electrum

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

commit b54ba556bca11f17c6236ead7a6c3cb754555fa1
parent 151ac099a98ce445d132cdb52429f3c11e4d6db0
Author: Neil Booth <kyuupichan@gmail.com>
Date:   Mon,  8 Feb 2016 22:32:49 +0900

Wallet: encapsulate wallet_types

Previously plugins would append lines to it and wizard.py would
hack into it too.

Diffstat:
Mlib/plugins.py | 7+++++--
Mlib/wallet.py | 38+++++++++++++++++++++++---------------
Mlib/wizard.py | 4++--
3 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/lib/plugins.py b/lib/plugins.py @@ -27,7 +27,7 @@ import time from util import * from i18n import _ from util import profiler, PrintError, DaemonThread, UserCancelled -import wallet + class Plugins(DaemonThread): @@ -140,13 +140,16 @@ class Plugins(DaemonThread): return wallet_types, descs def register_plugin_wallet(self, name, gui_good, details): + from wallet import Wallet + def dynamic_constructor(storage): return self.wallet_plugin_loader(name).wallet_class(storage) if details[0] == 'hardware': self.hw_wallets[name] = (gui_good, details) self.print_error("registering wallet %s: %s" %(name, details)) - wallet.wallet_types.append(details + (dynamic_constructor,)) + Wallet.register_plugin_wallet(details[0], details[1], + dynamic_constructor) def wallet_plugin_loader(self, name): if not name in self.plugins: diff --git a/lib/wallet.py b/lib/wallet.py @@ -27,6 +27,7 @@ import copy import re from functools import partial from unicodedata import normalize +from collections import namedtuple from i18n import _ from util import NotEnoughFunds, PrintError, profiler @@ -1908,18 +1909,7 @@ class OldWallet(Deterministic_Wallet): return ' '.join(old_mnemonic.mn_encode(s)) - - -wallet_types = [ - # category type description constructor - ('standard', 'old', ("Old wallet"), OldWallet), - ('standard', 'xpub', ("BIP32 Import"), BIP32_Simple_Wallet), - ('standard', 'standard', ("Standard wallet"), NewWallet), - ('standard', 'imported', ("Imported wallet"), Imported_Wallet), - ('multisig', '2of2', ("Multisig wallet (2 of 2)"), Multisig_Wallet), - ('multisig', '2of3', ("Multisig wallet (2 of 3)"), Multisig_Wallet), - ('bip44', 'bip44', ("Restored hardware wallet"), BIP44_Wallet), -] +WalletType = namedtuple("WalletType", "category type constructor") # former WalletFactory class Wallet(object): @@ -1927,6 +1917,16 @@ class Wallet(object): This class is actually a factory that will return a wallet of the correct type when passed a WalletStorage instance.""" + wallets = [ # category type constructor + WalletType('standard', 'old', OldWallet), + WalletType('standard', 'xpub', BIP32_Simple_Wallet), + WalletType('standard', 'standard', NewWallet), + WalletType('standard', 'imported', Imported_Wallet), + WalletType('multisig', '2of2', Multisig_Wallet), + WalletType('multisig', '2of3', Multisig_Wallet), + WalletType('bip44', 'bip44', BIP44_Wallet), + ] + def __new__(self, storage): seed_version = storage.get('seed_version') if not seed_version: @@ -1964,14 +1964,22 @@ class Wallet(object): return wallet @staticmethod + def categories(): + return [wallet.category for wallet in Wallet.wallets] + + @staticmethod + def register_plugin_wallet(category, type, constructor): + Wallet.wallets.append(WalletType(category, type, constructor)) + + @staticmethod def wallet_class(wallet_type, seed_version): if wallet_type: if Wallet.multisig_type(wallet_type): return Multisig_Wallet - for info in wallet_types: - if wallet_type == info[1]: - return info[3] + for wallet in Wallet.wallets: + if wallet.type == wallet_type: + return wallet.constructor raise RuntimeError("Unknown wallet type: " + wallet_type) diff --git a/lib/wizard.py b/lib/wizard.py @@ -19,7 +19,7 @@ from electrum import WalletStorage from electrum.plugins import run_hook from util import PrintError -from wallet import Wallet, wallet_types +from wallet import Wallet from i18n import _ MSG_GENERATING_WAIT = _("Electrum is generating your addresses, please wait...") @@ -198,7 +198,7 @@ class WizardBase(PrintError): self.remove_from_recently_open(storage.path) # Filter out any unregistered wallet kinds - registered_kinds = zip(*wallet_types)[0] + registered_kinds = Wallet.categories() kinds, descriptions = zip(*[pair for pair in WizardBase.wallet_kinds if pair[0] in registered_kinds]) action, kind_index = self.query_create_or_restore(descriptions)