1
0

(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.
This commit is contained in:
SomberNight
2019-12-06 19:45:55 +01:00
parent 428b63822b
commit 61aebd0f2d
3 changed files with 12 additions and 1 deletions

View File

@@ -25,6 +25,7 @@
from typing import Optional, List, Dict, Sequence, Set from typing import Optional, List, Dict, Sequence, Set
from enum import IntEnum from enum import IntEnum
import copy
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont
@@ -140,7 +141,8 @@ class UTXOList(MyTreeView):
def get_spend_list(self) -> Optional[Sequence[PartialTxInput]]: def get_spend_list(self) -> Optional[Sequence[PartialTxInput]]:
if self._spend_set is None: if self._spend_set is None:
return 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: def _maybe_reset_spend_list(self, current_wallet_utxos: Sequence[PartialTxInput]) -> None:
if self._spend_set is None: if self._spend_set is None:

View File

@@ -1344,6 +1344,12 @@ class PartialTxInput(TxInput, PSBTSection):
self._is_p2sh_segwit = calc_if_p2sh_segwit_now() self._is_p2sh_segwit = calc_if_p2sh_segwit_now()
return self._is_p2sh_segwit 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): class PartialTxOutput(TxOutput, PSBTSection):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View File

@@ -978,6 +978,9 @@ class Abstract_Wallet(AddressSynchronizer):
outputs: List[PartialTxOutput], fee=None, outputs: List[PartialTxOutput], fee=None,
change_addr: str = None, is_sweep=False) -> PartialTransaction: 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 '!' # prevent side-effect with '!'
outputs = copy.deepcopy(outputs) outputs = copy.deepcopy(outputs)