trestore action-driven wizard logic - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 5915b9b7e1d9ab5b29300b5586076c9337311dfc DIR parent 90a2fc1379808c2a2f91302bfaa82a32ecd43df3 HTML Author: ThomasV <thomasv@electrum.org> Date: Wed, 6 Jan 2016 10:31:55 +0100 restore action-driven wizard logic Diffstat: M gui/qt/installwizard.py | 14 +++++++++++++- M lib/wallet.py | 16 +++++++++------- M lib/wizard.py | 28 +++++++++++++++------------- M plugins/ledger/ledger.py | 2 +- M plugins/ledger/qt.py | 2 +- M plugins/trezor/plugin.py | 2 +- M plugins/trezor/qt_generic.py | 2 +- M plugins/trustedcoin/trustedcoin.py | 4 ++-- 8 files changed, 43 insertions(+), 27 deletions(-) --- DIR diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py t@@ -147,7 +147,19 @@ class InstallWizard(WindowModalDialog, WizardBase): msg = _("This wallet was restored offline. It may " "contain more addresses than displayed.") self.show_message(msg) - WaitingDialog(self, MSG_GENERATING_WAIT, wallet.wait_until_synchronized, on_finished) + + def create_addresses(self, wallet): + def task(): + wallet.synchronize() + self.emit(QtCore.SIGNAL('accept')) + t = threading.Thread(target = task) + t.start() + vbox = QVBoxLayout() + self.waiting_label = QLabel(MSG_GENERATING_WAIT) + vbox.addWidget(self.waiting_label) + self.set_layout(vbox) + self.raise_() + self.exec_() def set_layout(self, layout): w = QWidget() DIR diff --git a/lib/wallet.py b/lib/wallet.py t@@ -316,7 +316,7 @@ class Abstract_Wallet(PrintError): if removed: self.save_accounts() - def create_main_account(self, password): + def create_main_account(self): pass def synchronize(self): t@@ -1545,6 +1545,8 @@ class Deterministic_Wallet(Abstract_Wallet): def get_action(self): if not self.get_master_public_key(): return 'create_seed' + if not self.accounts: + return 'create_main_account' def get_master_public_keys(self): out = {} t@@ -1697,7 +1699,7 @@ class BIP32_HD_Wallet(BIP32_Wallet): return (self.can_create_accounts() and not self.show_account(self.last_account_id())) - def create_main_account(self, password): + def create_hd_account(self, password): # First check the password is valid (this raises if it isn't). if self.can_change_password(): self.check_password(password) t@@ -1783,7 +1785,7 @@ class NewWallet(BIP32_Wallet, Mnemonic): root_derivation = "m/" wallet_type = 'standard' - def create_main_account(self, password): + def create_main_account(self): xpub = self.master_public_keys.get("x/") account = BIP32_Account({'xpub':xpub}) self.add_account('0', account) t@@ -1810,7 +1812,7 @@ class Multisig_Wallet(BIP32_Wallet, Mnemonic): v['xpubs'] = [v['xpub'], v['xpub2']] self.accounts = {'0': Multisig_Account(v)} - def create_main_account(self, password): + def create_main_account(self): account = Multisig_Account({'xpubs': self.master_public_keys.values(), 'm': self.m}) self.add_account('0', account) t@@ -1821,6 +1823,8 @@ class Multisig_Wallet(BIP32_Wallet, Mnemonic): for i in range(self.n): if self.master_public_keys.get("x%d/"%(i+1)) is None: return 'create_seed' if i == 0 else 'add_cosigners' + if not self.accounts: + return 'create_main_account' class OldWallet(Deterministic_Wallet): t@@ -1864,7 +1868,7 @@ class OldWallet(Deterministic_Wallet): def get_master_public_keys(self): return {'Main Account':self.get_master_public_key()} - def create_main_account(self, password): + def create_main_account(self): mpk = self.storage.get("master_public_key") self.create_account(mpk) t@@ -2031,7 +2035,6 @@ class Wallet(object): w = klass(storage) w.add_seed(seed, password) w.create_master_keys(password) - w.create_main_account(password) return w @staticmethod t@@ -2091,7 +2094,6 @@ class Wallet(object): else: raise RunTimeError("Cannot handle text for multisig") wallet.set_use_encryption(password is not None) - wallet.create_main_account(password) return wallet @staticmethod DIR diff --git a/lib/wizard.py b/lib/wizard.py t@@ -152,15 +152,12 @@ class WizardBase(PrintError): return task = lambda: self.show_restore(wallet, network, cr) - action = wallet.get_action() - requires_action = action is not None - while action: - self.run_wallet_action(wallet, action) + while True: action = wallet.get_action() - - # Save the wallet after successful completion of actions. - # It will be saved again once synchronized. - if requires_action: + if not action: + break + self.run_wallet_action(wallet, action) + # Save the wallet after each action wallet.storage.write() if network: t@@ -168,11 +165,10 @@ class WizardBase(PrintError): else: self.show_warning(_('You are offline')) + self.create_addresses(wallet) # start wallet threads if network: wallet.start_threads(network) - else: - wallet.synchronize() if task: task() t@@ -263,14 +259,20 @@ class WizardBase(PrintError): return Wallet.from_multisig(key_list, password, storage, wallet_type) def create_seed(self, wallet): - '''The create_seed action creates a seed and then generates - wallet account(s).''' + '''The create_seed action creates a seed and generates + master keys.''' seed = wallet.make_seed(self.language_for_seed) self.show_and_verify_seed(seed) password = self.request_password() wallet.add_seed(seed, password) wallet.create_master_keys(password) - wallet.create_main_account(password) + + def create_main_account(self, wallet): + # FIXME: BIP44 restore requires password + wallet.create_main_account() + + def create_addresses(self, wallet): + wallet.synchronize() def add_cosigners(self, wallet): # FIXME: better handling of duplicate keys DIR diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py t@@ -449,7 +449,7 @@ class LedgerPlugin(BasePlugin): password = wizard.request_password() wallet.add_seed(seed, password) wallet.add_cosigner_seed(seed, 'x/', password, passphrase) - wallet.create_main_account(password) + wallet.create_hd_account(password) return wallet @hook DIR diff --git a/plugins/ledger/qt.py b/plugins/ledger/qt.py t@@ -24,7 +24,7 @@ class Plugin(LedgerPlugin): def on_create_wallet(self, wallet, wizard): self.handler = BTChipQTHandler(wizard) - wallet.create_main_account(None) + wallet.create_main_account() class BTChipQTHandler: DIR diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py t@@ -327,7 +327,7 @@ class TrezorCompatiblePlugin(BasePlugin, ThreadJob): password = wizard.request_password() wallet.add_seed(seed, password) wallet.add_cosigner_seed(seed, 'x/', password, passphrase) - wallet.create_main_account(password) + wallet.create_hd_account(password) return wallet def sign_transaction(self, wallet, tx, prev_tx, xpub_path): DIR diff --git a/plugins/trezor/qt_generic.py b/plugins/trezor/qt_generic.py t@@ -159,7 +159,7 @@ def qt_plugin_class(base_plugin_class): assert type(wallet) == self.wallet_class wallet.handler = self.create_handler(wizard) self.select_device(wallet, wizard) - wallet.create_main_account(None) + wallet.create_main_account() @hook def receive_menu(self, menu, addrs, wallet): DIR diff --git a/plugins/trustedcoin/trustedcoin.py b/plugins/trustedcoin/trustedcoin.py t@@ -364,7 +364,7 @@ class TrustedCoinPlugin(BasePlugin): wallet.add_cosigner_seed(' '.join(words[n:]), 'x2/', password) restore_third_key(wallet) - wallet.create_main_account(password) + wallet.create_main_account() return wallet def create_remote_key(self, wallet, window): t@@ -406,4 +406,4 @@ class TrustedCoinPlugin(BasePlugin): if self.setup_google_auth(window, short_id, otp_secret): wallet.add_master_public_key('x3/', xpub3) - wallet.create_main_account(None) + wallet.create_main_account()