Related to prev commit: multiple (compatible) keystores can now match
with the same HardwareClientBase, so we might as well also allow
reusing existing Clients for the wizard.
- the DeviceMgr no longer uses xpubs to keep track of paired hw devices
- instead, introduce keystore.pairing_code(), based on soft_device_id
- xpubs are now only used in a single place when the actual pairing happens
- motivation is to allow pairing a single device with multiple generic
output script descriptors, not just a single account-level xpub
- as a side-effect, we now allow pairing a device with multiple open
windows simultaneously (if keystores have the same root fingerprint
-- was already the case before if keystores had the same xpub)
Note that clicking "x" to close the wizard or pressing ESC also raises
a UserCancelled:
raising ChooseHwDeviceAgain was not letting the wizard close.
E | gui.qt.installwizard.InstallWizard |
Traceback (most recent call last):
File "/home/user/wspace/electrum/electrum/base_wizard.py", line 371, in on_device
client = self.plugin.setup_device(device_info, self, purpose)
File "/home/user/wspace/electrum/electrum/plugins/trezor/trezor.py", line 305, in setup_device
self.initialize_device(device_id, wizard, client.handler)
File "/home/user/wspace/electrum/electrum/plugins/trezor/trezor.py", line 231, in initialize_device
wizard.choice_dialog(title=_('Initialize Device'), message=msg, choices=choices, run_next=f)
File "/home/user/wspace/electrum/electrum/gui/qt/installwizard.py", line 106, in func_wrapper
out = func(*args, **kwargs)
File "/home/user/wspace/electrum/electrum/gui/qt/installwizard.py", line 614, in choice_dialog
self.exec_layout(vbox, title)
File "/home/user/wspace/electrum/electrum/gui/qt/installwizard.py", line 434, in exec_layout
raise UserCancelled()
electrum.util.UserCancelled
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/user/wspace/electrum/electrum/base_wizard.py", line 277, in choose_hw_device
self._choose_hw_device(purpose=purpose, storage=storage)
File "/home/user/wspace/electrum/electrum/base_wizard.py", line 363, in _choose_hw_device
self.choice_dialog(title=title, message=msg, choices=choices,
File "/home/user/wspace/electrum/electrum/gui/qt/installwizard.py", line 120, in func_wrapper
run_next(*out)
File "/home/user/wspace/electrum/electrum/base_wizard.py", line 364, in <lambda>
run_next=lambda *args: self.on_device(*args, purpose=purpose, storage=storage))
File "/home/user/wspace/electrum/electrum/base_wizard.py", line 386, in on_device
raise ChooseHwDeviceAgain()
electrum.base_wizard.ChooseHwDeviceAgain
E | gui.qt.installwizard.InstallWizard | choose_hw_device(). while iter starts.
I | plugin.DeviceMgr | scanning devices...
- use_recoverable_channel is a user setting, available
only in standard wallets with a 'segwit' seed_type
- if enabled, 'lightning_xprv' is derived from seed
- otherwise, wallets use the existing 'lightning_privkey2'
Recoverable channels:
- channel recovery data is added funding tx using an OP_RETURN
- recovery data = 4 magic bytes + node id[0:16]
- recovery data is chacha20 encrypted using funding_address as nonce.
(this will allow to fund multiple channels in the same tx)
GUI:
- whether channels are recoverable is shown in wallet info dialog.
- if the wallet can have recoverable channels but has an old node_id,
users are told to close their channels and restore from seed
to have that feature.
When setting up a multisig wallet, there is no point in asking for the
script type for each cosigner (bip39/hw) -- we can just ask for the
first one. If the first keystore is an electrum seed, we end up never asking :)
follow-up f13f46c555
When on dialog n user presses "Back",
- previously, we went back to when dialog n-1 appeared
- now, go back to just after dialog n-2 finishes
This way, any calculations between when dialog n-2 finishes and
dialog n-1 appears will rerun, potentially populating dialog n-1 differently.
Namely if the user presses back on the confirm_seed_dialog, we want to
go back to the show_seed_dialog but with a freshly generated seed.
E | gui.qt.installwizard.InstallWizard |
Traceback (most recent call last):
File "...\electrum\electrum\base_wizard.py", line 340, in on_device
self.plugin.setup_device(device_info, self, purpose)
File "...\electrum\electrum\plugins\digitalbitbox\digitalbitbox.py", line 719, in setup_device
client.get_xpub("m/44'/0'", 'standard')
File "...\electrum\electrum\plugins\digitalbitbox\digitalbitbox.py", line 120, in get_xpub
reply = self._get_xpub(bip32_path)
File "...\electrum\electrum\plugins\digitalbitbox\digitalbitbox.py", line 114, in _get_xpub
if self.check_device_dialog():
File "...\electrum\electrum\plugins\digitalbitbox\digitalbitbox.py", line 223, in check_device_dialog
self.recover_or_erase_dialog() # Already seeded
File "...\electrum\electrum\plugins\digitalbitbox\digitalbitbox.py", line 244, in recover_or_erase_dialog
if not self.dbb_load_backup():
File "...\electrum\electrum\plugins\digitalbitbox\digitalbitbox.py", line 340, in dbb_load_backup
raise UserFacingException(backups['error']['message'])
electrum.util.UserFacingException: Please insert SD card.
When initialising a Trezor as part of the wallet creation,
device_info.label is still the old (None) label in on_hw_derivation.
This is because device_info was created during the initial scan.
related: #6063
previously, client.handler was sometimes
- an InstallWizard
- a QtHandlerBase where win was an ElectrumWindow
- a QtHandlerBase where win was an InstallWizard
- a CmdLineHandler
That's just too much dynamic untyped undocumented polymorphism...
Now it will never be an InstallWizard (replaced with QtHandlerBase where win is an InstallWizard),
and now in all cases client.handler is an instance of HardwareHandlerBase, yay.
related: #6063
This was done to calculate the bip32 root fingerprint but it broke
the digitalbitbox. The keystore already had a different way to get
the root fingerprint for existing wallets, specifically handling this
case; the code in base_wizard used when creating new wallets was
duplicating that code originally and was then forgotten to be updated.
Now these codepaths are unified.
closes#5816