Browse Source

RBF dialog: do not decrease payment for swap funding transactions.

master
ThomasV 3 years ago
parent
commit
f617887509
  1. 3
      electrum/gui/qt/rbf_dialog.py
  2. 9
      electrum/submarine_swaps.py
  3. 13
      electrum/wallet.py

3
electrum/gui/qt/rbf_dialog.py

@ -58,6 +58,9 @@ class _BaseRBFDialog(TxEditor):
if len(invoices) == 1 and len(invoices[0].outputs) == 1: if len(invoices) == 1 and len(invoices[0].outputs) == 1:
if invoices[0].outputs[0].value == '!': if invoices[0].outputs[0].value == '!':
self.set_decrease_payment() 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): def create_grid(self):
self.method_label = QLabel(_('Method') + ':') self.method_label = QLabel(_('Method') + ':')

9
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}") f"recv_amount={recv_amount} -> send_amount={send_amount} -> inverted_recv_amount={inverted_recv_amount}")
return send_amount return send_amount
def get_swap_by_tx(self, tx: Transaction) -> Optional[SwapData]: def get_swap_by_funding_tx(self, tx: Transaction) -> Optional[SwapData]:
# determine if tx is spending from a swap 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] txin = tx.inputs()[0]
return self.get_swap_by_claim_txin(txin) return self.get_swap_by_claim_txin(txin)

13
electrum/wallet.py

@ -710,8 +710,11 @@ class Abstract_Wallet(ABC, Logger, EventListener):
return any([chan.funding_outpoint.txid == txid return any([chan.funding_outpoint.txid == txid
for chan in self.lnworker.channels.values()]) for chan in self.lnworker.channels.values()])
def is_swap_tx(self, tx: Transaction) -> bool: def get_swap_by_claim_tx(self, tx: Transaction) -> bool:
return bool(self.lnworker.swap_manager.get_swap_by_tx(tx)) if self.lnworker else False 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: def get_wallet_delta(self, tx: Transaction) -> TxWalletDelta:
"""Return the effect a transaction has on the wallet. """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) tx_wallet_delta = self.get_wallet_delta(tx)
is_relevant = tx_wallet_delta.is_relevant is_relevant = tx_wallet_delta.is_relevant
is_any_input_ismine = tx_wallet_delta.is_any_input_ismine 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 fee = tx_wallet_delta.fee
exp_n = None exp_n = None
can_broadcast = False can_broadcast = False
@ -2180,7 +2183,7 @@ class Abstract_Wallet(ABC, Logger, EventListener):
for k in self.get_keystores(): for k in self.get_keystores():
if k.can_sign_txin(txin): if k.can_sign_txin(txin):
return True return True
if self.is_swap_tx(tx): if self.get_swap_by_claim_tx(tx):
return True return True
return False return False
@ -2235,7 +2238,7 @@ class Abstract_Wallet(ABC, Logger, EventListener):
if not isinstance(tx, PartialTransaction): if not isinstance(tx, PartialTransaction):
return return
# note: swap signing does not require the password # 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: if swap:
self.lnworker.swap_manager.sign_tx(tx, swap) self.lnworker.swap_manager.sign_tx(tx, swap)
return return

Loading…
Cancel
Save