electrum

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

commit 985d54197ad84d958b0155531804ebdc83649195
parent 4d60380325f6bda89309dbe415976fa53de6bcde
Author: ThomasV <thomasv@electrum.org>
Date:   Wed,  9 Sep 2015 12:09:16 +0200

cleanup, and make send_tx work

Diffstat:
Mgui/kivy/main_window.py | 168++++++++++++++++++++-----------------------------------------------------------
Mgui/kivy/uix/ui_screens/mainscreen.kv | 4++--
2 files changed, 43 insertions(+), 129 deletions(-)

diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py @@ -1,11 +1,11 @@ import sys import datetime - -from android import activity +import traceback from electrum import WalletStorage, Wallet from electrum.i18n import _, set_language from electrum.contacts import Contacts +from electrum import bitcoin from kivy.config import Config Config.set('modules', 'screen', 'droid2') @@ -29,11 +29,10 @@ Factory.register('InstallWizard', module='electrum_gui.kivy.uix.dialogs.installwizard') Factory.register('InfoBubble', module='electrum_gui.kivy.uix.dialogs') Factory.register('ELTextInput', module='electrum_gui.kivy.uix.screens') -Factory.register('QrScannerDialog', module='electrum_gui.kivy.uix.dialogs.qr_scanner') # delayed imports: for startup speed on android -notification = app = Decimal = ref = format_satoshis = bitcoin = Builder = None +notification = app = Decimal = ref = format_satoshis = Builder = None inch = None util = False re = None @@ -124,6 +123,17 @@ class ElectrumWindow(App): '''Number of zeros used while representing the value in base_unit. ''' + def get_amount(self, amount_str): + from electrum.bitcoin import COIN + from decimal import Decimal + try: + x = Decimal(str(amount_str)) + except: + return None + p = pow(10, self.decimal_point) + return int(p * x) + + navigation_higherarchy = ListProperty([]) '''This is a list of the current navigation higherarchy of the app used to navigate using back button. @@ -188,8 +198,8 @@ class ElectrumWindow(App): self.electrum_config = config = kwargs.get('config', None) self.gui_object = kwargs.get('gui_object', None) - self.config = self.gui_object.config - self.contacts = Contacts(self.config) + #self.config = self.gui_object.config + self.contacts = Contacts(self.electrum_config) self.bind(url=self.set_url) # were we sent a url? @@ -208,16 +218,9 @@ class ElectrumWindow(App): def set_url(self, instance, url): self.gui_object.set_url(url) - def old_scan_qr(self, on_complete): - dlg = Cache.get('electrum_widgets', 'QrScannerDialog') - if not dlg: - dlg = Factory.QrScannerDialog() - Cache.append('electrum_widgets', 'QrScannerDialog', dlg) - dlg.bind(on_complete=on_complete) - dlg.open() - def scan_qr(self, on_complete): from jnius import autoclass + from android import activity PythonActivity = autoclass('org.renpy.android.PythonActivity') Intent = autoclass('android.content.Intent') intent = Intent("com.google.zxing.client.android.SCAN") @@ -498,9 +501,7 @@ class ElectrumWindow(App): # since the callback has been called before the GUI was initialized self.update_history_tab() self.notify_transactions() - self.update_account_selector() - #run_hook('load_wallet', wallet) def update_status(self, *dt): if not self.wallet: @@ -564,18 +565,6 @@ class ElectrumWindow(App): self.update_history_tab() self.update_contacts_tab() - def update_account_selector(self): - # account selector - #TODO - return - accounts = self.wallet.get_account_names() - self.account_selector.clear() - if len(accounts) > 1: - self.account_selector.addItems([_("All accounts")] + accounts.values()) - self.account_selector.setCurrentIndex(0) - self.account_selector.show() - else: - self.account_selector.hide() def parse_histories(self, items): for item in items: @@ -742,45 +731,12 @@ class ElectrumWindow(App): #self.run_hook('update_contacts_tab') - def set_pay_from(self, l): - #TODO - return - self.pay_from = l - self.from_list.clear() - self.from_label.setHidden(len(self.pay_from) == 0) - self.from_list.setHidden(len(self.pay_from) == 0) - for addr in self.pay_from: - c, u = self.wallet.get_addr_balance(addr) - balance = self.format_amount(c + u) - self.from_list.addTopLevelItem(QTreeWidgetItem( [addr, balance] )) - - - def protected(func): - return lambda s, *args, **kwargs: s.do_protect(func, args, **kwargs) - - def do_protect(self, func, **kwargs): - print kwargs - instance = kwargs.get('instance', None) - password = kwargs.get('password', None) - message = kwargs.get('message', '') - - def run_func(instance=None, password=None): - args = (self, instance, password) - apply(func, args) - - if self.wallet.use_encryption: - return self.password_required_dialog(post_ok=run_func, message=message) - - return run_func() - def do_send(self): app = App.get_running_app() screen_send = app.root.main_screen.ids.tabs.ids.screen_send scrn = screen_send.ids label = unicode(scrn.message_e.text) - r = unicode(scrn.payto_e.text).strip() - # label or alias, with address in brackets global re if not re: @@ -788,75 +744,45 @@ class ElectrumWindow(App): m = re.match('(.*?)\s*\<([1-9A-HJ-NP-Za-km-z]{26,})\>', r) to_address = m.group(2) if m else r - global bitcoin - if not bitcoin: - from electrum import bitcoin - if not bitcoin.is_address(to_address): - app.show_error(_('Invalid Bitcoin Address') + - ':\n' + to_address) + app.show_error(_('Invalid Bitcoin Address') + ':\n' + to_address) return - amount = scrn.amount_e.text + amount = self.get_amount(scrn.amount_e.text) + fee = scrn.fee_e.amt if not fee: app.show_error(_('Invalid Fee')) return - from pudb import set_trace; set_trace() - message = 'sending {} {} to {}'.format(\ - app.base_unit, scrn.amount_e.text, r) - - confirm_fee = self.config.get('confirm_amount', 100000) - if fee >= confirm_fee: - if not self.question(_("The fee for this transaction seems unusually high.\nAre you really sure you want to pay %(fee)s in fees?")%{ 'fee' : self.format_amount(fee) + ' '+ self.base_unit()}): - return + #from pudb import set_trace; set_trace() + message = 'sending {} {} to {}'.format(app.base_unit, scrn.amount_e.text, r) - self.send_tx(to_address, amount, fee, label) + # assume no password and fee is None + password = None + fee = None + self.send_tx([('address', to_address, amount)], fee, label, password) - @protected def send_tx(self, outputs, fee, label, password): - - # first, create an unsigned tx - domain = self.get_payment_sources() + app = App.get_running_app() + # make unsigned transaction + coins = self.wallet.get_spendable_coins() try: - tx = self.wallet.make_unsigned_transaction(outputs, fee, None, domain) - tx.error = None + tx = self.wallet.make_unsigned_transaction(coins, outputs, self.electrum_config, fee) except Exception as e: traceback.print_exc(file=sys.stdout) - self.show_info(str(e)) + app.show_error(str(e)) return + # sign transaction + try: + self.wallet.sign_transaction(tx, password) + except Exception as e: + traceback.print_exc(file=sys.stdout) + app.show_error(str(e)) + return + # broadcast + self.wallet.sendtx(tx) - # call hook to see if plugin needs gui interaction - #run_hook('send_tx', tx) - - # sign the tx - def sign_thread(): - time.sleep(0.1) - keypairs = {} - self.wallet.add_keypairs_from_wallet(tx, keypairs, password) - self.wallet.sign_transaction(tx, keypairs, password) - return tx, fee, label - - def sign_done(tx, fee, label): - if tx.error: - self.show_info(tx.error) - return - if tx.requires_fee(self.wallet.verifier) and fee < MIN_RELAY_TX_FEE: - self.show_error(_("This transaction requires a higher fee, or " - "it will not be propagated by the network.")) - return - if label: - self.wallet.set_label(tx.hash(), label) - - if not self.gui_object.payment_request: - if not tx.is_complete() or self.config.get('show_before_broadcast'): - self.show_transaction(tx) - return - - self.broadcast_transaction(tx) - - WaitingDialog(self, 'Signing..').start(sign_thread, sign_done) def notify_transactions(self, *dt): ''' @@ -1063,7 +989,6 @@ class ElectrumWindow(App): self.set_frozen(content, False) - self.set_pay_from([]) self.update_status() def set_frozen(self, entry, frozen): @@ -1156,18 +1081,7 @@ class ElectrumWindow(App): def get_payment_sources(self): - if self.pay_from: - return self.pay_from - else: - return self.wallet.get_account_addresses(self.current_account) - - - def send_from_addresses(self, addrs): - self.set_pay_from( addrs ) - tabs = self.tabs - screen_send = tabs.ids.screen_send - self.tabs.setCurrentIndex(1) - + return self.wallet.get_account_addresses(self.current_account) def payto(self, addr): if not addr: diff --git a/gui/kivy/uix/ui_screens/mainscreen.kv b/gui/kivy/uix/ui_screens/mainscreen.kv @@ -378,10 +378,10 @@ height: blue_bottom.item_height if app.expert_mode else 0 CreateAccountButtonGreen: background_color: (1, 1, 1, 1) if self.disabled else ((.258, .80, .388, 1) if self.state == 'normal' else (.203, .490, .741, 1)) - text: _('Goto next step') if app.wallet and app.wallet.seed else _('Create unsigned transaction') + text: _('Send') size_hint_y: None height: '38dp' - disabled: True if wallet_selection.opacity == 0 else False + disabled: False on_release: app.do_send() Widget