talways pass coins to wallet.make_unsigned_transactions. fix \! shortcut in commands - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 5cd3bfedb6c55477e386e3f59608cd91cc7d1d5b DIR parent 0531f00c80c507cd7f1feea64597b9a0ae7b1e74 HTML Author: ThomasV <thomasv@gitorious> Date: Sun, 31 May 2015 11:31:41 +0200 always pass coins to wallet.make_unsigned_transactions. fix \! shortcut in commands Diffstat: M gui/gtk.py | 4 +++- M gui/qt/main_window.py | 4 ++-- M lib/commands.py | 33 +++++++++++++++++-------------- M lib/wallet.py | 11 ++++------- 4 files changed, 27 insertions(+), 25 deletions(-) --- DIR diff --git a/gui/gtk.py b/gui/gtk.py t@@ -26,6 +26,7 @@ from gi.repository import Gtk, Gdk, GObject, cairo from decimal import Decimal from electrum.util import print_error, InvalidPassword from electrum.bitcoin import is_valid +from electrum.wallet import NotEnoughFunds from electrum import WalletStorage, Wallet Gdk.threads_init() t@@ -687,8 +688,9 @@ class ElectrumWindow: if not is_fee: fee = None if amount is None: return + coins = self.wallet.get_spendable_coins() try: - tx = self.wallet.make_unsigned_transaction([('op_return', 'dummy_tx', amount)], fee) + tx = self.wallet.make_unsigned_transaction(coins, [('op_return', 'dummy_tx', amount)], fee) self.funds_error = False except NotEnoughFunds: self.funds_error = True DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py t@@ -1006,7 +1006,7 @@ class ElectrumWindow(QMainWindow): addr = self.payto_e.payto_address if self.payto_e.payto_address else self.dummy_address outputs = [('address', addr, amount)] try: - tx = self.wallet.make_unsigned_transaction(outputs, fee, coins = self.get_coins()) + tx = self.wallet.make_unsigned_transaction(self.get_coins(), outputs, fee) self.not_enough_funds = False except NotEnoughFunds: self.not_enough_funds = True t@@ -1111,7 +1111,7 @@ class ElectrumWindow(QMainWindow): return outputs, fee, label, coins = r try: - tx = self.wallet.make_unsigned_transaction(outputs, fee, None, coins = coins) + tx = self.wallet.make_unsigned_transaction(coins, outputs, fee) if not tx: raise BaseException(_("Insufficient funds")) except Exception as e: DIR diff --git a/lib/commands.py b/lib/commands.py t@@ -424,7 +424,7 @@ class Commands: def verifymessage(self, address, signature, message): return bitcoin.verify_message(address, signature, message) - def _mktx(self, outputs, fee = None, change_addr = None, domain = None): + def _mktx(self, outputs, fee=None, change_addr=None, domain=None): for to_address, amount in outputs: if not is_valid(to_address): raise Exception("Invalid Bitcoin address", to_address) t@@ -445,6 +445,9 @@ class Commands: if change_addr and v == change_addr: change_addr = k + if fee is not None: + fee = int(100000000*fee) + final_outputs = [] for to_address, amount in outputs: for k, v in self.wallet.labels.items(): t@@ -453,11 +456,22 @@ class Commands: print_msg("alias", to_address) break - amount = int(100000000*amount) + if amount == '!': + assert len(outputs) == 1 + inputs = self.wallet.get_spendable_coins(domain) + amount = sum(map(lambda x:x['value'], inputs)) + if fee is None: + for i in inputs: + self.wallet.add_input_info(i) + output = ('address', to_address, amount) + dummy_tx = Transaction.from_io(inputs, [output]) + fee = self.wallet.estimated_fee(dummy_tx) + amount -= fee + else: + amount = int(100000000*amount) final_outputs.append(('address', to_address, amount)) - if fee is not None: fee = int(100000000*fee) - return self.wallet.mktx(final_outputs, self.password, fee , change_addr, domain) + return self.wallet.mktx(final_outputs, self.password, fee, change_addr, domain) def _read_csv(self, csvpath): import csv t@@ -473,17 +487,6 @@ class Commands: def mktx(self, to_address, amount, fee=None, from_addr=None, change_addr=None): domain = [from_addr] if from_addr else None - if amount == '!': - inputs = self.wallet.get_spendable_coins(domain) - amount = sum(map(lambda x:x['value'], inputs)) - for i in inputs: - self.wallet.add_input_info(i) - output = ('address', to_address, amount) - dummy_tx = Transaction.from_io(inputs, [output]) - fee = self.wallet.estimated_fee(dummy_tx) - amount -= fee - amount /= Decimal(100000000) - fee /= Decimal(100000000) tx = self._mktx([(to_address, amount)], fee, change_addr, domain) return tx DIR diff --git a/lib/wallet.py b/lib/wallet.py t@@ -840,16 +840,12 @@ class Abstract_Wallet(object): fee = MIN_RELAY_TX_FEE return fee - def make_unsigned_transaction(self, outputs, fixed_fee=None, change_addr=None, domain=None, coins=None ): + def make_unsigned_transaction(self, coins, outputs, fixed_fee=None, change_addr=None): # check outputs for type, data, value in outputs: if type == 'address': assert is_address(data), "Address " + data + " is invalid!" - # get coins - if not coins: - coins = self.get_spendable_coins(domain) - amount = sum(map(lambda x:x[2], outputs)) total = fee = 0 inputs = [] t@@ -923,8 +919,9 @@ class Abstract_Wallet(object): run_hook('make_unsigned_transaction', tx) return tx - def mktx(self, outputs, password, fee=None, change_addr=None, domain= None, coins = None ): - tx = self.make_unsigned_transaction(outputs, fee, change_addr, domain, coins) + def mktx(self, outputs, password, fee=None, change_addr=None, domain=None): + coins = self.get_spendable_coins(domain) + tx = self.make_unsigned_transaction(coins, outputs, fee, change_addr) self.sign_transaction(tx, password) return tx