electrum

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

commit 4e070bda5721a2bb0519c2758cf5f867be46d3fd
parent c763445734bf3a79a9b27c46a84a20fe96e34748
Author: thomasv <thomasv@gitorious>
Date:   Wed,  5 Dec 2012 18:18:47 +0100

new command: signtx (offline transaction signing)

Diffstat:
Melectrum | 16++++++++++++++--
Mlib/gui_qt.py | 27++++++++++++++++-----------
Mlib/wallet.py | 12+++++++++---
3 files changed, 39 insertions(+), 16 deletions(-)

diff --git a/electrum b/electrum @@ -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': @@ -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', @@ -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): @@ -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 ) diff --git a/lib/gui_qt.py b/lib/gui_qt.py @@ -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') ) @@ -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): diff --git a/lib/wallet.py b/lib/wallet.py @@ -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): @@ -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)