URI: 
       tMerge pull request #3536 from SomberNight/ledger_needs_fw_upd_msg - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 5c6544a296e929f6f7230b4f3a2ae4961126ad0f
   DIR parent 189779711dffd6bc6532b88709bc4798c981d4b6
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Mon, 18 Dec 2017 10:09:14 +0100
       
       Merge pull request #3536 from SomberNight/ledger_needs_fw_upd_msg
       
       ledger: mention "bitcoin" app when update is needed
       Diffstat:
         M plugins/ledger/ledger.py            |      40 ++++++++++++++++++-------------
       
       1 file changed, 23 insertions(+), 17 deletions(-)
       ---
   DIR diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py
       t@@ -25,6 +25,12 @@ try:
        except ImportError:
            BTCHIP = False
        
       +MSG_NEEDS_FW_UPDATE_GENERIC = _('Firmware version too old. Please update at') + \
       +                      ' https://www.ledgerwallet.com'
       +MSG_NEEDS_FW_UPDATE_SEGWIT = _('Firmware version (or "Bitcoin" app) too old for Segwit support. Please update at') + \
       +                      ' https://www.ledgerwallet.com'
       +
       +
        class Ledger_Client():
            def __init__(self, hidDevice):
                self.dongleObject = btchip(hidDevice)
       t@@ -46,7 +52,7 @@ class Ledger_Client():
                return ""
        
            def i4b(self, x):
       -        return pack('>I', x)        
       +        return pack('>I', x)
        
            def get_xpub(self, bip32_path, xtype):
                self.checkDevice()
       t@@ -57,9 +63,9 @@ class Ledger_Client():
                #self.get_client() # prompt for the PIN before displaying the dialog if necessary
                #self.handler.show_message("Computing master public key")
                if xtype in ['p2wpkh', 'p2wsh'] and not self.supports_native_segwit():
       -            raise Exception("Firmware version too old for Segwit support. Please update at https://www.ledgerwallet.com")
       +            raise Exception(MSG_NEEDS_FW_UPDATE_SEGWIT)
                if xtype in ['p2wpkh-p2sh', 'p2wsh-p2sh'] and not self.supports_segwit():
       -            raise Exception("Firmware version too old for Segwit support. Please update at https://www.ledgerwallet.com")
       +            raise Exception(MSG_NEEDS_FW_UPDATE_SEGWIT)
                splitPath = bip32_path.split('/')
                if splitPath[0] == 'm':
                    splitPath = splitPath[1:]
       t@@ -119,7 +125,7 @@ class Ledger_Client():
        
                    if not checkFirmware(firmware):
                        self.dongleObject.dongle.close()
       -                raise Exception("HW1 firmware version too old. Please update at https://www.ledgerwallet.com")
       +                raise Exception(MSG_NEEDS_FW_UPDATE_GENERIC)
                    try:
                        self.dongleObject.getOperationMode()
                    except BTChipException as e:
       t@@ -183,14 +189,14 @@ class Ledger_KeyStore(Hardware_KeyStore):
                return obj
        
            def get_derivation(self):
       -        return self.derivation        
       +        return self.derivation
        
            def get_client(self):
                return self.plugin.get_client(self).dongleObject
       -    
       +
            def get_client_electrum(self):
                return self.plugin.get_client(self)
       -    
       +
            def give_error(self, message, clear_client = False):
                print_error(message)
                if not self.signing:
       t@@ -285,12 +291,12 @@ class Ledger_KeyStore(Hardware_KeyStore):
        
                    if txin['type'] in ['p2wpkh-p2sh', 'p2wsh-p2sh']:
                        if not self.get_client_electrum().supports_segwit():
       -                    self.give_error("Firmware version too old to support segwit. Please update at https://www.ledgerwallet.com")
       +                    self.give_error(MSG_NEEDS_FW_UPDATE_SEGWIT)
                        segwitTransaction = True
        
                    if txin['type'] in ['p2wpkh', 'p2wsh']:
                        if not self.get_client_electrum().supports_native_segwit():
       -                    self.give_error("Firmware version too old to support native segwit. Please update at https://www.ledgerwallet.com")
       +                    self.give_error(MSG_NEEDS_FW_UPDATE_SEGWIT)
                        segwitTransaction = True
        
                    pubkeys, x_pubkeys = tx.get_sorted_pubkeys(txin)
       t@@ -342,10 +348,10 @@ class Ledger_KeyStore(Hardware_KeyStore):
                self.handler.show_message(_("Confirm Transaction on your Ledger device..."))
                try:
                    # Get trusted inputs from the original transactions
       -            for utxo in inputs:                
       +            for utxo in inputs:
                        sequence = int_to_hex(utxo[5], 4)
                        if segwitTransaction:
       -                    txtmp = bitcoinTransaction(bfh(utxo[0]))                    
       +                    txtmp = bitcoinTransaction(bfh(utxo[0]))
                            tmp = bfh(utxo[3])[::-1]
                            tmp += bfh(int_to_hex(utxo[1], 4))
                            tmp += txtmp.outputs[utxo[1]].amount
       t@@ -434,7 +440,7 @@ class LedgerPlugin(HW_PluginBase):
            libraries_available = BTCHIP
            keystore_class = Ledger_KeyStore
            client = None
       -    DEVICE_IDS = [ 
       +    DEVICE_IDS = [
                           (0x2581, 0x1807), # HW.1 legacy btchip
                           (0x2581, 0x2b7c), # HW.1 transitional production
                           (0x2581, 0x3b7c), # HW.1 ledger production
       t@@ -459,12 +465,12 @@ class LedgerPlugin(HW_PluginBase):
            def get_btchip_device(self, device):
                ledger = False
                if (device.product_key[0] == 0x2581 and device.product_key[1] == 0x3b7c) or (device.product_key[0] == 0x2581 and device.product_key[1] == 0x4b7c) or (device.product_key[0] == 0x2c97):
       -           ledger = True        
       +           ledger = True
                dev = hid.device()
                dev.open_path(device.path)
                dev.set_nonblocking(True)
                return HIDDongleHIDAPI(dev, ledger, BTCHIP_DEBUG)
       -        
       +
            def create_client(self, device, handler):
                self.handler = handler
        
       t@@ -473,7 +479,7 @@ class LedgerPlugin(HW_PluginBase):
                    client = Ledger_Client(client)
                return client
        
       -    def setup_device(self, device_info, wizard):        
       +    def setup_device(self, device_info, wizard):
                devmgr = self.device_manager()
                device_id = device_info.device.id_
                client = devmgr.client_by_id(device_id)
       t@@ -494,10 +500,10 @@ class LedgerPlugin(HW_PluginBase):
                devmgr = self.device_manager()
                handler = keystore.handler
                with devmgr.hid_lock:
       -            client = devmgr.client_for_keystore(self, handler, keystore, force_pair)        
       +            client = devmgr.client_for_keystore(self, handler, keystore, force_pair)
                # returns the client for a given keystore. can use xpub
                #if client:
                #    client.used()
                if client is not None:
       -            client.checkDevice()                    
       +            client.checkDevice()
                return client