tcommands: introduce 'removelocaltx' - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 40bf049c82f9c6850fa0124ed5524b5e42d36406 DIR parent 8e6904c7b70f8ec4e4f12f440237d1bf8414c104 HTML Author: SomberNight <somber.night@protonmail.com> Date: Wed, 20 Feb 2019 18:01:43 +0100 commands: introduce 'removelocaltx' see #5137 Diffstat: M electrum/address_synchronizer.py | 11 ++++++----- M electrum/commands.py | 20 +++++++++++++++++++- 2 files changed, 25 insertions(+), 6 deletions(-) --- DIR diff --git a/electrum/address_synchronizer.py b/electrum/address_synchronizer.py t@@ -336,11 +336,12 @@ class AddressSynchronizer(PrintError): def get_depending_transactions(self, tx_hash): """Returns all (grand-)children of tx_hash in this wallet.""" - children = set() - for other_hash in self.spent_outpoints[tx_hash].values(): - children.add(other_hash) - children |= self.get_depending_transactions(other_hash) - return children + with self.transaction_lock: + children = set() + for other_hash in self.spent_outpoints[tx_hash].values(): + children.add(other_hash) + children |= self.get_depending_transactions(other_hash) + return children def receive_tx_callback(self, tx_hash, tx, tx_height): self.add_unverified_tx(tx_hash, tx_height) DIR diff --git a/electrum/commands.py b/electrum/commands.py t@@ -35,7 +35,7 @@ from decimal import Decimal from typing import Optional, TYPE_CHECKING from .import util, ecc -from .util import bfh, bh2u, format_satoshis, json_decode, print_error, json_encode +from .util import bfh, bh2u, format_satoshis, json_decode, print_error, json_encode, is_hash256_str from . import bitcoin from .bitcoin import is_address, hash_160, COIN, TYPE_ADDRESS from . import bip32 t@@ -46,6 +46,7 @@ from .synchronizer import Notifier from .storage import WalletStorage from . import keystore from .wallet import Wallet, Imported_Wallet, Abstract_Wallet +from .address_synchronizer import TX_HEIGHT_LOCAL from .mnemonic import Mnemonic if TYPE_CHECKING: t@@ -763,6 +764,23 @@ class Commands: fee_level = Decimal(fee_level) return self.config.fee_per_kb(dyn=dyn, mempool=mempool, fee_level=fee_level) + @command('w') + def removelocaltx(self, txid): + """Remove a 'local' transaction from the wallet, and its dependent + transactions. + """ + if not is_hash256_str(txid): + raise Exception(f"{repr(txid)} is not a txid") + height = self.wallet.get_tx_height(txid).height + to_delete = {txid} + if height != TX_HEIGHT_LOCAL: + raise Exception(f'Only local transactions can be removed. ' + f'This tx has height: {height} != {TX_HEIGHT_LOCAL}') + to_delete |= self.wallet.get_depending_transactions(txid) + for tx_hash in to_delete: + self.wallet.remove_transaction(tx_hash) + self.wallet.save_transactions(write=True) + @command('') def help(self): # for the python console