Skip to content

Commit 825f3f1

Browse files
authored
Merge pull request #10106 from SomberNight/202508_wallet_delete_address
wallet: more locking in delete_address
2 parents ebb38e9 + 608980c commit 825f3f1

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

electrum/wallet.py

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3657,11 +3657,12 @@ def import_address(self, address: str) -> str:
36573657
def delete_address(self, address: str) -> None:
36583658
if not self.db.has_imported_address(address):
36593659
return
3660-
if len(self.get_addresses()) <= 1:
3661-
raise UserFacingException(_('Cannot delete last remaining address from wallet'))
3662-
transactions_to_remove = set() # only referred to by this address
3663-
transactions_new = set() # txs that are not only referred to by address
36643660
with self.lock:
3661+
if len(self.get_addresses()) <= 1: # check this inside lock
3662+
raise UserFacingException(_('Cannot delete last remaining address from wallet'))
3663+
transactions_to_remove = set() # only referred to by this address
3664+
transactions_new = set() # txs that are not only referred to by address
3665+
# rm txs from history
36653666
for addr in self.db.get_history():
36663667
details = self.adb.get_address_history(addr).items()
36673668
if addr == address:
@@ -3674,26 +3675,30 @@ def delete_address(self, address: str) -> None:
36743675
self.db.remove_addr_history(address)
36753676
for tx_hash in transactions_to_remove:
36763677
self.adb._remove_transaction(tx_hash)
3677-
self.set_label(address, None)
3678-
if req := self.get_request_by_addr(address):
3679-
self.delete_request(req.get_id())
3680-
self.set_frozen_state_of_addresses([address], False, write_to_disk=False)
3681-
pubkey = self.get_public_key(address)
3682-
self.db.remove_imported_address(address)
3683-
if pubkey:
3684-
# delete key iff no other address uses it (e.g. p2pkh and p2wpkh for same key)
3685-
for txin_type in bitcoin.WIF_SCRIPT_TYPES.keys():
3686-
try:
3687-
addr2 = bitcoin.pubkey_to_address(txin_type, pubkey)
3688-
except NotImplementedError:
3689-
pass
3678+
# rm label for addr
3679+
# TODO rm label for txids?
3680+
self.set_label(address, None)
3681+
# rm receive requests for addr
3682+
if req := self.get_request_by_addr(address):
3683+
self.delete_request(req.get_id())
3684+
self.set_frozen_state_of_addresses([address], False, write_to_disk=False)
3685+
# rm corresponding key from keystore
3686+
pubkey = self.get_public_key(address)
3687+
self.db.remove_imported_address(address)
3688+
if pubkey:
3689+
# delete key iff no other address uses it (e.g. p2pkh and p2wpkh for same key)
3690+
for txin_type in bitcoin.WIF_SCRIPT_TYPES.keys():
3691+
try:
3692+
addr2 = bitcoin.pubkey_to_address(txin_type, pubkey)
3693+
except NotImplementedError:
3694+
pass
3695+
else:
3696+
if self.db.has_imported_address(addr2):
3697+
break
36903698
else:
3691-
if self.db.has_imported_address(addr2):
3692-
break
3693-
else:
3694-
self.keystore.delete_imported_key(pubkey)
3695-
self.save_keystore()
3696-
self.save_db()
3699+
self.keystore.delete_imported_key(pubkey)
3700+
self.save_keystore()
3701+
self.save_db()
36973702

36983703
def get_change_addresses_for_new_transaction(self, *args, **kwargs) -> List[str]:
36993704
# for an imported wallet, if all "change addresses" are already used,

0 commit comments

Comments
 (0)