From 743ea80a4cc072dfb07899b0753f35a40c8bf864 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Thu, 23 Mar 2023 16:53:42 +0100 Subject: [PATCH] qml: move potentially slow tx generation in qeswaphelper to a short delay timer --- electrum/gui/qml/qeswaphelper.py | 49 ++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/electrum/gui/qml/qeswaphelper.py b/electrum/gui/qml/qeswaphelper.py index dcea0173e..5730767c1 100644 --- a/electrum/gui/qml/qeswaphelper.py +++ b/electrum/gui/qml/qeswaphelper.py @@ -3,7 +3,7 @@ import threading import math from typing import Union -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject +from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer from electrum.i18n import _ from electrum.lnutil import ln_dummy_address @@ -48,6 +48,12 @@ class QESwapHelper(AuthMixin, QObject): self._leftVoid = 0 self._rightVoid = 0 + self._fwd_swap_updatetx_timer = QTimer(self) + self._fwd_swap_updatetx_timer.setSingleShot(True) + # self._fwd_swap_updatetx_timer.setInterval(500) + self._fwd_swap_updatetx_timer.timeout.connect(self.fwd_swap_updatetx) + + walletChanged = pyqtSignal() @pyqtProperty(QEWallet, notify=walletChanged) def wallet(self): @@ -274,14 +280,12 @@ class QESwapHelper(AuthMixin, QObject): self.userinfo = _('Adds Lightning receiving capacity.') self.isReverse = True - pay_amount = abs(position) - self._send_amount = pay_amount - self.tosend = QEAmount(amount_sat=pay_amount) + self._send_amount = abs(position) + self.tosend = QEAmount(amount_sat=self._send_amount) - receive_amount = swap_manager.get_recv_amount( - send_amount=pay_amount, is_reverse=True) - self._receive_amount = receive_amount - self.toreceive = QEAmount(amount_sat=receive_amount) + self._receive_amount = swap_manager.get_recv_amount( + send_amount=self._send_amount, is_reverse=True) + self.toreceive = QEAmount(amount_sat=self._receive_amount) # fee breakdown self.serverfeeperc = f'{swap_manager.percentage:0.1f}%' @@ -289,33 +293,42 @@ class QESwapHelper(AuthMixin, QObject): self.server_miningfee = QEAmount(amount_sat=server_miningfee) self.miningfee = QEAmount(amount_sat=swap_manager.get_claim_fee()) + self.check_valid(self._send_amount, self._receive_amount) else: # forward (normal) swap self.userinfo = _('Adds Lightning sending capacity.') self.isReverse = False self._send_amount = position - self.update_tx(self._send_amount) - # add lockup fees, but the swap amount is position - pay_amount = position + self._tx.get_fee() if self._tx else 0 - self.tosend = QEAmount(amount_sat=pay_amount) - - receive_amount = swap_manager.get_recv_amount(send_amount=position, is_reverse=False) - self._receive_amount = receive_amount - self.toreceive = QEAmount(amount_sat=receive_amount) + self._receive_amount = swap_manager.get_recv_amount(send_amount=position, is_reverse=False) + self.toreceive = QEAmount(amount_sat=self._receive_amount) # fee breakdown self.serverfeeperc = f'{swap_manager.percentage:0.1f}%' server_miningfee = swap_manager.normal_fee self.server_miningfee = QEAmount(amount_sat=server_miningfee) - self.miningfee = QEAmount(amount_sat=self._tx.get_fee()) if self._tx else QEAmount() - if pay_amount and receive_amount: + # the slow stuff we delegate to a delay timer which triggers after slider + # doesn't update for a while + self.valid = False # wait for timer + self._fwd_swap_updatetx_timer.start(250) + + def check_valid(self, send_amount, receive_amount): + if send_amount and receive_amount: self.valid = True else: # add more nuanced error reporting? self.userinfo = _('Swap below minimal swap size, change the slider.') self.valid = False + def fwd_swap_updatetx(self): + self.update_tx(self._send_amount) + # add lockup fees, but the swap amount is position + pay_amount = self._send_amount + self._tx.get_fee() if self._tx else 0 + self.tosend = QEAmount(amount_sat=pay_amount) + + self.miningfee = QEAmount(amount_sat=self._tx.get_fee()) if self._tx else QEAmount() + self.check_valid(pay_amount, self._receive_amount) + def do_normal_swap(self, lightning_amount, onchain_amount): assert self._tx if lightning_amount is None or onchain_amount is None: