misc python3 updates:

- use jsonrpclib-pelix
 - update the kivy gui
 - update plugins
This commit is contained in:
ThomasV 2017-02-16 10:54:24 +01:00
parent e562b0b565
commit c3388d9677
32 changed files with 130 additions and 129 deletions

View File

@ -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

View File

@ -1,4 +1,4 @@
PYTHON = python PYTHON = python3
# needs kivy installed or in PYTHONPATH # needs kivy installed or in PYTHONPATH

View File

@ -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,

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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'

View File

@ -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'

View File

@ -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

View File

@ -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...

View File

@ -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,7 +63,7 @@ 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()
@ -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:

View File

@ -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

View File

@ -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
# os.close(fd)
# return
# os.write(fd, bytes(repr((server.socket.getsockname(), time.time())), 'utf8'))
# os.close(fd)
# server.timeout = 0.1
# for cmdname in known_commands:
# server.register_function(getattr(self.cmd_runner, cmdname), cmdname)
# server.register_function(self.run_cmdline, 'run_cmdline')
# server.register_function(self.ping, 'ping')
# server.register_function(self.run_daemon, 'daemon')
# server.register_function(self.run_gui, 'gui')
# self.server = server
self.server = None self.server = None
os.close(fd)
return
os.write(fd, bytes(repr((server.socket.getsockname(), time.time())), 'utf8'))
os.close(fd)
server.timeout = 0.1
for cmdname in known_commands:
server.register_function(getattr(self.cmd_runner, cmdname), cmdname)
server.register_function(self.run_cmdline, 'run_cmdline')
server.register_function(self.ping, 'ping')
server.register_function(self.run_daemon, 'daemon')
server.register_function(self.run_gui, 'gui')
self.server = server
def ping(self): def ping(self):
return True return True

View File

@ -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

View File

@ -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
# #

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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):

View File

@ -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)

View File

@ -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

View File

@ -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"

View File

@ -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):

View File

@ -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):

View File

@ -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':

View File

@ -43,7 +43,7 @@ setup(
'qrcode', 'qrcode',
'protobuf', 'protobuf',
'dnspython', 'dnspython',
'jsonrpclib', 'jsonrpclib-pelix',
'PySocks>=1.6.6', 'PySocks>=1.6.6',
], ],
packages=[ packages=[