URI: 
       tMerge pull request #4005 from SomberNight/trezor_segwit_offline_signing - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 7e501115cd4a6790be5b13ff6b4499115b350562
   DIR parent 7816edc3428f7148de1b2c4b567408b68c1d25cb
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Sat,  3 Mar 2018 09:59:04 +0100
       
       Merge pull request #4005 from SomberNight/trezor_segwit_offline_signing
       
       ttrezor: segwit offline signing
       Diffstat:
         M lib/network.py                      |       3 ++-
         M lib/util.py                         |      10 ++++++++++
         M lib/wallet.py                       |      17 ++++++++++++-----
         M plugins/trezor/trezor.py            |       3 +++
       
       4 files changed, 27 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/lib/network.py b/lib/network.py
       t@@ -40,6 +40,7 @@ from .bitcoin import *
        from .interface import Connection, Interface
        from . import blockchain
        from .version import ELECTRUM_VERSION, PROTOCOL_VERSION
       +from .i18n import _
        
        
        NODES_RETRY_INTERVAL = 60
       t@@ -1069,7 +1070,7 @@ class Network(util.DaemonThread):
                try:
                    r = q.get(True, timeout)
                except queue.Empty:
       -            raise BaseException('Server did not answer')
       +            raise util.TimeoutException(_('Server did not answer'))
                if r.get('error'):
                    raise BaseException(r.get('error'))
                return r.get('result')
   DIR diff --git a/lib/util.py b/lib/util.py
       t@@ -74,6 +74,16 @@ class FileExportFailed(Exception):
                return _("Failed to export to file.") + "\n" + self.message
        
        
       +class TimeoutException(Exception):
       +    def __init__(self, message=''):
       +        self.message = str(message)
       +
       +    def __str__(self):
       +        if not self.message:
       +            return _("Operation timed out.")
       +        return self.message
       +
       +
        # Throw this exception to unwind the stack like when an error occurs.
        # However unlike other exceptions the user won't be informed.
        class UserCancelled(Exception):
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -44,7 +44,7 @@ import sys
        
        from .i18n import _
        from .util import (NotEnoughFunds, PrintError, UserCancelled, profiler,
       -                   format_satoshis, NoDynamicFeeEstimates)
       +                   format_satoshis, NoDynamicFeeEstimates, TimeoutException)
        
        from .bitcoin import *
        from .version import *
       t@@ -1401,21 +1401,28 @@ class Abstract_Wallet(PrintError):
                        return True
                return False
        
       -    def get_input_tx(self, tx_hash):
       +    def get_input_tx(self, tx_hash, ignore_timeout=False):
                # First look up an input transaction in the wallet where it
                # will likely be.  If co-signing a transaction it may not have
                # all the input txs, in which case we ask the network.
       -        tx = self.transactions.get(tx_hash)
       +        tx = self.transactions.get(tx_hash, None)
                if not tx and self.network:
                    request = ('blockchain.transaction.get', [tx_hash])
       -            tx = Transaction(self.network.synchronous_get(request))
       +            try:
       +                tx = Transaction(self.network.synchronous_get(request))
       +            except TimeoutException as e:
       +                self.print_error('getting input txn from network timed out for {}'.format(tx_hash))
       +                if not ignore_timeout:
       +                    raise e
                return tx
        
            def add_hw_info(self, tx):
                # add previous tx for hw wallets
                for txin in tx.inputs():
                    tx_hash = txin['prevout_hash']
       -            txin['prev_tx'] = self.get_input_tx(tx_hash)
       +            # segwit inputs might not be needed for some hw wallets
       +            ignore_timeout = Transaction.is_segwit_input(txin)
       +            txin['prev_tx'] = self.get_input_tx(tx_hash, ignore_timeout)
                # add output info for hw wallets
                info = {}
                xpubs = self.get_master_public_keys()
   DIR diff --git a/plugins/trezor/trezor.py b/plugins/trezor/trezor.py
       t@@ -434,6 +434,9 @@ class TrezorPlugin(HW_PluginBase):
        
            def electrum_tx_to_txtype(self, tx):
                t = self.types.TransactionType()
       +        if tx is None:
       +            # probably for segwit input and we don't need this prev txn
       +            return t
                d = deserialize(tx.raw)
                t.version = d['version']
                t.lock_time = d['lockTime']