misc python3 updates:
- use jsonrpclib-pelix - update the kivy gui - update plugins
This commit is contained in:
parent
e562b0b565
commit
c3388d9677
5
electrum
5
electrum
|
@ -68,7 +68,7 @@ def check_imports():
|
||||||
import qrcode
|
import qrcode
|
||||||
import pbkdf2
|
import pbkdf2
|
||||||
import google.protobuf
|
import google.protobuf
|
||||||
# import jsonrpclib
|
import jsonrpclib
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
sys.exit("Error: %s. Try 'sudo pip install <module-name>'"%e.message)
|
sys.exit("Error: %s. Try 'sudo pip install <module-name>'"%e.message)
|
||||||
# the following imports are for pyinstaller
|
# the following imports are for pyinstaller
|
||||||
|
@ -76,7 +76,7 @@ def check_imports():
|
||||||
from google.protobuf import message
|
from google.protobuf import message
|
||||||
from google.protobuf import reflection
|
from google.protobuf import reflection
|
||||||
from google.protobuf import descriptor_pb2
|
from google.protobuf import descriptor_pb2
|
||||||
# from jsonrpclib import SimpleJSONRPCServer
|
from jsonrpclib import SimpleJSONRPCServer
|
||||||
# check that we have the correct version of ecdsa
|
# check that we have the correct version of ecdsa
|
||||||
try:
|
try:
|
||||||
from ecdsa.ecdsa import curve_secp256k1, generator_secp256k1
|
from ecdsa.ecdsa import curve_secp256k1, generator_secp256k1
|
||||||
|
@ -95,6 +95,7 @@ if is_bundle or is_local or is_android:
|
||||||
imp.load_module('electrum', *imp.find_module('lib'))
|
imp.load_module('electrum', *imp.find_module('lib'))
|
||||||
imp.load_module('electrum_gui', *imp.find_module('gui'))
|
imp.load_module('electrum_gui', *imp.find_module('gui'))
|
||||||
|
|
||||||
|
|
||||||
from electrum import bitcoin, network
|
from electrum import bitcoin, network
|
||||||
from electrum import SimpleConfig, Network
|
from electrum import SimpleConfig, Network
|
||||||
from electrum.wallet import Wallet, Imported_Wallet
|
from electrum.wallet import Wallet, Imported_Wallet
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
PYTHON = python
|
PYTHON = python3
|
||||||
|
|
||||||
# needs kivy installed or in PYTHONPATH
|
# needs kivy installed or in PYTHONPATH
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,6 @@ except ImportError:
|
||||||
# minimum required version for kivy
|
# minimum required version for kivy
|
||||||
kivy.require('1.8.0')
|
kivy.require('1.8.0')
|
||||||
from kivy.logger import Logger
|
from kivy.logger import Logger
|
||||||
from main_window import ElectrumWindow
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,6 +53,7 @@ class ElectrumGui:
|
||||||
self.plugins = plugins
|
self.plugins = plugins
|
||||||
|
|
||||||
def main(self):
|
def main(self):
|
||||||
|
from .main_window import ElectrumWindow
|
||||||
self.config.open_last_wallet()
|
self.config.open_last_wallet()
|
||||||
w = ElectrumWindow(config=self.config,
|
w = ElectrumWindow(config=self.config,
|
||||||
network=self.network,
|
network=self.network,
|
||||||
|
|
|
@ -29,23 +29,23 @@ from kivy.factory import Factory
|
||||||
from kivy.metrics import inch
|
from kivy.metrics import inch
|
||||||
from kivy.lang import Builder
|
from kivy.lang import Builder
|
||||||
|
|
||||||
# lazy imports for factory so that widgets can be used in kv
|
## lazy imports for factory so that widgets can be used in kv
|
||||||
Factory.register('InstallWizard',
|
#Factory.register('InstallWizard', module='electrum_gui.kivy.uix.dialogs.installwizard')
|
||||||
module='electrum_gui.kivy.uix.dialogs.installwizard')
|
#Factory.register('InfoBubble', module='electrum_gui.kivy.uix.dialogs')
|
||||||
Factory.register('InfoBubble', module='electrum_gui.kivy.uix.dialogs')
|
#Factory.register('OutputList', module='electrum_gui.kivy.uix.dialogs')
|
||||||
Factory.register('OutputList', module='electrum_gui.kivy.uix.dialogs')
|
#Factory.register('OutputItem', module='electrum_gui.kivy.uix.dialogs')
|
||||||
Factory.register('OutputItem', module='electrum_gui.kivy.uix.dialogs')
|
|
||||||
|
|
||||||
|
from .uix.dialogs.installwizard import InstallWizard
|
||||||
|
from .uix.dialogs import InfoBubble
|
||||||
|
from .uix.dialogs import OutputList, OutputItem
|
||||||
|
|
||||||
#from kivy.core.window import Window
|
#from kivy.core.window import Window
|
||||||
#Window.softinput_mode = 'below_target'
|
#Window.softinput_mode = 'below_target'
|
||||||
|
|
||||||
|
|
||||||
# delayed imports: for startup speed on android
|
# delayed imports: for startup speed on android
|
||||||
notification = app = ref = None
|
notification = app = ref = None
|
||||||
util = False
|
util = False
|
||||||
|
|
||||||
|
|
||||||
# register widget cache for keeping memory down timeout to forever to cache
|
# register widget cache for keeping memory down timeout to forever to cache
|
||||||
# the data
|
# the data
|
||||||
Cache.register('electrum_widgets', timeout=0)
|
Cache.register('electrum_widgets', timeout=0)
|
||||||
|
@ -239,12 +239,11 @@ class ElectrumWindow(App):
|
||||||
self.is_exit = False
|
self.is_exit = False
|
||||||
self.wallet = None
|
self.wallet = None
|
||||||
|
|
||||||
super(ElectrumWindow, self).__init__(**kwargs)
|
App.__init__(self)#, **kwargs)
|
||||||
|
|
||||||
title = _('Electrum App')
|
title = _('Electrum App')
|
||||||
self.electrum_config = config = kwargs.get('config', None)
|
self.electrum_config = config = kwargs.get('config', None)
|
||||||
self.language = config.get('language', 'en')
|
self.language = config.get('language', 'en')
|
||||||
|
|
||||||
self.network = network = kwargs.get('network', None)
|
self.network = network = kwargs.get('network', None)
|
||||||
if self.network:
|
if self.network:
|
||||||
self.num_blocks = self.network.get_local_height()
|
self.num_blocks = self.network.get_local_height()
|
||||||
|
@ -361,7 +360,7 @@ class ElectrumWindow(App):
|
||||||
popup.open()
|
popup.open()
|
||||||
|
|
||||||
def qr_dialog(self, title, data, show_text=False):
|
def qr_dialog(self, title, data, show_text=False):
|
||||||
from uix.dialogs.qr_dialog import QRDialog
|
from .uix.dialogs.qr_dialog import QRDialog
|
||||||
popup = QRDialog(title, data, show_text)
|
popup = QRDialog(title, data, show_text)
|
||||||
popup.open()
|
popup.open()
|
||||||
|
|
||||||
|
@ -540,8 +539,8 @@ class ElectrumWindow(App):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def settings_dialog(self):
|
def settings_dialog(self):
|
||||||
|
from .uix.dialogs.settings import SettingsDialog
|
||||||
if self._settings_dialog is None:
|
if self._settings_dialog is None:
|
||||||
from uix.dialogs.settings import SettingsDialog
|
|
||||||
self._settings_dialog = SettingsDialog(self)
|
self._settings_dialog = SettingsDialog(self)
|
||||||
self._settings_dialog.update()
|
self._settings_dialog.update()
|
||||||
self._settings_dialog.open()
|
self._settings_dialog.open()
|
||||||
|
@ -550,7 +549,7 @@ class ElectrumWindow(App):
|
||||||
if name == 'settings':
|
if name == 'settings':
|
||||||
self.settings_dialog()
|
self.settings_dialog()
|
||||||
elif name == 'wallets':
|
elif name == 'wallets':
|
||||||
from uix.dialogs.wallets import WalletDialog
|
from .uix.dialogs.wallets import WalletDialog
|
||||||
d = WalletDialog()
|
d = WalletDialog()
|
||||||
d.open()
|
d.open()
|
||||||
else:
|
else:
|
||||||
|
@ -562,7 +561,7 @@ class ElectrumWindow(App):
|
||||||
''' Initialize The Ux part of electrum. This function performs the basic
|
''' Initialize The Ux part of electrum. This function performs the basic
|
||||||
tasks of setting up the ui.
|
tasks of setting up the ui.
|
||||||
'''
|
'''
|
||||||
from weakref import ref
|
#from weakref import ref
|
||||||
|
|
||||||
self.funds_error = False
|
self.funds_error = False
|
||||||
# setup UX
|
# setup UX
|
||||||
|
@ -663,7 +662,7 @@ class ElectrumWindow(App):
|
||||||
def format_amount_and_units(self, x):
|
def format_amount_and_units(self, x):
|
||||||
return format_satoshis_plain(x, self.decimal_point()) + ' ' + self.base_unit
|
return format_satoshis_plain(x, self.decimal_point()) + ' ' + self.base_unit
|
||||||
|
|
||||||
@profiler
|
#@profiler
|
||||||
def update_wallet(self, *dt):
|
def update_wallet(self, *dt):
|
||||||
self._trigger_update_status()
|
self._trigger_update_status()
|
||||||
if self.wallet and (self.wallet.up_to_date or not self.network or not self.network.is_connected()):
|
if self.wallet and (self.wallet.up_to_date or not self.network or not self.network.is_connected()):
|
||||||
|
@ -779,7 +778,7 @@ class ElectrumWindow(App):
|
||||||
info_bubble.show(pos, duration, width, modal=modal, exit=exit)
|
info_bubble.show(pos, duration, width, modal=modal, exit=exit)
|
||||||
|
|
||||||
def tx_dialog(self, tx):
|
def tx_dialog(self, tx):
|
||||||
from uix.dialogs.tx_dialog import TxDialog
|
from .uix.dialogs.tx_dialog import TxDialog
|
||||||
d = TxDialog(self, tx)
|
d = TxDialog(self, tx)
|
||||||
d.open()
|
d.open()
|
||||||
|
|
||||||
|
@ -818,7 +817,7 @@ class ElectrumWindow(App):
|
||||||
self.show_info(_('Cannot broadcast transaction') + ':\n' + _('Not connected'))
|
self.show_info(_('Cannot broadcast transaction') + ':\n' + _('Not connected'))
|
||||||
|
|
||||||
def description_dialog(self, screen):
|
def description_dialog(self, screen):
|
||||||
from uix.dialogs.label_dialog import LabelDialog
|
from .uix.dialogs.label_dialog import LabelDialog
|
||||||
text = screen.message
|
text = screen.message
|
||||||
def callback(text):
|
def callback(text):
|
||||||
screen.message = text
|
screen.message = text
|
||||||
|
@ -827,7 +826,7 @@ class ElectrumWindow(App):
|
||||||
|
|
||||||
@profiler
|
@profiler
|
||||||
def amount_dialog(self, screen, show_max):
|
def amount_dialog(self, screen, show_max):
|
||||||
from uix.dialogs.amount_dialog import AmountDialog
|
from .uix.dialogs.amount_dialog import AmountDialog
|
||||||
amount = screen.amount
|
amount = screen.amount
|
||||||
if amount:
|
if amount:
|
||||||
amount, u = str(amount).split()
|
amount, u = str(amount).split()
|
||||||
|
@ -844,7 +843,7 @@ class ElectrumWindow(App):
|
||||||
f(*(args + (None,)))
|
f(*(args + (None,)))
|
||||||
|
|
||||||
def delete_wallet(self):
|
def delete_wallet(self):
|
||||||
from uix.dialogs.question import Question
|
from .uix.dialogs.question import Question
|
||||||
basename = os.path.basename(self.wallet.storage.path)
|
basename = os.path.basename(self.wallet.storage.path)
|
||||||
d = Question(_('Delete wallet?') + '\n' + basename, self._delete_wallet)
|
d = Question(_('Delete wallet?') + '\n' + basename, self._delete_wallet)
|
||||||
d.open()
|
d.open()
|
||||||
|
@ -917,10 +916,10 @@ class ElectrumWindow(App):
|
||||||
self.show_error("PIN numbers do not match")
|
self.show_error("PIN numbers do not match")
|
||||||
|
|
||||||
def password_dialog(self, msg, f, args):
|
def password_dialog(self, msg, f, args):
|
||||||
|
from .uix.dialogs.password_dialog import PasswordDialog
|
||||||
def callback(pw):
|
def callback(pw):
|
||||||
Clock.schedule_once(lambda _: f(*(args + (pw,))), 0.1)
|
Clock.schedule_once(lambda x: f(*(args + (pw,))), 0.1)
|
||||||
if self._password_dialog is None:
|
if self._password_dialog is None:
|
||||||
from uix.dialogs.password_dialog import PasswordDialog
|
|
||||||
self._password_dialog = PasswordDialog()
|
self._password_dialog = PasswordDialog()
|
||||||
self._password_dialog.init(msg, callback)
|
self._password_dialog.init(msg, callback)
|
||||||
self._password_dialog.open()
|
self._password_dialog.open()
|
||||||
|
|
|
@ -31,7 +31,7 @@ version.filename = %(source.dir)s/contrib/versions.py
|
||||||
#version = 1.9.8
|
#version = 1.9.8
|
||||||
|
|
||||||
# (list) Application requirements
|
# (list) Application requirements
|
||||||
requirements = hostpython2, android, openssl, pycrypto, pil, plyer, kivy==master
|
requirements = python3crystax, android, openssl, pycrypto, pil, plyer, kivy==master
|
||||||
|
|
||||||
# (str) Presplash of the application
|
# (str) Presplash of the application
|
||||||
#presplash.filename = %(source.dir)s/gui/kivy/theming/splash.png
|
#presplash.filename = %(source.dir)s/gui/kivy/theming/splash.png
|
||||||
|
|
|
@ -46,6 +46,7 @@ class ChoiceDialog(Factory.Popup):
|
||||||
|
|
||||||
def __init__(self, title, choices, key, callback):
|
def __init__(self, title, choices, key, callback):
|
||||||
Factory.Popup.__init__(self)
|
Factory.Popup.__init__(self)
|
||||||
|
print(choices, type(choices))
|
||||||
if type(choices) is list:
|
if type(choices) is list:
|
||||||
choices = dict(map(lambda x: (x,x), choices))
|
choices = dict(map(lambda x: (x,x), choices))
|
||||||
layout = self.ids.choices
|
layout = self.ids.choices
|
||||||
|
|
|
@ -14,15 +14,14 @@ from kivy.core.window import Window
|
||||||
from kivy.clock import Clock
|
from kivy.clock import Clock
|
||||||
from kivy.utils import platform
|
from kivy.utils import platform
|
||||||
|
|
||||||
from electrum_gui.kivy.uix.dialogs import EventsDialog
|
|
||||||
from electrum_gui.kivy.i18n import _
|
|
||||||
from electrum.base_wizard import BaseWizard
|
from electrum.base_wizard import BaseWizard
|
||||||
|
|
||||||
from password_dialog import PasswordDialog
|
|
||||||
|
from . import EventsDialog
|
||||||
|
from ...i18n import _
|
||||||
|
from .password_dialog import PasswordDialog
|
||||||
|
|
||||||
# global Variables
|
# global Variables
|
||||||
app = App.get_running_app()
|
|
||||||
|
|
||||||
is_test = (platform == "linux")
|
is_test = (platform == "linux")
|
||||||
test_seed = "time taxi field recycle tiny license olive virus report rare steel portion achieve"
|
test_seed = "time taxi field recycle tiny license olive virus report rare steel portion achieve"
|
||||||
test_xpub = "xpub661MyMwAqRbcEbvVtRRSjqxVnaWVUMewVzMiURAKyYratih4TtBpMypzzefmv8zUNebmNVzB3PojdC5sV2P9bDgMoo9B3SARw1MXUUfU1GL"
|
test_xpub = "xpub661MyMwAqRbcEbvVtRRSjqxVnaWVUMewVzMiURAKyYratih4TtBpMypzzefmv8zUNebmNVzB3PojdC5sV2P9bDgMoo9B3SARw1MXUUfU1GL"
|
||||||
|
@ -429,7 +428,7 @@ class WizardDialog(EventsDialog):
|
||||||
crcontent = ObjectProperty(None)
|
crcontent = ObjectProperty(None)
|
||||||
|
|
||||||
def __init__(self, wizard, **kwargs):
|
def __init__(self, wizard, **kwargs):
|
||||||
super(WizardDialog, self).__init__(**kwargs)
|
super(WizardDialog, self).__init__()
|
||||||
self.wizard = wizard
|
self.wizard = wizard
|
||||||
self.ids.back.disabled = not wizard.can_go_back()
|
self.ids.back.disabled = not wizard.can_go_back()
|
||||||
self.app = App.get_running_app()
|
self.app = App.get_running_app()
|
||||||
|
@ -624,9 +623,7 @@ class RestoreSeedDialog(WizardDialog):
|
||||||
|
|
||||||
def get_text(self):
|
def get_text(self):
|
||||||
ti = self.ids.text_input_seed
|
ti = self.ids.text_input_seed
|
||||||
text = unicode(ti.text).strip()
|
return ' '.join(ti.text.strip().split())
|
||||||
text = ' '.join(text.split())
|
|
||||||
return text
|
|
||||||
|
|
||||||
def update_text(self, c):
|
def update_text(self, c):
|
||||||
c = c.lower()
|
c = c.lower()
|
||||||
|
@ -752,6 +749,7 @@ class InstallWizard(BaseWizard, Widget):
|
||||||
# on completion hide message
|
# on completion hide message
|
||||||
Clock.schedule_once(lambda dt: app.info_bubble.hide(now=True), -1)
|
Clock.schedule_once(lambda dt: app.info_bubble.hide(now=True), -1)
|
||||||
|
|
||||||
|
app = App.get_running_app()
|
||||||
app.show_info_bubble(
|
app.show_info_bubble(
|
||||||
text=msg, icon='atlas://gui/kivy/theming/light/important',
|
text=msg, icon='atlas://gui/kivy/theming/light/important',
|
||||||
pos=Window.center, width='200sp', arrow_pos=None, modal=True)
|
pos=Window.center, width='200sp', arrow_pos=None, modal=True)
|
||||||
|
@ -793,6 +791,7 @@ class InstallWizard(BaseWizard, Widget):
|
||||||
def show_xpub_dialog(self, **kwargs): ShowXpubDialog(self, **kwargs).open()
|
def show_xpub_dialog(self, **kwargs): ShowXpubDialog(self, **kwargs).open()
|
||||||
|
|
||||||
def show_error(self, msg):
|
def show_error(self, msg):
|
||||||
|
app = App.get_running_app()
|
||||||
Clock.schedule_once(lambda dt: app.show_error(msg))
|
Clock.schedule_once(lambda dt: app.show_error(msg))
|
||||||
|
|
||||||
def password_dialog(self, message, callback):
|
def password_dialog(self, message, callback):
|
||||||
|
|
|
@ -10,7 +10,7 @@ from electrum.plugins import run_hook
|
||||||
from electrum import coinchooser
|
from electrum import coinchooser
|
||||||
from electrum.util import fee_levels
|
from electrum.util import fee_levels
|
||||||
|
|
||||||
from choice_dialog import ChoiceDialog
|
from .choice_dialog import ChoiceDialog
|
||||||
|
|
||||||
Builder.load_string('''
|
Builder.load_string('''
|
||||||
#:import partial functools.partial
|
#:import partial functools.partial
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
|
import os
|
||||||
|
|
||||||
from kivy.app import App
|
from kivy.app import App
|
||||||
from kivy.factory import Factory
|
from kivy.factory import Factory
|
||||||
from kivy.properties import ObjectProperty
|
from kivy.properties import ObjectProperty
|
||||||
from kivy.lang import Builder
|
from kivy.lang import Builder
|
||||||
|
|
||||||
from electrum_gui.kivy.i18n import _
|
|
||||||
from electrum.util import base_units
|
from electrum.util import base_units
|
||||||
|
|
||||||
import os
|
from ...i18n import _
|
||||||
from label_dialog import LabelDialog
|
from .label_dialog import LabelDialog
|
||||||
|
|
||||||
Builder.load_string('''
|
Builder.load_string('''
|
||||||
#:import os os
|
#:import os os
|
||||||
|
|
|
@ -104,7 +104,7 @@ class QRCodeWidget(FloatLayout):
|
||||||
for c in range(k):
|
for c in range(k):
|
||||||
bext([0, 0, 0] if matrix[k-1-r][c] else [cr, cg, cb])
|
bext([0, 0, 0] if matrix[k-1-r][c] else [cr, cg, cb])
|
||||||
# then blit the buffer
|
# then blit the buffer
|
||||||
buff = ''.join(map(chr, buff))
|
buff = bytes(buff)
|
||||||
# update texture
|
# update texture
|
||||||
self._upd_texture(buff)
|
self._upd_texture(buff)
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ from electrum import bitcoin
|
||||||
from electrum.util import timestamp_to_datetime
|
from electrum.util import timestamp_to_datetime
|
||||||
from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED
|
from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_UNKNOWN, PR_EXPIRED
|
||||||
|
|
||||||
from context_menu import ContextMenu
|
from .context_menu import ContextMenu
|
||||||
|
|
||||||
|
|
||||||
from electrum_gui.kivy.i18n import _
|
from electrum_gui.kivy.i18n import _
|
||||||
|
@ -235,7 +235,7 @@ class SendScreen(CScreen):
|
||||||
self.payment_request = None
|
self.payment_request = None
|
||||||
|
|
||||||
def do_paste(self):
|
def do_paste(self):
|
||||||
contents = unicode(self.app._clipboard.paste())
|
contents = self.app._clipboard.paste()
|
||||||
if not contents:
|
if not contents:
|
||||||
self.app.show_info(_("Clipboard is empty"))
|
self.app.show_info(_("Clipboard is empty"))
|
||||||
return
|
return
|
||||||
|
@ -261,7 +261,7 @@ class SendScreen(CScreen):
|
||||||
self.app.show_error(_('Invalid amount') + ':\n' + self.screen.amount)
|
self.app.show_error(_('Invalid amount') + ':\n' + self.screen.amount)
|
||||||
return
|
return
|
||||||
outputs = [(bitcoin.TYPE_ADDRESS, address, amount)]
|
outputs = [(bitcoin.TYPE_ADDRESS, address, amount)]
|
||||||
message = unicode(self.screen.message)
|
message = self.screen.message
|
||||||
amount = sum(map(lambda x:x[2], outputs))
|
amount = sum(map(lambda x:x[2], outputs))
|
||||||
if self.app.electrum_config.get('use_rbf'):
|
if self.app.electrum_config.get('use_rbf'):
|
||||||
from dialogs.question import Question
|
from dialogs.question import Question
|
||||||
|
@ -344,7 +344,7 @@ class ReceiveScreen(CScreen):
|
||||||
req = self.app.wallet.get_payment_request(addr, self.app.electrum_config)
|
req = self.app.wallet.get_payment_request(addr, self.app.electrum_config)
|
||||||
self.screen.status = ''
|
self.screen.status = ''
|
||||||
if req:
|
if req:
|
||||||
self.screen.message = unicode(req.get('memo', ''))
|
self.screen.message = req.get('memo', '')
|
||||||
amount = req.get('amount')
|
amount = req.get('amount')
|
||||||
self.screen.amount = self.app.format_amount_and_units(amount) if amount else ''
|
self.screen.amount = self.app.format_amount_and_units(amount) if amount else ''
|
||||||
status = req.get('status', PR_UNKNOWN)
|
status = req.get('status', PR_UNKNOWN)
|
||||||
|
@ -376,9 +376,9 @@ class ReceiveScreen(CScreen):
|
||||||
self.app.show_info(_('Request copied to clipboard'))
|
self.app.show_info(_('Request copied to clipboard'))
|
||||||
|
|
||||||
def save_request(self):
|
def save_request(self):
|
||||||
addr = str(self.screen.address)
|
addr = self.screen.address
|
||||||
amount = str(self.screen.amount)
|
amount = self.screen.amount
|
||||||
message = unicode(self.screen.message)
|
message = self.screen.message
|
||||||
amount = self.app.get_amount(amount) if amount else 0
|
amount = self.app.get_amount(amount) if amount else 0
|
||||||
req = self.app.wallet.make_payment_request(addr, amount, message, None)
|
req = self.app.wallet.make_payment_request(addr, amount, message, None)
|
||||||
self.app.wallet.add_payment_request(req, self.app.electrum_config)
|
self.app.wallet.add_payment_request(req, self.app.electrum_config)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#:import _ electrum_gui.kivy.i18n._
|
#:import _ electrum_gui.kivy.i18n._
|
||||||
#:import Factory kivy.factory.Factory
|
#:import Factory kivy.factory.Factory
|
||||||
#:set font_light 'gui/kivy/data/fonts/Roboto-Condensed.ttf'
|
#:set font_light 'gui/kivy/data/fonts/Roboto-Condensed.ttf'
|
||||||
#:set btc_symbol unichr(171)
|
#:set btc_symbol chr(171)
|
||||||
#:set mbtc_symbol unichr(187)
|
#:set mbtc_symbol chr(187)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#:import _ electrum_gui.kivy.i18n._
|
#:import _ electrum_gui.kivy.i18n._
|
||||||
#:import Decimal decimal.Decimal
|
#:import Decimal decimal.Decimal
|
||||||
#:set btc_symbol unichr(171)
|
#:set btc_symbol chr(171)
|
||||||
#:set mbtc_symbol unichr(187)
|
#:set mbtc_symbol chr(187)
|
||||||
#:set font_light 'gui/kivy/data/fonts/Roboto-Condensed.ttf'
|
#:set font_light 'gui/kivy/data/fonts/Roboto-Condensed.ttf'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#:import _ electrum_gui.kivy.i18n._
|
#:import _ electrum_gui.kivy.i18n._
|
||||||
#:import Decimal decimal.Decimal
|
#:import Decimal decimal.Decimal
|
||||||
#:set btc_symbol unichr(171)
|
#:set btc_symbol chr(171)
|
||||||
#:set mbtc_symbol unichr(187)
|
#:set mbtc_symbol chr(187)
|
||||||
#:set font_light 'gui/kivy/data/fonts/Roboto-Condensed.ttf'
|
#:set font_light 'gui/kivy/data/fonts/Roboto-Condensed.ttf'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ from PyQt4.QtGui import *
|
||||||
from PyQt4.QtCore import *
|
from PyQt4.QtCore import *
|
||||||
import PyQt4.QtCore as QtCore
|
import PyQt4.QtCore as QtCore
|
||||||
|
|
||||||
from lib.util import bh2u, bfh
|
from electrum.util import bh2u, bfh
|
||||||
from . import icons_rc
|
from . import icons_rc
|
||||||
|
|
||||||
from electrum import keystore
|
from electrum import keystore
|
||||||
|
|
|
@ -42,7 +42,7 @@ from electrum.bitcoin import base_encode
|
||||||
from electrum.i18n import _
|
from electrum.i18n import _
|
||||||
from electrum.plugins import run_hook
|
from electrum.plugins import run_hook
|
||||||
|
|
||||||
from lib.util import bfh
|
from electrum.util import bfh
|
||||||
from .util import *
|
from .util import *
|
||||||
|
|
||||||
dialogs = [] # Otherwise python randomly garbage collects the dialogs...
|
dialogs = [] # Otherwise python randomly garbage collects the dialogs...
|
||||||
|
|
16
gui/stdio.py
16
gui/stdio.py
|
@ -23,7 +23,7 @@ class ElectrumGui:
|
||||||
self.network = daemon.network
|
self.network = daemon.network
|
||||||
storage = WalletStorage(config.get_wallet_path())
|
storage = WalletStorage(config.get_wallet_path())
|
||||||
if not storage.file_exists:
|
if not storage.file_exists:
|
||||||
print "Wallet not found. try 'electrum create'"
|
print("Wallet not found. try 'electrum create'")
|
||||||
exit()
|
exit()
|
||||||
if storage.is_encrypted():
|
if storage.is_encrypted():
|
||||||
password = getpass.getpass('Password:', stream=None)
|
password = getpass.getpass('Password:', stream=None)
|
||||||
|
@ -63,8 +63,8 @@ class ElectrumGui:
|
||||||
|
|
||||||
def main_command(self):
|
def main_command(self):
|
||||||
self.print_balance()
|
self.print_balance()
|
||||||
c = raw_input("enter command: ")
|
c = input("enter command: ")
|
||||||
if c == "h" : self.print_commands()
|
if c == "h" : self.print_commands()
|
||||||
elif c == "i" : self.print_history()
|
elif c == "i" : self.print_history()
|
||||||
elif c == "o" : self.enter_order()
|
elif c == "o" : self.enter_order()
|
||||||
elif c == "p" : self.print_order()
|
elif c == "p" : self.print_order()
|
||||||
|
@ -144,10 +144,10 @@ class ElectrumGui:
|
||||||
+ "\nfee: " + self.str_fee + ", desc: " + self.str_description)
|
+ "\nfee: " + self.str_fee + ", desc: " + self.str_description)
|
||||||
|
|
||||||
def enter_order(self):
|
def enter_order(self):
|
||||||
self.str_recipient = raw_input("Pay to: ")
|
self.str_recipient = input("Pay to: ")
|
||||||
self.str_description = raw_input("Description : ")
|
self.str_description = input("Description : ")
|
||||||
self.str_amount = raw_input("Amount: ")
|
self.str_amount = input("Amount: ")
|
||||||
self.str_fee = raw_input("Fee: ")
|
self.str_fee = input("Fee: ")
|
||||||
|
|
||||||
def send_order(self):
|
def send_order(self):
|
||||||
self.do_send()
|
self.do_send()
|
||||||
|
@ -192,7 +192,7 @@ class ElectrumGui:
|
||||||
|
|
||||||
c = ""
|
c = ""
|
||||||
while c != "y":
|
while c != "y":
|
||||||
c = raw_input("ok to send (y/n)?")
|
c = input("ok to send (y/n)?")
|
||||||
if c == "n": return
|
if c == "n": return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
13
gui/text.py
13
gui/text.py
|
@ -25,7 +25,7 @@ class ElectrumGui:
|
||||||
self.network = daemon.network
|
self.network = daemon.network
|
||||||
storage = WalletStorage(config.get_wallet_path())
|
storage = WalletStorage(config.get_wallet_path())
|
||||||
if not storage.file_exists:
|
if not storage.file_exists:
|
||||||
print "Wallet not found. try 'electrum create'"
|
print("Wallet not found. try 'electrum create'")
|
||||||
exit()
|
exit()
|
||||||
if storage.is_encrypted():
|
if storage.is_encrypted():
|
||||||
password = getpass.getpass('Password:', stream=None)
|
password = getpass.getpass('Password:', stream=None)
|
||||||
|
@ -186,8 +186,13 @@ class ElectrumGui:
|
||||||
self.print_list( self.network.banner.split('\n'))
|
self.print_list( self.network.banner.split('\n'))
|
||||||
|
|
||||||
def print_qr(self, data):
|
def print_qr(self, data):
|
||||||
import qrcode, StringIO
|
import qrcode
|
||||||
s = StringIO.StringIO()
|
try:
|
||||||
|
from StringIO import StringIO
|
||||||
|
except ImportError:
|
||||||
|
from io import StringIO
|
||||||
|
|
||||||
|
s = StringIO()
|
||||||
self.qr = qrcode.QRCode()
|
self.qr = qrcode.QRCode()
|
||||||
self.qr.add_data(data)
|
self.qr.add_data(data)
|
||||||
self.qr.print_ascii(out=s, invert=False)
|
self.qr.print_ascii(out=s, invert=False)
|
||||||
|
@ -218,7 +223,7 @@ class ElectrumGui:
|
||||||
|
|
||||||
def main_command(self):
|
def main_command(self):
|
||||||
c = self.stdscr.getch()
|
c = self.stdscr.getch()
|
||||||
print c
|
print(c)
|
||||||
if c == curses.KEY_RIGHT: self.tab = (self.tab + 1)%self.num_tabs
|
if c == curses.KEY_RIGHT: self.tab = (self.tab + 1)%self.num_tabs
|
||||||
elif c == curses.KEY_LEFT: self.tab = (self.tab - 1)%self.num_tabs
|
elif c == curses.KEY_LEFT: self.tab = (self.tab - 1)%self.num_tabs
|
||||||
elif c == curses.KEY_DOWN: self.pos +=1
|
elif c == curses.KEY_DOWN: self.pos +=1
|
||||||
|
|
|
@ -34,8 +34,8 @@ import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
# from jsonrpc import JSONRPCResponseManager
|
# from jsonrpc import JSONRPCResponseManager
|
||||||
# import jsonrpclib
|
import jsonrpclib
|
||||||
# from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer, SimpleJSONRPCRequestHandler
|
from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer, SimpleJSONRPCRequestHandler
|
||||||
|
|
||||||
from .version import ELECTRUM_VERSION
|
from .version import ELECTRUM_VERSION
|
||||||
from .network import Network
|
from .network import Network
|
||||||
|
@ -96,17 +96,17 @@ def get_server(config):
|
||||||
time.sleep(1.0)
|
time.sleep(1.0)
|
||||||
|
|
||||||
|
|
||||||
# class RequestHandler(SimpleJSONRPCRequestHandler):
|
class RequestHandler(SimpleJSONRPCRequestHandler):
|
||||||
#
|
|
||||||
# def do_OPTIONS(self):
|
def do_OPTIONS(self):
|
||||||
# self.send_response(200)
|
self.send_response(200)
|
||||||
# self.end_headers()
|
self.end_headers()
|
||||||
#
|
|
||||||
# def end_headers(self):
|
def end_headers(self):
|
||||||
# self.send_header("Access-Control-Allow-Headers",
|
self.send_header("Access-Control-Allow-Headers",
|
||||||
# "Origin, X-Requested-With, Content-Type, Accept")
|
"Origin, X-Requested-With, Content-Type, Accept")
|
||||||
# self.send_header("Access-Control-Allow-Origin", "*")
|
self.send_header("Access-Control-Allow-Origin", "*")
|
||||||
# SimpleJSONRPCRequestHandler.end_headers(self)
|
SimpleJSONRPCRequestHandler.end_headers(self)
|
||||||
|
|
||||||
|
|
||||||
class Daemon(DaemonThread):
|
class Daemon(DaemonThread):
|
||||||
|
@ -132,24 +132,23 @@ class Daemon(DaemonThread):
|
||||||
def init_server(self, config, fd):
|
def init_server(self, config, fd):
|
||||||
host = config.get('rpchost', '127.0.0.1')
|
host = config.get('rpchost', '127.0.0.1')
|
||||||
port = config.get('rpcport', 0)
|
port = config.get('rpcport', 0)
|
||||||
# try:
|
try:
|
||||||
# server = SimpleJSONRPCServer((host, port), logRequests=False, requestHandler=RequestHandler)
|
server = SimpleJSONRPCServer((host, port), logRequests=False, requestHandler=RequestHandler)
|
||||||
# except Exception as e:
|
except Exception as e:
|
||||||
# self.print_error('Warning: cannot initialize RPC server on host', host, e)
|
self.print_error('Warning: cannot initialize RPC server on host', host, e)
|
||||||
# self.server = None
|
self.server = None
|
||||||
# os.close(fd)
|
os.close(fd)
|
||||||
# return
|
return
|
||||||
# os.write(fd, bytes(repr((server.socket.getsockname(), time.time())), 'utf8'))
|
os.write(fd, bytes(repr((server.socket.getsockname(), time.time())), 'utf8'))
|
||||||
# os.close(fd)
|
os.close(fd)
|
||||||
# server.timeout = 0.1
|
server.timeout = 0.1
|
||||||
# for cmdname in known_commands:
|
for cmdname in known_commands:
|
||||||
# server.register_function(getattr(self.cmd_runner, cmdname), cmdname)
|
server.register_function(getattr(self.cmd_runner, cmdname), cmdname)
|
||||||
# server.register_function(self.run_cmdline, 'run_cmdline')
|
server.register_function(self.run_cmdline, 'run_cmdline')
|
||||||
# server.register_function(self.ping, 'ping')
|
server.register_function(self.ping, 'ping')
|
||||||
# server.register_function(self.run_daemon, 'daemon')
|
server.register_function(self.run_daemon, 'daemon')
|
||||||
# server.register_function(self.run_gui, 'gui')
|
server.register_function(self.run_gui, 'gui')
|
||||||
# self.server = server
|
self.server = server
|
||||||
self.server = None
|
|
||||||
|
|
||||||
def ping(self):
|
def ping(self):
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -122,7 +122,7 @@ def parse_servers(result):
|
||||||
pruning_level = v[1:]
|
pruning_level = v[1:]
|
||||||
if pruning_level == '': pruning_level = '0'
|
if pruning_level == '': pruning_level = '0'
|
||||||
try:
|
try:
|
||||||
is_recent = cmp(util.normalize_version(version), util.normalize_version(PROTOCOL_VERSION)) >= 0
|
is_recent = util.normalize_version(version) >= util.normalize_version(PROTOCOL_VERSION)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print_error(e)
|
print_error(e)
|
||||||
is_recent = False
|
is_recent = False
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
#
|
|
||||||
# Electrum - lightweight Bitcoin client
|
# Electrum - lightweight Bitcoin client
|
||||||
# Copyright (C) 2011 Thomas Voegtlin
|
# Copyright (C) 2011 Thomas Voegtlin
|
||||||
#
|
#
|
||||||
|
|
|
@ -42,7 +42,7 @@ from functools import partial
|
||||||
from collections import namedtuple, defaultdict
|
from collections import namedtuple, defaultdict
|
||||||
|
|
||||||
from .i18n import _
|
from .i18n import _
|
||||||
from .util import NotEnoughFunds, PrintError, UserCancelled, profiler
|
from .util import NotEnoughFunds, PrintError, UserCancelled, profiler, format_satoshis
|
||||||
|
|
||||||
from .bitcoin import *
|
from .bitcoin import *
|
||||||
from .version import *
|
from .version import *
|
||||||
|
@ -59,6 +59,7 @@ from .verifier import SPV
|
||||||
from .mnemonic import Mnemonic
|
from .mnemonic import Mnemonic
|
||||||
|
|
||||||
from . import paymentrequest
|
from . import paymentrequest
|
||||||
|
from .paymentrequest import PR_PAID, PR_UNPAID, PR_UNKNOWN, PR_EXPIRED
|
||||||
|
|
||||||
from .storage import WalletStorage
|
from .storage import WalletStorage
|
||||||
|
|
||||||
|
@ -1183,12 +1184,11 @@ class Abstract_Wallet(PrintError):
|
||||||
return False, None
|
return False, None
|
||||||
|
|
||||||
def get_payment_request(self, addr, config):
|
def get_payment_request(self, addr, config):
|
||||||
import util
|
|
||||||
r = self.receive_requests.get(addr)
|
r = self.receive_requests.get(addr)
|
||||||
if not r:
|
if not r:
|
||||||
return
|
return
|
||||||
out = copy.copy(r)
|
out = copy.copy(r)
|
||||||
out['URI'] = 'bitcoin:' + addr + '?amount=' + util.format_satoshis(out.get('amount'))
|
out['URI'] = 'bitcoin:' + addr + '?amount=' + format_satoshis(out.get('amount'))
|
||||||
status, conf = self.get_request_status(addr)
|
status, conf = self.get_request_status(addr)
|
||||||
out['status'] = status
|
out['status'] = status
|
||||||
if conf is not None:
|
if conf is not None:
|
||||||
|
@ -1219,7 +1219,6 @@ class Abstract_Wallet(PrintError):
|
||||||
return out
|
return out
|
||||||
|
|
||||||
def get_request_status(self, key):
|
def get_request_status(self, key):
|
||||||
from paymentrequest import PR_PAID, PR_UNPAID, PR_UNKNOWN, PR_EXPIRED
|
|
||||||
r = self.receive_requests.get(key)
|
r = self.receive_requests.get(key)
|
||||||
if r is None:
|
if r is None:
|
||||||
return PR_UNKNOWN
|
return PR_UNKNOWN
|
||||||
|
|
|
@ -157,7 +157,7 @@ class DigitalBitbox_Client():
|
||||||
self.isInitialized = True # Wallet exists. Electrum code later checks if the device matches the wallet
|
self.isInitialized = True # Wallet exists. Electrum code later checks if the device matches the wallet
|
||||||
elif not self.isInitialized:
|
elif not self.isInitialized:
|
||||||
reply = self.hid_send_encrypt('{"device":"info"}')
|
reply = self.hid_send_encrypt('{"device":"info"}')
|
||||||
if reply['device']['id'] <> "":
|
if reply['device']['id'] != "":
|
||||||
self.recover_or_erase_dialog() # Already seeded
|
self.recover_or_erase_dialog() # Already seeded
|
||||||
else:
|
else:
|
||||||
self.seed_device_dialog() # Seed if not initialized
|
self.seed_device_dialog() # Seed if not initialized
|
||||||
|
@ -594,7 +594,7 @@ class DigitalBitboxPlugin(HW_PluginBase):
|
||||||
handler = keystore.handler
|
handler = keystore.handler
|
||||||
with devmgr.hid_lock:
|
with devmgr.hid_lock:
|
||||||
client = devmgr.client_for_keystore(self, handler, keystore, force_pair)
|
client = devmgr.client_for_keystore(self, handler, keystore, force_pair)
|
||||||
if client <> None:
|
if client is not None:
|
||||||
client.check_device_dialog()
|
client.check_device_dialog()
|
||||||
return client
|
return client
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from PyQt4.Qt import (QInputDialog, QLineEdit)
|
from PyQt4.Qt import (QInputDialog, QLineEdit)
|
||||||
from ..hw_wallet.qt import QtHandlerBase, QtPluginBase
|
from ..hw_wallet.qt import QtHandlerBase, QtPluginBase
|
||||||
from digitalbitbox import DigitalBitboxPlugin
|
from .digitalbitbox import DigitalBitboxPlugin
|
||||||
|
|
||||||
|
|
||||||
class Plugin(DigitalBitboxPlugin, QtPluginBase):
|
class Plugin(DigitalBitboxPlugin, QtPluginBase):
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from ..trezor.qt_generic import QtPlugin
|
from ..trezor.qt_generic import QtPlugin
|
||||||
from keepkey import KeepKeyPlugin
|
from .keepkey import KeepKeyPlugin
|
||||||
|
|
||||||
|
|
||||||
class Plugin(KeepKeyPlugin, QtPlugin):
|
class Plugin(KeepKeyPlugin, QtPlugin):
|
||||||
|
|
|
@ -225,7 +225,7 @@ class LedgerAuthDialog(QDialog):
|
||||||
try:
|
try:
|
||||||
mode = self.dongle.exchange( bytearray(apdu) )
|
mode = self.dongle.exchange( bytearray(apdu) )
|
||||||
return mode
|
return mode
|
||||||
except BTChipException, e:
|
except BTChipException as e:
|
||||||
debug_msg('Device getMode Failed')
|
debug_msg('Device getMode Failed')
|
||||||
return 0x11
|
return 0x11
|
||||||
|
|
||||||
|
@ -274,7 +274,7 @@ class LedgerWebSocket(QThread):
|
||||||
challenge = self.dongle.exchange( bytearray(apdu) )
|
challenge = self.dongle.exchange( bytearray(apdu) )
|
||||||
ws.send( '{"type":"challenge","data":"%s" }' % str(challenge).encode('hex') )
|
ws.send( '{"type":"challenge","data":"%s" }' % str(challenge).encode('hex') )
|
||||||
self.data = data
|
self.data = data
|
||||||
except BTChipException, e:
|
except BTChipException as e:
|
||||||
debug_msg('Identify Failed')
|
debug_msg('Identify Failed')
|
||||||
|
|
||||||
if data['type'] == 'challenge':
|
if data['type'] == 'challenge':
|
||||||
|
@ -287,7 +287,7 @@ class LedgerWebSocket(QThread):
|
||||||
ws.send( '{"type":"pairing","is_successful":"true"}' )
|
ws.send( '{"type":"pairing","is_successful":"true"}' )
|
||||||
self.data['pairid'] = self.pairID
|
self.data['pairid'] = self.pairID
|
||||||
self.pairing_done.emit(self.data)
|
self.pairing_done.emit(self.data)
|
||||||
except BTChipException, e:
|
except BTChipException as e:
|
||||||
debug_msg('Pairing Failed')
|
debug_msg('Pairing Failed')
|
||||||
ws.send( '{"type":"pairing","is_successful":"false"}' )
|
ws.send( '{"type":"pairing","is_successful":"false"}' )
|
||||||
self.pairing_done.emit(None)
|
self.pairing_done.emit(None)
|
||||||
|
|
|
@ -90,7 +90,7 @@ class Ledger_Client():
|
||||||
try:
|
try:
|
||||||
client.getVerifyPinRemainingAttempts()
|
client.getVerifyPinRemainingAttempts()
|
||||||
return True
|
return True
|
||||||
except BTChipException, e:
|
except BTChipException as e:
|
||||||
if e.sw == 0x6d00:
|
if e.sw == 0x6d00:
|
||||||
return False
|
return False
|
||||||
raise e
|
raise e
|
||||||
|
@ -99,7 +99,7 @@ class Ledger_Client():
|
||||||
try:
|
try:
|
||||||
# Invalid SET OPERATION MODE to verify the PIN status
|
# Invalid SET OPERATION MODE to verify the PIN status
|
||||||
client.dongle.exchange(bytearray([0xe0, 0x26, 0x00, 0x00, 0x01, 0xAB]))
|
client.dongle.exchange(bytearray([0xe0, 0x26, 0x00, 0x00, 0x01, 0xAB]))
|
||||||
except BTChipException, e:
|
except BTChipException as e:
|
||||||
if (e.sw == 0x6982):
|
if (e.sw == 0x6982):
|
||||||
return False
|
return False
|
||||||
if (e.sw == 0x6A80):
|
if (e.sw == 0x6A80):
|
||||||
|
@ -118,16 +118,16 @@ class Ledger_Client():
|
||||||
raise Exception("HW1 firmware version too old. Please update at https://www.ledgerwallet.com")
|
raise Exception("HW1 firmware version too old. Please update at https://www.ledgerwallet.com")
|
||||||
try:
|
try:
|
||||||
self.dongleObject.getOperationMode()
|
self.dongleObject.getOperationMode()
|
||||||
except BTChipException, e:
|
except BTChipException as e:
|
||||||
if (e.sw == 0x6985):
|
if (e.sw == 0x6985):
|
||||||
self.dongleObject.dongle.close()
|
self.dongleObject.dongle.close()
|
||||||
self.handler.get_setup( )
|
self.handler.get_setup( )
|
||||||
# Acquire the new client on the next run
|
# Acquire the new client on the next run
|
||||||
else:
|
else:
|
||||||
raise e
|
raise e
|
||||||
if self.has_detached_pin_support(self.dongleObject) and not self.is_pin_validated(self.dongleObject) and (self.handler <> None):
|
if self.has_detached_pin_support(self.dongleObject) and not self.is_pin_validated(self.dongleObject) and (self.handler is not None):
|
||||||
remaining_attempts = self.dongleObject.getVerifyPinRemainingAttempts()
|
remaining_attempts = self.dongleObject.getVerifyPinRemainingAttempts()
|
||||||
if remaining_attempts <> 1:
|
if remaining_attempts != 1:
|
||||||
msg = "Enter your Ledger PIN - remaining attempts : " + str(remaining_attempts)
|
msg = "Enter your Ledger PIN - remaining attempts : " + str(remaining_attempts)
|
||||||
else:
|
else:
|
||||||
msg = "Enter your Ledger PIN - WARNING : LAST ATTEMPT. If the PIN is not correct, the dongle will be wiped."
|
msg = "Enter your Ledger PIN - WARNING : LAST ATTEMPT. If the PIN is not correct, the dongle will be wiped."
|
||||||
|
@ -136,7 +136,7 @@ class Ledger_Client():
|
||||||
raise Exception('Aborted by user - please unplug the dongle and plug it again before retrying')
|
raise Exception('Aborted by user - please unplug the dongle and plug it again before retrying')
|
||||||
pin = pin.encode()
|
pin = pin.encode()
|
||||||
self.dongleObject.verifyPin(pin)
|
self.dongleObject.verifyPin(pin)
|
||||||
except BTChipException, e:
|
except BTChipException as e:
|
||||||
if (e.sw == 0x6faa):
|
if (e.sw == 0x6faa):
|
||||||
raise Exception("Dongle is temporarily locked - please unplug it and replug it again")
|
raise Exception("Dongle is temporarily locked - please unplug it and replug it again")
|
||||||
if ((e.sw & 0xFFF0) == 0x63c0):
|
if ((e.sw & 0xFFF0) == 0x63c0):
|
||||||
|
@ -225,7 +225,7 @@ class Ledger_KeyStore(Hardware_KeyStore):
|
||||||
raise UserWarning(_('Cancelled by user'))
|
raise UserWarning(_('Cancelled by user'))
|
||||||
pin = str(pin).encode()
|
pin = str(pin).encode()
|
||||||
signature = self.get_client().signMessageSign(pin)
|
signature = self.get_client().signMessageSign(pin)
|
||||||
except BTChipException, e:
|
except BTChipException as e:
|
||||||
if e.sw == 0x6a80:
|
if e.sw == 0x6a80:
|
||||||
self.give_error("Unfortunately, this message cannot be signed by the Ledger wallet. Only alphanumerical messages shorter than 140 characters are supported. Please remove any extra characters (tab, carriage return) and retry.")
|
self.give_error("Unfortunately, this message cannot be signed by the Ledger wallet. Only alphanumerical messages shorter than 140 characters are supported. Please remove any extra characters (tab, carriage return) and retry.")
|
||||||
else:
|
else:
|
||||||
|
@ -233,7 +233,7 @@ class Ledger_KeyStore(Hardware_KeyStore):
|
||||||
except UserWarning:
|
except UserWarning:
|
||||||
self.handler.show_error(_('Cancelled by user'))
|
self.handler.show_error(_('Cancelled by user'))
|
||||||
return ''
|
return ''
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
self.give_error(e, True)
|
self.give_error(e, True)
|
||||||
finally:
|
finally:
|
||||||
self.handler.clear_dialog()
|
self.handler.clear_dialog()
|
||||||
|
@ -469,7 +469,7 @@ class LedgerPlugin(HW_PluginBase):
|
||||||
self.handler = handler
|
self.handler = handler
|
||||||
|
|
||||||
client = self.get_btchip_device(device)
|
client = self.get_btchip_device(device)
|
||||||
if client <> None:
|
if client is not None:
|
||||||
client = Ledger_Client(client)
|
client = Ledger_Client(client)
|
||||||
return client
|
return client
|
||||||
|
|
||||||
|
@ -501,6 +501,6 @@ class LedgerPlugin(HW_PluginBase):
|
||||||
# returns the client for a given keystore. can use xpub
|
# returns the client for a given keystore. can use xpub
|
||||||
#if client:
|
#if client:
|
||||||
# client.used()
|
# client.used()
|
||||||
if client <> None:
|
if client is not None:
|
||||||
client.checkDevice()
|
client.checkDevice()
|
||||||
return client
|
return client
|
||||||
|
|
|
@ -9,7 +9,7 @@ from .ledger import LedgerPlugin
|
||||||
from ..hw_wallet.qt import QtHandlerBase, QtPluginBase
|
from ..hw_wallet.qt import QtHandlerBase, QtPluginBase
|
||||||
from electrum_gui.qt.util import *
|
from electrum_gui.qt.util import *
|
||||||
|
|
||||||
from btchip.btchipPersoWizard import StartBTChipPersoDialog
|
#from btchip.btchipPersoWizard import StartBTChipPersoDialog
|
||||||
|
|
||||||
class Plugin(LedgerPlugin, QtPluginBase):
|
class Plugin(LedgerPlugin, QtPluginBase):
|
||||||
icon_unpaired = ":icons/ledger_unpaired.png"
|
icon_unpaired = ":icons/ledger_unpaired.png"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from ..trezor.qt_generic import QtPlugin
|
from ..trezor.qt_generic import QtPlugin
|
||||||
from trezor import TrezorPlugin
|
from .trezor import TrezorPlugin
|
||||||
|
|
||||||
|
|
||||||
class Plugin(TrezorPlugin, QtPlugin):
|
class Plugin(TrezorPlugin, QtPlugin):
|
||||||
|
|
|
@ -37,7 +37,7 @@ from electrum_gui.qt.amountedit import AmountEdit
|
||||||
from electrum_gui.qt.main_window import StatusBarButton
|
from electrum_gui.qt.main_window import StatusBarButton
|
||||||
from electrum.i18n import _
|
from electrum.i18n import _
|
||||||
from electrum.plugins import hook
|
from electrum.plugins import hook
|
||||||
from trustedcoin import TrustedCoinPlugin, server
|
from .trustedcoin import TrustedCoinPlugin, server
|
||||||
|
|
||||||
|
|
||||||
class Plugin(TrustedCoinPlugin):
|
class Plugin(TrustedCoinPlugin):
|
||||||
|
|
|
@ -90,11 +90,10 @@ class TrustedCoinCosignerClient(object):
|
||||||
kwargs['headers']['content-type'] = 'application/json'
|
kwargs['headers']['content-type'] = 'application/json'
|
||||||
url = urljoin(self.base_url, relative_url)
|
url = urljoin(self.base_url, relative_url)
|
||||||
if self.debug:
|
if self.debug:
|
||||||
print '%s %s %s' % (method, url, data)
|
print('%s %s %s' % (method, url, data))
|
||||||
response = requests.request(method, url, **kwargs)
|
response = requests.request(method, url, **kwargs)
|
||||||
if self.debug:
|
if self.debug:
|
||||||
print response.text
|
print(response.text)
|
||||||
print
|
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
message = str(response.text)
|
message = str(response.text)
|
||||||
if response.headers.get('content-type') == 'application/json':
|
if response.headers.get('content-type') == 'application/json':
|
||||||
|
|
Loading…
Reference in New Issue