commit 777a3aa8bfe751c13873a272cea2c95215c9234d
parent 6b872b68bd322d71326600a1df70035b80da99ff
Author: ThomasV <thomasv@electrum.org>
Date: Thu, 6 Jul 2017 16:03:21 +0200
Fixes for TrustedCoin plugin:
- reset billing_info after broadcast
- when bumping tx fee, do not use Trustedcoin output
Diffstat:
4 files changed, 33 insertions(+), 15 deletions(-)
diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
@@ -1340,9 +1340,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
_("Mining fee") + ": " + self.format_amount_and_units(fee),
]
- extra_fee = run_hook('get_additional_fee', self.wallet, tx)
- if extra_fee:
- msg.append( _("Additional fees") + ": " + self.format_amount_and_units(extra_fee) )
+ x_fee = run_hook('get_tx_extra_fee', self.wallet, tx)
+ if x_fee:
+ x_fee_address, x_fee_amount = x_fee
+ msg.append( _("Additional fees") + ": " + self.format_amount_and_units(x_fee_amount) )
confirm_rate = 2 * self.config.max_fee_rate()
if fee > confirm_rate * tx.estimated_size() / 1000:
diff --git a/lib/wallet.py b/lib/wallet.py
@@ -1030,6 +1030,11 @@ class Abstract_Wallet(PrintError):
# ... unless there is none
if not s:
s = outputs
+ x_fee = run_hook('get_tx_extra_fee', self, tx)
+ if x_fee:
+ x_fee_address, x_fee_amount = x_fee
+ s = filter(lambda x: x[1]!=x_fee_address, s)
+
# prioritize low value outputs, to get rid of dust
s = sorted(s, key=lambda x: x[2])
for o in s:
diff --git a/plugins/trustedcoin/qt.py b/plugins/trustedcoin/qt.py
@@ -58,9 +58,7 @@ class Plugin(TrustedCoinPlugin):
button = StatusBarButton(QIcon(":icons/trustedcoin-status.png"),
_("TrustedCoin"), action)
window.statusBar().addPermanentWidget(button)
- t = Thread(target=self.request_billing_info, args=(wallet,))
- t.setDaemon(True)
- t.start()
+ self.start_request_thread(window.wallet)
def auth_dialog(self, window):
d = WindowModalDialog(window, _("Authorization"))
@@ -102,13 +100,10 @@ class Plugin(TrustedCoinPlugin):
wallet = window.wallet
if not isinstance(wallet, self.wallet_class):
return
- if not wallet.can_sign_without_server():
- if wallet.billing_info is None:
- # request billing info before forming the transaction
- waiting_dialog(self, window).wait()
- if wallet.billing_info is None:
- window.show_message('Could not contact server')
- return True
+ if wallet.can_sign_without_server():
+ return
+ if wallet.billing_info is None:
+ return True
return False
diff --git a/plugins/trustedcoin/trustedcoin.py b/plugins/trustedcoin/trustedcoin.py
@@ -237,6 +237,9 @@ class Wallet_2fa(Multisig_Wallet):
def extra_fee(self, config):
if self.can_sign_without_server():
return 0
+ if self.billing_info is None:
+ self.plugin.start_request_thread(self)
+ return 0
if self.billing_info.get('tx_remaining'):
return 0
if self.is_billing:
@@ -282,6 +285,8 @@ class Wallet_2fa(Multisig_Wallet):
raw_tx = r.get('transaction')
tx.update(raw_tx)
self.print_error("twofactor: is complete", tx.is_complete())
+ # reset billing_info
+ self.billing_info = None
# Utility functions
@@ -314,6 +319,7 @@ class TrustedCoinPlugin(BasePlugin):
def __init__(self, parent, config, name):
BasePlugin.__init__(self, parent, config, name)
self.wallet_class.plugin = self
+ self.requesting = False
@staticmethod
def is_valid_seed(seed):
@@ -326,23 +332,34 @@ class TrustedCoinPlugin(BasePlugin):
return True
@hook
- def get_additional_fee(self, wallet, tx):
+ def get_tx_extra_fee(self, wallet, tx):
if type(wallet) != Wallet_2fa:
return
address = wallet.billing_info['billing_address']
for _type, addr, amount in tx.outputs():
if _type == TYPE_ADDRESS and addr == address:
- return amount
+ return address, amount
def request_billing_info(self, wallet):
+ self.print_error("request billing info")
billing_info = server.get(wallet.get_user_id()[1])
billing_address = make_billing_address(wallet, billing_info['billing_index'])
assert billing_address == billing_info['billing_address']
wallet.billing_info = billing_info
wallet.price_per_tx = dict(billing_info['price_per_tx'])
wallet.price_per_tx.pop(1)
+ self.requesting = False
return True
+ def start_request_thread(self, wallet):
+ from threading import Thread
+ if self.requesting is False:
+ self.requesting = True
+ t = Thread(target=self.request_billing_info, args=(wallet,))
+ t.setDaemon(True)
+ t.start()
+ return t
+
def make_seed(self):
return Mnemonic('english').make_seed(seed_type='2fa', num_bits=128)