fix: import addresses and private keys
This commit is contained in:
parent
5733a5d125
commit
f6e393d7b6
|
@ -132,7 +132,7 @@ class AddressList(MyTreeWidget):
|
||||||
menu.addAction(_("Sign/verify message"), lambda: self.parent.sign_verify_message(addr))
|
menu.addAction(_("Sign/verify message"), lambda: self.parent.sign_verify_message(addr))
|
||||||
menu.addAction(_("Encrypt/decrypt message"), lambda: self.parent.encrypt_message(addr))
|
menu.addAction(_("Encrypt/decrypt message"), lambda: self.parent.encrypt_message(addr))
|
||||||
if is_imported:
|
if is_imported:
|
||||||
menu.addAction(_("Remove from wallet"), lambda: self.parent.delete_imported_key(addr))
|
menu.addAction(_("Remove from wallet"), lambda: self.parent.remove_address(addr))
|
||||||
addr_URL = block_explorer_URL(self.config, 'addr', addr)
|
addr_URL = block_explorer_URL(self.config, 'addr', addr)
|
||||||
if addr_URL:
|
if addr_URL:
|
||||||
menu.addAction(_("View on block explorer"), lambda: webbrowser.open(addr_URL))
|
menu.addAction(_("View on block explorer"), lambda: webbrowser.open(addr_URL))
|
||||||
|
|
|
@ -297,7 +297,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||||
title += ' [%s]' % (_('watching only'))
|
title += ' [%s]' % (_('watching only'))
|
||||||
self.setWindowTitle(title)
|
self.setWindowTitle(title)
|
||||||
self.password_menu.setEnabled(self.wallet.can_change_password())
|
self.password_menu.setEnabled(self.wallet.can_change_password())
|
||||||
self.import_menu.setVisible(self.wallet.can_import())
|
self.import_privkey_menu.setVisible(self.wallet.can_import_privkey())
|
||||||
|
self.import_address_menu.setVisible(self.wallet.can_import_address())
|
||||||
self.export_menu.setEnabled(self.wallet.can_export())
|
self.export_menu.setEnabled(self.wallet.can_export())
|
||||||
|
|
||||||
def warn_if_watching_only(self):
|
def warn_if_watching_only(self):
|
||||||
|
@ -395,8 +396,9 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||||
|
|
||||||
self.private_keys_menu = wallet_menu.addMenu(_("&Private keys"))
|
self.private_keys_menu = wallet_menu.addMenu(_("&Private keys"))
|
||||||
self.private_keys_menu.addAction(_("&Sweep"), self.sweep_key_dialog)
|
self.private_keys_menu.addAction(_("&Sweep"), self.sweep_key_dialog)
|
||||||
self.import_menu = self.private_keys_menu.addAction(_("&Import"), self.do_import_privkey)
|
self.import_privkey_menu = self.private_keys_menu.addAction(_("&Import"), self.do_import_privkey)
|
||||||
self.export_menu = self.private_keys_menu.addAction(_("&Export"), self.export_privkeys_dialog)
|
self.export_menu = self.private_keys_menu.addAction(_("&Export"), self.export_privkeys_dialog)
|
||||||
|
self.import_address_menu = wallet_menu.addAction(_("Import addresses"), self.import_addresses)
|
||||||
wallet_menu.addAction(_("&Export History"), self.export_history_dialog)
|
wallet_menu.addAction(_("&Export History"), self.export_history_dialog)
|
||||||
wallet_menu.addAction(_("Search"), self.toggle_search).setShortcut(QKeySequence("Ctrl+S"))
|
wallet_menu.addAction(_("Search"), self.toggle_search).setShortcut(QKeySequence("Ctrl+S"))
|
||||||
wallet_menu.addAction(_("Addresses"), self.toggle_addresses_tab).setShortcut(QKeySequence("Ctrl+A"))
|
wallet_menu.addAction(_("Addresses"), self.toggle_addresses_tab).setShortcut(QKeySequence("Ctrl+A"))
|
||||||
|
@ -1408,9 +1410,9 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||||
self.contact_list = l = ContactList(self)
|
self.contact_list = l = ContactList(self)
|
||||||
return self.create_list_tab(l)
|
return self.create_list_tab(l)
|
||||||
|
|
||||||
def delete_imported_key(self, addr):
|
def remove_address(self, addr):
|
||||||
if self.question(_("Do you want to remove")+" %s "%addr +_("from your wallet?")):
|
if self.question(_("Do you want to remove")+" %s "%addr +_("from your wallet?")):
|
||||||
self.wallet.delete_imported_key(addr)
|
self.wallet.delete_address(addr)
|
||||||
self.address_list.update()
|
self.address_list.update()
|
||||||
self.history_list.update()
|
self.history_list.update()
|
||||||
|
|
||||||
|
@ -2196,33 +2198,38 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||||
self.warn_if_watching_only()
|
self.warn_if_watching_only()
|
||||||
self.show_transaction(tx)
|
self.show_transaction(tx)
|
||||||
|
|
||||||
|
def _do_import(self, title, msg, func):
|
||||||
|
text = text_dialog(self, title, msg + ' :', _('Import'))
|
||||||
|
if not text:
|
||||||
|
return
|
||||||
|
bad = []
|
||||||
|
good = []
|
||||||
|
for key in str(text).split():
|
||||||
|
try:
|
||||||
|
addr = func(key)
|
||||||
|
good.append(addr)
|
||||||
|
except BaseException as e:
|
||||||
|
bad.append(key)
|
||||||
|
continue
|
||||||
|
if good:
|
||||||
|
self.show_message(_("The following addresses were added") + ':\n' + '\n'.join(good))
|
||||||
|
if bad:
|
||||||
|
self.show_critical(_("The following inputs could not be imported") + ':\n'+ '\n'.join(bad))
|
||||||
|
self.address_list.update()
|
||||||
|
self.history_list.update()
|
||||||
|
|
||||||
|
def import_addresses(self):
|
||||||
|
if not self.wallet.can_import_address():
|
||||||
|
return
|
||||||
|
title, msg = _('Import addresses'), _("Enter addresses")
|
||||||
|
self._do_import(title, msg, self.wallet.import_address)
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
def do_import_privkey(self, password):
|
def do_import_privkey(self, password):
|
||||||
if not self.wallet.keystore.can_import():
|
if not self.wallet.can_import_privkey():
|
||||||
return
|
return
|
||||||
text = text_dialog(self, _('Import private keys'), _("Enter private keys")+':', _("Import"))
|
title, msg = _('Import private keys'), _("Enter private keys")
|
||||||
if not text:
|
self._do_import(title, msg, lambda x: self.wallet.import_key(x, password))
|
||||||
return
|
|
||||||
text = str(text).split()
|
|
||||||
badkeys = []
|
|
||||||
addrlist = []
|
|
||||||
for key in text:
|
|
||||||
try:
|
|
||||||
addr = self.wallet.import_key(key, password)
|
|
||||||
except BaseException as e:
|
|
||||||
badkeys.append(key)
|
|
||||||
continue
|
|
||||||
if not addr:
|
|
||||||
badkeys.append(key)
|
|
||||||
else:
|
|
||||||
addrlist.append(addr)
|
|
||||||
if addrlist:
|
|
||||||
self.show_message(_("The following addresses were added") + ':\n' + '\n'.join(addrlist))
|
|
||||||
if badkeys:
|
|
||||||
self.show_critical(_("The following inputs could not be imported") + ':\n'+ '\n'.join(badkeys))
|
|
||||||
self.address_list.update()
|
|
||||||
self.history_list.update()
|
|
||||||
|
|
||||||
|
|
||||||
def settings_dialog(self):
|
def settings_dialog(self):
|
||||||
|
|
|
@ -124,7 +124,7 @@ class BaseWizard(object):
|
||||||
if keystore.is_address_list(text):
|
if keystore.is_address_list(text):
|
||||||
self.wallet = Imported_Wallet(self.storage)
|
self.wallet = Imported_Wallet(self.storage)
|
||||||
for x in text.split():
|
for x in text.split():
|
||||||
self.wallet.add_address(x)
|
self.wallet.import_address(x)
|
||||||
self.terminate()
|
self.terminate()
|
||||||
elif keystore.is_private(text):
|
elif keystore.is_private(text):
|
||||||
self.add_password(text)
|
self.add_password(text)
|
||||||
|
|
|
@ -1152,9 +1152,17 @@ class Abstract_Wallet(PrintError):
|
||||||
def get_fingerprint(self):
|
def get_fingerprint(self):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def can_import(self):
|
def can_import_privkey(self):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def can_import_address(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def add_address(self, address):
|
||||||
|
if address not in self.history:
|
||||||
|
self.history[address] = []
|
||||||
|
if self.synchronizer:
|
||||||
|
self.synchronizer.add(address)
|
||||||
|
|
||||||
|
|
||||||
class Imported_Wallet(Abstract_Wallet):
|
class Imported_Wallet(Abstract_Wallet):
|
||||||
|
@ -1177,7 +1185,7 @@ class Imported_Wallet(Abstract_Wallet):
|
||||||
def can_change_password(self):
|
def can_change_password(self):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def can_import(self):
|
def can_import_address(self):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def is_watching_only(self):
|
def is_watching_only(self):
|
||||||
|
@ -1204,20 +1212,22 @@ class Imported_Wallet(Abstract_Wallet):
|
||||||
def get_addresses(self, include_change=False):
|
def get_addresses(self, include_change=False):
|
||||||
return self.addresses
|
return self.addresses
|
||||||
|
|
||||||
def add_address(self, address):
|
def import_address(self, address):
|
||||||
if address in self.addresses:
|
if address in self.addresses:
|
||||||
return
|
return
|
||||||
self.addresses.append(address)
|
self.addresses.append(address)
|
||||||
self.storage.put('addresses', self.addresses)
|
self.storage.put('addresses', self.addresses)
|
||||||
self.storage.write()
|
self.storage.write()
|
||||||
|
self.add_address(address)
|
||||||
# force resynchronization, because we need to re-run add_transaction
|
|
||||||
if address in self.history:
|
|
||||||
self.history.pop(address)
|
|
||||||
if self.synchronizer:
|
|
||||||
self.synchronizer.add(address)
|
|
||||||
return address
|
return address
|
||||||
|
|
||||||
|
def delete_address(self, address):
|
||||||
|
if address not in self.addresses:
|
||||||
|
return
|
||||||
|
self.addresses.remove(address)
|
||||||
|
self.storage.put('addresses', self.addresses)
|
||||||
|
self.storage.write()
|
||||||
|
|
||||||
def get_receiving_addresses(self):
|
def get_receiving_addresses(self):
|
||||||
return self.addresses[:]
|
return self.addresses[:]
|
||||||
|
|
||||||
|
@ -1332,12 +1342,6 @@ class Deterministic_Wallet(Abstract_Wallet):
|
||||||
if n > nmax: nmax = n
|
if n > nmax: nmax = n
|
||||||
return nmax + 1
|
return nmax + 1
|
||||||
|
|
||||||
def add_address(self, address):
|
|
||||||
if address not in self.history:
|
|
||||||
self.history[address] = []
|
|
||||||
if self.synchronizer:
|
|
||||||
self.synchronizer.add(address)
|
|
||||||
|
|
||||||
def create_new_address(self, for_change):
|
def create_new_address(self, for_change):
|
||||||
pubkey_list = self.change_pubkeys if for_change else self.receiving_pubkeys
|
pubkey_list = self.change_pubkeys if for_change else self.receiving_pubkeys
|
||||||
n = len(pubkey_list)
|
n = len(pubkey_list)
|
||||||
|
@ -1432,7 +1436,7 @@ class Standard_Wallet(Deterministic_Wallet, P2PK_Wallet):
|
||||||
self.keystore.update_password(old_pw, new_pw)
|
self.keystore.update_password(old_pw, new_pw)
|
||||||
self.keystore.save(self.storage, self.root_name)
|
self.keystore.save(self.storage, self.root_name)
|
||||||
|
|
||||||
def can_import(self):
|
def can_import_privkey(self):
|
||||||
return self.keystore.can_import()
|
return self.keystore.can_import()
|
||||||
|
|
||||||
def import_key(self, pk, pw):
|
def import_key(self, pk, pw):
|
||||||
|
|
Loading…
Reference in New Issue