Merge pull request #1097 from andyichr/multisig-xprv

Support for restoring multisig wallets from BIP32 private keys
This commit is contained in:
ThomasV 2015-03-21 05:19:46 +01:00
commit 13d5c20c5a
1 changed files with 24 additions and 6 deletions

View File

@ -22,7 +22,7 @@ MSG_ENTER_ANYTHING = _("Please enter a wallet seed, a master public key, a li
MSG_SHOW_MPK = _("This is your master public key") MSG_SHOW_MPK = _("This is your master public key")
MSG_ENTER_MPK = _("Please enter your master public key") MSG_ENTER_MPK = _("Please enter your master public key")
MSG_ENTER_COLD_MPK = _("Please enter the master public key of your cosigner wallet") MSG_ENTER_COLD_MPK = _("Please enter the master public key of your cosigner wallet")
MSG_ENTER_SEED_OR_MPK = _("Please enter a wallet seed, or master public key") MSG_ENTER_SEED_OR_MPK = _("Please enter a wallet seed, BIP32 private key, or master public key")
MSG_VERIFY_SEED = _("Your seed is important!") + "\n" + _("To make sure that you have properly saved your seed, please retype it here.") MSG_VERIFY_SEED = _("Your seed is important!") + "\n" + _("To make sure that you have properly saved your seed, please retype it here.")
@ -452,12 +452,13 @@ class InstallWizard(QDialog):
return return
text1, text2 = r text1, text2 = r
wallet = Wallet_2of2(self.storage) wallet = Wallet_2of2(self.storage)
if Wallet.is_seed(text1) or Wallet.is_seed(text2): if (Wallet.is_seed(text1) or Wallet.is_seed(text2) or
Wallet.is_xprv(text1) or Wallet.is_xprv(text2)):
password = self.password_dialog() password = self.password_dialog()
else: else:
password = None password = None
if Wallet.is_seed(text2) and Wallet.is_xpub(text1): if (Wallet.is_seed(text2) or Wallet.is_xprv(text2)) and Wallet.is_xpub(text1):
c = text1 c = text1
text1 = text2 text1 = text2
text2 = c text2 = c
@ -465,6 +466,10 @@ class InstallWizard(QDialog):
if Wallet.is_seed(text1): if Wallet.is_seed(text1):
wallet.add_seed(text1, password) wallet.add_seed(text1, password)
wallet.create_master_keys(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: else:
wallet.add_master_public_key("x1/", text1) wallet.add_master_public_key("x1/", text1)
@ -482,17 +487,18 @@ class InstallWizard(QDialog):
return return
text1, text2, text3 = r text1, text2, text3 = r
wallet = Wallet_2of3(self.storage) wallet = Wallet_2of3(self.storage)
if Wallet.is_seed(text1) or Wallet.is_seed(text2) or Wallet.is_seed(text3): 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() password = self.password_dialog()
else: else:
password = None password = None
if Wallet.is_xpub(text1) and Wallet.is_seed(text2): if Wallet.is_xpub(text1) and (Wallet.is_seed(text2) or Wallet.is_xprv(text2)):
temp = text1 temp = text1
text1 = text2 text1 = text2
text2 = temp text2 = temp
if Wallet.is_xpub(text1) and Wallet.is_seed(text3): if Wallet.is_xpub(text1) and (Wallet.is_seed(text3) or Wallet.is_xprv(text3)):
temp = text1 temp = text1
text1 = text3 text1 = text3
text3 = temp text3 = temp
@ -500,16 +506,28 @@ class InstallWizard(QDialog):
if Wallet.is_seed(text1): if Wallet.is_seed(text1):
wallet.add_seed(text1, password) wallet.add_seed(text1, password)
wallet.create_master_keys(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: else:
wallet.add_master_public_key("x1/", text1) wallet.add_master_public_key("x1/", text1)
if Wallet.is_seed(text2): if Wallet.is_seed(text2):
wallet.add_cosigner_seed(text2, "x2/", password) 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): elif Wallet.is_xpub(text2):
wallet.add_master_public_key("x2/", text2) wallet.add_master_public_key("x2/", text2)
if Wallet.is_seed(text3): if Wallet.is_seed(text3):
wallet.add_cosigner_seed(text3, "x3/", password) 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): elif Wallet.is_xpub(text3):
wallet.add_master_public_key("x3/", text3) wallet.add_master_public_key("x3/", text3)