class for xpub wallets
This commit is contained in:
parent
edb5552a31
commit
8df2179025
|
@ -138,7 +138,6 @@ class Abstract_Wallet(object):
|
||||||
self.gap_limit_for_change = 3 # constant
|
self.gap_limit_for_change = 3 # constant
|
||||||
# saved fields
|
# saved fields
|
||||||
self.seed_version = storage.get('seed_version', NEW_SEED_VERSION)
|
self.seed_version = storage.get('seed_version', NEW_SEED_VERSION)
|
||||||
self.gap_limit = storage.get('gap_limit', 5)
|
|
||||||
self.use_change = storage.get('use_change',True)
|
self.use_change = storage.get('use_change',True)
|
||||||
self.use_encryption = storage.get('use_encryption', False)
|
self.use_encryption = storage.get('use_encryption', False)
|
||||||
self.seed = storage.get('seed', '') # encrypted
|
self.seed = storage.get('seed', '') # encrypted
|
||||||
|
@ -1223,16 +1222,15 @@ class Deterministic_Wallet(Abstract_Wallet):
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class BIP32_Wallet(Deterministic_Wallet):
|
class BIP32_Wallet(Deterministic_Wallet):
|
||||||
# Wallet with a single BIP32 account, no seed
|
# abstract class, bip32 logic
|
||||||
# gap limit 20
|
gap_limit = 20
|
||||||
root_name = 'x/'
|
|
||||||
|
|
||||||
def __init__(self, storage):
|
def __init__(self, storage):
|
||||||
Deterministic_Wallet.__init__(self, storage)
|
Deterministic_Wallet.__init__(self, storage)
|
||||||
self.master_public_keys = storage.get('master_public_keys', {})
|
self.master_public_keys = storage.get('master_public_keys', {})
|
||||||
self.master_private_keys = storage.get('master_private_keys', {})
|
self.master_private_keys = storage.get('master_private_keys', {})
|
||||||
self.gap_limit = 20
|
|
||||||
|
|
||||||
def is_watching_only(self):
|
def is_watching_only(self):
|
||||||
return not bool(self.master_private_keys)
|
return not bool(self.master_private_keys)
|
||||||
|
@ -1251,20 +1249,6 @@ class BIP32_Wallet(Deterministic_Wallet):
|
||||||
xpub = self.master_public_keys[self.root_name]
|
xpub = self.master_public_keys[self.root_name]
|
||||||
assert deserialize_xkey(xpriv)[3] == deserialize_xkey(xpub)[3]
|
assert deserialize_xkey(xpriv)[3] == deserialize_xkey(xpub)[3]
|
||||||
|
|
||||||
def create_xprv_wallet(self, xprv, password):
|
|
||||||
xpub = bitcoin.xpub_from_xprv(xprv)
|
|
||||||
account = BIP32_Account({'xpub':xpub})
|
|
||||||
self.storage.put('seed_version', self.seed_version, True)
|
|
||||||
self.add_master_private_key(self.root_name, xprv, password)
|
|
||||||
self.add_master_public_key(self.root_name, xpub)
|
|
||||||
self.add_account('0', account)
|
|
||||||
|
|
||||||
def create_xpub_wallet(self, xpub):
|
|
||||||
account = BIP32_Account({'xpub':xpub})
|
|
||||||
self.storage.put('seed_version', self.seed_version, True)
|
|
||||||
self.add_master_public_key(self.root_name, xpub)
|
|
||||||
self.add_account('0', account)
|
|
||||||
|
|
||||||
def add_master_public_key(self, name, xpub):
|
def add_master_public_key(self, name, xpub):
|
||||||
self.master_public_keys[name] = xpub
|
self.master_public_keys[name] = xpub
|
||||||
self.storage.put('master_public_keys', self.master_public_keys, True)
|
self.storage.put('master_public_keys', self.master_public_keys, True)
|
||||||
|
@ -1295,6 +1279,27 @@ class BIP32_Wallet(Deterministic_Wallet):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class BIP32_Simple_Wallet(BIP32_Wallet):
|
||||||
|
# Wallet with a single BIP32 account, no seed
|
||||||
|
# gap limit 20
|
||||||
|
root_name = 'x/'
|
||||||
|
wallet_type = 'xpub'
|
||||||
|
|
||||||
|
def create_xprv_wallet(self, xprv, password):
|
||||||
|
xpub = bitcoin.xpub_from_xprv(xprv)
|
||||||
|
account = BIP32_Account({'xpub':xpub})
|
||||||
|
self.storage.put('seed_version', self.seed_version, True)
|
||||||
|
self.add_master_private_key(self.root_name, xprv, password)
|
||||||
|
self.add_master_public_key(self.root_name, xpub)
|
||||||
|
self.add_account('0', account)
|
||||||
|
|
||||||
|
def create_xpub_wallet(self, xpub):
|
||||||
|
account = BIP32_Account({'xpub':xpub})
|
||||||
|
self.storage.put('seed_version', self.seed_version, True)
|
||||||
|
self.add_master_public_key(self.root_name, xpub)
|
||||||
|
self.add_account('0', account)
|
||||||
|
|
||||||
|
|
||||||
class BIP32_HD_Wallet(BIP32_Wallet):
|
class BIP32_HD_Wallet(BIP32_Wallet):
|
||||||
# wallet that can create accounts
|
# wallet that can create accounts
|
||||||
|
|
||||||
|
@ -1484,6 +1489,11 @@ class Wallet_2of3(Wallet_2of2):
|
||||||
|
|
||||||
class OldWallet(Deterministic_Wallet):
|
class OldWallet(Deterministic_Wallet):
|
||||||
wallet_type = 'old'
|
wallet_type = 'old'
|
||||||
|
gap_limit = 5
|
||||||
|
|
||||||
|
def __init__(self, storage):
|
||||||
|
Deterministic_Wallet.__init__(self, storage)
|
||||||
|
self.gap_limit = storage.get('gap_limit', 5)
|
||||||
|
|
||||||
def make_seed(self):
|
def make_seed(self):
|
||||||
import mnemonic
|
import mnemonic
|
||||||
|
@ -1571,6 +1581,7 @@ class Wallet(object):
|
||||||
|
|
||||||
self.wallet_types = [
|
self.wallet_types = [
|
||||||
('old', ("Old wallet"), OldWallet),
|
('old', ("Old wallet"), OldWallet),
|
||||||
|
('xpub', ("BIP32 Import"), BIP32_Simple_Wallet),
|
||||||
('standard', ("Standard wallet"), NewWallet),
|
('standard', ("Standard wallet"), NewWallet),
|
||||||
('imported', ("Imported wallet"), Imported_Wallet),
|
('imported', ("Imported wallet"), Imported_Wallet),
|
||||||
('2of2', ("Multisig wallet (2 of 2)"), Wallet_2of2),
|
('2of2', ("Multisig wallet (2 of 2)"), Wallet_2of2),
|
||||||
|
@ -1689,12 +1700,12 @@ class Wallet(object):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_xpub(self, xpub, storage):
|
def from_xpub(self, xpub, storage):
|
||||||
w = BIP32_Wallet(storage)
|
w = BIP32_Simple_Wallet(storage)
|
||||||
w.create_xpub_wallet(xpub)
|
w.create_xpub_wallet(xpub)
|
||||||
return w
|
return w
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_xprv(self, xprv, password, storage):
|
def from_xprv(self, xprv, password, storage):
|
||||||
w = BIP32_Wallet(storage)
|
w = BIP32_Simple_Wallet(storage)
|
||||||
w.create_xprv_wallet(xprv, password)
|
w.create_xprv_wallet(xprv, password)
|
||||||
return w
|
return w
|
||||||
|
|
Loading…
Reference in New Issue