From 2cbb16ae4b8e58278fc551490f2e8296856e59b5 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Thu, 30 Mar 2023 10:41:01 +0200 Subject: [PATCH] qml: move save_tx to qewallet --- electrum/gui/qml/components/TxDetails.qml | 12 ++++++++++-- electrum/gui/qml/qetxdetails.py | 12 +----------- electrum/gui/qml/qewallet.py | 24 ++++++++++++++++++++--- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/electrum/gui/qml/components/TxDetails.qml b/electrum/gui/qml/components/TxDetails.qml index a7b803225..3561b3516 100644 --- a/electrum/gui/qml/components/TxDetails.qml +++ b/electrum/gui/qml/components/TxDetails.qml @@ -421,7 +421,13 @@ Pane { }) dialog.open() } - onSaveTxSuccess: { + } + + Connections { + target: Daemon.currentWallet + function onSaveTxSuccess(txid) { + if (txid != txdetails.txid) + return var dialog = app.messageDialog.createObject(app, { text: qsTr('Transaction added to wallet history.') + '\n\n' + qsTr('Note: this is an offline transaction, if you want the network to see it, you need to broadcast it.') @@ -429,7 +435,9 @@ Pane { dialog.open() root.close() } - onSaveTxError: { + function onSaveTxError(txid, code, message) { + if (txid != txdetails.txid) + return var dialog = app.messageDialog.createObject(app, { text: message }) dialog.open() } diff --git a/electrum/gui/qml/qetxdetails.py b/electrum/gui/qml/qetxdetails.py index 40e8176b2..d4a7e82c9 100644 --- a/electrum/gui/qml/qetxdetails.py +++ b/electrum/gui/qml/qetxdetails.py @@ -386,17 +386,7 @@ class QETxDetails(QObject, QtEventListener): if not self._tx: return - try: - if not self._wallet.wallet.adb.add_transaction(self._tx): - self.saveTxError.emit('conflict', - _("Transaction could not be saved.") + "\n" + _("It conflicts with current history.")) - return - self._wallet.wallet.save_db() - self.saveTxSuccess.emit() - self._wallet.historyModel.init_model(True) - except AddTransactionException as e: - self.saveTxError.emit('error', str(e)) - finally: + if self._wallet.save_tx(self._tx): self._can_save_as_local = False self._can_remove = True self.detailsChanged.emit() diff --git a/electrum/gui/qml/qewallet.py b/electrum/gui/qml/qewallet.py index ec63b3f39..20789e020 100644 --- a/electrum/gui/qml/qewallet.py +++ b/electrum/gui/qml/qewallet.py @@ -12,8 +12,8 @@ from electrum.i18n import _ from electrum.invoices import InvoiceError, PR_DEFAULT_EXPIRATION_WHEN_CREATING, PR_PAID from electrum.logging import get_logger from electrum.network import TxBroadcastError, BestEffortRequestFailed -from electrum.transaction import PartialTxOutput -from electrum.util import (parse_max_spend, InvalidPassword, event_listener) +from electrum.transaction import PartialTxOutput, PartialTransaction +from electrum.util import parse_max_spend, InvalidPassword, event_listener, AddTransactionException from electrum.plugin import run_hook from electrum.wallet import Multisig_Wallet from electrum.crypto import pw_decode_with_version_and_mac @@ -65,6 +65,8 @@ class QEWallet(AuthMixin, QObject, QtEventListener): transactionSigned = pyqtSignal([str], arguments=['txid']) broadcastSucceeded = pyqtSignal([str], arguments=['txid']) broadcastFailed = pyqtSignal([str,str,str], arguments=['txid','code','reason']) + saveTxSuccess = pyqtSignal([str], arguments=['txid']) + saveTxError = pyqtSignal([str,str], arguments=['txid', 'code', 'message']) importChannelBackupFailed = pyqtSignal([str], arguments=['message']) labelsUpdated = pyqtSignal() otpRequested = pyqtSignal() @@ -509,7 +511,7 @@ class QEWallet(AuthMixin, QObject, QtEventListener): if broadcast: self.broadcast(tx) else: - # not broadcasted, so add to history now + # not broadcasted, so refresh history here self.historyModel.init_model(True) # this assumes a 2fa wallet, but there are no other tc_sign_wrapper hooks, so that's ok @@ -553,6 +555,22 @@ class QEWallet(AuthMixin, QObject, QtEventListener): #TODO: properly catch server side errors, e.g. bad-txns-inputs-missingorspent + def save_tx(self, tx: 'PartialTransaction'): + assert tx + + try: + if not self.wallet.adb.add_transaction(tx): + self.saveTxError.emit(tx.txid(), 'conflict', + _("Transaction could not be saved.") + "\n" + _("It conflicts with current history.")) + return + self.wallet.save_db() + self.saveTxSuccess.emit(tx.txid()) + self.historyModel.init_model(True) + return True + except AddTransactionException as e: + self.saveTxError.emit(tx.txid(), 'error', str(e)) + return False + paymentAuthRejected = pyqtSignal() def ln_auth_rejected(self): self.paymentAuthRejected.emit()