1
0

qml: detect transaction removed (e.g. replace-by-fee) for qetxdetails and qetxfinalizer,

don't close active feebump/cancel dialogs, but invalidate them,
don't close TxDetails page, but show removed status,
show broadcast-failed status in TxDetails
This commit is contained in:
Sander van Grieken
2025-03-10 21:35:38 +01:00
parent 3db26c4ecb
commit f16efd759a
6 changed files with 87 additions and 33 deletions

View File

@@ -6,7 +6,7 @@ from electrum.i18n import _
from electrum.logging import get_logger
from electrum.bitcoin import DummyAddress
from electrum.util import format_time, TxMinedInfo
from electrum.transaction import tx_from_any, Transaction, PartialTxInput, Sighash, PartialTransaction, TxOutpoint
from electrum.transaction import tx_from_any, Transaction, PartialTransaction
from electrum.network import Network
from electrum.address_synchronizer import TX_HEIGHT_UNCONF_PARENT, TX_HEIGHT_UNCONFIRMED, TX_HEIGHT_FUTURE
from electrum.wallet import TxSighashDanger
@@ -22,7 +22,7 @@ class QETxDetails(QObject, QtEventListener):
confirmRemoveLocalTx = pyqtSignal([str], arguments=['message'])
txRemoved = pyqtSignal()
saveTxError = pyqtSignal([str,str], arguments=['code', 'message'])
saveTxError = pyqtSignal([str, str], arguments=['code', 'message'])
saveTxSuccess = pyqtSignal()
detailsChanged = pyqtSignal()
@@ -59,6 +59,7 @@ class QETxDetails(QObject, QtEventListener):
self._is_complete = False
self._is_mined = False
self._is_rbf_enabled = False
self._is_removed = False
self._lock_delay = 0
self._sighash_danger = TxSighashDanger()
@@ -90,6 +91,8 @@ class QETxDetails(QObject, QtEventListener):
def on_event_removed_transaction(self, wallet, tx):
if wallet == self._wallet.wallet and tx.txid() == self._txid:
self._logger.debug(f'removed my transaction {tx.txid()}')
self._is_removed = True
self.update()
self.txRemoved.emit()
walletChanged = pyqtSignal()
@@ -184,6 +187,10 @@ class QETxDetails(QObject, QtEventListener):
def isMined(self):
return self._is_mined
@pyqtProperty(bool, notify=detailsChanged)
def isRemoved(self):
return self._is_removed
@pyqtProperty(str, notify=detailsChanged)
def mempoolDepth(self):
return self._mempool_depth
@@ -267,6 +274,20 @@ class QETxDetails(QObject, QtEventListener):
def update(self, from_txid: bool = False):
assert self._wallet
if self._is_removed:
self._logger.debug('tx removed, disable gui options')
self._can_broadcast = False
self._can_bump = False
self._can_dscancel = False
self._can_cpfp = False
self._can_save_as_local = False
self._can_remove = False
self._can_sign = False
self._mempool_depth = ''
self._status = _('removed')
self.detailsChanged.emit()
return
if from_txid:
self._tx = self._wallet.wallet.db.get_transaction(self._txid)
assert self._tx is not None, f'unknown txid "{self._txid}"'