From 5a508f7b8d07835d54aec8b9c22a9b2c25609357 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 3 Apr 2018 01:50:37 +0200 Subject: [PATCH] fix #4218 --- lib/keystore.py | 13 +++++++++++++ lib/wallet.py | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/keystore.py b/lib/keystore.py index f4b3d0166..968323310 100644 --- a/lib/keystore.py +++ b/lib/keystore.py @@ -76,6 +76,8 @@ class KeyStore(PrintError): return False return bool(self.get_tx_derivations(tx)) + def ready_to_sign(self): + return not self.is_watching_only() class Software_KeyStore(KeyStore): @@ -536,6 +538,17 @@ class Hardware_KeyStore(KeyStore, Xpub): password = self.get_pubkey_from_xpub(xpub, ()) return password + def has_usable_connection_with_device(self): + if not hasattr(self, 'plugin'): + return False + client = self.plugin.get_client(self, force_pair=False) + if client is None: + return False + return client.has_usable_connection_with_device() + + def ready_to_sign(self): + return super().ready_to_sign() and self.has_usable_connection_with_device() + def bip39_normalize_passphrase(passphrase): return normalize('NFKD', passphrase or '') diff --git a/lib/wallet.py b/lib/wallet.py index 6dc4b8e5e..f5596c9f3 100644 --- a/lib/wallet.py +++ b/lib/wallet.py @@ -1458,8 +1458,8 @@ class Abstract_Wallet(PrintError): # hardware wallets require extra info if any([(isinstance(k, Hardware_KeyStore) and k.can_sign(tx)) for k in self.get_keystores()]): self.add_hw_info(tx) - # sign - for k in self.get_keystores(): + # sign. start with ready keystores. + for k in sorted(self.get_keystores(), key=lambda ks: ks.ready_to_sign(), reverse=True): try: if k.can_sign(tx): k.sign_transaction(tx, password)