mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-09-01 01:35:20 +00:00
generic multisig wallet constructor. fixes #1129
This commit is contained in:
parent
87709dfd16
commit
a3422d3fae
3 changed files with 38 additions and 94 deletions
5
electrum
5
electrum
|
@ -334,10 +334,7 @@ if __name__ == '__main__':
|
||||||
seed = getpass.getpass(prompt="seed:", stream=None) if options.concealed else raw_input("seed:")
|
seed = getpass.getpass(prompt="seed:", stream=None) if options.concealed else raw_input("seed:")
|
||||||
if not Wallet.is_seed(seed):
|
if not Wallet.is_seed(seed):
|
||||||
sys.exit("Error: Invalid seed")
|
sys.exit("Error: Invalid seed")
|
||||||
wallet = Wallet.from_seed(seed, storage)
|
wallet = Wallet.from_seed(seed, password, storage)
|
||||||
wallet.add_seed(seed, password)
|
|
||||||
wallet.create_master_keys(password)
|
|
||||||
wallet.create_main_account(password)
|
|
||||||
|
|
||||||
if not options.offline:
|
if not options.offline:
|
||||||
s = get_daemon(config, False)
|
s = get_daemon(config, False)
|
||||||
|
|
|
@ -439,99 +439,16 @@ class InstallWizard(QDialog):
|
||||||
wallet = Wallet.from_private_key(text, password, self.storage)
|
wallet = Wallet.from_private_key(text, password, self.storage)
|
||||||
elif Wallet.is_seed(text):
|
elif Wallet.is_seed(text):
|
||||||
password = self.password_dialog()
|
password = self.password_dialog()
|
||||||
wallet = Wallet.from_seed(text, self.storage)
|
wallet = Wallet.from_seed(text, password, self.storage)
|
||||||
wallet.add_seed(text, password)
|
|
||||||
wallet.create_master_keys(password)
|
|
||||||
wallet.create_main_account(password)
|
|
||||||
else:
|
else:
|
||||||
raise BaseException('unknown wallet type')
|
raise BaseException('unknown wallet type')
|
||||||
|
|
||||||
elif t in ['2of2']:
|
elif t in ['2of2', '2of3']:
|
||||||
r = self.multi_seed_dialog(1)
|
key_list = self.multi_seed_dialog(1 if t == '2of2' else 2)
|
||||||
if not r:
|
if not key_list:
|
||||||
return
|
return
|
||||||
text1, text2 = r
|
password = self.password_dialog() if any(map(lambda x: Wallet.is_seed(x) or Wallet.is_xprv(x), key_list)) else None
|
||||||
wallet = Wallet_2of2(self.storage)
|
wallet = Wallet.from_multisig(key_list, password, self.storage)
|
||||||
if (Wallet.is_seed(text1) or Wallet.is_seed(text2) or
|
|
||||||
Wallet.is_xprv(text1) or Wallet.is_xprv(text2)):
|
|
||||||
password = self.password_dialog()
|
|
||||||
else:
|
|
||||||
password = None
|
|
||||||
|
|
||||||
if (Wallet.is_seed(text2) or Wallet.is_xprv(text2)) and Wallet.is_xpub(text1):
|
|
||||||
c = text1
|
|
||||||
text1 = text2
|
|
||||||
text2 = c
|
|
||||||
|
|
||||||
if Wallet.is_seed(text1):
|
|
||||||
wallet.add_seed(text1, password)
|
|
||||||
wallet.create_master_keys(password)
|
|
||||||
elif Wallet.is_xprv(text1):
|
|
||||||
xpub = bitcoin.xpub_from_xprv(text1)
|
|
||||||
wallet.add_master_public_key(wallet.root_name, xpub)
|
|
||||||
wallet.add_master_private_key(wallet.root_name, text1, password)
|
|
||||||
else:
|
|
||||||
wallet.add_master_public_key("x1/", text1)
|
|
||||||
|
|
||||||
if Wallet.is_seed(text2):
|
|
||||||
wallet.add_cosigner_seed(text2, "x2/", password)
|
|
||||||
elif Wallet.is_xpub(text2):
|
|
||||||
wallet.add_master_public_key("x2/", text2)
|
|
||||||
|
|
||||||
wallet.create_main_account(password)
|
|
||||||
|
|
||||||
|
|
||||||
elif t in ['2of3']:
|
|
||||||
r = self.multi_seed_dialog(2)
|
|
||||||
if not r:
|
|
||||||
return
|
|
||||||
text1, text2, text3 = r
|
|
||||||
wallet = Wallet_2of3(self.storage)
|
|
||||||
if (Wallet.is_seed(text1) or Wallet.is_seed(text2) or Wallet.is_seed(text3) or
|
|
||||||
Wallet.is_xprv(text1) or Wallet.is_xprv(text2) or Wallet.is_xprv(text3)):
|
|
||||||
password = self.password_dialog()
|
|
||||||
else:
|
|
||||||
password = None
|
|
||||||
|
|
||||||
if Wallet.is_xpub(text1) and (Wallet.is_seed(text2) or Wallet.is_xprv(text2)):
|
|
||||||
temp = text1
|
|
||||||
text1 = text2
|
|
||||||
text2 = temp
|
|
||||||
|
|
||||||
if Wallet.is_xpub(text1) and (Wallet.is_seed(text3) or Wallet.is_xprv(text3)):
|
|
||||||
temp = text1
|
|
||||||
text1 = text3
|
|
||||||
text3 = temp
|
|
||||||
|
|
||||||
if Wallet.is_seed(text1):
|
|
||||||
wallet.add_seed(text1, password)
|
|
||||||
wallet.create_master_keys(password)
|
|
||||||
elif Wallet.is_xprv(text1):
|
|
||||||
xpub = bitcoin.xpub_from_xprv(text1)
|
|
||||||
wallet.add_master_public_key(wallet.root_name, xpub)
|
|
||||||
wallet.add_master_private_key(wallet.root_name, text1, password)
|
|
||||||
else:
|
|
||||||
wallet.add_master_public_key("x1/", text1)
|
|
||||||
|
|
||||||
if Wallet.is_seed(text2):
|
|
||||||
wallet.add_cosigner_seed(text2, "x2/", password)
|
|
||||||
elif Wallet.is_xprv(text2):
|
|
||||||
xpub = bitcoin.xpub_from_xprv(text2)
|
|
||||||
wallet.add_master_public_key(wallet.root_name, xpub)
|
|
||||||
wallet.add_master_private_key(wallet.root_name, text2, password)
|
|
||||||
elif Wallet.is_xpub(text2):
|
|
||||||
wallet.add_master_public_key("x2/", text2)
|
|
||||||
|
|
||||||
if Wallet.is_seed(text3):
|
|
||||||
wallet.add_cosigner_seed(text3, "x3/", password)
|
|
||||||
elif Wallet.is_xprv(text3):
|
|
||||||
xpub = bitcoin.xpub_from_xprv(text3)
|
|
||||||
wallet.add_master_public_key(wallet.root_name, xpub)
|
|
||||||
wallet.add_master_private_key(wallet.root_name, text3, password)
|
|
||||||
elif Wallet.is_xpub(text3):
|
|
||||||
wallet.add_master_public_key("x3/", text3)
|
|
||||||
|
|
||||||
wallet.create_main_account(password)
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.storage.put('wallet_type', t)
|
self.storage.put('wallet_type', t)
|
||||||
|
|
|
@ -1798,12 +1798,15 @@ class Wallet(object):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_seed(self, seed, storage):
|
def from_seed(self, seed, password, storage):
|
||||||
if is_old_seed(seed):
|
if is_old_seed(seed):
|
||||||
klass = OldWallet
|
klass = OldWallet
|
||||||
elif is_new_seed(seed):
|
elif is_new_seed(seed):
|
||||||
klass = NewWallet
|
klass = NewWallet
|
||||||
w = klass(storage)
|
w = klass(storage)
|
||||||
|
w.add_seed(text, password)
|
||||||
|
w.create_master_keys(password)
|
||||||
|
w.create_main_account(password)
|
||||||
return w
|
return w
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -1840,3 +1843,30 @@ class Wallet(object):
|
||||||
w = BIP32_Simple_Wallet(storage)
|
w = BIP32_Simple_Wallet(storage)
|
||||||
w.create_xprv_wallet(xprv, password)
|
w.create_xprv_wallet(xprv, password)
|
||||||
return w
|
return w
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_multisig(klass, key_list, password, storage):
|
||||||
|
if len(key_list) == 2:
|
||||||
|
self = Wallet_2of2(storage)
|
||||||
|
elif len(key_list) == 3:
|
||||||
|
self = Wallet_2of3(storage)
|
||||||
|
key_list = sorted(key_list, key = lambda x: klass.is_xpub(x))
|
||||||
|
for i, text in enumerate(key_list):
|
||||||
|
assert klass.is_seed(text) or klass.is_xprv(text) or klass.is_xpub(text)
|
||||||
|
name = "x%d/"%(i+1)
|
||||||
|
if klass.is_seed(text):
|
||||||
|
if name == 'x1/':
|
||||||
|
self.add_seed(text1, password)
|
||||||
|
self.create_master_keys(password)
|
||||||
|
else:
|
||||||
|
self.add_cosigner_seed(text, name, password)
|
||||||
|
elif klass.is_xprv(text):
|
||||||
|
xpub = bitcoin.xpub_from_xprv(text)
|
||||||
|
self.add_master_public_key(name, xpub)
|
||||||
|
self.add_master_private_key(name, text, password)
|
||||||
|
elif klass.is_xpub(text):
|
||||||
|
self.add_master_public_key(name, text)
|
||||||
|
self.use_encryption = (password != None)
|
||||||
|
self.storage.put('use_encryption', self.use_encryption, True)
|
||||||
|
self.create_main_account(password)
|
||||||
|
return self
|
||||||
|
|
Loading…
Add table
Reference in a new issue