qt wizard: start: merge "start_viewstate" and "initial_data"
What changed, and why it matters
This commit is a straightforward internal code cleanup in Electrum's setup wizard. It merges two ways of passing starting information into the wizard so that callers now supply a single 'WizardViewState' object instead of separate 'start_viewstate' and 'initial_data' arguments. There is no user-facing change and no security relevance visible in the diff.
No security action needed. Treat as normal refactoring.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch refactors wizard initialization across Qt GUI and core wizard classes. Previously, some callers passed a full WizardViewState (start_viewstate) while others passed a dict (initial_data). The change unifies the interface: start() and start_wizard() now accept an optional start_viewstate: WizardViewState and either use it directly or create a default one. Tests are updated to construct the WizardViewState explicitly. No logic changes affecting validation, cryptography, network behavior, or permissions are present.
Changed components
electrum/gui/qt/wizard/wallet.pyelectrum/gui/qt/wizard/wizard.pyelectrum/wizard.pytests/test_wizard.pyInspect captured patch +34 / −32
diff --git a/electrum/gui/qt/wizard/wallet.py b/electrum/gui/qt/wizard/wallet.py
index 839d6a8..eecc68f 100644
--- a/electrum/gui/qt/wizard/wallet.py
+++ b/electrum/gui/qt/wizard/wallet.py
@@ -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'
diff --git a/electrum/gui/qt/wizard/wizard.py b/electrum/gui/qt/wizard/wizard.py
index 4f6c5af..eb0e74d 100644
--- a/electrum/gui/qt/wizard/wizard.py
+++ b/electrum/gui/qt/wizard/wizard.py
@@ -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:
diff --git a/electrum/wizard.py b/electrum/wizard.py
index 34aea66..0a475b5 100644
--- a/electrum/wizard.py
+++ b/electrum/wizard.py
@@ -257,13 +257,14 @@ 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 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
return self._current
# returns (sub)dict of current cosigner (or root if first)
@@ -487,13 +488,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 +863,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 +891,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
diff --git a/tests/test_wizard.py b/tests/test_wizard.py
index 068e915..e1872f6 100644
--- a/tests/test_wizard.py
+++ b/tests/test_wizard.py
@@ -140,7 +140,8 @@ class KeystoreWizardTestCase(WizardTestCase):
def _wizard_for(self, *, wallet_type: str = 'standard', hww: bool = False) -> tuple[KeystoreWizard, WizardViewState]:
w = KeystoreWizardTestCase.TKeystoreWizard(self.plugins)
- v = w.start(initial_data={'wallet_type': wallet_type})
+ start_viewstate = WizardViewState('keystore_type', {'wallet_type': wallet_type}, {})
+ v = w.start(start_viewstate=start_viewstate)
self.assertEqual('keystore_type', v.view)
d = v.wizard_data
if hww:
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.