electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 70a638a7c3cb81f3a6e2c0fae3c9aeb9fdad28d5
parent bac2c8175c5df0b1b7fb9a7d5091a659d886b3eb
Author: ThomasV <thomasv@gitorious>
Date:   Mon, 28 Apr 2014 17:30:48 +0200

more robust install wizard

Diffstat:
Mgui/qt/__init__.py | 18+++++++-----------
Mgui/qt/installwizard.py | 54++++++++++++++++++++++++++++++++++++------------------
Mlib/wallet.py | 30+++++++++++++++++-------------
3 files changed, 60 insertions(+), 42 deletions(-)

diff --git a/gui/qt/__init__.py b/gui/qt/__init__.py @@ -151,24 +151,20 @@ class ElectrumGui: def main(self, url): storage = WalletStorage(self.config) - if not storage.file_exists: - import installwizard - wizard = installwizard.InstallWizard(self.config, self.network, storage) - wallet = wizard.run() - if not wallet: - exit() + if storage.file_exists: + wallet = Wallet(storage) + action = wallet.get_action() + else: + action = 'new' - elif storage.get('wallet_type') in ['2of3'] and storage.get('seed') is None: + if action is not None: import installwizard wizard = installwizard.InstallWizard(self.config, self.network, storage) - wallet = wizard.run(action= 'create2of3') + wallet = wizard.run(action) if not wallet: exit() - else: - wallet = Wallet(storage) wallet.start_threads(self.network) - # init tray self.dark_icon = self.config.get("dark_icon", False) diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py @@ -275,9 +275,9 @@ class InstallWizard(QDialog): return '2of3' - def run(self, action = None): + def run(self, action): - if action is None: + if action == 'new': action = self.restore_or_create() if action is None: @@ -289,32 +289,53 @@ class InstallWizard(QDialog): return if t == '2of3': - run_hook('create_cold_seed', self.storage, self) + action = 'create_cold' + + + if action in ['create', 'create_cold', 'create_hot', 'create_remote']: + wallet = Wallet(self.storage) + + if action == 'create': + seed = wallet.make_seed() + if not self.show_seed(seed, None): + return + if not self.verify_seed(seed, None): return + password = self.password_dialog() + wallet.add_seed(seed, password) + wallet.create_accounts(password) + # generate first addresses offline + self.waiting_dialog(wallet.synchronize) - if action in ['create', 'create2of3']: + if action == 'create_cold': + run_hook('create_cold_seed', self.storage, self) + return - wallet = Wallet(self.storage) + + if action == 'create_hot': + msg = _('You are about to create the hot seed of a multisig wallet') + if not self.question(msg): + return seed = wallet.make_seed() - sid = 'hot' if action == 'create2of3' else None - if not self.show_seed(seed, sid): + if not self.show_seed(seed, 'hot'): return - if not self.verify_seed(seed, sid): + if not self.verify_seed(seed, 'hot'): return password = self.password_dialog() wallet.add_seed(seed, password) + action = 'create_remote' - if action == 'create2of3': - run_hook('create_third_key', wallet, self) - if not wallet.master_public_keys.get("remote/"): - return - wallet.create_accounts(password) - # generate first addresses offline + if action == 'create_remote': + run_hook('create_remote_key', wallet, self) + if not wallet.master_public_keys.get("remote/"): + return + wallet.create_account() self.waiting_dialog(wallet.synchronize) - elif action == 'restore': + + if action == 'restore': t = self.choose_wallet_type() if not t: return @@ -362,9 +383,6 @@ class InstallWizard(QDialog): raise - - - else: raise #if not self.config.get('server'): if self.network: diff --git a/lib/wallet.py b/lib/wallet.py @@ -237,6 +237,10 @@ class NewWallet: for tx2 in self.transactions.values(): tx2.add_extra_addresses({h:tx}) + + def get_action(self): + pass + def can_create_accounts(self): return not self.is_watching_only() @@ -1482,7 +1486,7 @@ class Wallet_2of2(NewWallet): def can_create_accounts(self): return False - def make_account(self, account_id, password): + def create_account(self, account_id): """Creates and saves the master keys, but does not save the account""" xpub1 = self.master_public_keys.get("m/") xpub2 = self.master_public_keys.get("cold/") @@ -1495,17 +1499,6 @@ class Wallet_2of2(NewWallet): return {'hot':xpub1, 'cold':xpub2} - def add_cold_seed(self, cold_seed, password): - seed_version, cold_seed = self.prepare_seed(cold_seed) - hex_seed = mnemonic_to_seed(cold_seed,'').encode('hex') - xpriv, xpub = bip32_root(hex_seed) - - if password: - cold_seed = pw_encode( cold_seed, password) - self.storage.put('cold_seed', cold_seed, True) - - self.add_master_public_key('cold/', xpub) - self.add_master_private_key('cold/', xpriv, password) class Wallet_2of3(Wallet_2of2): @@ -1514,7 +1507,7 @@ class Wallet_2of3(Wallet_2of2): NewWallet.__init__(self, storage) self.storage.put('wallet_type', '2of3', True) - def create_accounts(self, password): + def create_account(self): xpub1 = self.master_public_keys.get("m/") xpub2 = self.master_public_keys.get("cold/") xpub3 = self.master_public_keys.get("remote/") @@ -1527,6 +1520,17 @@ class Wallet_2of3(Wallet_2of2): xpub3 = self.master_public_keys.get("remote/") return {'hot':xpub1, 'cold':xpub2, 'remote':xpub3} + def get_action(self): + xpub1 = self.master_public_keys.get("m/") + xpub2 = self.master_public_keys.get("cold/") + xpub3 = self.master_public_keys.get("remote/") + if xpub2 is None: + return 'create_cold' + if xpub1 is None: + return 'create_hot' + if xpub3 is None: + return 'create_remote' + class WalletSynchronizer(threading.Thread):