Multiple max spends functionality added (#7492)
this implements https://github.com/spesmilo/electrum/issues/7054
This commit is contained in:
@@ -16,7 +16,7 @@ from electrum.invoices import (PR_TYPE_ONCHAIN, PR_TYPE_LN, PR_DEFAULT_EXPIRATIO
|
||||
from electrum import bitcoin, constants
|
||||
from electrum.transaction import tx_from_any, PartialTxOutput
|
||||
from electrum.util import (parse_URI, InvalidBitcoinURI, TxMinedInfo, maybe_extract_bolt11_invoice,
|
||||
InvoiceError, format_time)
|
||||
InvoiceError, format_time, parse_max_spend)
|
||||
from electrum.lnaddr import lndecode, LnInvoiceException
|
||||
from electrum.logging import Logger
|
||||
|
||||
@@ -371,7 +371,7 @@ class SendScreen(CScreen, Logger):
|
||||
|
||||
def _do_pay_onchain(self, invoice: OnchainInvoice) -> None:
|
||||
outputs = invoice.outputs
|
||||
amount = sum(map(lambda x: x.value, outputs)) if '!' not in [x.value for x in outputs] else '!'
|
||||
amount = sum(map(lambda x: x.value, outputs)) if not any(parse_max_spend(x.value) for x in outputs) else '!'
|
||||
coins = self.app.wallet.get_spendable_coins(None)
|
||||
make_tx = lambda rbf: self.app.wallet.make_unsigned_transaction(coins=coins, outputs=outputs, rbf=rbf)
|
||||
on_pay = lambda tx: self.app.protected(_('Send payment?'), self.send_tx, (tx, invoice))
|
||||
|
||||
@@ -64,7 +64,7 @@ from electrum.util import (format_time,
|
||||
InvalidBitcoinURI, maybe_extract_bolt11_invoice, NotEnoughFunds,
|
||||
NoDynamicFeeEstimates, MultipleSpendMaxTxOutputs,
|
||||
AddTransactionException, BITCOIN_BIP21_URI_SCHEME,
|
||||
InvoiceError)
|
||||
InvoiceError, parse_max_spend)
|
||||
from electrum.invoices import PR_TYPE_ONCHAIN, PR_TYPE_LN, PR_DEFAULT_EXPIRATION_WHEN_CREATING, Invoice
|
||||
from electrum.invoices import PR_PAID, PR_FAILED, pr_expiration_values, LNInvoice, OnchainInvoice
|
||||
from electrum.transaction import (Transaction, PartialTxInput,
|
||||
@@ -1709,11 +1709,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
|
||||
fee=fee_est,
|
||||
is_sweep=is_sweep)
|
||||
output_values = [x.value for x in outputs]
|
||||
if output_values.count('!') > 1:
|
||||
self.show_error(_("More than one output set to spend max"))
|
||||
return
|
||||
|
||||
output_value = '!' if '!' in output_values else sum(output_values)
|
||||
if any(parse_max_spend(outval) for outval in output_values):
|
||||
output_value = '!'
|
||||
else:
|
||||
output_value = sum(output_values)
|
||||
conf_dlg = ConfirmTxDialog(window=self, make_tx=make_tx, output_value=output_value, is_sweep=is_sweep)
|
||||
if conf_dlg.not_enough_funds:
|
||||
# Check if we had enough funds excluding fees,
|
||||
|
||||
@@ -31,7 +31,7 @@ from typing import NamedTuple, Sequence, Optional, List, TYPE_CHECKING
|
||||
from PyQt5.QtGui import QFontMetrics, QFont
|
||||
|
||||
from electrum import bitcoin
|
||||
from electrum.util import bfh, maybe_extract_bolt11_invoice, BITCOIN_BIP21_URI_SCHEME
|
||||
from electrum.util import bfh, maybe_extract_bolt11_invoice, BITCOIN_BIP21_URI_SCHEME, parse_max_spend
|
||||
from electrum.transaction import PartialTxOutput
|
||||
from electrum.bitcoin import opcodes, construct_script
|
||||
from electrum.logging import Logger
|
||||
@@ -131,8 +131,8 @@ class PayToEdit(CompletionTextEdit, ScanQRTextEdit, Logger):
|
||||
x = x.strip()
|
||||
if not x:
|
||||
raise Exception("Amount is empty")
|
||||
if x == '!':
|
||||
return '!'
|
||||
if parse_max_spend(x):
|
||||
return x
|
||||
p = pow(10, self.amount_edit.decimal_point())
|
||||
try:
|
||||
return int(p * Decimal(x))
|
||||
@@ -203,7 +203,7 @@ class PayToEdit(CompletionTextEdit, ScanQRTextEdit, Logger):
|
||||
idx=i, line_content=line.strip(), exc=e, is_multiline=True))
|
||||
continue
|
||||
outputs.append(output)
|
||||
if output.value == '!':
|
||||
if parse_max_spend(output.value):
|
||||
is_max = True
|
||||
else:
|
||||
total += output.value
|
||||
|
||||
Reference in New Issue
Block a user