URI: 
       tnew command: signtx (offline transaction signing) - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 4e070bda5721a2bb0519c2758cf5f867be46d3fd
   DIR parent c763445734bf3a79a9b27c46a84a20fe96e34748
  HTML Author: thomasv <thomasv@gitorious>
       Date:   Wed,  5 Dec 2012 18:18:47 +0100
       
       new command: signtx (offline transaction signing)
       
       Diffstat:
         M electrum                            |      16 ++++++++++++++--
         M lib/gui_qt.py                       |      27 ++++++++++++++++-----------
         M lib/wallet.py                       |      12 +++++++++---
       
       3 files changed, 39 insertions(+), 16 deletions(-)
       ---
   DIR diff --git a/electrum b/electrum
       t@@ -67,6 +67,7 @@ options:
        Syntax: mktx <recipient> <amount> [label]
        options:\n  --fee, -f: set transaction fee\n  --fromaddr, -s: send from address -\n  --changeaddr, -c: send change to address
                """,
       +    'signtx':"Sign an unsigned transaction created by a deseeded wallet\nSyntax: signtx <filename>",
            'seed':
                    "Print the generation seed of your wallet.",
            'import': 
       t@@ -93,7 +94,7 @@ options:\n  --fee, -f: set transaction fee\n  --fromaddr, -s: send from address 
        
        
        
       -offline_commands = [ 'password', 'mktx',
       +offline_commands = [ 'password', 'mktx', 'signtx',
                             'label', 'contacts',
                             'help', 'validateaddress',
                             'signmessage', 'verifymessage',
       t@@ -104,7 +105,7 @@ offline_commands = [ 'password', 'mktx',
                             'prioritize','unprioritize']
        
        
       -protected_commands = ['payto', 'password', 'mktx', 'seed', 'import','signmessage' ]
       +protected_commands = ['payto', 'password', 'mktx', 'signtx', 'seed', 'import','signmessage' ]
        
        # get password routine
        def prompt_password(prompt, confirm=True):
       t@@ -594,6 +595,17 @@ if __name__ == '__main__':
                    del(wallet.history[from_addr])
                wallet.save()
        
       +    elif cmd == 'signtx':
       +        import ast
       +        filename = args[1]
       +        f = open(filename, 'r')
       +        d = ast.literal_eval(f.read())
       +        f.close()
       +        inputs = d['inputs']
       +        outputs = d['outputs']
       +        tx = wallet.signed_tx( inputs, outputs, password )
       +        print_msg(tx)
       +
            elif cmd == 'sendtx':
                tx = args[1]
                r, h = wallet.sendtx( tx )
   DIR diff --git a/lib/gui_qt.py b/lib/gui_qt.py
       t@@ -308,8 +308,7 @@ class ElectrumWindow(QMainWindow):
        
                self.tabs = tabs = QTabWidget(self)
                tabs.addTab(self.create_history_tab(), _('History') )
       -        if self.wallet.seed:
       -            tabs.addTab(self.create_send_tab(), _('Send') )
       +        tabs.addTab(self.create_send_tab(), _('Send') )
                tabs.addTab(self.create_receive_tab(), _('Receive') )
                tabs.addTab(self.create_contacts_tab(), _('Contacts') )
                tabs.addTab(self.create_wall_tab(), _('Wall') )
       t@@ -772,17 +771,23 @@ class ElectrumWindow(QMainWindow):
                except BaseException, e:
                    self.show_message(str(e))
                    return
       -            
       -        h = self.wallet.send_tx(tx)
       -        waiting_dialog(lambda: False if self.wallet.tx_event.isSet() else _("Please wait..."))
       -        status, msg = self.wallet.receive_tx( h )
        
       -        if status:
       -            QMessageBox.information(self, '', _('Payment sent.')+'\n'+msg, _('OK'))
       -            self.do_clear()
       -            self.update_contacts_tab()
       +        if self.wallet.seed:
       +            h = self.wallet.send_tx(tx)
       +            waiting_dialog(lambda: False if self.wallet.tx_event.isSet() else _("Please wait..."))
       +            status, msg = self.wallet.receive_tx( h )
       +            if status:
       +                QMessageBox.information(self, '', _('Payment sent.')+'\n'+msg, _('OK'))
       +                self.do_clear()
       +                self.update_contacts_tab()
       +            else:
       +                QMessageBox.warning(self, _('Error'), msg, _('OK'))
                else:
       -            QMessageBox.warning(self, _('Error'), msg, _('OK'))
       +            filename = 'unsigned_tx'
       +            f = open(filename,'w')
       +            f.write(tx)
       +            f.close()
       +            QMessageBox.information(self, _('Unsigned transaction'), _("Unsigned transaction was saved to file:") + " " +filename, _('OK'))
        
        
            def set_url(self, url):
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -776,10 +776,11 @@ class Wallet:
                    change_addr = inputs[-1][0]
                    print_error( "Sending change to", change_addr )
                outputs = self.add_tx_change(outputs, amount, fee, total, change_addr)
       -        
       -        s_inputs = self.sign_inputs( inputs, outputs, password )
        
       -        tx = filter( raw_tx( s_inputs, outputs ) )
       +        if not self.seed:
       +            return {'inputs':inputs, 'outputs':outputs}
       +        
       +        tx = repr(self.signed_tx(inputs, outputs, password))
        
                for address, x in outputs:
                    if address not in self.addressbook and not self.is_mine(address):
       t@@ -791,6 +792,11 @@ class Wallet:
        
                return tx
        
       +    def signed_tx(self, inputs, outputs, password):
       +        s_inputs = self.sign_inputs( inputs, outputs, password )
       +        tx = filter( raw_tx( s_inputs, outputs ) )
       +        return tx
       +
            def sendtx(self, tx):
                # synchronous
                h = self.send_tx(tx)