Browse Source

qml: second part of partially signing tx while not having txid yet

master
Sander van Grieken 3 years ago
parent
commit
3cec6cdcfb
  1. 31
      electrum/gui/qml/components/WalletMainView.qml
  2. 44
      electrum/gui/qml/qetxfinalizer.py

31
electrum/gui/qml/components/WalletMainView.qml

@ -51,10 +51,6 @@ Item {
} }
} }
function showExportByTxid(txid, helptext) {
showExport(Daemon.currentWallet.getSerializedTx(txid), helptext)
}
function showExport(data, helptext) { function showExport(data, helptext) {
var dialog = exportTxDialog.createObject(app, { var dialog = exportTxDialog.createObject(app, {
text: data[0], text: data[0],
@ -334,7 +330,7 @@ Item {
if (Daemon.currentWallet.isWatchOnly) { if (Daemon.currentWallet.isWatchOnly) {
dialog.finalizer.save() dialog.finalizer.save()
} else { } else {
dialog.finalizer.signAndSave() dialog.finalizer.sign()
} }
} else { } else {
dialog.finalizer.signAndSend() dialog.finalizer.signAndSend()
@ -430,13 +426,24 @@ Item {
finalizer: TxFinalizer { finalizer: TxFinalizer {
wallet: Daemon.currentWallet wallet: Daemon.currentWallet
canRbf: true canRbf: true
onFinishedSave: { onFinished: {
if (wallet.isWatchOnly) { if (!complete) {
// tx was saved. Show QR for signer(s) var msg
showExportByTxid(txid, qsTr('Transaction created. Present this QR code to the signing device')) if (wallet.isWatchOnly) {
} else { // tx created in watchonly wallet. Show QR for signer(s)
// tx was (partially) signed and saved. Show QR for co-signers or online wallet if (wallet.isMultisig) {
showExportByTxid(txid, qsTr('Transaction created and partially signed by this wallet. Present this QR code to the next co-signer')) msg = qsTr('Transaction created. Present this QR code to one of the co-cigners or signing devices')
} else {
msg = qsTr('Transaction created. Present this QR code to the signing device')
}
} else {
if (signed) {
msg = qsTr('Transaction created and partially signed by this wallet. Present this QR code to the next co-signer')
} else {
msg = qsTr('Transaction created but not signed by this wallet yet. Sign the transaction and present this QR code to the next co-signer')
}
}
showExport(getSerializedTx(), msg)
} }
_confirmPaymentDialog.destroy() _confirmPaymentDialog.destroy()
} }

44
electrum/gui/qml/qetxfinalizer.py

@ -1,5 +1,6 @@
from decimal import Decimal from decimal import Decimal
from typing import Optional from typing import Optional
from functools import partial
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject
@ -220,7 +221,7 @@ class TxFeeSlider(FeeSlider):
class QETxFinalizer(TxFeeSlider): class QETxFinalizer(TxFeeSlider):
_logger = get_logger(__name__) _logger = get_logger(__name__)
finishedSave = pyqtSignal([str], arguments=['txid']) finished = pyqtSignal([bool, bool, bool], arguments=['signed', 'saved', 'complete'])
def __init__(self, parent=None, *, make_tx=None, accept=None): def __init__(self, parent=None, *, make_tx=None, accept=None):
super().__init__(parent) super().__init__(parent)
@ -343,12 +344,16 @@ class QETxFinalizer(TxFeeSlider):
@pyqtSlot() @pyqtSlot()
def save(self): def save(self):
if not self._valid or not self._tx: if not self._valid or not self._tx or not self._tx.txid():
self._logger.debug('no valid tx') self._logger.debug('no valid tx or no txid')
return return
saved = False
if self._wallet.save_tx(self._tx): if self._wallet.save_tx(self._tx):
self.finishedSave.emit(self._tx.txid()) saved = True
# self.finishedSave.emit(self._tx.txid())
self.finished.emit(False, saved)
@pyqtSlot() @pyqtSlot()
def signAndSend(self): def signAndSend(self):
@ -360,25 +365,36 @@ class QETxFinalizer(TxFeeSlider):
self.f_accept(self._tx) self.f_accept(self._tx)
return return
self._wallet.sign(self._tx, broadcast=True) self._wallet.sign(self._tx,
broadcast=True,
on_success=partial(self.on_signed_tx, False)
)
@pyqtSlot() @pyqtSlot()
def signAndSave(self): def sign(self):
if not self._valid or not self._tx: if not self._valid or not self._tx:
self._logger.error('no valid tx') self._logger.error('no valid tx')
return return
self._wallet.sign(self._tx, broadcast=False, on_success=self.on_signed_tx) self._wallet.sign(self._tx,
broadcast=False,
on_success=partial(self.on_signed_tx, True)
)
def on_signed_tx(self, tx: Transaction): def on_signed_tx(self, save: bool, tx: Transaction):
self._logger.debug('on_signed_tx') self._logger.debug('on_signed_tx')
if not self._wallet.save_tx(self._tx): saved = False
self._logger.error('Could not save tx') if save and self._tx.txid():
else: if self._wallet.save_tx(self._tx):
# FIXME: don't rely on txid. (non-segwit tx don't have a txid saved = True
# until tx is complete, and can't save to backend without it). else:
self.finishedSave.emit(self._tx.txid()) self._logger.error('Could not save tx')
self.finished.emit(True, saved, tx.is_complete())
@pyqtSlot(result='QVariantList')
def getSerializedTx(self):
txqr = self._tx.to_qr_data()
return [str(self._tx), txqr[0], txqr[1]]
# mixin for watching an existing TX based on its txid for verified event # mixin for watching an existing TX based on its txid for verified event
# requires self._wallet to contain a QEWallet instance # requires self._wallet to contain a QEWallet instance

Loading…
Cancel
Save