URI: 
       t(fix) qt coin selection: signatures for coins would persist in memory - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 61aebd0f2dbf83b8e0f6c043036f8f7301b4a158
   DIR parent 428b63822b359d56d6ececabf406a43589545d24
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Fri,  6 Dec 2019 19:45:55 +0100
       
       (fix) qt coin selection: signatures for coins would persist in memory
       
       Scenario: select some UTXOs in the 'Coins' tab. Create a tx and sign it.
       Close the tx dialog without broadcasting/etc (cancel tx).
       Signatures would remain for selected UTXOs.
       Create new tx -> invalid sigs.
       
       Diffstat:
         M electrum/gui/qt/utxo_list.py        |       4 +++-
         M electrum/transaction.py             |       6 ++++++
         M electrum/wallet.py                  |       3 +++
       
       3 files changed, 12 insertions(+), 1 deletion(-)
       ---
   DIR diff --git a/electrum/gui/qt/utxo_list.py b/electrum/gui/qt/utxo_list.py
       t@@ -25,6 +25,7 @@
        
        from typing import Optional, List, Dict, Sequence, Set
        from enum import IntEnum
       +import copy
        
        from PyQt5.QtCore import Qt
        from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont
       t@@ -140,7 +141,8 @@ class UTXOList(MyTreeView):
            def get_spend_list(self) -> Optional[Sequence[PartialTxInput]]:
                if self._spend_set is None:
                    return None
       -        return [self.utxo_dict[x] for x in self._spend_set]
       +        utxos = [self.utxo_dict[x] for x in self._spend_set]
       +        return copy.deepcopy(utxos)  # copy so that side-effects don't affect utxo_dict
        
            def _maybe_reset_spend_list(self, current_wallet_utxos: Sequence[PartialTxInput]) -> None:
                if self._spend_set is None:
   DIR diff --git a/electrum/transaction.py b/electrum/transaction.py
       t@@ -1344,6 +1344,12 @@ class PartialTxInput(TxInput, PSBTSection):
                    self._is_p2sh_segwit = calc_if_p2sh_segwit_now()
                return self._is_p2sh_segwit
        
       +    def already_has_some_signatures(self) -> bool:
       +        """Returns whether progress has been made towards completing this input."""
       +        return (self.part_sigs
       +                or self.script_sig is not None
       +                or self.witness is not None)
       +
        
        class PartialTxOutput(TxOutput, PSBTSection):
            def __init__(self, *args, **kwargs):
   DIR diff --git a/electrum/wallet.py b/electrum/wallet.py
       t@@ -978,6 +978,9 @@ class Abstract_Wallet(AddressSynchronizer):
                                          outputs: List[PartialTxOutput], fee=None,
                                          change_addr: str = None, is_sweep=False) -> PartialTransaction:
        
       +        if any([c.already_has_some_signatures() for c in coins]):
       +            raise Exception("Some inputs already contain signatures!")
       +
                # prevent side-effect with '!'
                outputs = copy.deepcopy(outputs)