1
0

Wallet: encapsulate wallet_types

Previously plugins would append lines to it and wizard.py would
hack into it too.
This commit is contained in:
Neil Booth
2016-02-08 22:32:49 +09:00
parent 151ac099a9
commit b54ba556bc
3 changed files with 30 additions and 19 deletions

View File

@@ -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:
@@ -1963,15 +1963,23 @@ 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)