always pass coins to wallet.make_unsigned_transactions. fix \! shortcut in commands

This commit is contained in:
ThomasV 2015-05-31 11:31:41 +02:00
parent 0531f00c80
commit 5cd3bfedb6
4 changed files with 27 additions and 25 deletions

View File

@ -26,6 +26,7 @@ from gi.repository import Gtk, Gdk, GObject, cairo
from decimal import Decimal from decimal import Decimal
from electrum.util import print_error, InvalidPassword from electrum.util import print_error, InvalidPassword
from electrum.bitcoin import is_valid from electrum.bitcoin import is_valid
from electrum.wallet import NotEnoughFunds
from electrum import WalletStorage, Wallet from electrum import WalletStorage, Wallet
Gdk.threads_init() Gdk.threads_init()
@ -687,8 +688,9 @@ class ElectrumWindow:
if not is_fee: fee = None if not is_fee: fee = None
if amount is None: if amount is None:
return return
coins = self.wallet.get_spendable_coins()
try: 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 self.funds_error = False
except NotEnoughFunds: except NotEnoughFunds:
self.funds_error = True self.funds_error = True

View File

@ -1006,7 +1006,7 @@ class ElectrumWindow(QMainWindow):
addr = self.payto_e.payto_address if self.payto_e.payto_address else self.dummy_address addr = self.payto_e.payto_address if self.payto_e.payto_address else self.dummy_address
outputs = [('address', addr, amount)] outputs = [('address', addr, amount)]
try: 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 self.not_enough_funds = False
except NotEnoughFunds: except NotEnoughFunds:
self.not_enough_funds = True self.not_enough_funds = True
@ -1111,7 +1111,7 @@ class ElectrumWindow(QMainWindow):
return return
outputs, fee, label, coins = r outputs, fee, label, coins = r
try: try:
tx = self.wallet.make_unsigned_transaction(outputs, fee, None, coins = coins) tx = self.wallet.make_unsigned_transaction(coins, outputs, fee)
if not tx: if not tx:
raise BaseException(_("Insufficient funds")) raise BaseException(_("Insufficient funds"))
except Exception as e: except Exception as e:

View File

@ -424,7 +424,7 @@ class Commands:
def verifymessage(self, address, signature, message): def verifymessage(self, address, signature, message):
return bitcoin.verify_message(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: for to_address, amount in outputs:
if not is_valid(to_address): if not is_valid(to_address):
raise Exception("Invalid Bitcoin address", to_address) raise Exception("Invalid Bitcoin address", to_address)
@ -445,6 +445,9 @@ class Commands:
if change_addr and v == change_addr: if change_addr and v == change_addr:
change_addr = k change_addr = k
if fee is not None:
fee = int(100000000*fee)
final_outputs = [] final_outputs = []
for to_address, amount in outputs: for to_address, amount in outputs:
for k, v in self.wallet.labels.items(): for k, v in self.wallet.labels.items():
@ -453,11 +456,22 @@ class Commands:
print_msg("alias", to_address) print_msg("alias", to_address)
break 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)) 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): def _read_csv(self, csvpath):
import csv import csv
@ -473,17 +487,6 @@ class Commands:
def mktx(self, to_address, amount, fee=None, from_addr=None, change_addr=None): def mktx(self, to_address, amount, fee=None, from_addr=None, change_addr=None):
domain = [from_addr] if from_addr else 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) tx = self._mktx([(to_address, amount)], fee, change_addr, domain)
return tx return tx

View File

@ -840,16 +840,12 @@ class Abstract_Wallet(object):
fee = MIN_RELAY_TX_FEE fee = MIN_RELAY_TX_FEE
return 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 # check outputs
for type, data, value in outputs: for type, data, value in outputs:
if type == 'address': if type == 'address':
assert is_address(data), "Address " + data + " is invalid!" 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)) amount = sum(map(lambda x:x[2], outputs))
total = fee = 0 total = fee = 0
inputs = [] inputs = []
@ -923,8 +919,9 @@ class Abstract_Wallet(object):
run_hook('make_unsigned_transaction', tx) run_hook('make_unsigned_transaction', tx)
return tx return tx
def mktx(self, outputs, password, fee=None, change_addr=None, domain= None, coins = None ): def mktx(self, outputs, password, fee=None, change_addr=None, domain=None):
tx = self.make_unsigned_transaction(outputs, fee, change_addr, domain, coins) coins = self.get_spendable_coins(domain)
tx = self.make_unsigned_transaction(coins, outputs, fee, change_addr)
self.sign_transaction(tx, password) self.sign_transaction(tx, password)
return tx return tx