diff --git a/electrum/gui/qml/qeswaphelper.py b/electrum/gui/qml/qeswaphelper.py index e0d34775a..846401fcb 100644 --- a/electrum/gui/qml/qeswaphelper.py +++ b/electrum/gui/qml/qeswaphelper.py @@ -428,12 +428,13 @@ class QESwapHelper(AuthMixin, QObject, QtEventListener): raise InvalidSwapParameters("swap_manager.max_amount_forward_swap() is None") if max_amount > max_swap_amount: onchain_amount = max_swap_amount - self._wallet.wallet.config.WALLET_SEND_CHANGE_TO_LIGHTNING = False outputs = [PartialTxOutput.from_address_and_value(DummyAddress.SWAP, onchain_amount)] try: tx = self._wallet.wallet.make_unsigned_transaction( coins=coins, - outputs=outputs) + outputs=outputs, + send_change_to_lightning=False, + ) except (NotEnoughFunds, NoDynamicFeeEstimates) as e: raise InvalidSwapParameters(str(e)) from e return tx diff --git a/electrum/gui/qt/swap_dialog.py b/electrum/gui/qt/swap_dialog.py index 639957369..1d5ef7e16 100644 --- a/electrum/gui/qt/swap_dialog.py +++ b/electrum/gui/qt/swap_dialog.py @@ -293,12 +293,13 @@ class SwapDialog(WindowModalDialog, QtEventListener): raise InvalidSwapParameters("swap_manager.max_amount_forward_swap() is None") if max_amount > max_swap_amount: onchain_amount = max_swap_amount - self.config.WALLET_SEND_CHANGE_TO_LIGHTNING = False outputs = [PartialTxOutput.from_address_and_value(DummyAddress.SWAP, onchain_amount)] try: tx = self.window.wallet.make_unsigned_transaction( coins=coins, - outputs=outputs) + outputs=outputs, + send_change_to_lightning=False, + ) except (NotEnoughFunds, NoDynamicFeeEstimates) as e: raise InvalidSwapParameters(str(e)) from e return tx diff --git a/electrum/submarine_swaps.py b/electrum/submarine_swaps.py index 2ca934c75..7a2d573ed 100644 --- a/electrum/submarine_swaps.py +++ b/electrum/submarine_swaps.py @@ -406,8 +406,7 @@ class SwapManager(Logger): if swap.funding_txid is None: password = self.wallet.get_unlocked_password() for batch_rbf in [True, False]: - self.wallet.config.WALLET_BATCH_RBF = batch_rbf - tx = self.create_funding_tx(swap, None, password) + tx = self.create_funding_tx(swap, None, password, batch_rbf=batch_rbf) try: await self.broadcast_funding_tx(swap, tx) except TxBroadcastServerReturnedError: @@ -716,13 +715,18 @@ class SwapManager(Logger): await self.broadcast_funding_tx(swap, tx) return swap.funding_txid - def create_funding_tx(self, swap, tx, password): + def create_funding_tx(self, swap, tx, password, *, batch_rbf: Optional[bool] = None): # create funding tx # note: rbf must not decrease payment # this is taken care of in wallet._is_rbf_allowed_to_touch_tx_output if tx is None: funding_output = PartialTxOutput.from_address_and_value(swap.lockup_address, swap.onchain_amount) - tx = self.wallet.create_transaction(outputs=[funding_output], rbf=True, password=password) + tx = self.wallet.create_transaction( + outputs=[funding_output], + rbf=True, + password=password, + batch_rbf=batch_rbf, + ) else: tx.replace_output_address(DummyAddress.SWAP, swap.lockup_address) tx.set_rbf(True) diff --git a/electrum/wallet.py b/electrum/wallet.py index 567ba956d..0830c578e 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -1724,13 +1724,20 @@ class Abstract_Wallet(ABC, Logger, EventListener): fee=None, change_addr: str = None, is_sweep=False, - rbf=True) -> PartialTransaction: + rbf=True, + batch_rbf: Optional[bool] = None, + send_change_to_lightning: Optional[bool] = None, + ) -> PartialTransaction: """Can raise NotEnoughFunds or NoDynamicFeeEstimates.""" if not coins: # any bitcoin tx must have at least 1 input by consensus raise NotEnoughFunds() if any([c.already_has_some_signatures() for c in coins]): raise Exception("Some inputs already contain signatures!") + if batch_rbf is None: + batch_rbf = self.config.WALLET_BATCH_RBF + if send_change_to_lightning is None: + send_change_to_lightning = self.config.WALLET_SEND_CHANGE_TO_LIGHTNING # prevent side-effect with '!' outputs = copy.deepcopy(outputs) @@ -1767,7 +1774,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): # Let the coin chooser select the coins to spend coin_chooser = coinchooser.get_coin_chooser(self.config) # If there is an unconfirmed RBF tx, merge with it - base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins) if self.config.WALLET_BATCH_RBF else None + base_tx = self.get_unconfirmed_base_tx_for_batching(outputs, coins) if batch_rbf else None if base_tx: # make sure we don't try to spend change from the tx-to-be-replaced: coins = [c for c in coins if c.prevout.txid.hex() != base_tx.txid()] @@ -1801,7 +1808,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): change_addrs=change_addrs, fee_estimator_vb=fee_estimator, dust_threshold=self.dust_threshold()) - if self.lnworker and self.config.WALLET_SEND_CHANGE_TO_LIGHTNING: + if self.lnworker and send_change_to_lightning: change = tx.get_change_outputs() # do not use multiple change addresses if len(change) == 1: @@ -2924,8 +2931,22 @@ class Abstract_Wallet(ABC, Logger, EventListener): def get_all_known_addresses_beyond_gap_limit(self) -> Set[str]: pass - def create_transaction(self, outputs, *, fee=None, feerate=None, change_addr=None, domain_addr=None, domain_coins=None, - unsigned=False, rbf=True, password=None, locktime=None): + def create_transaction( + self, + outputs, + *, + fee=None, + feerate=None, + change_addr=None, + domain_addr=None, + domain_coins=None, + unsigned=False, + rbf=True, + password=None, + locktime=None, + batch_rbf: Optional[bool] = None, + send_change_to_lightning: Optional[bool] = None, + ): if fee is not None and feerate is not None: raise Exception("Cannot specify both 'fee' and 'feerate' at the same time!") coins = self.get_spendable_coins(domain_addr) @@ -2940,7 +2961,10 @@ class Abstract_Wallet(ABC, Logger, EventListener): coins=coins, outputs=outputs, fee=fee_estimator, - change_addr=change_addr) + change_addr=change_addr, + batch_rbf=batch_rbf, + send_change_to_lightning=send_change_to_lightning, + ) if locktime is not None: tx.locktime = locktime tx.set_rbf(rbf)