URI: 
       thww: rm some code duplication: add "scan_and_create_client_for_device" - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 81fc3fcce2413bae55fc3e80a43744f7743745aa
   DIR parent 18c98483acc6adb13b22dfd6d356dac5128cd8e5
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Wed,  1 Apr 2020 20:22:39 +0200
       
       hww: rm some code duplication: add "scan_and_create_client_for_device"
       
       Diffstat:
         M electrum/plugins/coldcard/coldcard… |      11 ++---------
         M electrum/plugins/digitalbitbox/dig… |      11 ++---------
         M electrum/plugins/hw_wallet/plugin.… |       9 +++++++++
         M electrum/plugins/keepkey/keepkey.py |      11 ++---------
         M electrum/plugins/ledger/ledger.py   |      11 ++---------
         M electrum/plugins/safe_t/safe_t.py   |      11 ++---------
         M electrum/plugins/trezor/trezor.py   |      11 ++---------
       
       7 files changed, 21 insertions(+), 54 deletions(-)
       ---
   DIR diff --git a/electrum/plugins/coldcard/coldcard.py b/electrum/plugins/coldcard/coldcard.py
       t@@ -522,22 +522,15 @@ class ColdcardPlugin(HW_PluginBase):
                    return None
        
            def setup_device(self, device_info, wizard, purpose):
       -        devmgr = self.device_manager()
                device_id = device_info.device.id_
       -        client = devmgr.client_by_id(device_id)
       -        if client is None:
       -            raise UserFacingException(_('Failed to create a client for this device.') + '\n' +
       -                                      _('Make sure it is in the correct state.'))
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
        
            def get_xpub(self, device_id, derivation, xtype, wizard):
                # this seems to be part of the pairing process only, not during normal ops?
                # base_wizard:on_hw_derivation
                if xtype not in self.SUPPORTED_XTYPES:
                    raise ScriptTypeNotSupported(_('This type of script is not supported with {}.').format(self.device))
       -        devmgr = self.device_manager()
       -        client = devmgr.client_by_id(device_id)
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                client.ping_check()
        
                xpub = client.get_xpub(derivation, xtype)
   DIR diff --git a/electrum/plugins/digitalbitbox/digitalbitbox.py b/electrum/plugins/digitalbitbox/digitalbitbox.py
       t@@ -703,13 +703,8 @@ class DigitalBitboxPlugin(HW_PluginBase):
        
        
            def setup_device(self, device_info, wizard, purpose):
       -        devmgr = self.device_manager()
                device_id = device_info.device.id_
       -        client = devmgr.client_by_id(device_id)
       -        if client is None:
       -            raise Exception(_('Failed to create a client for this device.') + '\n' +
       -                            _('Make sure it is in the correct state.'))
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                if purpose == HWD_SETUP_NEW_WALLET:
                    client.setupRunning = True
                client.get_xpub("m/44'/0'", 'standard')
       t@@ -739,9 +734,7 @@ class DigitalBitboxPlugin(HW_PluginBase):
                    raise ScriptTypeNotSupported(_('This type of script is not supported with {}.').format(self.device))
                if is_all_public_derivation(derivation):
                    raise Exception(f"The {self.device} does not reveal xpubs corresponding to non-hardened paths. (path: {derivation})")
       -        devmgr = self.device_manager()
       -        client = devmgr.client_by_id(device_id)
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                client.check_device_dialog()
                xpub = client.get_xpub(derivation, xtype)
                return xpub
   DIR diff --git a/electrum/plugins/hw_wallet/plugin.py b/electrum/plugins/hw_wallet/plugin.py
       t@@ -65,6 +65,15 @@ class HW_PluginBase(BasePlugin):
                    if isinstance(keystore, self.keystore_class):
                        self.device_manager().unpair_xpub(keystore.xpub)
        
       +    def scan_and_create_client_for_device(self, *, device_id: str, wizard: 'BaseWizard') -> 'HardwareClientBase':
       +        devmgr = self.device_manager()
       +        client = devmgr.client_by_id(device_id)
       +        if client is None:
       +            raise UserFacingException(_('Failed to create a client for this device.') + '\n' +
       +                                      _('Make sure it is in the correct state.'))
       +        client.handler = self.create_handler(wizard)
       +        return client
       +
            def setup_device(self, device_info: DeviceInfo, wizard: 'BaseWizard', purpose):
                """Called when creating a new wallet or when using the device to decrypt
                an existing wallet. Select the device to use.  If the device is
   DIR diff --git a/electrum/plugins/keepkey/keepkey.py b/electrum/plugins/keepkey/keepkey.py
       t@@ -275,13 +275,8 @@ class KeepKeyPlugin(HW_PluginBase):
                return self.types.HDNodePathType(node=node, address_n=address_n)
        
            def setup_device(self, device_info, wizard, purpose):
       -        devmgr = self.device_manager()
                device_id = device_info.device.id_
       -        client = devmgr.client_by_id(device_id)
       -        if client is None:
       -            raise UserFacingException(_('Failed to create a client for this device.') + '\n' +
       -                                      _('Make sure it is in the correct state.'))
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                if not device_info.initialized:
                    self.initialize_device(device_id, wizard, client.handler)
                client.get_xpub('m', 'standard')
       t@@ -290,9 +285,7 @@ class KeepKeyPlugin(HW_PluginBase):
            def get_xpub(self, device_id, derivation, xtype, wizard):
                if xtype not in self.SUPPORTED_XTYPES:
                    raise ScriptTypeNotSupported(_('This type of script is not supported with {}.').format(self.device))
       -        devmgr = self.device_manager()
       -        client = devmgr.client_by_id(device_id)
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                xpub = client.get_xpub(derivation, xtype)
                client.used()
                return xpub
   DIR diff --git a/electrum/plugins/ledger/ledger.py b/electrum/plugins/ledger/ledger.py
       t@@ -589,21 +589,14 @@ class LedgerPlugin(HW_PluginBase):
                return client
        
            def setup_device(self, device_info, wizard, purpose):
       -        devmgr = self.device_manager()
                device_id = device_info.device.id_
       -        client = devmgr.client_by_id(device_id)
       -        if client is None:
       -            raise UserFacingException(_('Failed to create a client for this device.') + '\n' +
       -                                      _('Make sure it is in the correct state.'))
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                client.get_xpub("m/44'/0'", 'standard') # TODO replace by direct derivation once Nano S > 1.1
        
            def get_xpub(self, device_id, derivation, xtype, wizard):
                if xtype not in self.SUPPORTED_XTYPES:
                    raise ScriptTypeNotSupported(_('This type of script is not supported with {}.').format(self.device))
       -        devmgr = self.device_manager()
       -        client = devmgr.client_by_id(device_id)
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                client.checkDevice()
                xpub = client.get_xpub(derivation, xtype)
                return xpub
   DIR diff --git a/electrum/plugins/safe_t/safe_t.py b/electrum/plugins/safe_t/safe_t.py
       t@@ -249,13 +249,8 @@ class SafeTPlugin(HW_PluginBase):
                return self.types.HDNodePathType(node=node, address_n=address_n)
        
            def setup_device(self, device_info, wizard, purpose):
       -        devmgr = self.device_manager()
                device_id = device_info.device.id_
       -        client = devmgr.client_by_id(device_id)
       -        if client is None:
       -            raise UserFacingException(_('Failed to create a client for this device.') + '\n' +
       -                                      _('Make sure it is in the correct state.'))
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                if not device_info.initialized:
                    self.initialize_device(device_id, wizard, client.handler)
                client.get_xpub('m', 'standard')
       t@@ -264,9 +259,7 @@ class SafeTPlugin(HW_PluginBase):
            def get_xpub(self, device_id, derivation, xtype, wizard):
                if xtype not in self.SUPPORTED_XTYPES:
                    raise ScriptTypeNotSupported(_('This type of script is not supported with {}.').format(self.device))
       -        devmgr = self.device_manager()
       -        client = devmgr.client_by_id(device_id)
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                xpub = client.get_xpub(derivation, xtype)
                client.used()
                return xpub
   DIR diff --git a/electrum/plugins/trezor/trezor.py b/electrum/plugins/trezor/trezor.py
       t@@ -268,12 +268,8 @@ class TrezorPlugin(HW_PluginBase):
                return HDNodePathType(node=node, address_n=address_n)
        
            def setup_device(self, device_info, wizard, purpose):
       -        devmgr = self.device_manager()
                device_id = device_info.device.id_
       -        client = devmgr.client_by_id(device_id)
       -        if client is None:
       -            raise UserFacingException(_('Failed to create a client for this device.') + '\n' +
       -                                      _('Make sure it is in the correct state.'))
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
        
                if not client.is_uptodate():
                    msg = (_('Outdated {} firmware for device labelled {}. Please '
       t@@ -281,7 +277,6 @@ class TrezorPlugin(HW_PluginBase):
                           .format(self.device, client.label(), self.firmware_URL))
                    raise OutdatedHwFirmwareException(msg)
        
       -        client.handler = self.create_handler(wizard)
                if not device_info.initialized:
                    self.initialize_device(device_id, wizard, client.handler)
                is_creating_wallet = purpose == HWD_SETUP_NEW_WALLET
       t@@ -291,9 +286,7 @@ class TrezorPlugin(HW_PluginBase):
            def get_xpub(self, device_id, derivation, xtype, wizard):
                if xtype not in self.SUPPORTED_XTYPES:
                    raise ScriptTypeNotSupported(_('This type of script is not supported with {}.').format(self.device))
       -        devmgr = self.device_manager()
       -        client = devmgr.client_by_id(device_id)
       -        client.handler = self.create_handler(wizard)
       +        client = self.scan_and_create_client_for_device(device_id=device_id, wizard=wizard)
                xpub = client.get_xpub(derivation, xtype)
                client.used()
                return xpub