qml: second part of partially signing tx while not having txid yet
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user