Merge pull request #10141 from SomberNight/202508_kswizard_multisig

wizard: enable_keystore: fix for multisig
This commit is contained in:
ghost43
2025-08-18 14:27:45 +00:00
committed by GitHub
5 changed files with 103 additions and 46 deletions

View File

@@ -57,7 +57,7 @@ class QEKeystoreWizard(KeystoreWizard, QEAbstractWizard, MessageBoxMixin):
config: 'SimpleConfig',
app: 'QElectrumApplication',
plugins: 'Plugins',
start_viewstate: WizardViewState = None
start_viewstate: WizardViewState = None,
):
assert 'wallet_type' in start_viewstate.wizard_data, 'wallet_type required'
@@ -440,10 +440,6 @@ class WCExtendKeystore(WalletWizardComponent):
def apply(self):
self.wizard_data['keystore_type'] = self.choice_w.selected_key
if multisig_type(self.wizard_data['wallet_type']):
self.wizard_data['multisig_participants'] = 2
self.wizard_data['multisig_signatures'] = 2
self.wizard_data['multisig_cosigner_data'] = {}
class WCCreateSeed(WalletWizardComponent):

View File

@@ -124,10 +124,7 @@ class QEAbstractWizard(QDialog, MessageBoxMixin):
@pyqtSlot()
def strt(self):
if self.start_viewstate is not None:
viewstate = self._current = self.start_viewstate
else:
viewstate = self.start_wizard()
viewstate = self.start_wizard(start_viewstate=self.start_viewstate)
self.load_next_component(viewstate.view, viewstate.wizard_data, viewstate.params)
self.set_default_focus()
@@ -236,8 +233,8 @@ class QEAbstractWizard(QDialog, MessageBoxMixin):
self.prev() # rollback the submit above
raise e
def start_wizard(self) -> 'WizardViewState':
self.start()
def start_wizard(self, *, start_viewstate: Optional['WizardViewState'] = None) -> 'WizardViewState':
self.start(start_viewstate=start_viewstate)
return self._current
def view_to_component(self, view) -> QWidget:

View File

@@ -17,6 +17,7 @@ from electrum.wallet_db import WalletDB
from electrum.bip32 import normalize_bip32_derivation, xpub_type
from electrum import keystore, mnemonic, bitcoin
from electrum.mnemonic import is_any_2fa_seed_type, can_seed_have_passphrase
from electrum.util import multisig_type
if TYPE_CHECKING:
from electrum.daemon import Daemon
@@ -257,13 +258,23 @@ class KeystoreWizard(AbstractWizard):
# one at a time
return True
def start(self, initial_data: dict = None) -> WizardViewState:
if initial_data is None:
initial_data = {}
def _convert_wallet_type(self, wizard_data: dict) -> None:
assert 'wallet_type' in wizard_data
if multisig_type(wizard_data['wallet_type']):
wizard_data['wallet_type'] = 'multisig' # convert from e.g. "2of2" to "multisig"
wizard_data['multisig_participants'] = 2
wizard_data['multisig_signatures'] = 2
wizard_data['multisig_cosigner_data'] = {}
def start(self, *, start_viewstate: WizardViewState = None) -> WizardViewState:
self.reset()
start_view = 'keystore_type'
params = self.navmap[start_view].get('params', {})
self._current = WizardViewState(start_view, initial_data, params)
if start_viewstate is None:
start_view = 'keystore_type'
params = self.navmap[start_view].get('params', {})
self._current = WizardViewState(start_view, {}, params)
else:
self._current = start_viewstate
self._convert_wallet_type(self._current.wizard_data) # mutating in-place
return self._current
# returns (sub)dict of current cosigner (or root if first)
@@ -487,13 +498,14 @@ class NewWalletWizard(KeystoreWizard):
# todo: load only if needed, like hw plugins
self.plugins.load_plugin_by_name('trustedcoin')
def start(self, initial_data: dict = None) -> WizardViewState:
if initial_data is None:
initial_data = {}
def start(self, *, start_viewstate: WizardViewState = None) -> WizardViewState:
self.reset()
start_view = 'wallet_name'
params = self.navmap[start_view].get('params', {})
self._current = WizardViewState(start_view, initial_data, params)
if start_viewstate is None:
start_view = 'wallet_name'
params = self.navmap[start_view].get('params', {})
self._current = WizardViewState(start_view, {}, params)
else:
self._current = start_viewstate
return self._current
def is_single_password(self) -> bool:
@@ -861,13 +873,14 @@ class ServerConnectWizard(AbstractWizard):
if wizard_data.get('autoconnect') is not None:
self._daemon.config.NETWORK_AUTO_CONNECT = wizard_data.get('autoconnect')
def start(self, initial_data: dict = None) -> WizardViewState:
if initial_data is None:
initial_data = {}
def start(self, *, start_viewstate: WizardViewState = None) -> WizardViewState:
self.reset()
start_view = 'welcome'
params = self.navmap[start_view].get('params', {})
self._current = WizardViewState(start_view, initial_data, params)
if start_viewstate is None:
start_view = 'welcome'
params = self.navmap[start_view].get('params', {})
self._current = WizardViewState(start_view, {}, params)
else:
self._current = start_viewstate
return self._current
@@ -888,11 +901,12 @@ class TermsOfUseWizard(AbstractWizard):
def accept_terms_of_use(self, _):
self._config.TERMS_OF_USE_ACCEPTED = TERMS_OF_USE_LATEST_VERSION
def start(self, initial_data: dict = None) -> WizardViewState:
if initial_data is None:
initial_data = {}
def start(self, *, start_viewstate: WizardViewState = None) -> WizardViewState:
self.reset()
start_view = 'terms_of_use'
params = self.navmap[start_view].get('params', {})
self._current = WizardViewState(start_view, initial_data, params)
if start_viewstate is None:
start_view = 'terms_of_use'
params = self.navmap[start_view].get('params', {})
self._current = WizardViewState(start_view, {}, params)
else:
self._current = start_viewstate
return self._current