diff --git a/electrum/gui/qml/qewallet.py b/electrum/gui/qml/qewallet.py index 52784947b..5f48a1d89 100644 --- a/electrum/gui/qml/qewallet.py +++ b/electrum/gui/qml/qewallet.py @@ -611,11 +611,17 @@ class QEWallet(AuthMixin, QObject, QtEventListener): return req_key, addr + def _delete_expired_requests(self): + keys = self.wallet.delete_expired_requests() + for key in keys: + self.requestModel.delete_invoice(key) + @pyqtSlot(QEAmount, str, int) @pyqtSlot(QEAmount, str, int, bool) @pyqtSlot(QEAmount, str, int, bool, bool) @pyqtSlot(QEAmount, str, int, bool, bool, bool) def createRequest(self, amount: QEAmount, message: str, expiration: int, ignore_gap: bool = False, reuse_address: bool = False): + self._delete_expired_requests() try: if self.wallet.lnworker and self.wallet.lnworker.channels: # TODO maybe show a warning if amount exceeds lnworker.num_sats_can_receive (as in kivy) @@ -639,6 +645,7 @@ class QEWallet(AuthMixin, QObject, QtEventListener): @pyqtSlot(bool) @pyqtSlot(bool, bool) def createDefaultRequest(self, ignore_gap: bool = False, reuse_address: bool = False): + self._delete_expired_requests() try: default_expiry = self.wallet.config.get('request_expiry', PR_DEFAULT_EXPIRATION_WHEN_CREATING) if self.wallet.lnworker and self.wallet.lnworker.channels: diff --git a/electrum/gui/qt/receive_tab.py b/electrum/gui/qt/receive_tab.py index 242f0a6d0..438c6ea19 100644 --- a/electrum/gui/qt/receive_tab.py +++ b/electrum/gui/qt/receive_tab.py @@ -158,6 +158,7 @@ class ReceiveTab(QWidget, MessageBoxMixin, Logger): self.qr_menu_action = menu.addToggle(_("Show QR code window"), self.window.toggle_qr_window) menu.addAction(_("Import requests"), self.window.import_requests) menu.addAction(_("Export requests"), self.window.export_requests) + menu.addAction(_("Delete expired requests"), self.request_list.delete_expired_requests) # layout vbox_g = QVBoxLayout() diff --git a/electrum/gui/qt/request_list.py b/electrum/gui/qt/request_list.py index b3e96bbf5..8d6c49d73 100644 --- a/electrum/gui/qt/request_list.py +++ b/electrum/gui/qt/request_list.py @@ -208,10 +208,15 @@ class RequestList(MyTreeView): menu.exec_(self.viewport().mapToGlobal(position)) def delete_requests(self, keys): + self.wallet.delete_requests(keys) + for key in keys: + self.delete_item(key) + self.receive_tab.do_clear() + + def delete_expired_requests(self): + keys = self.wallet.delete_expired_requests() for key in keys: - self.wallet.delete_request(key, write_to_disk=False) self.delete_item(key) - self.wallet.save_db() self.receive_tab.do_clear() def set_visibility_of_columns(self): diff --git a/electrum/wallet.py b/electrum/wallet.py index b0db8b3e4..33c12ceb5 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -2611,6 +2611,17 @@ class Abstract_Wallet(ABC, Logger, EventListener): out.sort(key=lambda x: x.time) return out + def delete_expired_requests(self): + keys = [k for k, v in self._receive_requests.items() if self.get_invoice_status(v) == PR_EXPIRED] + self.delete_requests(keys) + return keys + + def delete_requests(self, keys): + for key in keys: + self.delete_request(key, write_to_disk=False) + if keys: + self.save_db() + @abstractmethod def get_fingerprint(self) -> str: """Returns a string that can be used to identify this wallet.