always pass coins to wallet.make_unsigned_transactions. fix \! shortcut in commands
This commit is contained in:
parent
0531f00c80
commit
5cd3bfedb6
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue