diff --git a/electrum/gui/qml/components/Receive.qml b/electrum/gui/qml/components/Receive.qml index ddf2c00b8..4703b3373 100644 --- a/electrum/gui/qml/components/Receive.qml +++ b/electrum/gui/qml/components/Receive.qml @@ -43,12 +43,12 @@ Pane { placeholderText: qsTr('Amount') inputMethodHints: Qt.ImhPreferNumbers - property string textAsSats + property Amount textAsSats onTextChanged: { textAsSats = Config.unitsToSats(amount.text) if (amountFiat.activeFocus) return - amountFiat.text = Daemon.fx.fiatValue(amount.textAsSats) + amountFiat.text = text == '' ? '' : Daemon.fx.fiatValue(amount.textAsSats) } Connections { @@ -109,7 +109,7 @@ Pane { expiresmodel.append({'text': qsTr('1 hour'), 'value': 60*60}) expiresmodel.append({'text': qsTr('1 day'), 'value': 24*60*60}) expiresmodel.append({'text': qsTr('1 week'), 'value': 7*24*60*60}) - expiresmodel.append({'text': qsTr('1 month'), 'value': 31*7*24*60*60}) + expiresmodel.append({'text': qsTr('1 month'), 'value': 31*24*60*60}) expiresmodel.append({'text': qsTr('Never'), 'value': 0}) expires.currentIndex = 0 } diff --git a/electrum/gui/qml/components/Send.qml b/electrum/gui/qml/components/Send.qml index 14eb92ee9..aa2b07e59 100644 --- a/electrum/gui/qml/components/Send.qml +++ b/electrum/gui/qml/components/Send.qml @@ -77,7 +77,7 @@ Pane { placeholderText: qsTr('Amount') Layout.preferredWidth: parent.width /2 inputMethodHints: Qt.ImhPreferNumbers - property string textAsSats + property Amount textAsSats onTextChanged: { textAsSats = Config.unitsToSats(amount.text) if (amountFiat.activeFocus) diff --git a/electrum/gui/qml/qeconfig.py b/electrum/gui/qml/qeconfig.py index 411eac7c3..64ab26873 100644 --- a/electrum/gui/qml/qeconfig.py +++ b/electrum/gui/qml/qeconfig.py @@ -89,23 +89,25 @@ class QEConfig(QObject): def max_precision(self): return self.decimal_point() + 0 #self.extra_precision - @pyqtSlot(str, result='qint64') + @pyqtSlot(str, result=QEAmount) def unitsToSats(self, unitAmount): + self._amount = QEAmount() try: x = Decimal(unitAmount) except: - return 0 + return self._amount # scale it to max allowed precision, make it an int max_prec_amount = int(pow(10, self.max_precision()) * x) # if the max precision is simply what unit conversion allows, just return if self.max_precision() == self.decimal_point(): - return max_prec_amount + self._amount = QEAmount(amount_sat=max_prec_amount) + return self._amount self._logger.debug('fallthrough') # otherwise, scale it back to the expected unit #amount = Decimal(max_prec_amount) / Decimal(pow(10, self.max_precision()-self.decimal_point())) #return int(amount) #Decimal(amount) if not self.is_int else int(amount) - return 0 + return self._amount @pyqtSlot('quint64', result=float) def satsToUnits(self, satoshis): diff --git a/electrum/gui/qml/qetxfinalizer.py b/electrum/gui/qml/qetxfinalizer.py index c1bb3bad2..3aa3faee1 100644 --- a/electrum/gui/qml/qetxfinalizer.py +++ b/electrum/gui/qml/qetxfinalizer.py @@ -8,6 +8,7 @@ from electrum.transaction import PartialTxOutput from electrum.util import NotEnoughFunds, profiler from .qewallet import QEWallet +from .qetypes import QEAmount class QETxFinalizer(QObject): def __init__(self, parent=None): @@ -16,7 +17,7 @@ class QETxFinalizer(QObject): _logger = get_logger(__name__) _address = '' - _amount = '' + _amount = QEAmount() _fee = '' _feeRate = '' _wallet = None @@ -58,14 +59,14 @@ class QETxFinalizer(QObject): self.addressChanged.emit() amountChanged = pyqtSignal() - @pyqtProperty(str, notify=amountChanged) + @pyqtProperty(QEAmount, notify=amountChanged) def amount(self): return self._amount @amount.setter def amount(self, amount): if self._amount != amount: - self._logger.info('amount = "%s"' % amount) + self._logger.info('amount = "%s"' % repr(amount)) self._amount = amount self.amountChanged.emit() @@ -181,7 +182,7 @@ class QETxFinalizer(QObject): @profiler def make_tx(self, rbf: bool): coins = self._wallet.wallet.get_spendable_coins(None) - outputs = [PartialTxOutput.from_address_and_value(self.address, int(self.amount))] + outputs = [PartialTxOutput.from_address_and_value(self.address, self._amount.satsInt)] tx = self._wallet.wallet.make_unsigned_transaction(coins=coins,outputs=outputs, fee=None) self._logger.debug('fee: %d, inputs: %d, outputs: %d' % (tx.get_fee(), len(tx.inputs()), len(tx.outputs()))) return tx @@ -204,7 +205,8 @@ class QETxFinalizer(QObject): self.validChanged.emit() return - amount = int(self.amount) if self.amount != '!' else tx.output_value() + amount = self._amount.satsInt if not self._amount.isMax else tx.output_value() + tx_size = tx.estimated_size() fee = tx.get_fee() feerate = Decimal(fee) / tx_size # sat/byte diff --git a/electrum/gui/qml/qewallet.py b/electrum/gui/qml/qewallet.py index bfcbc16d1..64b072694 100644 --- a/electrum/gui/qml/qewallet.py +++ b/electrum/gui/qml/qewallet.py @@ -16,6 +16,7 @@ from electrum.invoices import (Invoice, InvoiceError, PR_TYPE_ONCHAIN, PR_TYPE from .qeinvoicelistmodel import QEInvoiceListModel, QERequestListModel from .qetransactionlistmodel import QETransactionListModel from .qeaddresslistmodel import QEAddressListModel +from .qetypes import QEAmount class QEWallet(QObject): __instances = [] @@ -318,10 +319,10 @@ class QEWallet(QObject): self._requestModel.add_invoice(req) return addr - @pyqtSlot('quint64', 'QString', int) - @pyqtSlot('quint64', 'QString', int, bool) - @pyqtSlot('quint64', 'QString', int, bool, bool) - def create_request(self, amount: int, message: str, expiration: int, is_lightning: bool = False, ignore_gap: bool = False): + @pyqtSlot(QEAmount, 'QString', int) + @pyqtSlot(QEAmount, 'QString', int, bool) + @pyqtSlot(QEAmount, 'QString', int, bool, bool) + def create_request(self, amount: QEAmount, message: str, expiration: int, is_lightning: bool = False, ignore_gap: bool = False): expiry = expiration #TODO: self.config.get('request_expiry', PR_DEFAULT_EXPIRATION_WHEN_CREATING) try: if is_lightning: @@ -329,9 +330,9 @@ class QEWallet(QObject): self.requestCreateError.emit('fatal',_("You need to open a Lightning channel first.")) return # TODO maybe show a warning if amount exceeds lnworker.num_sats_can_receive (as in kivy) - key = self.wallet.lnworker.add_request(amount, message, expiry) + key = self.wallet.lnworker.add_request(amount.satsInt, message, expiry) else: - key = self.create_bitcoin_request(amount, message, expiry, ignore_gap) + key = self.create_bitcoin_request(amount.satsInt, message, expiry, ignore_gap) if not key: return self._addressModel.init_model()