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 { CheckBox {
id: final_cb id: final_cb
text: qsTr('Final') text: qsTr('Replace-by-Fee')
Layout.columnSpan: 2 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 { Rectangle {
@ -179,10 +205,7 @@ Dialog {
text: qsTr('Pay') text: qsTr('Pay')
enabled: finalizer.valid enabled: finalizer.valid
onClicked: { onClicked: {
var f_amount = parseFloat(dialog.satoshis) finalizer.send_onchain()
if (isNaN(f_amount))
return
var result = Daemon.currentWallet.send_onchain(dialog.address, dialog.satoshis, undefined, false)
} }
} }
} }

56
electrum/gui/qml/qetxfinalizer.py

@ -13,6 +13,7 @@ from .qetypes import QEAmount
class QETxFinalizer(QObject): class QETxFinalizer(QObject):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self._tx = None
_logger = get_logger(__name__) _logger = get_logger(__name__)
@ -27,6 +28,8 @@ class QETxFinalizer(QObject):
_method = -1 _method = -1
_warning = '' _warning = ''
_target = '' _target = ''
_rbf = False
_outputs = []
config = None config = None
validChanged = pyqtSignal() validChanged = pyqtSignal()
@ -103,6 +106,29 @@ class QETxFinalizer(QObject):
self._target = target self._target = target
self.targetChanged.emit() 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() warningChanged = pyqtSignal()
@pyqtProperty(str, notify=warningChanged) @pyqtProperty(str, notify=warningChanged)
def warning(self): def warning(self):
@ -163,7 +189,7 @@ class QETxFinalizer(QObject):
self._method = (2 if mempool else 1) if dynfees else 0 self._method = (2 if mempool else 1) if dynfees else 0
self.update_slider() self.update_slider()
self.methodChanged.emit() self.methodChanged.emit()
self.update(False) self.update()
def save_config(self): def save_config(self):
value = int(self._sliderPos) value = int(self._sliderPos)
@ -177,22 +203,26 @@ class QETxFinalizer(QObject):
self.config.set_key('fee_level', value, True) self.config.set_key('fee_level', value, True)
else: else:
self.config.set_key('fee_per_kb', self.config.static_fee(value), True) self.config.set_key('fee_per_kb', self.config.static_fee(value), True)
self.update(False) self.update()
@profiler @profiler
def make_tx(self, rbf: bool): def make_tx(self):
coins = self._wallet.wallet.get_spendable_coins(None) coins = self._wallet.wallet.get_spendable_coins(None)
outputs = [PartialTxOutput.from_address_and_value(self.address, self._amount.satsInt)] 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('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 return tx
@pyqtSlot(bool) @pyqtSlot()
def update(self, rbf): def update(self):
#rbf = not bool(self.ids.final_cb.active) if self.show_final else False
try: try:
# make unsigned transaction # make unsigned transaction
tx = self.make_tx(rbf) tx = self.make_tx()
except NotEnoughFunds: except NotEnoughFunds:
self.warning = _("Not enough funds") self.warning = _("Not enough funds")
self._valid = False self._valid = False
@ -205,6 +235,8 @@ class QETxFinalizer(QObject):
self.validChanged.emit() self.validChanged.emit()
return return
self._tx = tx
amount = self._amount.satsInt if not self._amount.isMax else tx.output_value() amount = self._amount.satsInt if not self._amount.isMax else tx.output_value()
tx_size = tx.estimated_size() tx_size = tx.estimated_size()
@ -229,3 +261,11 @@ class QETxFinalizer(QObject):
self._valid = True self._valid = True
self.validChanged.emit() 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)) use_rbf = bool(self.wallet.config.get('use_rbf', True))
tx.set_rbf(use_rbf) tx.set_rbf(use_rbf)
self.sign_and_broadcast(tx)
def sign_and_broadcast(self, tx):
def cb(result): def cb(result):
self._logger.info('signing was succesful? %s' % str(result)) self._logger.info('signing was succesful? %s' % str(result))
tx = self.wallet.sign_transaction(tx, None) tx = self.wallet.sign_transaction(tx, None)

Loading…
Cancel
Save