commit 052d8b236edd1fa151e71ef2ef8f88c7a0e7fbe5
parent 94ac0db91fd66afba646450f0fcdec6081f99f7d
Author: ThomasV <thomasv@electrum.org>
Date: Wed, 28 Oct 2015 10:36:44 +0100
fix #1494
Diffstat:
4 files changed, 40 insertions(+), 55 deletions(-)
diff --git a/electrum b/electrum
@@ -142,26 +142,12 @@ def init_cmdline(config):
if cmd.name == 'restore':
text = config.get('text')
+ password = password_dialog() if Wallet.is_seed(text) or Wallet.is_xprv(text) or Wallet.is_private_key(text) else None
try:
- wallet = Wallet.from_text(text, password_dialog, storage)
+ wallet = Wallet.from_text(text, password, storage)
except BaseException as e:
sys.exit(str(e))
-
- if not config.get('offline'):
- network = Network(config)
- network.start()
- wallet.start_threads(network)
- print_msg("Recovering wallet...")
- wallet.restore(lambda x: x)
- wallet.synchronize()
- if wallet.is_found():
- print_msg("Recovery successful")
- else:
- print_msg("Warning: Found no history for this wallet")
- else:
- wallet.synchronize()
- print_msg("Warning: This wallet was restored offline. It may contain more addresses than displayed.")
-
+ wallet.synchronize()
else:
password = password_dialog()
wallet = Wallet(storage)
@@ -174,8 +160,6 @@ def init_cmdline(config):
print_msg("Please keep it in a safe place; if you lose it, you will not be able to restore your wallet.")
print_msg("Wallet saved in '%s'" % wallet.storage.path)
- # terminate
- sys.exit(0)
if cmd.name not in ['create', 'restore'] and cmd.requires_wallet and not storage.file_exists:
print_msg("Error: Wallet file not found.")
@@ -248,6 +232,9 @@ def run_command(config, network, password):
storage = WalletStorage(config.get_wallet_path())
# create wallet instance
wallet = Wallet(storage) if cmd.requires_wallet else None
+ # start threads
+ if network:
+ wallet.start_threads(network)
# arguments passed to function
args = map(lambda x: config.get(x), cmd.params)
# decode json arguments
@@ -264,10 +251,9 @@ def run_command(config, network, password):
cmd_runner.password = password
func = getattr(cmd_runner, cmd.name)
result = func(*args)
-
+ # stop threads
if wallet:
wallet.stop_threads()
-
return result
diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py
@@ -565,7 +565,8 @@ class InstallWizard(QDialog):
text = self.enter_seed_dialog(MSG_ENTER_ANYTHING, None)
if not text:
return
- wallet = Wallet.from_text(text, self.password_dialog, self.storage)
+ password = self.password_dialog() if Wallet.is_seed(text) or Wallet.is_xprv(text) or Wallet.is_private_key(text) else None
+ wallet = Wallet.from_text(text, password, self.storage)
elif re.match('(\d+)of(\d+)', t):
n = int(re.match('(\d+)of(\d+)', t).group(2))
key_list = self.multi_seed_dialog(n - 1)
diff --git a/lib/commands.py b/lib/commands.py
@@ -101,13 +101,20 @@ class Commands:
@command('')
def create(self):
"""Create a new wallet"""
+ return True
- @command('')
+ @command('wn')
def restore(self, text):
"""Restore a wallet from text. Text can be a seed phrase, a master
public key, a master private key, a list of bitcoin addresses
or bitcoin private keys. If you want to be prompted for your
seed, type '?' or ':' (concealed) """
+ self.wallet.restore(lambda x: print_msg(x))
+ #self.wallet.synchronize()
+ msg = "Recovery successful" if self.wallet.is_found() else "Warning: Found no history for this wallet"
+ if not self.network:
+ msg += "\nWarning: This wallet was restored offline. It may contain more addresses than displayed."
+ return msg
@command('w')
def deseed(self):
diff --git a/lib/wallet.py b/lib/wallet.py
@@ -1135,8 +1135,28 @@ class Abstract_Wallet(PrintError):
self.verifier = None
self.storage.put('stored_height', self.get_local_height(), True)
- def restore(self, cb):
- pass
+ def restore(self, callback):
+ from i18n import _
+ def wait_for_wallet():
+ self.set_up_to_date(False)
+ while not self.is_up_to_date():
+ msg = "%s\n%s %d"%(
+ _("Please wait..."),
+ _("Addresses generated:"),
+ len(self.addresses(True)))
+ apply(callback, (msg,))
+ time.sleep(0.1)
+ def wait_for_network():
+ while not self.network.is_connected():
+ msg = "%s \n" % (_("Connecting..."))
+ apply(callback, (msg,))
+ time.sleep(0.1)
+ # wait until we are connected, because the user might have selected another server
+ if self.network:
+ wait_for_network()
+ wait_for_wallet()
+ else:
+ self.synchronize()
def get_accounts(self):
return self.accounts
@@ -1509,32 +1529,6 @@ class Deterministic_Wallet(Abstract_Wallet):
for account in self.accounts.values():
account.synchronize(self)
- def restore(self, callback):
- from i18n import _
- def wait_for_wallet():
- self.set_up_to_date(False)
- while not self.is_up_to_date():
- msg = "%s\n%s %d"%(
- _("Please wait..."),
- _("Addresses generated:"),
- len(self.addresses(True)))
-
- apply(callback, (msg,))
- time.sleep(0.1)
-
- def wait_for_network():
- while not self.network.is_connected():
- msg = "%s \n" % (_("Connecting..."))
- apply(callback, (msg,))
- time.sleep(0.1)
-
- # wait until we are connected, because the user might have selected another server
- if self.network:
- wait_for_network()
- wait_for_wallet()
- else:
- self.synchronize()
-
def is_beyond_limit(self, address, account, is_change):
if type(account) == ImportedAccount:
return False
@@ -2089,9 +2083,8 @@ class Wallet(object):
return self
@classmethod
- def from_text(klass, text, password_dialog, storage):
+ def from_text(klass, text, password, storage):
if Wallet.is_xprv(text):
- password = password_dialog()
wallet = klass.from_xprv(text, password, storage)
elif Wallet.is_old_mpk(text):
wallet = klass.from_old_mpk(text, storage)
@@ -2100,10 +2093,8 @@ class Wallet(object):
elif Wallet.is_address(text):
wallet = klass.from_address(text, storage)
elif Wallet.is_private_key(text):
- password = password_dialog()
wallet = klass.from_private_key(text, password, storage)
elif Wallet.is_seed(text):
- password = password_dialog()
wallet = klass.from_seed(text, password, storage)
else:
raise BaseException('Invalid seedphrase or key')