URI: 
       tcleanup, and make send_tx work - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 985d54197ad84d958b0155531804ebdc83649195
   DIR parent 4d60380325f6bda89309dbe415976fa53de6bcde
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Wed,  9 Sep 2015 12:09:16 +0200
       
       cleanup, and make send_tx work
       
       Diffstat:
         M gui/kivy/main_window.py             |     168 ++++++++-----------------------
         M gui/kivy/uix/ui_screens/mainscreen… |       4 ++--
       
       2 files changed, 43 insertions(+), 129 deletions(-)
       ---
   DIR diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
       t@@ -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')
       t@@ -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
       t@@ -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.
       t@@ -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?
       t@@ -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")
       t@@ -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:
       t@@ -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:
       t@@ -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:
       t@@ -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):
                '''
       t@@ -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):
       t@@ -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:
   DIR diff --git a/gui/kivy/uix/ui_screens/mainscreen.kv b/gui/kivy/uix/ui_screens/mainscreen.kv
       t@@ -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