(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:
@@ -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:
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user