removed trailing whitespace and fixed indentation in history widget
This commit is contained in:
parent
49c0a3a08f
commit
d9c5250a6f
|
@ -160,7 +160,7 @@ class ElectrumGui:
|
||||||
import installwizard
|
import installwizard
|
||||||
wizard = installwizard.InstallWizard(self.config, self.network, storage)
|
wizard = installwizard.InstallWizard(self.config, self.network, storage)
|
||||||
wallet = wizard.run(action)
|
wallet = wizard.run(action)
|
||||||
if not wallet:
|
if not wallet:
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
wallet.start_threads(self.network)
|
wallet.start_threads(self.network)
|
||||||
|
@ -203,7 +203,7 @@ class ElectrumGui:
|
||||||
s.start()
|
s.start()
|
||||||
|
|
||||||
self.windows.append(w)
|
self.windows.append(w)
|
||||||
if url:
|
if url:
|
||||||
self.set_url(url)
|
self.set_url(url)
|
||||||
|
|
||||||
w.app = self.app
|
w.app = self.app
|
||||||
|
@ -221,5 +221,3 @@ class ElectrumGui:
|
||||||
self.app.sendEvent(self.app.clipboard(), event)
|
self.app.sendEvent(self.app.clipboard(), event)
|
||||||
|
|
||||||
w.close_wallet()
|
w.close_wallet()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -96,4 +96,3 @@ class BTCAmountEdit(AmountEdit):
|
||||||
p = pow(10, self.decimal_point())
|
p = pow(10, self.decimal_point())
|
||||||
x = amount / Decimal(p)
|
x = amount / Decimal(p)
|
||||||
self.setText(str(x))
|
self.setText(str(x))
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ class Console(QtGui.QPlainTextEdit):
|
||||||
|
|
||||||
def set_json(self, b):
|
def set_json(self, b):
|
||||||
self.is_json = b
|
self.is_json = b
|
||||||
|
|
||||||
def run_script(self, filename):
|
def run_script(self, filename):
|
||||||
with open(filename) as f:
|
with open(filename) as f:
|
||||||
script = f.read()
|
script = f.read()
|
||||||
|
@ -106,7 +106,7 @@ class Console(QtGui.QPlainTextEdit):
|
||||||
|
|
||||||
self.moveCursor(QtGui.QTextCursor.End)
|
self.moveCursor(QtGui.QTextCursor.End)
|
||||||
self.completions_visible = True
|
self.completions_visible = True
|
||||||
|
|
||||||
|
|
||||||
def hide_completions(self):
|
def hide_completions(self):
|
||||||
if not self.completions_visible:
|
if not self.completions_visible:
|
||||||
|
@ -146,7 +146,7 @@ class Console(QtGui.QPlainTextEdit):
|
||||||
def addToHistory(self, command):
|
def addToHistory(self, command):
|
||||||
if command.find("importprivkey") > -1:
|
if command.find("importprivkey") > -1:
|
||||||
return
|
return
|
||||||
|
|
||||||
if command and (not self.history or self.history[-1] != command):
|
if command and (not self.history or self.history[-1] != command):
|
||||||
self.history.append(command)
|
self.history.append(command)
|
||||||
self.history_index = len(self.history)
|
self.history_index = len(self.history)
|
||||||
|
@ -177,7 +177,7 @@ class Console(QtGui.QPlainTextEdit):
|
||||||
def register_command(self, c, func):
|
def register_command(self, c, func):
|
||||||
methods = { c: func}
|
methods = { c: func}
|
||||||
self.updateNamespace(methods)
|
self.updateNamespace(methods)
|
||||||
|
|
||||||
|
|
||||||
def runCommand(self):
|
def runCommand(self):
|
||||||
command = self.getCommand()
|
command = self.getCommand()
|
||||||
|
@ -232,7 +232,7 @@ class Console(QtGui.QPlainTextEdit):
|
||||||
sys.stdout = tmp_stdout
|
sys.stdout = tmp_stdout
|
||||||
self.newPrompt()
|
self.newPrompt()
|
||||||
self.set_json(False)
|
self.set_json(False)
|
||||||
|
|
||||||
|
|
||||||
def keyPressEvent(self, event):
|
def keyPressEvent(self, event):
|
||||||
if event.key() == QtCore.Qt.Key_Tab:
|
if event.key() == QtCore.Qt.Key_Tab:
|
||||||
|
@ -280,7 +280,7 @@ class Console(QtGui.QPlainTextEdit):
|
||||||
obj = self.namespace.get(path[0])
|
obj = self.namespace.get(path[0])
|
||||||
prefix = path[0] + '.'
|
prefix = path[0] + '.'
|
||||||
ns = dir(obj)
|
ns = dir(obj)
|
||||||
|
|
||||||
|
|
||||||
completions = []
|
completions = []
|
||||||
for x in ns:
|
for x in ns:
|
||||||
|
@ -289,7 +289,7 @@ class Console(QtGui.QPlainTextEdit):
|
||||||
if xx.startswith(lastword):
|
if xx.startswith(lastword):
|
||||||
completions.append(xx)
|
completions.append(xx)
|
||||||
completions.sort()
|
completions.sort()
|
||||||
|
|
||||||
if not completions:
|
if not completions:
|
||||||
self.hide_completions()
|
self.hide_completions()
|
||||||
elif len(completions) == 1:
|
elif len(completions) == 1:
|
||||||
|
|
|
@ -14,13 +14,12 @@ class HistoryWidget(QTreeWidget):
|
||||||
|
|
||||||
def append(self, address, amount, date):
|
def append(self, address, amount, date):
|
||||||
if address is None:
|
if address is None:
|
||||||
address = _("Unknown")
|
address = _("Unknown")
|
||||||
if amount is None:
|
if amount is None:
|
||||||
amount = _("Unknown")
|
amount = _("Unknown")
|
||||||
if date is None:
|
if date is None:
|
||||||
date = _("Unknown")
|
date = _("Unknown")
|
||||||
item = QTreeWidgetItem([amount, address, date])
|
item = QTreeWidgetItem([amount, address, date])
|
||||||
if float(amount) < 0:
|
if float(amount) < 0:
|
||||||
item.setForeground(0, QBrush(QColor("#BC1E1E")))
|
item.setForeground(0, QBrush(QColor("#BC1E1E")))
|
||||||
self.insertTopLevelItem(0, item)
|
self.insertTopLevelItem(0, item)
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ class InstallWizard(QDialog):
|
||||||
|
|
||||||
if not self.exec_():
|
if not self.exec_():
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
action = 'create' if b1.isChecked() else 'restore'
|
action = 'create' if b1.isChecked() else 'restore'
|
||||||
wallet_type = self.wallet_types[group2.checkedId()][0]
|
wallet_type = self.wallet_types[group2.checkedId()][0]
|
||||||
return action, wallet_type
|
return action, wallet_type
|
||||||
|
@ -184,7 +184,7 @@ class InstallWizard(QDialog):
|
||||||
|
|
||||||
self.set_layout(vbox)
|
self.set_layout(vbox)
|
||||||
if not self.exec_():
|
if not self.exec_():
|
||||||
return
|
return
|
||||||
return map(lambda e: self.get_seed_text(e), entries)
|
return map(lambda e: self.get_seed_text(e), entries)
|
||||||
|
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ class InstallWizard(QDialog):
|
||||||
# skip this if config already exists
|
# skip this if config already exists
|
||||||
if self.config.get('server') is not None:
|
if self.config.get('server') is not None:
|
||||||
return
|
return
|
||||||
|
|
||||||
grid = QGridLayout()
|
grid = QGridLayout()
|
||||||
grid.setSpacing(5)
|
grid.setSpacing(5)
|
||||||
|
|
||||||
|
@ -245,14 +245,14 @@ class InstallWizard(QDialog):
|
||||||
self.set_layout(vbox)
|
self.set_layout(vbox)
|
||||||
if not self.exec_():
|
if not self.exec_():
|
||||||
return
|
return
|
||||||
|
|
||||||
if b2.isChecked():
|
if b2.isChecked():
|
||||||
return NetworkDialog(self.network, self.config, None).do_exec()
|
return NetworkDialog(self.network, self.config, None).do_exec()
|
||||||
else:
|
else:
|
||||||
self.config.set_key('auto_cycle', True, True)
|
self.config.set_key('auto_cycle', True, True)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def show_message(self, msg, icon=None):
|
def show_message(self, msg, icon=None):
|
||||||
vbox = QVBoxLayout()
|
vbox = QVBoxLayout()
|
||||||
self.set_layout(vbox)
|
self.set_layout(vbox)
|
||||||
|
@ -263,7 +263,7 @@ class InstallWizard(QDialog):
|
||||||
vbox.addWidget(QLabel(msg))
|
vbox.addWidget(QLabel(msg))
|
||||||
vbox.addStretch(1)
|
vbox.addStretch(1)
|
||||||
vbox.addLayout(close_button(self, _('Next')))
|
vbox.addLayout(close_button(self, _('Next')))
|
||||||
if not self.exec_():
|
if not self.exec_():
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
@ -302,7 +302,7 @@ class InstallWizard(QDialog):
|
||||||
vbox.addWidget(label)
|
vbox.addWidget(label)
|
||||||
vbox.addStretch(1)
|
vbox.addStretch(1)
|
||||||
vbox.addLayout(ok_cancel_buttons(self, yes_label, no_label))
|
vbox.addLayout(ok_cancel_buttons(self, yes_label, no_label))
|
||||||
if not self.exec_():
|
if not self.exec_():
|
||||||
return None
|
return None
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -400,7 +400,7 @@ class InstallWizard(QDialog):
|
||||||
|
|
||||||
else:
|
else:
|
||||||
f = run_hook('get_wizard_action', self, wallet, action)
|
f = run_hook('get_wizard_action', self, wallet, action)
|
||||||
if not f:
|
if not f:
|
||||||
raise BaseException('unknown wizard action', action)
|
raise BaseException('unknown wizard action', action)
|
||||||
r = f(wallet, self)
|
r = f(wallet, self)
|
||||||
if not r:
|
if not r:
|
||||||
|
@ -461,7 +461,7 @@ class InstallWizard(QDialog):
|
||||||
|
|
||||||
elif t in ['2of2']:
|
elif t in ['2of2']:
|
||||||
r = self.multi_seed_dialog(1)
|
r = self.multi_seed_dialog(1)
|
||||||
if not r:
|
if not r:
|
||||||
return
|
return
|
||||||
text1, text2 = r
|
text1, text2 = r
|
||||||
wallet = Wallet_2of2(self.storage)
|
wallet = Wallet_2of2(self.storage)
|
||||||
|
@ -491,7 +491,7 @@ class InstallWizard(QDialog):
|
||||||
|
|
||||||
elif t in ['2of3']:
|
elif t in ['2of3']:
|
||||||
r = self.multi_seed_dialog(2)
|
r = self.multi_seed_dialog(2)
|
||||||
if not r:
|
if not r:
|
||||||
return
|
return
|
||||||
text1, text2, text3 = r
|
text1, text2, text3 = r
|
||||||
wallet = Wallet_2of3(self.storage)
|
wallet = Wallet_2of3(self.storage)
|
||||||
|
@ -536,5 +536,5 @@ class InstallWizard(QDialog):
|
||||||
|
|
||||||
# create first keys offline
|
# create first keys offline
|
||||||
self.waiting_dialog(wallet.synchronize)
|
self.waiting_dialog(wallet.synchronize)
|
||||||
|
|
||||||
return wallet
|
return wallet
|
||||||
|
|
|
@ -88,7 +88,7 @@ class TransactionWindow(QDialog):
|
||||||
label = unicode(self.label_edit.text())
|
label = unicode(self.label_edit.text())
|
||||||
self.parent.wallet.labels[self.tx_id] = label
|
self.parent.wallet.labels[self.tx_id] = label
|
||||||
|
|
||||||
super(TransactionWindow, self).accept()
|
super(TransactionWindow, self).accept()
|
||||||
|
|
||||||
def __init__(self, transaction_id, parent):
|
def __init__(self, transaction_id, parent):
|
||||||
super(TransactionWindow, self).__init__()
|
super(TransactionWindow, self).__init__()
|
||||||
|
@ -210,7 +210,7 @@ class MiniWindow(QDialog):
|
||||||
self.receiving = receiving_widget.ReceivingWidget(self)
|
self.receiving = receiving_widget.ReceivingWidget(self)
|
||||||
self.receiving.setObjectName("receiving")
|
self.receiving.setObjectName("receiving")
|
||||||
|
|
||||||
# Add to the right side
|
# Add to the right side
|
||||||
self.receiving_box = QGroupBox(_("Select a receiving address"))
|
self.receiving_box = QGroupBox(_("Select a receiving address"))
|
||||||
extra_layout = QGridLayout()
|
extra_layout = QGridLayout()
|
||||||
|
|
||||||
|
@ -250,7 +250,7 @@ class MiniWindow(QDialog):
|
||||||
self.show_history(show_hist)
|
self.show_history(show_hist)
|
||||||
show_hist = self.config.get("gui_show_receiving",False)
|
show_hist = self.config.get("gui_show_receiving",False)
|
||||||
self.toggle_receiving_layout(show_hist)
|
self.toggle_receiving_layout(show_hist)
|
||||||
|
|
||||||
self.setWindowIcon(QIcon(":icons/electrum.png"))
|
self.setWindowIcon(QIcon(":icons/electrum.png"))
|
||||||
self.setWindowTitle("Electrum")
|
self.setWindowTitle("Electrum")
|
||||||
self.setWindowFlags(Qt.Window|Qt.MSWindowsFixedSizeDialogHint)
|
self.setWindowFlags(Qt.Window|Qt.MSWindowsFixedSizeDialogHint)
|
||||||
|
@ -384,7 +384,7 @@ class MiniWindow(QDialog):
|
||||||
self.balance_label.show_balance()
|
self.balance_label.show_balance()
|
||||||
|
|
||||||
def create_quote_text(self, btc_balance):
|
def create_quote_text(self, btc_balance):
|
||||||
"""Return a string copy of the amount fiat currency the
|
"""Return a string copy of the amount fiat currency the
|
||||||
user has in bitcoins."""
|
user has in bitcoins."""
|
||||||
from electrum.plugins import run_hook
|
from electrum.plugins import run_hook
|
||||||
r = {}
|
r = {}
|
||||||
|
@ -443,7 +443,7 @@ class MiniWindow(QDialog):
|
||||||
|
|
||||||
def update_completions(self, completions):
|
def update_completions(self, completions):
|
||||||
self.address_completions.setStringList(completions)
|
self.address_completions.setStringList(completions)
|
||||||
|
|
||||||
|
|
||||||
def update_history(self, tx_history):
|
def update_history(self, tx_history):
|
||||||
|
|
||||||
|
@ -499,7 +499,7 @@ class BalanceLabel(QLabel):
|
||||||
position = event.globalPos()
|
position = event.globalPos()
|
||||||
menu = self.parent.context_menu()
|
menu = self.parent.context_menu()
|
||||||
menu.exec_(position)
|
menu.exec_(position)
|
||||||
|
|
||||||
|
|
||||||
def set_balance_text(self, amount, unit, quote_text):
|
def set_balance_text(self, amount, unit, quote_text):
|
||||||
"""Set the amount of bitcoins in the gui."""
|
"""Set the amount of bitcoins in the gui."""
|
||||||
|
@ -560,7 +560,7 @@ class PasswordDialog(QDialog):
|
||||||
main_layout.addLayout(grid)
|
main_layout.addLayout(grid)
|
||||||
|
|
||||||
main_layout.addLayout(ok_cancel_buttons(self))
|
main_layout.addLayout(ok_cancel_buttons(self))
|
||||||
self.setLayout(main_layout)
|
self.setLayout(main_layout)
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
if not self.exec_():
|
if not self.exec_():
|
||||||
|
@ -599,10 +599,10 @@ class ReceivePopup(QDialog):
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
class MiniActuator:
|
class MiniActuator:
|
||||||
"""Initialize the definitions relating to themes and
|
"""Initialize the definitions relating to themes and
|
||||||
sending/receiving bitcoins."""
|
sending/receiving bitcoins."""
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, main_window):
|
def __init__(self, main_window):
|
||||||
"""Retrieve the gui theme used in previous session."""
|
"""Retrieve the gui theme used in previous session."""
|
||||||
self.g = main_window
|
self.g = main_window
|
||||||
|
@ -624,7 +624,7 @@ class MiniActuator:
|
||||||
def theme_names(self):
|
def theme_names(self):
|
||||||
"""Sort themes."""
|
"""Sort themes."""
|
||||||
return sorted(self.themes.keys())
|
return sorted(self.themes.keys())
|
||||||
|
|
||||||
def selected_theme(self):
|
def selected_theme(self):
|
||||||
"""Select theme."""
|
"""Select theme."""
|
||||||
return self.theme_name
|
return self.theme_name
|
||||||
|
@ -634,14 +634,14 @@ class MiniActuator:
|
||||||
self.theme_name = theme_name
|
self.theme_name = theme_name
|
||||||
self.g.config.set_key('litegui_theme',theme_name)
|
self.g.config.set_key('litegui_theme',theme_name)
|
||||||
self.load_theme()
|
self.load_theme()
|
||||||
|
|
||||||
def set_configured_exchange(self, set_exchange):
|
def set_configured_exchange(self, set_exchange):
|
||||||
use_exchange = self.g.config.get('use_exchange')
|
use_exchange = self.g.config.get('use_exchange')
|
||||||
if use_exchange is not None:
|
if use_exchange is not None:
|
||||||
set_exchange(use_exchange)
|
set_exchange(use_exchange)
|
||||||
|
|
||||||
def set_configured_currency(self, set_quote_currency):
|
def set_configured_currency(self, set_quote_currency):
|
||||||
"""Set the inital fiat currency conversion country (USD/EUR/GBP) in
|
"""Set the inital fiat currency conversion country (USD/EUR/GBP) in
|
||||||
the GUI to what it was set to in the wallet."""
|
the GUI to what it was set to in the wallet."""
|
||||||
currency = self.g.config.get('currency')
|
currency = self.g.config.get('currency')
|
||||||
# currency can be none when Electrum is used for the first
|
# currency can be none when Electrum is used for the first
|
||||||
|
@ -694,7 +694,7 @@ class MiniActuator:
|
||||||
dest_address = self.fetch_destination(address)
|
dest_address = self.fetch_destination(address)
|
||||||
|
|
||||||
if dest_address is None or not is_valid(dest_address):
|
if dest_address is None or not is_valid(dest_address):
|
||||||
QMessageBox.warning(parent_window, _('Error'),
|
QMessageBox.warning(parent_window, _('Error'),
|
||||||
_('Invalid Bitcoin Address') + ':\n' + address, _('OK'))
|
_('Invalid Bitcoin Address') + ':\n' + address, _('OK'))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -726,7 +726,7 @@ class MiniActuator:
|
||||||
h = self.g.wallet.send_tx(tx)
|
h = self.g.wallet.send_tx(tx)
|
||||||
|
|
||||||
self.waiting_dialog(lambda: False if self.g.wallet.tx_event.isSet() else _("Sending transaction, please wait..."))
|
self.waiting_dialog(lambda: False if self.g.wallet.tx_event.isSet() else _("Sending transaction, please wait..."))
|
||||||
|
|
||||||
status, message = self.g.wallet.receive_tx(h, tx)
|
status, message = self.g.wallet.receive_tx(h, tx)
|
||||||
|
|
||||||
if not status:
|
if not status:
|
||||||
|
@ -737,7 +737,7 @@ class MiniActuator:
|
||||||
print "Dumped error tx to", dumpf.name
|
print "Dumped error tx to", dumpf.name
|
||||||
QMessageBox.warning(parent_window, _('Error'), message, _('OK'))
|
QMessageBox.warning(parent_window, _('Error'), message, _('OK'))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
TransactionWindow(message, self)
|
TransactionWindow(message, self)
|
||||||
else:
|
else:
|
||||||
filename = 'unsigned_tx_%s' % (time.mktime(time.gmtime()))
|
filename = 'unsigned_tx_%s' % (time.mktime(time.gmtime()))
|
||||||
|
@ -760,10 +760,10 @@ class MiniActuator:
|
||||||
# label or alias, with address in brackets
|
# label or alias, with address in brackets
|
||||||
match2 = re.match("(.*?)\s*\<([1-9A-HJ-NP-Za-km-z]{26,})\>",
|
match2 = re.match("(.*?)\s*\<([1-9A-HJ-NP-Za-km-z]{26,})\>",
|
||||||
recipient)
|
recipient)
|
||||||
|
|
||||||
if match1:
|
if match1:
|
||||||
dest_address = \
|
dest_address = \
|
||||||
self.g.wallet.get_alias(recipient, True,
|
self.g.wallet.get_alias(recipient, True,
|
||||||
self.show_message, self.question)
|
self.show_message, self.question)
|
||||||
return dest_address
|
return dest_address
|
||||||
elif match2:
|
elif match2:
|
||||||
|
@ -772,7 +772,7 @@ class MiniActuator:
|
||||||
return recipient
|
return recipient
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MiniDriver(QObject):
|
class MiniDriver(QObject):
|
||||||
|
@ -872,4 +872,3 @@ if __name__ == "__main__":
|
||||||
app.setStyleSheet(style_file.read())
|
app.setStyleSheet(style_file.read())
|
||||||
mini = MiniWindow()
|
mini = MiniWindow()
|
||||||
sys.exit(app.exec_())
|
sys.exit(app.exec_())
|
||||||
|
|
||||||
|
|
|
@ -762,7 +762,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
if not message and not amount:
|
if not message and not amount:
|
||||||
QMessageBox.warning(self, _('Error'), _('No message or amount'), _('OK'))
|
QMessageBox.warning(self, _('Error'), _('No message or amount'), _('OK'))
|
||||||
return
|
return
|
||||||
self.receive_requests = self.wallet.storage.get('receive_requests',{})
|
self.receive_requests = self.wallet.storage.get('receive_requests',{})
|
||||||
self.receive_requests[addr] = (amount, message)
|
self.receive_requests[addr] = (amount, message)
|
||||||
self.wallet.storage.put('receive_requests', self.receive_requests)
|
self.wallet.storage.put('receive_requests', self.receive_requests)
|
||||||
self.update_receive_tab()
|
self.update_receive_tab()
|
||||||
|
@ -784,7 +784,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
self.receive_amount_e.setAmount(None)
|
self.receive_amount_e.setAmount(None)
|
||||||
|
|
||||||
def clear_receive_tab(self):
|
def clear_receive_tab(self):
|
||||||
self.receive_requests = self.wallet.storage.get('receive_requests',{})
|
self.receive_requests = self.wallet.storage.get('receive_requests',{})
|
||||||
domain = self.wallet.get_account_addresses(self.current_account, include_change=False)
|
domain = self.wallet.get_account_addresses(self.current_account, include_change=False)
|
||||||
for addr in domain:
|
for addr in domain:
|
||||||
if not self.wallet.history.get(addr) and addr not in self.receive_requests.keys():
|
if not self.wallet.history.get(addr) and addr not in self.receive_requests.keys():
|
||||||
|
@ -818,7 +818,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
self.receive_address_e.setText(addr)
|
self.receive_address_e.setText(addr)
|
||||||
|
|
||||||
def update_receive_tab(self):
|
def update_receive_tab(self):
|
||||||
self.receive_requests = self.wallet.storage.get('receive_requests',{})
|
self.receive_requests = self.wallet.storage.get('receive_requests',{})
|
||||||
b = len(self.receive_requests) > 0
|
b = len(self.receive_requests) > 0
|
||||||
self.receive_list.setVisible(b)
|
self.receive_list.setVisible(b)
|
||||||
self.receive_requests_label.setVisible(b)
|
self.receive_requests_label.setVisible(b)
|
||||||
|
@ -1566,7 +1566,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
self.payment_request_ok()
|
self.payment_request_ok()
|
||||||
else:
|
else:
|
||||||
self.payment_request_error()
|
self.payment_request_error()
|
||||||
|
|
||||||
|
|
||||||
def create_invoice_menu(self, position):
|
def create_invoice_menu(self, position):
|
||||||
item = self.invoices_list.itemAt(position)
|
item = self.invoices_list.itemAt(position)
|
||||||
|
@ -1616,11 +1616,11 @@ class ElectrumWindow(QMainWindow):
|
||||||
name = _("Receiving") if not is_change else _("Change")
|
name = _("Receiving") if not is_change else _("Change")
|
||||||
seq_item = QTreeWidgetItem( [ name, '', '', '', ''] )
|
seq_item = QTreeWidgetItem( [ name, '', '', '', ''] )
|
||||||
account_item.addChild(seq_item)
|
account_item.addChild(seq_item)
|
||||||
if not is_change:
|
if not is_change:
|
||||||
seq_item.setExpanded(True)
|
seq_item.setExpanded(True)
|
||||||
else:
|
else:
|
||||||
seq_item = account_item
|
seq_item = account_item
|
||||||
|
|
||||||
used_item = QTreeWidgetItem( [ _("Used"), '', '', '', ''] )
|
used_item = QTreeWidgetItem( [ _("Used"), '', '', '', ''] )
|
||||||
used_flag = False
|
used_flag = False
|
||||||
|
|
||||||
|
@ -1874,7 +1874,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
|
|
||||||
|
|
||||||
def show_qrcode(self, data, title = _("QR code")):
|
def show_qrcode(self, data, title = _("QR code")):
|
||||||
if not data:
|
if not data:
|
||||||
return
|
return
|
||||||
d = QRDialog(data, self, title)
|
d = QRDialog(data, self, title)
|
||||||
d.exec_()
|
d.exec_()
|
||||||
|
@ -2267,8 +2267,8 @@ class ElectrumWindow(QMainWindow):
|
||||||
d.setMinimumSize(850, 300)
|
d.setMinimumSize(850, 300)
|
||||||
vbox = QVBoxLayout(d)
|
vbox = QVBoxLayout(d)
|
||||||
|
|
||||||
msg = "%s\n%s\n%s" % (_("WARNING: ALL your private keys are secret."),
|
msg = "%s\n%s\n%s" % (_("WARNING: ALL your private keys are secret."),
|
||||||
_("Exposing a single private key can compromise your entire wallet!"),
|
_("Exposing a single private key can compromise your entire wallet!"),
|
||||||
_("In particular, DO NOT use 'redeem private key' services proposed by third parties."))
|
_("In particular, DO NOT use 'redeem private key' services proposed by third parties."))
|
||||||
vbox.addWidget(QLabel(msg))
|
vbox.addWidget(QLabel(msg))
|
||||||
|
|
||||||
|
@ -2291,7 +2291,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
def privkeys_thread():
|
def privkeys_thread():
|
||||||
for addr in addresses:
|
for addr in addresses:
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
if done:
|
if done:
|
||||||
break
|
break
|
||||||
private_keys[addr] = "\n".join(self.wallet.get_private_key(addr, password))
|
private_keys[addr] = "\n".join(self.wallet.get_private_key(addr, password))
|
||||||
d.emit(SIGNAL('computing_privkeys'))
|
d.emit(SIGNAL('computing_privkeys'))
|
||||||
|
@ -2641,7 +2641,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
on_video_device = lambda x: self.config.set_key("video_device", str(qr_combo.itemData(x).toString()), True)
|
on_video_device = lambda x: self.config.set_key("video_device", str(qr_combo.itemData(x).toString()), True)
|
||||||
qr_combo.currentIndexChanged.connect(on_video_device)
|
qr_combo.currentIndexChanged.connect(on_video_device)
|
||||||
widgets.append((qr_label, qr_combo, qr_help))
|
widgets.append((qr_label, qr_combo, qr_help))
|
||||||
|
|
||||||
usechange_cb = QCheckBox(_('Use change addresses'))
|
usechange_cb = QCheckBox(_('Use change addresses'))
|
||||||
usechange_cb.setChecked(self.wallet.use_change)
|
usechange_cb.setChecked(self.wallet.use_change)
|
||||||
usechange_help = HelpButton(_('Using change addresses makes it more difficult for other people to track your transactions.'))
|
usechange_help = HelpButton(_('Using change addresses makes it more difficult for other people to track your transactions.'))
|
||||||
|
@ -2671,7 +2671,7 @@ class ElectrumWindow(QMainWindow):
|
||||||
|
|
||||||
for a,b,c in widgets:
|
for a,b,c in widgets:
|
||||||
i = grid.rowCount()
|
i = grid.rowCount()
|
||||||
if b:
|
if b:
|
||||||
grid.addWidget(a, i, 0)
|
grid.addWidget(a, i, 0)
|
||||||
grid.addWidget(b, i, 1)
|
grid.addWidget(b, i, 1)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -56,7 +56,7 @@ class NetworkDialog(QDialog):
|
||||||
else:
|
else:
|
||||||
status = _("Not connected")
|
status = _("Not connected")
|
||||||
if network.is_connected():
|
if network.is_connected():
|
||||||
status += "\n" + _("Server") + ": %s"%(host)
|
status += "\n" + _("Server") + ": %s"%(host)
|
||||||
else:
|
else:
|
||||||
status += "\n" + _("Disconnected from server")
|
status += "\n" + _("Disconnected from server")
|
||||||
else:
|
else:
|
||||||
|
@ -117,14 +117,14 @@ class NetworkDialog(QDialog):
|
||||||
self.change_server(host, protocol)
|
self.change_server(host, protocol)
|
||||||
self.set_protocol(protocol)
|
self.set_protocol(protocol)
|
||||||
|
|
||||||
self.servers_list_widget.connect(self.servers_list_widget,
|
self.servers_list_widget.connect(self.servers_list_widget,
|
||||||
SIGNAL('currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)'),
|
SIGNAL('currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)'),
|
||||||
lambda x,y: self.server_changed(x))
|
lambda x,y: self.server_changed(x))
|
||||||
grid.addWidget(self.servers_list_widget, 1, 1, 1, 3)
|
grid.addWidget(self.servers_list_widget, 1, 1, 1, 3)
|
||||||
|
|
||||||
if not config.is_modifiable('server'):
|
if not config.is_modifiable('server'):
|
||||||
for w in [self.server_host, self.server_port, self.server_protocol, self.servers_list_widget]: w.setEnabled(False)
|
for w in [self.server_host, self.server_port, self.server_protocol, self.servers_list_widget]: w.setEnabled(False)
|
||||||
|
|
||||||
def enable_set_server():
|
def enable_set_server():
|
||||||
enabled = not self.autocycle_cb.isChecked()
|
enabled = not self.autocycle_cb.isChecked()
|
||||||
self.server_host.setEnabled(enabled)
|
self.server_host.setEnabled(enabled)
|
||||||
|
@ -167,7 +167,7 @@ class NetworkDialog(QDialog):
|
||||||
|
|
||||||
# buttons
|
# buttons
|
||||||
vbox.addLayout(ok_cancel_buttons(self))
|
vbox.addLayout(ok_cancel_buttons(self))
|
||||||
self.setLayout(vbox)
|
self.setLayout(vbox)
|
||||||
|
|
||||||
|
|
||||||
def init_servers_list(self):
|
def init_servers_list(self):
|
||||||
|
@ -182,7 +182,7 @@ class NetworkDialog(QDialog):
|
||||||
if protocol != self.protocol:
|
if protocol != self.protocol:
|
||||||
self.protocol = protocol
|
self.protocol = protocol
|
||||||
self.init_servers_list()
|
self.init_servers_list()
|
||||||
|
|
||||||
def change_protocol(self, index):
|
def change_protocol(self, index):
|
||||||
p = protocol_letters[index]
|
p = protocol_letters[index]
|
||||||
host = unicode(self.server_host.text())
|
host = unicode(self.server_host.text())
|
||||||
|
@ -195,7 +195,7 @@ class NetworkDialog(QDialog):
|
||||||
self.set_protocol(p)
|
self.set_protocol(p)
|
||||||
|
|
||||||
def server_changed(self, x):
|
def server_changed(self, x):
|
||||||
if x:
|
if x:
|
||||||
self.change_server(str(x.text(0)), self.protocol)
|
self.change_server(str(x.text(0)), self.protocol)
|
||||||
|
|
||||||
def change_server(self, host, protocol):
|
def change_server(self, host, protocol):
|
||||||
|
@ -204,7 +204,7 @@ class NetworkDialog(QDialog):
|
||||||
if protocol:
|
if protocol:
|
||||||
port = pp.get(protocol)
|
port = pp.get(protocol)
|
||||||
if not port: protocol = None
|
if not port: protocol = None
|
||||||
|
|
||||||
if not protocol:
|
if not protocol:
|
||||||
if 's' in pp.keys():
|
if 's' in pp.keys():
|
||||||
protocol = 's'
|
protocol = 's'
|
||||||
|
@ -212,7 +212,7 @@ class NetworkDialog(QDialog):
|
||||||
else:
|
else:
|
||||||
protocol = pp.keys()[0]
|
protocol = pp.keys()[0]
|
||||||
port = pp.get(protocol)
|
port = pp.get(protocol)
|
||||||
|
|
||||||
self.server_host.setText( host )
|
self.server_host.setText( host )
|
||||||
self.server_port.setText( port )
|
self.server_port.setText( port )
|
||||||
self.server_protocol.setCurrentIndex(protocol_letters.index(protocol))
|
self.server_protocol.setCurrentIndex(protocol_letters.index(protocol))
|
||||||
|
@ -237,8 +237,8 @@ class NetworkDialog(QDialog):
|
||||||
protocol = protocol_letters[self.server_protocol.currentIndex()]
|
protocol = protocol_letters[self.server_protocol.currentIndex()]
|
||||||
|
|
||||||
if self.proxy_mode.currentText() != 'NONE':
|
if self.proxy_mode.currentText() != 'NONE':
|
||||||
proxy = { 'mode':str(self.proxy_mode.currentText()).lower(),
|
proxy = { 'mode':str(self.proxy_mode.currentText()).lower(),
|
||||||
'host':str(self.proxy_host.text()),
|
'host':str(self.proxy_host.text()),
|
||||||
'port':str(self.proxy_port.text()) }
|
'port':str(self.proxy_port.text()) }
|
||||||
else:
|
else:
|
||||||
proxy = None
|
proxy = None
|
||||||
|
|
|
@ -33,7 +33,7 @@ def make_password_dialog(self, wallet, msg, new_pass=True):
|
||||||
self.new_pw.setEchoMode(2)
|
self.new_pw.setEchoMode(2)
|
||||||
self.conf_pw = QLineEdit()
|
self.conf_pw = QLineEdit()
|
||||||
self.conf_pw.setEchoMode(2)
|
self.conf_pw.setEchoMode(2)
|
||||||
|
|
||||||
vbox = QVBoxLayout()
|
vbox = QVBoxLayout()
|
||||||
label = QLabel(msg)
|
label = QLabel(msg)
|
||||||
label.setWordWrap(True)
|
label.setWordWrap(True)
|
||||||
|
@ -56,7 +56,7 @@ def make_password_dialog(self, wallet, msg, new_pass=True):
|
||||||
grid.setSpacing(8)
|
grid.setSpacing(8)
|
||||||
grid.setColumnMinimumWidth(0, 250)
|
grid.setColumnMinimumWidth(0, 250)
|
||||||
grid.setColumnStretch(1,1)
|
grid.setColumnStretch(1,1)
|
||||||
|
|
||||||
if wallet and wallet.use_encryption:
|
if wallet and wallet.use_encryption:
|
||||||
grid.addWidget(QLabel(_('Password')), 0, 0)
|
grid.addWidget(QLabel(_('Password')), 0, 0)
|
||||||
grid.addWidget(self.pw, 0, 1)
|
grid.addWidget(self.pw, 0, 1)
|
||||||
|
@ -79,7 +79,7 @@ def make_password_dialog(self, wallet, msg, new_pass=True):
|
||||||
|
|
||||||
|
|
||||||
def run_password_dialog(self, wallet, parent):
|
def run_password_dialog(self, wallet, parent):
|
||||||
|
|
||||||
if wallet and wallet.is_watching_only():
|
if wallet and wallet.is_watching_only():
|
||||||
QMessageBox.information(parent, _('Error'), _('This is a watching-only wallet'), _('OK'))
|
QMessageBox.information(parent, _('Error'), _('This is a watching-only wallet'), _('OK'))
|
||||||
return False, None, None
|
return False, None, None
|
||||||
|
@ -173,7 +173,3 @@ class PasswordDialog(QDialog):
|
||||||
QMessageBox.information(self.parent, _('Success'), _('Password was updated successfully'), _('OK'))
|
QMessageBox.information(self.parent, _('Success'), _('Password was updated successfully'), _('OK'))
|
||||||
else:
|
else:
|
||||||
QMessageBox.information(self.parent, _('Success'), _('This wallet is not encrypted'), _('OK'))
|
QMessageBox.information(self.parent, _('Success'), _('This wallet is not encrypted'), _('OK'))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -122,7 +122,7 @@ class PayToEdit(QRTextEdit):
|
||||||
except:
|
except:
|
||||||
self.errors.append((i, line.strip()))
|
self.errors.append((i, line.strip()))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
outputs.append((type, to_address, amount))
|
outputs.append((type, to_address, amount))
|
||||||
total += amount
|
total += amount
|
||||||
|
|
||||||
|
@ -189,7 +189,7 @@ class PayToEdit(QRTextEdit):
|
||||||
tc.movePosition(QTextCursor.EndOfWord)
|
tc.movePosition(QTextCursor.EndOfWord)
|
||||||
tc.insertText(completion.right(extra))
|
tc.insertText(completion.right(extra))
|
||||||
self.setTextCursor(tc)
|
self.setTextCursor(tc)
|
||||||
|
|
||||||
|
|
||||||
def textUnderCursor(self):
|
def textUnderCursor(self):
|
||||||
tc = self.textCursor()
|
tc = self.textCursor()
|
||||||
|
@ -235,4 +235,3 @@ class PayToEdit(QRTextEdit):
|
||||||
cr = self.cursorRect()
|
cr = self.cursorRect()
|
||||||
cr.setWidth(self.c.popup().sizeHintForColumn(0) + self.c.popup().verticalScrollBar().sizeHint().width())
|
cr.setWidth(self.c.popup().sizeHintForColumn(0) + self.c.popup().verticalScrollBar().sizeHint().width())
|
||||||
self.c.complete(cr)
|
self.c.complete(cr)
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ class QRCodeWidget(QWidget):
|
||||||
self.qr = None
|
self.qr = None
|
||||||
|
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
|
|
||||||
def paintEvent(self, e):
|
def paintEvent(self, e):
|
||||||
if not self.data:
|
if not self.data:
|
||||||
|
@ -83,7 +83,7 @@ class QRCodeWidget(QWidget):
|
||||||
qp.setPen(white)
|
qp.setPen(white)
|
||||||
qp.drawRect(left+c*boxsize, top+r*boxsize, boxsize, boxsize)
|
qp.drawRect(left+c*boxsize, top+r*boxsize, boxsize, boxsize)
|
||||||
qp.end()
|
qp.end()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class QRDialog(QDialog):
|
class QRDialog(QDialog):
|
||||||
|
@ -132,4 +132,3 @@ class QRDialog(QDialog):
|
||||||
|
|
||||||
vbox.addLayout(hbox)
|
vbox.addLayout(hbox)
|
||||||
d.setLayout(vbox)
|
d.setLayout(vbox)
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ class QR_Window(QWidget):
|
||||||
self.setFocusPolicy(QtCore.Qt.NoFocus)
|
self.setFocusPolicy(QtCore.Qt.NoFocus)
|
||||||
|
|
||||||
main_box = QHBoxLayout()
|
main_box = QHBoxLayout()
|
||||||
|
|
||||||
self.qrw = QRCodeWidget()
|
self.qrw = QRCodeWidget()
|
||||||
main_box.addWidget(self.qrw, 1)
|
main_box.addWidget(self.qrw, 1)
|
||||||
|
|
||||||
|
@ -84,7 +84,3 @@ class QR_Window(QWidget):
|
||||||
label_text = "<span style='font-size: 21pt'>%s</span>" % message if message else ""
|
label_text = "<span style='font-size: 21pt'>%s</span>" % message if message else ""
|
||||||
self.label_label.setText(label_text)
|
self.label_label.setText(label_text)
|
||||||
self.qrw.setData(url)
|
self.qrw.setData(url)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ class ReceivingWidget(QTreeWidget):
|
||||||
self.editing = False
|
self.editing = False
|
||||||
|
|
||||||
def update_label(self, item, column):
|
def update_label(self, item, column):
|
||||||
if self.editing:
|
if self.editing:
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
address = str(item.text(0))
|
address = str(item.text(0))
|
||||||
|
@ -32,7 +32,7 @@ class ReceivingWidget(QTreeWidget):
|
||||||
def copy_address(self):
|
def copy_address(self):
|
||||||
address = self.currentItem().text(0)
|
address = self.currentItem().text(0)
|
||||||
qApp.clipboard().setText(address)
|
qApp.clipboard().setText(address)
|
||||||
|
|
||||||
|
|
||||||
def update_list(self):
|
def update_list(self):
|
||||||
return
|
return
|
||||||
|
|
|
@ -40,18 +40,18 @@ class SeedDialog(QDialog):
|
||||||
|
|
||||||
def icon_filename(sid):
|
def icon_filename(sid):
|
||||||
if sid == 'cold':
|
if sid == 'cold':
|
||||||
return ":icons/cold_seed.png"
|
return ":icons/cold_seed.png"
|
||||||
elif sid == 'hot':
|
elif sid == 'hot':
|
||||||
return ":icons/hot_seed.png"
|
return ":icons/hot_seed.png"
|
||||||
else:
|
else:
|
||||||
return ":icons/seed.png"
|
return ":icons/seed.png"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def show_seed_box(seed, sid=None):
|
def show_seed_box(seed, sid=None):
|
||||||
|
|
||||||
save_msg = _("Please save these %d words on paper (order is important).")%len(seed.split()) + " "
|
save_msg = _("Please save these %d words on paper (order is important).")%len(seed.split()) + " "
|
||||||
qr_msg = _("Your seed is also displayed as QR code, in case you want to transfer it to a mobile phone.") + "<p>"
|
qr_msg = _("Your seed is also displayed as QR code, in case you want to transfer it to a mobile phone.") + "<p>"
|
||||||
warning_msg = "<b>"+_("WARNING")+":</b> " + _("Never disclose your seed. Never type it on a website.") + "</b><p>"
|
warning_msg = "<b>"+_("WARNING")+":</b> " + _("Never disclose your seed. Never type it on a website.") + "</b><p>"
|
||||||
|
|
||||||
|
@ -60,12 +60,12 @@ def show_seed_box(seed, sid=None):
|
||||||
msg2 = save_msg + " " \
|
msg2 = save_msg + " " \
|
||||||
+ _("This seed will allow you to recover your wallet in case of computer failure.") + "<br/>" \
|
+ _("This seed will allow you to recover your wallet in case of computer failure.") + "<br/>" \
|
||||||
+ warning_msg
|
+ warning_msg
|
||||||
|
|
||||||
elif sid == 'cold':
|
elif sid == 'cold':
|
||||||
msg = _("Your cold storage seed is")
|
msg = _("Your cold storage seed is")
|
||||||
msg2 = save_msg + " " \
|
msg2 = save_msg + " " \
|
||||||
+ _("This seed will be permanently deleted from your wallet file. Make sure you have saved it before you press 'next'") + " " \
|
+ _("This seed will be permanently deleted from your wallet file. Make sure you have saved it before you press 'next'") + " " \
|
||||||
|
|
||||||
elif sid == 'hot':
|
elif sid == 'hot':
|
||||||
msg = _("Your hot seed is")
|
msg = _("Your hot seed is")
|
||||||
msg2 = save_msg + " " \
|
msg2 = save_msg + " " \
|
||||||
|
@ -92,7 +92,7 @@ def show_seed_box(seed, sid=None):
|
||||||
vbox.addLayout(grid)
|
vbox.addLayout(grid)
|
||||||
vbox.addWidget(label2)
|
vbox.addWidget(label2)
|
||||||
vbox.addStretch(1)
|
vbox.addStretch(1)
|
||||||
|
|
||||||
return vbox
|
return vbox
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ class TxDialog(QDialog):
|
||||||
tx_dict = tx.as_dict()
|
tx_dict = tx.as_dict()
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.wallet = parent.wallet
|
self.wallet = parent.wallet
|
||||||
|
|
||||||
QDialog.__init__(self)
|
QDialog.__init__(self)
|
||||||
self.setMinimumWidth(600)
|
self.setMinimumWidth(600)
|
||||||
self.setWindowTitle(_("Transaction"))
|
self.setWindowTitle(_("Transaction"))
|
||||||
|
@ -102,7 +102,7 @@ class TxDialog(QDialog):
|
||||||
buttons.insertWidget(1,b)
|
buttons.insertWidget(1,b)
|
||||||
|
|
||||||
run_hook('transaction_dialog', self)
|
run_hook('transaction_dialog', self)
|
||||||
|
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
|
|
||||||
|
@ -175,9 +175,9 @@ class TxDialog(QDialog):
|
||||||
if not self.wallet.up_to_date:
|
if not self.wallet.up_to_date:
|
||||||
return
|
return
|
||||||
|
|
||||||
if is_relevant:
|
if is_relevant:
|
||||||
if is_mine:
|
if is_mine:
|
||||||
if fee is not None:
|
if fee is not None:
|
||||||
self.amount_label.setText(_("Amount sent:")+' %s'% self.parent.format_amount(v-fee) + ' ' + self.parent.base_unit())
|
self.amount_label.setText(_("Amount sent:")+' %s'% self.parent.format_amount(v-fee) + ' ' + self.parent.base_unit())
|
||||||
self.fee_label.setText(_("Transaction fee")+': %s'% self.parent.format_amount(fee) + ' ' + self.parent.base_unit())
|
self.fee_label.setText(_("Transaction fee")+': %s'% self.parent.format_amount(fee) + ' ' + self.parent.base_unit())
|
||||||
else:
|
else:
|
||||||
|
@ -219,11 +219,7 @@ class TxDialog(QDialog):
|
||||||
o_text.setMaximumHeight(100)
|
o_text.setMaximumHeight(100)
|
||||||
vbox.addWidget(o_text)
|
vbox.addWidget(o_text)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def show_message(self, msg):
|
def show_message(self, msg):
|
||||||
QMessageBox.information(self, _('Message'), msg, _('OK'))
|
QMessageBox.information(self, _('Message'), msg, _('OK'))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -182,7 +182,7 @@ def filename_field(parent, config, defaultname, select_msg):
|
||||||
b2.setText(_("json"))
|
b2.setText(_("json"))
|
||||||
vbox.addWidget(b1)
|
vbox.addWidget(b1)
|
||||||
vbox.addWidget(b2)
|
vbox.addWidget(b2)
|
||||||
|
|
||||||
hbox = QHBoxLayout()
|
hbox = QHBoxLayout()
|
||||||
|
|
||||||
directory = config.get('io_dir', unicode(os.path.expanduser('~')))
|
directory = config.get('io_dir', unicode(os.path.expanduser('~')))
|
||||||
|
|
|
@ -30,7 +30,7 @@ class VersionGetter(threading.Thread):
|
||||||
def __init__(self, label):
|
def __init__(self, label):
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
self.label = label
|
self.label = label
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
try:
|
try:
|
||||||
con = httplib.HTTPConnection('electrum.org', 80, timeout=5)
|
con = httplib.HTTPConnection('electrum.org', 80, timeout=5)
|
||||||
|
@ -39,7 +39,7 @@ class VersionGetter(threading.Thread):
|
||||||
except socket.error as msg:
|
except socket.error as msg:
|
||||||
print_error("Could not retrieve version information")
|
print_error("Could not retrieve version information")
|
||||||
return
|
return
|
||||||
|
|
||||||
if res.status == 200:
|
if res.status == 200:
|
||||||
latest_version = res.read()
|
latest_version = res.read()
|
||||||
latest_version = latest_version.replace("\n","")
|
latest_version = latest_version.replace("\n","")
|
||||||
|
@ -88,7 +88,7 @@ class UpdateLabel(QLabel):
|
||||||
self.config.set_key("last_seen_version", "9.9.9", True)
|
self.config.set_key("last_seen_version", "9.9.9", True)
|
||||||
QMessageBox.information(self, _("Preference saved"), _("No more notifications about version updates will be shown."))
|
QMessageBox.information(self, _("Preference saved"), _("No more notifications about version updates will be shown."))
|
||||||
self.dialog.done(0)
|
self.dialog.done(0)
|
||||||
|
|
||||||
def open_website(self):
|
def open_website(self):
|
||||||
webbrowser.open("http://electrum.org/download.html")
|
webbrowser.open("http://electrum.org/download.html")
|
||||||
self.dialog.done(0)
|
self.dialog.done(0)
|
||||||
|
@ -100,7 +100,7 @@ class UpdateLabel(QLabel):
|
||||||
|
|
||||||
main_layout = QGridLayout()
|
main_layout = QGridLayout()
|
||||||
main_layout.addWidget(QLabel(_("A new version of Electrum is available:")+" " + self.latest_version), 0,0,1,3)
|
main_layout.addWidget(QLabel(_("A new version of Electrum is available:")+" " + self.latest_version), 0,0,1,3)
|
||||||
|
|
||||||
ignore_version = QPushButton(_("Ignore this version"))
|
ignore_version = QPushButton(_("Ignore this version"))
|
||||||
ignore_version.clicked.connect(self.ignore_this_version)
|
ignore_version.clicked.connect(self.ignore_this_version)
|
||||||
|
|
||||||
|
@ -117,7 +117,5 @@ class UpdateLabel(QLabel):
|
||||||
dialog.setLayout(main_layout)
|
dialog.setLayout(main_layout)
|
||||||
|
|
||||||
self.dialog = dialog
|
self.dialog = dialog
|
||||||
|
|
||||||
if not dialog.exec_(): return
|
if not dialog.exec_(): return
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -224,7 +224,7 @@ class OldAccount(Account):
|
||||||
pk = number_to_string( secexp, generator_secp256k1.order() )
|
pk = number_to_string( secexp, generator_secp256k1.order() )
|
||||||
compressed = False
|
compressed = False
|
||||||
return SecretToASecret( pk, compressed )
|
return SecretToASecret( pk, compressed )
|
||||||
|
|
||||||
|
|
||||||
def get_private_key(self, sequence, wallet, password):
|
def get_private_key(self, sequence, wallet, password):
|
||||||
seed = wallet.get_seed(password)
|
seed = wallet.get_seed(password)
|
||||||
|
@ -417,7 +417,3 @@ class BIP32_Account_2of3(BIP32_Account_2of2):
|
||||||
|
|
||||||
def get_type(self):
|
def get_type(self):
|
||||||
return _('Multisig 2 of 3')
|
return _('Multisig 2 of 3')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ class Blockchain(threading.Thread):
|
||||||
self.set_local_height()
|
self.set_local_height()
|
||||||
self.queue = Queue.Queue()
|
self.queue = Queue.Queue()
|
||||||
|
|
||||||
|
|
||||||
def height(self):
|
def height(self):
|
||||||
return self.local_height
|
return self.local_height
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ class Blockchain(threading.Thread):
|
||||||
|
|
||||||
i, header = result
|
i, header = result
|
||||||
if not header: continue
|
if not header: continue
|
||||||
|
|
||||||
height = header.get('block_height')
|
height = header.get('block_height')
|
||||||
|
|
||||||
if height <= self.local_height:
|
if height <= self.local_height:
|
||||||
|
@ -83,10 +83,10 @@ class Blockchain(threading.Thread):
|
||||||
chain = self.get_chain( i, header )
|
chain = self.get_chain( i, header )
|
||||||
|
|
||||||
# skip that server if the result is not consistent
|
# skip that server if the result is not consistent
|
||||||
if not chain:
|
if not chain:
|
||||||
print_error('e')
|
print_error('e')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# verify the chain
|
# verify the chain
|
||||||
if self.verify_chain( chain ):
|
if self.verify_chain( chain ):
|
||||||
print_error("height:", height, i.server)
|
print_error("height:", height, i.server)
|
||||||
|
@ -101,13 +101,13 @@ class Blockchain(threading.Thread):
|
||||||
self.network.new_blockchain_height(height, i)
|
self.network.new_blockchain_height(height, i)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def verify_chain(self, chain):
|
def verify_chain(self, chain):
|
||||||
|
|
||||||
first_header = chain[0]
|
first_header = chain[0]
|
||||||
prev_header = self.read_header(first_header.get('block_height') -1)
|
prev_header = self.read_header(first_header.get('block_height') -1)
|
||||||
|
|
||||||
for header in chain:
|
for header in chain:
|
||||||
|
|
||||||
height = header.get('block_height')
|
height = header.get('block_height')
|
||||||
|
@ -133,7 +133,7 @@ class Blockchain(threading.Thread):
|
||||||
height = index*2016
|
height = index*2016
|
||||||
num = len(data)/80
|
num = len(data)/80
|
||||||
|
|
||||||
if index == 0:
|
if index == 0:
|
||||||
previous_hash = ("0"*64)
|
previous_hash = ("0"*64)
|
||||||
else:
|
else:
|
||||||
prev_header = self.read_header(index*2016-1)
|
prev_header = self.read_header(index*2016-1)
|
||||||
|
@ -152,12 +152,12 @@ class Blockchain(threading.Thread):
|
||||||
assert int('0x'+_hash,16) < target
|
assert int('0x'+_hash,16) < target
|
||||||
|
|
||||||
previous_header = header
|
previous_header = header
|
||||||
previous_hash = _hash
|
previous_hash = _hash
|
||||||
|
|
||||||
self.save_chunk(index, data)
|
self.save_chunk(index, data)
|
||||||
print_error("validated chunk %d"%height)
|
print_error("validated chunk %d"%height)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def header_to_string(self, res):
|
def header_to_string(self, res):
|
||||||
s = int_to_hex(res.get('version'),4) \
|
s = int_to_hex(res.get('version'),4) \
|
||||||
|
@ -190,7 +190,7 @@ class Blockchain(threading.Thread):
|
||||||
filename = self.path()
|
filename = self.path()
|
||||||
if os.path.exists(filename):
|
if os.path.exists(filename):
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import urllib, socket
|
import urllib, socket
|
||||||
socket.setdefaulttimeout(30)
|
socket.setdefaulttimeout(30)
|
||||||
|
@ -238,7 +238,7 @@ class Blockchain(threading.Thread):
|
||||||
f.close()
|
f.close()
|
||||||
if len(h) == 80:
|
if len(h) == 80:
|
||||||
h = self.header_from_string(h)
|
h = self.header_from_string(h)
|
||||||
return h
|
return h
|
||||||
|
|
||||||
|
|
||||||
def get_target(self, index, chain=None):
|
def get_target(self, index, chain=None):
|
||||||
|
@ -254,13 +254,13 @@ class Blockchain(threading.Thread):
|
||||||
for h in chain:
|
for h in chain:
|
||||||
if h.get('block_height') == index*2016-1:
|
if h.get('block_height') == index*2016-1:
|
||||||
last = h
|
last = h
|
||||||
|
|
||||||
nActualTimespan = last.get('timestamp') - first.get('timestamp')
|
nActualTimespan = last.get('timestamp') - first.get('timestamp')
|
||||||
nTargetTimespan = 14*24*60*60
|
nTargetTimespan = 14*24*60*60
|
||||||
nActualTimespan = max(nActualTimespan, nTargetTimespan/4)
|
nActualTimespan = max(nActualTimespan, nTargetTimespan/4)
|
||||||
nActualTimespan = min(nActualTimespan, nTargetTimespan*4)
|
nActualTimespan = min(nActualTimespan, nTargetTimespan*4)
|
||||||
|
|
||||||
bits = last.get('bits')
|
bits = last.get('bits')
|
||||||
# convert to bignum
|
# convert to bignum
|
||||||
MM = 256*256*256
|
MM = 256*256*256
|
||||||
a = bits%MM
|
a = bits%MM
|
||||||
|
@ -270,7 +270,7 @@ class Blockchain(threading.Thread):
|
||||||
|
|
||||||
# new target
|
# new target
|
||||||
new_target = min( max_target, (target * nActualTimespan)/nTargetTimespan )
|
new_target = min( max_target, (target * nActualTimespan)/nTargetTimespan )
|
||||||
|
|
||||||
# convert it to bits
|
# convert it to bits
|
||||||
c = ("%064X"%new_target)[2:]
|
c = ("%064X"%new_target)[2:]
|
||||||
i = 31
|
i = 31
|
||||||
|
@ -279,7 +279,7 @@ class Blockchain(threading.Thread):
|
||||||
i -= 1
|
i -= 1
|
||||||
|
|
||||||
c = int('0x'+c[0:6],16)
|
c = int('0x'+c[0:6],16)
|
||||||
if c >= 0x800000:
|
if c >= 0x800000:
|
||||||
c /= 256
|
c /= 256
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
|
@ -357,4 +357,3 @@ class Blockchain(threading.Thread):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
61
lib/bmp.py
61
lib/bmp.py
|
@ -23,7 +23,7 @@ bmp.py - module for constructing simple BMP graphics files
|
||||||
|
|
||||||
"""
|
"""
|
||||||
__version__ = "0.3"
|
__version__ = "0.3"
|
||||||
__about = "bmp module, version %s, written by Paul McGuire, October, 2003, updated by Margus Laak, September, 2009" % __version__
|
__about = "bmp module, version %s, written by Paul McGuire, October, 2003, updated by Margus Laak, September, 2009" % __version__
|
||||||
|
|
||||||
from math import ceil, hypot
|
from math import ceil, hypot
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ class Color(object):
|
||||||
"""class for specifying colors while drawing BitMap elements"""
|
"""class for specifying colors while drawing BitMap elements"""
|
||||||
__slots__ = [ 'red', 'grn', 'blu' ]
|
__slots__ = [ 'red', 'grn', 'blu' ]
|
||||||
__shade = 32
|
__shade = 32
|
||||||
|
|
||||||
def __init__( self, r=0, g=0, b=0 ):
|
def __init__( self, r=0, g=0, b=0 ):
|
||||||
self.red = r
|
self.red = r
|
||||||
self.grn = g
|
self.grn = g
|
||||||
|
@ -65,32 +65,32 @@ class Color(object):
|
||||||
|
|
||||||
def __str__( self ):
|
def __str__( self ):
|
||||||
return "R:%d G:%d B:%d" % (self.red, self.grn, self.blu )
|
return "R:%d G:%d B:%d" % (self.red, self.grn, self.blu )
|
||||||
|
|
||||||
def __hash__( self ):
|
def __hash__( self ):
|
||||||
return ( ( long(self.blu) ) +
|
return ( ( long(self.blu) ) +
|
||||||
( long(self.grn) << 8 ) +
|
( long(self.grn) << 8 ) +
|
||||||
( long(self.red) << 16 ) )
|
( long(self.red) << 16 ) )
|
||||||
|
|
||||||
def __eq__( self, other ):
|
def __eq__( self, other ):
|
||||||
return (self is other) or (self.toLong == other.toLong)
|
return (self is other) or (self.toLong == other.toLong)
|
||||||
|
|
||||||
def lighten( self ):
|
def lighten( self ):
|
||||||
return Color(
|
return Color(
|
||||||
min( self.red + Color.__shade, 255),
|
min( self.red + Color.__shade, 255),
|
||||||
min( self.grn + Color.__shade, 255),
|
min( self.grn + Color.__shade, 255),
|
||||||
min( self.blu + Color.__shade, 255)
|
min( self.blu + Color.__shade, 255)
|
||||||
)
|
)
|
||||||
|
|
||||||
def darken( self ):
|
def darken( self ):
|
||||||
return Color(
|
return Color(
|
||||||
max( self.red - Color.__shade, 0),
|
max( self.red - Color.__shade, 0),
|
||||||
max( self.grn - Color.__shade, 0),
|
max( self.grn - Color.__shade, 0),
|
||||||
max( self.blu - Color.__shade, 0)
|
max( self.blu - Color.__shade, 0)
|
||||||
)
|
)
|
||||||
|
|
||||||
def toLong( self ):
|
def toLong( self ):
|
||||||
return self.__hash__()
|
return self.__hash__()
|
||||||
|
|
||||||
def fromLong( l ):
|
def fromLong( l ):
|
||||||
b = l & 0xff
|
b = l & 0xff
|
||||||
l = l >> 8
|
l = l >> 8
|
||||||
|
@ -120,7 +120,7 @@ Color.GRAY = Color( 128, 128, 128 )
|
||||||
|
|
||||||
class BitMap(object):
|
class BitMap(object):
|
||||||
"""class for drawing and saving simple Windows bitmap files"""
|
"""class for drawing and saving simple Windows bitmap files"""
|
||||||
|
|
||||||
LINE_SOLID = 0
|
LINE_SOLID = 0
|
||||||
LINE_DASHED = 1
|
LINE_DASHED = 1
|
||||||
LINE_DOTTED = 2
|
LINE_DOTTED = 2
|
||||||
|
@ -128,8 +128,8 @@ class BitMap(object):
|
||||||
_DASH_LEN = 12.0
|
_DASH_LEN = 12.0
|
||||||
_DOT_LEN = 6.0
|
_DOT_LEN = 6.0
|
||||||
_DOT_DASH_LEN = _DOT_LEN + _DASH_LEN
|
_DOT_DASH_LEN = _DOT_LEN + _DASH_LEN
|
||||||
|
|
||||||
def __init__( self, width, height,
|
def __init__( self, width, height,
|
||||||
bkgd = Color.WHITE, frgd = Color.BLACK ):
|
bkgd = Color.WHITE, frgd = Color.BLACK ):
|
||||||
self.wd = int( ceil(width) )
|
self.wd = int( ceil(width) )
|
||||||
self.ht = int( ceil(height) )
|
self.ht = int( ceil(height) )
|
||||||
|
@ -143,18 +143,18 @@ class BitMap(object):
|
||||||
tmparray = [ self.bgcolor ] * self.wd
|
tmparray = [ self.bgcolor ] * self.wd
|
||||||
self.bitarray = [ tmparray[:] for i in range( self.ht ) ]
|
self.bitarray = [ tmparray[:] for i in range( self.ht ) ]
|
||||||
self.currentPen = 1
|
self.currentPen = 1
|
||||||
|
|
||||||
|
|
||||||
def plotPoint( self, x, y ):
|
def plotPoint( self, x, y ):
|
||||||
if ( 0 <= x < self.wd and 0 <= y < self.ht ):
|
if ( 0 <= x < self.wd and 0 <= y < self.ht ):
|
||||||
x = int(x)
|
x = int(x)
|
||||||
y = int(y)
|
y = int(y)
|
||||||
self.bitarray[y][x] = self.currentPen
|
self.bitarray[y][x] = self.currentPen
|
||||||
|
|
||||||
|
|
||||||
def _saveBitMapNoCompression( self ):
|
def _saveBitMapNoCompression( self ):
|
||||||
line_padding = (4 - (self.wd % 4)) % 4
|
line_padding = (4 - (self.wd % 4)) % 4
|
||||||
|
|
||||||
# write bitmap header
|
# write bitmap header
|
||||||
_bitmap = "BM"
|
_bitmap = "BM"
|
||||||
_bitmap += longToString( 54 + self.ht*(self.wd*3 + line_padding) ) # DWORD size in bytes of the file
|
_bitmap += longToString( 54 + self.ht*(self.wd*3 + line_padding) ) # DWORD size in bytes of the file
|
||||||
|
@ -183,15 +183,15 @@ class BitMap(object):
|
||||||
|
|
||||||
return _bitmap
|
return _bitmap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def saveFile( self, filename):
|
def saveFile( self, filename):
|
||||||
_b = self._saveBitMapNoCompression( )
|
_b = self._saveBitMapNoCompression( )
|
||||||
|
|
||||||
f = file(filename, 'wb')
|
f = file(filename, 'wb')
|
||||||
f.write(_b)
|
f.write(_b)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
|
||||||
def save_qrcode(qr, filename):
|
def save_qrcode(qr, filename):
|
||||||
matrix = qr.get_matrix()
|
matrix = qr.get_matrix()
|
||||||
|
@ -211,12 +211,11 @@ def save_qrcode(qr, filename):
|
||||||
|
|
||||||
bitmap.saveFile( filename )
|
bitmap.saveFile( filename )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
bmp = BitMap( 10, 10 )
|
bmp = BitMap( 10, 10 )
|
||||||
bmp.plotPoint( 5, 5 )
|
bmp.plotPoint( 5, 5 )
|
||||||
bmp.plotPoint( 0, 0 )
|
bmp.plotPoint( 0, 0 )
|
||||||
bmp.saveFile( "test.bmp" )
|
bmp.saveFile( "test.bmp" )
|
||||||
|
|
||||||
|
|
|
@ -33,8 +33,8 @@ def _(x):
|
||||||
def set_language(x):
|
def set_language(x):
|
||||||
global language
|
global language
|
||||||
if x: language = gettext.translation('electrum', LOCALE_DIR, fallback = True, languages=[x])
|
if x: language = gettext.translation('electrum', LOCALE_DIR, fallback = True, languages=[x])
|
||||||
|
|
||||||
|
|
||||||
languages = {
|
languages = {
|
||||||
'':_('Default'),
|
'':_('Default'),
|
||||||
'pt_PT':_('Portuguese'),
|
'pt_PT':_('Portuguese'),
|
||||||
|
|
|
@ -252,7 +252,7 @@ class TcpInterface(threading.Thread):
|
||||||
os.rename(temporary_path, cert_path)
|
os.rename(temporary_path, cert_path)
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
def send_request(self, request, queue=None):
|
def send_request(self, request, queue=None):
|
||||||
_id = request.get('id')
|
_id = request.get('id')
|
||||||
|
@ -273,7 +273,7 @@ class TcpInterface(threading.Thread):
|
||||||
|
|
||||||
def parse_proxy_options(self, s):
|
def parse_proxy_options(self, s):
|
||||||
if type(s) == type({}): return s # fixme: type should be fixed
|
if type(s) == type({}): return s # fixme: type should be fixed
|
||||||
if type(s) != type(""): return None
|
if type(s) != type(""): return None
|
||||||
if s.lower() == 'none': return None
|
if s.lower() == 'none': return None
|
||||||
proxy = { "mode":"socks5", "host":"localhost" }
|
proxy = { "mode":"socks5", "host":"localhost" }
|
||||||
args = s.split(':')
|
args = s.split(':')
|
||||||
|
@ -355,7 +355,7 @@ class HttpInterface(TcpInterface):
|
||||||
def send_request(self, request, queue=None):
|
def send_request(self, request, queue=None):
|
||||||
import urllib2, json, time, cookielib
|
import urllib2, json, time, cookielib
|
||||||
print_error( "send_http", messages )
|
print_error( "send_http", messages )
|
||||||
|
|
||||||
if self.proxy:
|
if self.proxy:
|
||||||
socks.setdefaultproxy(self.proxy_mode, self.proxy["host"], int(self.proxy["port"]) )
|
socks.setdefaultproxy(self.proxy_mode, self.proxy["host"], int(self.proxy["port"]) )
|
||||||
socks.wrapmodule(urllib2)
|
socks.wrapmodule(urllib2)
|
||||||
|
@ -380,9 +380,9 @@ class HttpInterface(TcpInterface):
|
||||||
data_json = json.dumps(data)
|
data_json = json.dumps(data)
|
||||||
else:
|
else:
|
||||||
# poll with GET
|
# poll with GET
|
||||||
data_json = None
|
data_json = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
headers = {'content-type': 'application/json'}
|
headers = {'content-type': 'application/json'}
|
||||||
if self.session_id:
|
if self.session_id:
|
||||||
headers['cookie'] = 'SESSION=%s'%self.session_id
|
headers['cookie'] = 'SESSION=%s'%self.session_id
|
||||||
|
@ -399,17 +399,17 @@ class HttpInterface(TcpInterface):
|
||||||
|
|
||||||
response = response_stream.read()
|
response = response_stream.read()
|
||||||
self.bytes_received += len(response)
|
self.bytes_received += len(response)
|
||||||
if response:
|
if response:
|
||||||
response = json.loads( response )
|
response = json.loads( response )
|
||||||
if type(response) is not type([]):
|
if type(response) is not type([]):
|
||||||
self.process_response(response)
|
self.process_response(response)
|
||||||
else:
|
else:
|
||||||
for item in response:
|
for item in response:
|
||||||
self.process_response(item)
|
self.process_response(item)
|
||||||
if response:
|
if response:
|
||||||
self.poll_interval = 1
|
self.poll_interval = 1
|
||||||
else:
|
else:
|
||||||
if self.poll_interval < 15:
|
if self.poll_interval < 15:
|
||||||
self.poll_interval += 1
|
self.poll_interval += 1
|
||||||
#print self.poll_interval, response
|
#print self.poll_interval, response
|
||||||
self.rtime = time.time() - t1
|
self.rtime = time.time() - t1
|
||||||
|
@ -454,7 +454,7 @@ class HttpInterface(TcpInterface):
|
||||||
except Exception:
|
except Exception:
|
||||||
traceback.print_exc(file=sys.stdout)
|
traceback.print_exc(file=sys.stdout)
|
||||||
break
|
break
|
||||||
|
|
||||||
self.is_connected = False
|
self.is_connected = False
|
||||||
|
|
||||||
|
|
||||||
|
|
24
lib/msqr.py
24
lib/msqr.py
|
@ -3,14 +3,14 @@
|
||||||
def modular_sqrt(a, p):
|
def modular_sqrt(a, p):
|
||||||
""" Find a quadratic residue (mod p) of 'a'. p
|
""" Find a quadratic residue (mod p) of 'a'. p
|
||||||
must be an odd prime.
|
must be an odd prime.
|
||||||
|
|
||||||
Solve the congruence of the form:
|
Solve the congruence of the form:
|
||||||
x^2 = a (mod p)
|
x^2 = a (mod p)
|
||||||
And returns x. Note that p - x is also a root.
|
And returns x. Note that p - x is also a root.
|
||||||
|
|
||||||
0 is returned is no square root exists for
|
0 is returned is no square root exists for
|
||||||
these a and p.
|
these a and p.
|
||||||
|
|
||||||
The Tonelli-Shanks algorithm is used (except
|
The Tonelli-Shanks algorithm is used (except
|
||||||
for some simple cases in which the solution
|
for some simple cases in which the solution
|
||||||
is known from an identity). This algorithm
|
is known from an identity). This algorithm
|
||||||
|
@ -27,7 +27,7 @@ def modular_sqrt(a, p):
|
||||||
return p
|
return p
|
||||||
elif p % 4 == 3:
|
elif p % 4 == 3:
|
||||||
return pow(a, (p + 1) / 4, p)
|
return pow(a, (p + 1) / 4, p)
|
||||||
|
|
||||||
# Partition p-1 to s * 2^e for an odd s (i.e.
|
# Partition p-1 to s * 2^e for an odd s (i.e.
|
||||||
# reduce all the powers of 2 from p-1)
|
# reduce all the powers of 2 from p-1)
|
||||||
#
|
#
|
||||||
|
@ -36,20 +36,20 @@ def modular_sqrt(a, p):
|
||||||
while s % 2 == 0:
|
while s % 2 == 0:
|
||||||
s /= 2
|
s /= 2
|
||||||
e += 1
|
e += 1
|
||||||
|
|
||||||
# Find some 'n' with a legendre symbol n|p = -1.
|
# Find some 'n' with a legendre symbol n|p = -1.
|
||||||
# Shouldn't take long.
|
# Shouldn't take long.
|
||||||
#
|
#
|
||||||
n = 2
|
n = 2
|
||||||
while legendre_symbol(n, p) != -1:
|
while legendre_symbol(n, p) != -1:
|
||||||
n += 1
|
n += 1
|
||||||
|
|
||||||
# Here be dragons!
|
# Here be dragons!
|
||||||
# Read the paper "Square roots from 1; 24, 51,
|
# Read the paper "Square roots from 1; 24, 51,
|
||||||
# 10 to Dan Shanks" by Ezra Brown for more
|
# 10 to Dan Shanks" by Ezra Brown for more
|
||||||
# information
|
# information
|
||||||
#
|
#
|
||||||
|
|
||||||
# x is a guess of the square root that gets better
|
# x is a guess of the square root that gets better
|
||||||
# with each iteration.
|
# with each iteration.
|
||||||
# b is the "fudge factor" - by how much we're off
|
# b is the "fudge factor" - by how much we're off
|
||||||
|
@ -63,7 +63,7 @@ def modular_sqrt(a, p):
|
||||||
b = pow(a, s, p)
|
b = pow(a, s, p)
|
||||||
g = pow(n, s, p)
|
g = pow(n, s, p)
|
||||||
r = e
|
r = e
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
t = b
|
t = b
|
||||||
m = 0
|
m = 0
|
||||||
|
@ -71,22 +71,22 @@ def modular_sqrt(a, p):
|
||||||
if t == 1:
|
if t == 1:
|
||||||
break
|
break
|
||||||
t = pow(t, 2, p)
|
t = pow(t, 2, p)
|
||||||
|
|
||||||
if m == 0:
|
if m == 0:
|
||||||
return x
|
return x
|
||||||
|
|
||||||
gs = pow(g, 2 ** (r - m - 1), p)
|
gs = pow(g, 2 ** (r - m - 1), p)
|
||||||
g = (gs * gs) % p
|
g = (gs * gs) % p
|
||||||
x = (x * gs) % p
|
x = (x * gs) % p
|
||||||
b = (b * g) % p
|
b = (b * g) % p
|
||||||
r = m
|
r = m
|
||||||
|
|
||||||
def legendre_symbol(a, p):
|
def legendre_symbol(a, p):
|
||||||
""" Compute the Legendre symbol a|p using
|
""" Compute the Legendre symbol a|p using
|
||||||
Euler's criterion. p is a prime, a is
|
Euler's criterion. p is a prime, a is
|
||||||
relatively prime to p (if p divides
|
relatively prime to p (if p divides
|
||||||
a, then a|p = 0)
|
a, then a|p = 0)
|
||||||
|
|
||||||
Returns 1 if a has a square root modulo
|
Returns 1 if a has a square root modulo
|
||||||
p, -1 otherwise.
|
p, -1 otherwise.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -46,7 +46,7 @@ def parse_servers(result):
|
||||||
elif re.match("p\d*", v):
|
elif re.match("p\d*", v):
|
||||||
pruning_level = v[1:]
|
pruning_level = v[1:]
|
||||||
if pruning_level == '': pruning_level = '0'
|
if pruning_level == '': pruning_level = '0'
|
||||||
try:
|
try:
|
||||||
is_recent = float(version)>=float(PROTOCOL_VERSION)
|
is_recent = float(version)>=float(PROTOCOL_VERSION)
|
||||||
except Exception:
|
except Exception:
|
||||||
is_recent = False
|
is_recent = False
|
||||||
|
@ -65,7 +65,7 @@ def filter_protocol(servers, p):
|
||||||
if p in protocols:
|
if p in protocols:
|
||||||
l.append( ':'.join([k, protocols[p], p]) )
|
l.append( ':'.join([k, protocols[p], p]) )
|
||||||
return l
|
return l
|
||||||
|
|
||||||
|
|
||||||
def pick_random_server(p='s'):
|
def pick_random_server(p='s'):
|
||||||
return random.choice( filter_protocol(DEFAULT_SERVERS,p) )
|
return random.choice( filter_protocol(DEFAULT_SERVERS,p) )
|
||||||
|
@ -115,7 +115,7 @@ class Network(threading.Thread):
|
||||||
os.mkdir(dir_path)
|
os.mkdir(dir_path)
|
||||||
|
|
||||||
# address subscriptions and cached results
|
# address subscriptions and cached results
|
||||||
self.addresses = {}
|
self.addresses = {}
|
||||||
self.connection_status = 'connecting'
|
self.connection_status = 'connecting'
|
||||||
self.requests_queue = Queue.Queue()
|
self.requests_queue = Queue.Queue()
|
||||||
|
|
||||||
|
@ -169,10 +169,10 @@ class Network(threading.Thread):
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
choice_list.append(s)
|
choice_list.append(s)
|
||||||
|
|
||||||
if not choice_list:
|
if not choice_list:
|
||||||
return
|
return
|
||||||
|
|
||||||
server = random.choice( choice_list )
|
server = random.choice( choice_list )
|
||||||
return server
|
return server
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ class Network(threading.Thread):
|
||||||
|
|
||||||
def get_servers(self):
|
def get_servers(self):
|
||||||
if self.irc_servers:
|
if self.irc_servers:
|
||||||
out = self.irc_servers
|
out = self.irc_servers
|
||||||
else:
|
else:
|
||||||
out = DEFAULT_SERVERS
|
out = DEFAULT_SERVERS
|
||||||
for s in self.recent_servers:
|
for s in self.recent_servers:
|
||||||
|
@ -213,7 +213,7 @@ class Network(threading.Thread):
|
||||||
self.interface = self.start_interface(self.default_server)
|
self.interface = self.start_interface(self.default_server)
|
||||||
for i in range(self.num_server):
|
for i in range(self.num_server):
|
||||||
self.start_random_interface()
|
self.start_random_interface()
|
||||||
|
|
||||||
def start(self, response_queue):
|
def start(self, response_queue):
|
||||||
self.running = True
|
self.running = True
|
||||||
self.response_queue = response_queue
|
self.response_queue = response_queue
|
||||||
|
@ -269,7 +269,7 @@ class Network(threading.Thread):
|
||||||
|
|
||||||
|
|
||||||
def stop_interface(self):
|
def stop_interface(self):
|
||||||
self.interface.stop()
|
self.interface.stop()
|
||||||
|
|
||||||
|
|
||||||
def set_server(self, server):
|
def set_server(self, server):
|
||||||
|
@ -293,7 +293,7 @@ class Network(threading.Thread):
|
||||||
self.switch_to_interface( self.interfaces[server] )
|
self.switch_to_interface( self.interfaces[server] )
|
||||||
else:
|
else:
|
||||||
self.interface = self.start_interface(server)
|
self.interface = self.start_interface(server)
|
||||||
|
|
||||||
|
|
||||||
def add_recent_server(self, i):
|
def add_recent_server(self, i):
|
||||||
# list is ordered
|
# list is ordered
|
||||||
|
@ -366,7 +366,7 @@ class Network(threading.Thread):
|
||||||
if method == 'blockchain.address.subscribe':
|
if method == 'blockchain.address.subscribe':
|
||||||
addr = params[0]
|
addr = params[0]
|
||||||
if addr in self.addresses:
|
if addr in self.addresses:
|
||||||
self.response_queue.put({'id':_id, 'result':self.addresses[addr]})
|
self.response_queue.put({'id':_id, 'result':self.addresses[addr]})
|
||||||
return
|
return
|
||||||
|
|
||||||
self.interface.send_request(request)
|
self.interface.send_request(request)
|
||||||
|
@ -393,7 +393,7 @@ class Network(threading.Thread):
|
||||||
self.disconnected_time = time.time()
|
self.disconnected_time = time.time()
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if response is not None:
|
if response is not None:
|
||||||
self.process_response(i, response)
|
self.process_response(i, response)
|
||||||
continue
|
continue
|
||||||
|
@ -484,5 +484,3 @@ class Network(threading.Thread):
|
||||||
|
|
||||||
def get_local_height(self):
|
def get_local_height(self):
|
||||||
return self.blockchain.height()
|
return self.blockchain.height()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,7 @@ class NetworkProxy(threading.Thread):
|
||||||
print_error("NetworkProxy: terminating")
|
print_error("NetworkProxy: terminating")
|
||||||
|
|
||||||
def process(self, response):
|
def process(self, response):
|
||||||
if self.debug:
|
if self.debug:
|
||||||
print_error("<--", response)
|
print_error("<--", response)
|
||||||
|
|
||||||
if response.get('method') == 'network.status':
|
if response.get('method') == 'network.status':
|
||||||
|
@ -125,7 +125,7 @@ class NetworkProxy(threading.Thread):
|
||||||
print_error( "received unexpected notification", method, params)
|
print_error( "received unexpected notification", method, params)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
r = {'method':method, 'params':params, 'result':result, 'id':msg_id, 'error':error}
|
r = {'method':method, 'params':params, 'result':result, 'id':msg_id, 'error':error}
|
||||||
callback(r)
|
callback(r)
|
||||||
|
|
||||||
|
@ -141,7 +141,7 @@ class NetworkProxy(threading.Thread):
|
||||||
sub.append(message)
|
sub.append(message)
|
||||||
if sub:
|
if sub:
|
||||||
with self.lock:
|
with self.lock:
|
||||||
if self.subscriptions.get(callback) is None:
|
if self.subscriptions.get(callback) is None:
|
||||||
self.subscriptions[callback] = []
|
self.subscriptions[callback] = []
|
||||||
for message in sub:
|
for message in sub:
|
||||||
if message not in self.subscriptions[callback]:
|
if message not in self.subscriptions[callback]:
|
||||||
|
@ -151,12 +151,12 @@ class NetworkProxy(threading.Thread):
|
||||||
requests = []
|
requests = []
|
||||||
ids = []
|
ids = []
|
||||||
for m in messages:
|
for m in messages:
|
||||||
method, params = m
|
method, params = m
|
||||||
request = { 'id':self.message_id, 'method':method, 'params':params }
|
request = { 'id':self.message_id, 'method':method, 'params':params }
|
||||||
self.unanswered_requests[self.message_id] = method, params, callback
|
self.unanswered_requests[self.message_id] = method, params, callback
|
||||||
ids.append(self.message_id)
|
ids.append(self.message_id)
|
||||||
requests.append(request)
|
requests.append(request)
|
||||||
if self.debug:
|
if self.debug:
|
||||||
print_error("-->", request)
|
print_error("-->", request)
|
||||||
self.message_id += 1
|
self.message_id += 1
|
||||||
|
|
||||||
|
@ -230,4 +230,3 @@ class NetworkProxy(threading.Thread):
|
||||||
callbacks = self.callbacks.get(event,[])[:]
|
callbacks = self.callbacks.get(event,[])[:]
|
||||||
if callbacks:
|
if callbacks:
|
||||||
[callback() for callback in callbacks]
|
[callback() for callback in callbacks]
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,7 @@ class PaymentRequest:
|
||||||
paymntreq = self.data
|
paymntreq = self.data
|
||||||
if not paymntreq.signature:
|
if not paymntreq.signature:
|
||||||
self.error = "No signature"
|
self.error = "No signature"
|
||||||
return
|
return
|
||||||
|
|
||||||
cert = paymentrequest_pb2.X509Certificates()
|
cert = paymentrequest_pb2.X509Certificates()
|
||||||
cert.ParseFromString(paymntreq.pki_data)
|
cert.ParseFromString(paymntreq.pki_data)
|
||||||
|
@ -199,7 +199,7 @@ class PaymentRequest:
|
||||||
prefixBytes = bytearray([0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20])
|
prefixBytes = bytearray([0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20])
|
||||||
verify = pubkey.verify(sig, prefixBytes + hashBytes)
|
verify = pubkey.verify(sig, prefixBytes + hashBytes)
|
||||||
else:
|
else:
|
||||||
self.error = "Algorithm not supported"
|
self.error = "Algorithm not supported"
|
||||||
util.print_error(self.error, algo.getComponentByName('algorithm'))
|
util.print_error(self.error, algo.getComponentByName('algorithm'))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -352,4 +352,3 @@ if __name__ == "__main__":
|
||||||
|
|
||||||
tx = "blah"
|
tx = "blah"
|
||||||
pr.send_ack(tx, refund_addr = "1vXAXUnGitimzinpXrqDWVU4tyAAQ34RA")
|
pr.send_ack(tx, refund_addr = "1vXAXUnGitimzinpXrqDWVU4tyAAQ34RA")
|
||||||
|
|
||||||
|
|
|
@ -301,37 +301,37 @@ DESCRIPTOR.message_types_by_name['PaymentACK'] = _PAYMENTACK
|
||||||
class Output(message.Message):
|
class Output(message.Message):
|
||||||
__metaclass__ = reflection.GeneratedProtocolMessageType
|
__metaclass__ = reflection.GeneratedProtocolMessageType
|
||||||
DESCRIPTOR = _OUTPUT
|
DESCRIPTOR = _OUTPUT
|
||||||
|
|
||||||
# @@protoc_insertion_point(class_scope:payments.Output)
|
# @@protoc_insertion_point(class_scope:payments.Output)
|
||||||
|
|
||||||
class PaymentDetails(message.Message):
|
class PaymentDetails(message.Message):
|
||||||
__metaclass__ = reflection.GeneratedProtocolMessageType
|
__metaclass__ = reflection.GeneratedProtocolMessageType
|
||||||
DESCRIPTOR = _PAYMENTDETAILS
|
DESCRIPTOR = _PAYMENTDETAILS
|
||||||
|
|
||||||
# @@protoc_insertion_point(class_scope:payments.PaymentDetails)
|
# @@protoc_insertion_point(class_scope:payments.PaymentDetails)
|
||||||
|
|
||||||
class PaymentRequest(message.Message):
|
class PaymentRequest(message.Message):
|
||||||
__metaclass__ = reflection.GeneratedProtocolMessageType
|
__metaclass__ = reflection.GeneratedProtocolMessageType
|
||||||
DESCRIPTOR = _PAYMENTREQUEST
|
DESCRIPTOR = _PAYMENTREQUEST
|
||||||
|
|
||||||
# @@protoc_insertion_point(class_scope:payments.PaymentRequest)
|
# @@protoc_insertion_point(class_scope:payments.PaymentRequest)
|
||||||
|
|
||||||
class X509Certificates(message.Message):
|
class X509Certificates(message.Message):
|
||||||
__metaclass__ = reflection.GeneratedProtocolMessageType
|
__metaclass__ = reflection.GeneratedProtocolMessageType
|
||||||
DESCRIPTOR = _X509CERTIFICATES
|
DESCRIPTOR = _X509CERTIFICATES
|
||||||
|
|
||||||
# @@protoc_insertion_point(class_scope:payments.X509Certificates)
|
# @@protoc_insertion_point(class_scope:payments.X509Certificates)
|
||||||
|
|
||||||
class Payment(message.Message):
|
class Payment(message.Message):
|
||||||
__metaclass__ = reflection.GeneratedProtocolMessageType
|
__metaclass__ = reflection.GeneratedProtocolMessageType
|
||||||
DESCRIPTOR = _PAYMENT
|
DESCRIPTOR = _PAYMENT
|
||||||
|
|
||||||
# @@protoc_insertion_point(class_scope:payments.Payment)
|
# @@protoc_insertion_point(class_scope:payments.Payment)
|
||||||
|
|
||||||
class PaymentACK(message.Message):
|
class PaymentACK(message.Message):
|
||||||
__metaclass__ = reflection.GeneratedProtocolMessageType
|
__metaclass__ = reflection.GeneratedProtocolMessageType
|
||||||
DESCRIPTOR = _PAYMENTACK
|
DESCRIPTOR = _PAYMENTACK
|
||||||
|
|
||||||
# @@protoc_insertion_point(class_scope:payments.PaymentACK)
|
# @@protoc_insertion_point(class_scope:payments.PaymentACK)
|
||||||
|
|
||||||
# @@protoc_insertion_point(module_scope)
|
# @@protoc_insertion_point(module_scope)
|
||||||
|
|
|
@ -81,7 +81,7 @@ class BasePlugin:
|
||||||
|
|
||||||
def requires_settings(self):
|
def requires_settings(self):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def enable(self):
|
def enable(self):
|
||||||
self.set_enabled(True)
|
self.set_enabled(True)
|
||||||
return True
|
return True
|
||||||
|
@ -109,4 +109,3 @@ class BasePlugin:
|
||||||
|
|
||||||
def settings_dialog(self):
|
def settings_dialog(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ def scan_qr(config):
|
||||||
if str(r.type) != 'QRCODE':
|
if str(r.type) != 'QRCODE':
|
||||||
continue
|
continue
|
||||||
return r.data
|
return r.data
|
||||||
|
|
||||||
|
|
||||||
def _find_system_cameras():
|
def _find_system_cameras():
|
||||||
device_root = "/sys/class/video4linux"
|
device_root = "/sys/class/video4linux"
|
||||||
|
|
|
@ -51,27 +51,27 @@ class RIPEMD160:
|
||||||
"""Return a new RIPEMD160 object. An optional string argument
|
"""Return a new RIPEMD160 object. An optional string argument
|
||||||
may be provided; if present, this string will be automatically
|
may be provided; if present, this string will be automatically
|
||||||
hashed."""
|
hashed."""
|
||||||
|
|
||||||
def __init__(self, arg=None):
|
def __init__(self, arg=None):
|
||||||
self.ctx = RMDContext()
|
self.ctx = RMDContext()
|
||||||
if arg:
|
if arg:
|
||||||
self.update(arg)
|
self.update(arg)
|
||||||
self.dig = None
|
self.dig = None
|
||||||
|
|
||||||
def update(self, arg):
|
def update(self, arg):
|
||||||
"""update(arg)"""
|
"""update(arg)"""
|
||||||
RMD160Update(self.ctx, arg, len(arg))
|
RMD160Update(self.ctx, arg, len(arg))
|
||||||
self.dig = None
|
self.dig = None
|
||||||
|
|
||||||
def digest(self):
|
def digest(self):
|
||||||
"""digest()"""
|
"""digest()"""
|
||||||
if self.dig:
|
if self.dig:
|
||||||
return self.dig
|
return self.dig
|
||||||
ctx = self.ctx.copy()
|
ctx = self.ctx.copy()
|
||||||
self.dig = RMD160Final(self.ctx)
|
self.dig = RMD160Final(self.ctx)
|
||||||
self.ctx = ctx
|
self.ctx = ctx
|
||||||
return self.dig
|
return self.dig
|
||||||
|
|
||||||
def hexdigest(self):
|
def hexdigest(self):
|
||||||
"""hexdigest()"""
|
"""hexdigest()"""
|
||||||
dig = self.digest()
|
dig = self.digest()
|
||||||
|
@ -79,9 +79,9 @@ class RIPEMD160:
|
||||||
for d in dig:
|
for d in dig:
|
||||||
hex_digest += '%02x' % ord(d)
|
hex_digest += '%02x' % ord(d)
|
||||||
return hex_digest
|
return hex_digest
|
||||||
|
|
||||||
def copy(self):
|
def copy(self):
|
||||||
"""copy()"""
|
"""copy()"""
|
||||||
import copy
|
import copy
|
||||||
return copy.deepcopy(self)
|
return copy.deepcopy(self)
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ class RIPEMD160:
|
||||||
def new(arg=None):
|
def new(arg=None):
|
||||||
"""Return a new RIPEMD160 object. An optional string argument
|
"""Return a new RIPEMD160 object. An optional string argument
|
||||||
may be provided; if present, this string will be automatically
|
may be provided; if present, this string will be automatically
|
||||||
hashed."""
|
hashed."""
|
||||||
return RIPEMD160(arg)
|
return RIPEMD160(arg)
|
||||||
|
|
||||||
|
|
||||||
|
@ -260,7 +260,7 @@ def RMD160Transform(state, block): #uint32 state[5], uchar block[64]
|
||||||
b = state[1]
|
b = state[1]
|
||||||
c = state[2]
|
c = state[2]
|
||||||
d = state[3]
|
d = state[3]
|
||||||
e = state[4]
|
e = state[4]
|
||||||
|
|
||||||
#/* Parallel round 1 */
|
#/* Parallel round 1 */
|
||||||
a, c = R(a, b, c, d, e, F4, KK0, 8, 5, x)
|
a, c = R(a, b, c, d, e, F4, KK0, 8, 5, x)
|
||||||
|
@ -361,7 +361,7 @@ def RMD160Transform(state, block): #uint32 state[5], uchar block[64]
|
||||||
def RMD160Update(ctx, inp, inplen):
|
def RMD160Update(ctx, inp, inplen):
|
||||||
if type(inp) == str:
|
if type(inp) == str:
|
||||||
inp = [ord(i)&0xff for i in inp]
|
inp = [ord(i)&0xff for i in inp]
|
||||||
|
|
||||||
have = (ctx.count / 8) % 64
|
have = (ctx.count / 8) % 64
|
||||||
need = 64 - have
|
need = 64 - have
|
||||||
ctx.count += 8 * inplen
|
ctx.count += 8 * inplen
|
||||||
|
|
|
@ -166,11 +166,11 @@ class WalletSynchronizer(threading.Thread):
|
||||||
rs = requested_histories.pop(addr)
|
rs = requested_histories.pop(addr)
|
||||||
if self.wallet.get_status(hist) != rs:
|
if self.wallet.get_status(hist) != rs:
|
||||||
raise Exception("error: status mismatch: %s"%addr)
|
raise Exception("error: status mismatch: %s"%addr)
|
||||||
|
|
||||||
# store received history
|
# store received history
|
||||||
self.wallet.receive_history_callback(addr, hist)
|
self.wallet.receive_history_callback(addr, hist)
|
||||||
|
|
||||||
# request transactions that we don't have
|
# request transactions that we don't have
|
||||||
for tx_hash, tx_height in hist:
|
for tx_hash, tx_height in hist:
|
||||||
if self.wallet.transactions.get(tx_hash) is None:
|
if self.wallet.transactions.get(tx_hash) is None:
|
||||||
if (tx_hash, tx_height) not in requested_tx and (tx_hash, tx_height) not in missing_tx:
|
if (tx_hash, tx_height) not in requested_tx and (tx_hash, tx_height) not in missing_tx:
|
||||||
|
@ -192,6 +192,5 @@ class WalletSynchronizer(threading.Thread):
|
||||||
if self.was_updated and not requested_tx:
|
if self.was_updated and not requested_tx:
|
||||||
self.network.trigger_callback('updated')
|
self.network.trigger_callback('updated')
|
||||||
# Updated gets called too many times from other places as well; if we use that signal we get the notification three times
|
# Updated gets called too many times from other places as well; if we use that signal we get the notification three times
|
||||||
self.network.trigger_callback("new_transaction")
|
self.network.trigger_callback("new_transaction")
|
||||||
self.was_updated = False
|
self.was_updated = False
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ class BCDataStream(object):
|
||||||
|
|
||||||
def seek_file(self, position):
|
def seek_file(self, position):
|
||||||
self.read_cursor = position
|
self.read_cursor = position
|
||||||
|
|
||||||
def close_file(self):
|
def close_file(self):
|
||||||
self.input.close()
|
self.input.close()
|
||||||
|
|
||||||
|
@ -319,7 +319,7 @@ def x_to_xpub(x_pubkey):
|
||||||
xpub, s = BIP32_Account.parse_xpubkey(x_pubkey)
|
xpub, s = BIP32_Account.parse_xpubkey(x_pubkey)
|
||||||
return xpub
|
return xpub
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def parse_xpub(x_pubkey):
|
def parse_xpub(x_pubkey):
|
||||||
if x_pubkey[0:2] == 'ff':
|
if x_pubkey[0:2] == 'ff':
|
||||||
|
@ -439,7 +439,7 @@ def get_address_from_output_script(bytes):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def parse_input(vds):
|
def parse_input(vds):
|
||||||
d = {}
|
d = {}
|
||||||
|
@ -506,7 +506,7 @@ class Transaction:
|
||||||
self.outputs = outputs
|
self.outputs = outputs
|
||||||
self.locktime = locktime
|
self.locktime = locktime
|
||||||
self.raw = None
|
self.raw = None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def deserialize(klass, raw):
|
def deserialize(klass, raw):
|
||||||
self = klass([],[])
|
self = klass([],[])
|
||||||
|
@ -520,7 +520,7 @@ class Transaction:
|
||||||
self.outputs = map(lambda x: (x['type'], x['address'], x['value']), d['outputs'])
|
self.outputs = map(lambda x: (x['type'], x['address'], x['value']), d['outputs'])
|
||||||
self.locktime = d['lockTime']
|
self.locktime = d['lockTime']
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def sweep(klass, privkeys, network, to_address, fee):
|
def sweep(klass, privkeys, network, to_address, fee):
|
||||||
inputs = []
|
inputs = []
|
||||||
for privkey in privkeys:
|
for privkey in privkeys:
|
||||||
|
@ -555,14 +555,14 @@ class Transaction:
|
||||||
if num is None: num = n
|
if num is None: num = n
|
||||||
# supports only "2 of 2", and "2 of 3" transactions
|
# supports only "2 of 2", and "2 of 3" transactions
|
||||||
assert num <= n and n in [2,3]
|
assert num <= n and n in [2,3]
|
||||||
|
|
||||||
if num==2:
|
if num==2:
|
||||||
s = '52'
|
s = '52'
|
||||||
elif num == 3:
|
elif num == 3:
|
||||||
s = '53'
|
s = '53'
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
for k in public_keys:
|
for k in public_keys:
|
||||||
s += op_push(len(k)/2)
|
s += op_push(len(k)/2)
|
||||||
s += k
|
s += k
|
||||||
|
@ -811,7 +811,7 @@ class Transaction:
|
||||||
def has_address(self, addr):
|
def has_address(self, addr):
|
||||||
found = False
|
found = False
|
||||||
for txin in self.inputs:
|
for txin in self.inputs:
|
||||||
if addr == txin.get('address'):
|
if addr == txin.get('address'):
|
||||||
found = True
|
found = True
|
||||||
break
|
break
|
||||||
if addr in self.get_output_addresses():
|
if addr in self.get_output_addresses():
|
||||||
|
@ -843,7 +843,7 @@ class Transaction:
|
||||||
is_partial = True
|
is_partial = True
|
||||||
|
|
||||||
if not is_send: is_partial = False
|
if not is_send: is_partial = False
|
||||||
|
|
||||||
for addr, value in self.get_outputs():
|
for addr, value in self.get_outputs():
|
||||||
v_out += value
|
v_out += value
|
||||||
if addr in addresses:
|
if addr in addresses:
|
||||||
|
@ -899,7 +899,4 @@ class Transaction:
|
||||||
sum += i["value"] * age
|
sum += i["value"] * age
|
||||||
priority = sum / size
|
priority = sum / size
|
||||||
print_error(priority, threshold)
|
print_error(priority, threshold)
|
||||||
return priority < threshold
|
return priority < threshold
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -182,7 +182,7 @@ def parse_URI(uri):
|
||||||
valid_address = bitcoin.is_address(address)
|
valid_address = bitcoin.is_address(address)
|
||||||
|
|
||||||
pq = urlparse.parse_qs(u.query)
|
pq = urlparse.parse_qs(u.query)
|
||||||
|
|
||||||
for k, v in pq.items():
|
for k, v in pq.items():
|
||||||
if len(v)!=1:
|
if len(v)!=1:
|
||||||
raise Exception('Duplicate Key', k)
|
raise Exception('Duplicate Key', k)
|
||||||
|
@ -202,7 +202,7 @@ def parse_URI(uri):
|
||||||
label = pq['label'][0]
|
label = pq['label'][0]
|
||||||
if 'r' in pq:
|
if 'r' in pq:
|
||||||
request_url = pq['r'][0]
|
request_url = pq['r'][0]
|
||||||
|
|
||||||
if request_url != '':
|
if request_url != '':
|
||||||
return address, amount, label, message, request_url
|
return address, amount, label, message, request_url
|
||||||
|
|
||||||
|
@ -225,7 +225,7 @@ __builtin__.raw_input = raw_input
|
||||||
|
|
||||||
def parse_json(message):
|
def parse_json(message):
|
||||||
n = message.find('\n')
|
n = message.find('\n')
|
||||||
if n==-1:
|
if n==-1:
|
||||||
return None, message
|
return None, message
|
||||||
try:
|
try:
|
||||||
j = json.loads( message[0:n] )
|
j = json.loads( message[0:n] )
|
||||||
|
@ -352,4 +352,3 @@ class QueuePipe:
|
||||||
def send_all(self, requests):
|
def send_all(self, requests):
|
||||||
for request in requests:
|
for request in requests:
|
||||||
self.send(request)
|
self.send(request)
|
||||||
|
|
||||||
|
|
|
@ -216,7 +216,7 @@ class Abstract_Wallet(object):
|
||||||
# inputs
|
# inputs
|
||||||
tx.add_pubkey_addresses(self.transactions)
|
tx.add_pubkey_addresses(self.transactions)
|
||||||
|
|
||||||
# outputs of tx: inputs of tx2
|
# outputs of tx: inputs of tx2
|
||||||
for type, x, v in tx.outputs:
|
for type, x, v in tx.outputs:
|
||||||
if type == 'pubkey':
|
if type == 'pubkey':
|
||||||
for tx2 in self.transactions.values():
|
for tx2 in self.transactions.values():
|
||||||
|
@ -1444,7 +1444,7 @@ class NewWallet(BIP32_HD_Wallet, Mnemonic):
|
||||||
|
|
||||||
|
|
||||||
class Wallet_2of2(BIP32_Wallet, Mnemonic):
|
class Wallet_2of2(BIP32_Wallet, Mnemonic):
|
||||||
# Wallet with multisig addresses.
|
# Wallet with multisig addresses.
|
||||||
# Cannot create accounts
|
# Cannot create accounts
|
||||||
root_name = "x1/"
|
root_name = "x1/"
|
||||||
root_derivation = "m/44'/0'"
|
root_derivation = "m/44'/0'"
|
||||||
|
@ -1590,7 +1590,7 @@ class OldWallet(Deterministic_Wallet):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
wallet_types = [
|
wallet_types = [
|
||||||
# category type description constructor
|
# category type description constructor
|
||||||
('standard', 'old', ("Old wallet"), OldWallet),
|
('standard', 'old', ("Old wallet"), OldWallet),
|
||||||
('standard', 'xpub', ("BIP32 Import"), BIP32_Simple_Wallet),
|
('standard', 'xpub', ("BIP32 Import"), BIP32_Simple_Wallet),
|
||||||
|
|
12
lib/x509.py
12
lib/x509.py
|
@ -81,16 +81,16 @@ class X509(tlslite.X509):
|
||||||
'DNS': set(),
|
'DNS': set(),
|
||||||
'SRV': set(),
|
'SRV': set(),
|
||||||
'URI': set(),
|
'URI': set(),
|
||||||
'XMPPAddr': set(),
|
'XMPPAddr': set(),
|
||||||
'OU': None,}
|
'OU': None,}
|
||||||
|
|
||||||
# Extract the CommonName(s) from the cert.
|
# Extract the CommonName(s) from the cert.
|
||||||
for rdnss in self.subject:
|
for rdnss in self.subject:
|
||||||
for rdns in rdnss:
|
for rdns in rdnss:
|
||||||
for name in rdns:
|
for name in rdns:
|
||||||
oid = name.getComponentByName('type')
|
oid = name.getComponentByName('type')
|
||||||
value = name.getComponentByName('value')
|
value = name.getComponentByName('value')
|
||||||
|
|
||||||
if oid == COMMON_NAME:
|
if oid == COMMON_NAME:
|
||||||
value = decoder.decode(value, asn1Spec=DirectoryString())[0]
|
value = decoder.decode(value, asn1Spec=DirectoryString())[0]
|
||||||
value = decode_str(value.getComponent())
|
value = decode_str(value.getComponent())
|
||||||
|
@ -106,7 +106,7 @@ class X509(tlslite.X509):
|
||||||
oid = extension.getComponentByName('extnID')
|
oid = extension.getComponentByName('extnID')
|
||||||
if oid != SUBJECT_ALT_NAME:
|
if oid != SUBJECT_ALT_NAME:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
value = decoder.decode(extension.getComponentByName('extnValue'),
|
value = decoder.decode(extension.getComponentByName('extnValue'),
|
||||||
asn1Spec=OctetString())[0]
|
asn1Spec=OctetString())[0]
|
||||||
sa_names = decoder.decode(value, asn1Spec=SubjectAltName())[0]
|
sa_names = decoder.decode(value, asn1Spec=SubjectAltName())[0]
|
||||||
|
@ -120,10 +120,10 @@ class X509(tlslite.X509):
|
||||||
results['URI'].add(value[5:])
|
results['URI'].add(value[5:])
|
||||||
elif name_type == 'otherName':
|
elif name_type == 'otherName':
|
||||||
name = name.getComponent()
|
name = name.getComponent()
|
||||||
|
|
||||||
oid = name.getComponentByName('type-id')
|
oid = name.getComponentByName('type-id')
|
||||||
value = name.getComponentByName('value')
|
value = name.getComponentByName('value')
|
||||||
|
|
||||||
if oid == XMPP_ADDR:
|
if oid == XMPP_ADDR:
|
||||||
value = decoder.decode(value, asn1Spec=UTF8String())[0]
|
value = decoder.decode(value, asn1Spec=UTF8String())[0]
|
||||||
results['XMPPAddr'].add(decode_str(value))
|
results['XMPPAddr'].add(decode_str(value))
|
||||||
|
|
Loading…
Reference in New Issue