From 81435f431cafe691142ee2b49f849eccda1b9731 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Thu, 5 May 2022 09:20:33 +0200 Subject: [PATCH] use rbf flag, show tx outputs, actually send tx in confirmpaymentdialog --- .../qml/components/ConfirmPaymentDialog.qml | 33 +++++++++-- electrum/gui/qml/qetxfinalizer.py | 56 ++++++++++++++++--- electrum/gui/qml/qewallet.py | 2 + 3 files changed, 78 insertions(+), 13 deletions(-) diff --git a/electrum/gui/qml/components/ConfirmPaymentDialog.qml b/electrum/gui/qml/components/ConfirmPaymentDialog.qml index 59f327113..fdcd91c7c 100644 --- a/electrum/gui/qml/components/ConfirmPaymentDialog.qml +++ b/electrum/gui/qml/components/ConfirmPaymentDialog.qml @@ -153,8 +153,34 @@ Dialog { CheckBox { id: final_cb - text: qsTr('Final') + text: qsTr('Replace-by-Fee') Layout.columnSpan: 2 + checked: finalizer.rbf + } + + Rectangle { + height: 1 + Layout.fillWidth: true + Layout.columnSpan: 2 + color: Material.accentColor + } + + Label { + text: qsTr('Outputs') + Layout.columnSpan: 2 + } + + Repeater { + model: finalizer.outputs + delegate: RowLayout { + Layout.columnSpan: 2 + Label { + text: modelData.address + } + Label { + text: modelData.value_sats + } + } } Rectangle { @@ -179,10 +205,7 @@ Dialog { text: qsTr('Pay') enabled: finalizer.valid onClicked: { - var f_amount = parseFloat(dialog.satoshis) - if (isNaN(f_amount)) - return - var result = Daemon.currentWallet.send_onchain(dialog.address, dialog.satoshis, undefined, false) + finalizer.send_onchain() } } } diff --git a/electrum/gui/qml/qetxfinalizer.py b/electrum/gui/qml/qetxfinalizer.py index a71199fe9..a49b97389 100644 --- a/electrum/gui/qml/qetxfinalizer.py +++ b/electrum/gui/qml/qetxfinalizer.py @@ -13,6 +13,7 @@ from .qetypes import QEAmount class QETxFinalizer(QObject): def __init__(self, parent=None): super().__init__(parent) + self._tx = None _logger = get_logger(__name__) @@ -27,6 +28,8 @@ class QETxFinalizer(QObject): _method = -1 _warning = '' _target = '' + _rbf = False + _outputs = [] config = None validChanged = pyqtSignal() @@ -103,6 +106,29 @@ class QETxFinalizer(QObject): self._target = target self.targetChanged.emit() + rbfChanged = pyqtSignal() + @pyqtProperty(bool, notify=rbfChanged) + def rbf(self): + return self._rbf + + @rbf.setter + def rbf(self, rbf): + if self._rbf != rbf: + self._rbf = rbf + self.update() + self.rbfChanged.emit() + + outputsChanged = pyqtSignal() + @pyqtProperty('QVariantList', notify=outputsChanged) + def outputs(self): + return self._outputs + + @outputs.setter + def outputs(self, outputs): + if self._outputs != outputs: + self._outputs = outputs + self.outputsChanged.emit() + warningChanged = pyqtSignal() @pyqtProperty(str, notify=warningChanged) def warning(self): @@ -163,7 +189,7 @@ class QETxFinalizer(QObject): self._method = (2 if mempool else 1) if dynfees else 0 self.update_slider() self.methodChanged.emit() - self.update(False) + self.update() def save_config(self): value = int(self._sliderPos) @@ -177,22 +203,26 @@ class QETxFinalizer(QObject): self.config.set_key('fee_level', value, True) else: self.config.set_key('fee_per_kb', self.config.static_fee(value), True) - self.update(False) + self.update() @profiler - def make_tx(self, rbf: bool): + def make_tx(self): coins = self._wallet.wallet.get_spendable_coins(None) outputs = [PartialTxOutput.from_address_and_value(self.address, self._amount.satsInt)] - tx = self._wallet.wallet.make_unsigned_transaction(coins=coins,outputs=outputs, fee=None) + tx = self._wallet.wallet.make_unsigned_transaction(coins=coins,outputs=outputs, fee=None,rbf=self._rbf) self._logger.debug('fee: %d, inputs: %d, outputs: %d' % (tx.get_fee(), len(tx.inputs()), len(tx.outputs()))) + self._logger.debug(repr(tx.outputs())) + outputs = [] + for o in tx.outputs(): + outputs.append(o.to_json()) + self.outputs = outputs return tx - @pyqtSlot(bool) - def update(self, rbf): - #rbf = not bool(self.ids.final_cb.active) if self.show_final else False + @pyqtSlot() + def update(self): try: # make unsigned transaction - tx = self.make_tx(rbf) + tx = self.make_tx() except NotEnoughFunds: self.warning = _("Not enough funds") self._valid = False @@ -205,6 +235,8 @@ class QETxFinalizer(QObject): self.validChanged.emit() return + self._tx = tx + amount = self._amount.satsInt if not self._amount.isMax else tx.output_value() tx_size = tx.estimated_size() @@ -229,3 +261,11 @@ class QETxFinalizer(QObject): self._valid = True self.validChanged.emit() + + @pyqtSlot() + def send_onchain(self): + if not self._valid or not self._tx: + self._logger.debug('no valid tx') + return + + self._wallet.sign_and_broadcast(self._tx) diff --git a/electrum/gui/qml/qewallet.py b/electrum/gui/qml/qewallet.py index 2aa2a7007..1957fe4fe 100644 --- a/electrum/gui/qml/qewallet.py +++ b/electrum/gui/qml/qewallet.py @@ -264,7 +264,9 @@ class QEWallet(QObject): use_rbf = bool(self.wallet.config.get('use_rbf', True)) tx.set_rbf(use_rbf) + self.sign_and_broadcast(tx) + def sign_and_broadcast(self, tx): def cb(result): self._logger.info('signing was succesful? %s' % str(result)) tx = self.wallet.sign_transaction(tx, None)