From f617887509c92833ffaa6db25d8ed0497acb9ddb Mon Sep 17 00:00:00 2001 From: ThomasV Date: Fri, 10 Feb 2023 16:30:08 +0100 Subject: [PATCH] RBF dialog: do not decrease payment for swap funding transactions. --- electrum/gui/qt/rbf_dialog.py | 3 +++ electrum/submarine_swaps.py | 9 +++++++-- electrum/wallet.py | 13 ++++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/electrum/gui/qt/rbf_dialog.py b/electrum/gui/qt/rbf_dialog.py index 34f5f3ec6..d3ec31a89 100644 --- a/electrum/gui/qt/rbf_dialog.py +++ b/electrum/gui/qt/rbf_dialog.py @@ -58,6 +58,9 @@ class _BaseRBFDialog(TxEditor): if len(invoices) == 1 and len(invoices[0].outputs) == 1: if invoices[0].outputs[0].value == '!': self.set_decrease_payment() + # do not decrease payment if it is a swap + if self.wallet.get_swap_by_funding_tx(self.old_tx): + self.method_combo.setEnabled(False) def create_grid(self): self.method_label = QLabel(_('Method') + ':') diff --git a/electrum/submarine_swaps.py b/electrum/submarine_swaps.py index 7779c8988..fe6c20c8f 100644 --- a/electrum/submarine_swaps.py +++ b/electrum/submarine_swaps.py @@ -594,8 +594,13 @@ class SwapManager(Logger): f"recv_amount={recv_amount} -> send_amount={send_amount} -> inverted_recv_amount={inverted_recv_amount}") return send_amount - def get_swap_by_tx(self, tx: Transaction) -> Optional[SwapData]: - # determine if tx is spending from a swap + def get_swap_by_funding_tx(self, tx: Transaction) -> Optional[SwapData]: + if len(tx.outputs()) != 1: + return False + prevout = TxOutpoint(txid=bytes.fromhex(tx.txid()), out_idx=0) + return self._swaps_by_funding_outpoint.get(prevout) + + def get_swap_by_claim_tx(self, tx: Transaction) -> Optional[SwapData]: txin = tx.inputs()[0] return self.get_swap_by_claim_txin(txin) diff --git a/electrum/wallet.py b/electrum/wallet.py index a89be2734..913611663 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -710,8 +710,11 @@ class Abstract_Wallet(ABC, Logger, EventListener): return any([chan.funding_outpoint.txid == txid for chan in self.lnworker.channels.values()]) - def is_swap_tx(self, tx: Transaction) -> bool: - return bool(self.lnworker.swap_manager.get_swap_by_tx(tx)) if self.lnworker else False + def get_swap_by_claim_tx(self, tx: Transaction) -> bool: + return self.lnworker.swap_manager.get_swap_by_claim_tx(tx) if self.lnworker else None + + def get_swap_by_funding_tx(self, tx: Transaction) -> bool: + return bool(self.lnworker.swap_manager.get_swap_by_funding_tx(tx)) if self.lnworker else None def get_wallet_delta(self, tx: Transaction) -> TxWalletDelta: """Return the effect a transaction has on the wallet. @@ -757,7 +760,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): tx_wallet_delta = self.get_wallet_delta(tx) is_relevant = tx_wallet_delta.is_relevant is_any_input_ismine = tx_wallet_delta.is_any_input_ismine - is_swap = self.is_swap_tx(tx) + is_swap = bool(self.get_swap_by_claim_tx(tx)) fee = tx_wallet_delta.fee exp_n = None can_broadcast = False @@ -2180,7 +2183,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): for k in self.get_keystores(): if k.can_sign_txin(txin): return True - if self.is_swap_tx(tx): + if self.get_swap_by_claim_tx(tx): return True return False @@ -2235,7 +2238,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): if not isinstance(tx, PartialTransaction): return # note: swap signing does not require the password - swap = self.lnworker.swap_manager.get_swap_by_tx(tx) if self.lnworker else None + swap = self.get_swap_by_claim_tx(tx) if swap: self.lnworker.swap_manager.sign_tx(tx, swap) return