Browse Source

use rbf flag, show tx outputs, actually send tx in confirmpaymentdialog

patch-4
Sander van Grieken 3 years ago
parent
commit
81435f431c
  1. 33
      electrum/gui/qml/components/ConfirmPaymentDialog.qml
  2. 56
      electrum/gui/qml/qetxfinalizer.py
  3. 2
      electrum/gui/qml/qewallet.py

33
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()
}
}
}

56
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)

2
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)

Loading…
Cancel
Save