Browse Source

wallet.make_unsigned_transaction: add batch_rbf/send_change params

Don't side-effect config just to modify the next call of make_unsigned_transaction >.<
Cleaner to pass parameters.
master
SomberNight 2 years ago
parent
commit
65394c37d5
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 5
      electrum/gui/qml/qeswaphelper.py
  2. 5
      electrum/gui/qt/swap_dialog.py
  3. 12
      electrum/submarine_swaps.py
  4. 36
      electrum/wallet.py

5
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

5
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

12
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)

36
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)

Loading…
Cancel
Save