|
|
|
|
@ -170,12 +170,14 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
def on_event_payment_succeeded(self, wallet, key): |
|
|
|
|
if wallet == self._wallet.wallet and key == self.key: |
|
|
|
|
self.statusChanged.emit() |
|
|
|
|
self.determine_can_pay() |
|
|
|
|
self.userinfo = _('Paid!') |
|
|
|
|
|
|
|
|
|
@event_listener |
|
|
|
|
def on_event_payment_failed(self, wallet, key, reason): |
|
|
|
|
if wallet == self._wallet.wallet and key == self.key: |
|
|
|
|
self.statusChanged.emit() |
|
|
|
|
self.determine_can_pay() |
|
|
|
|
self.userinfo = _('Payment failed: ') + reason |
|
|
|
|
|
|
|
|
|
@event_listener |
|
|
|
|
@ -183,6 +185,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
if wallet == self._wallet.wallet and key == self.key: |
|
|
|
|
self.statusChanged.emit() |
|
|
|
|
if status in [PR_INFLIGHT, PR_ROUTING]: |
|
|
|
|
self.determine_can_pay() |
|
|
|
|
self.userinfo = _('In progress...') |
|
|
|
|
|
|
|
|
|
@pyqtProperty(int, notify=invoiceChanged) |
|
|
|
|
@ -231,6 +234,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
if self._effectiveInvoice: |
|
|
|
|
self._effectiveInvoice.amount_msat = '!' if new_amount.isMax else int(new_amount.satsInt * 1000) |
|
|
|
|
|
|
|
|
|
self.update_userinfo() |
|
|
|
|
self.determine_can_pay() |
|
|
|
|
self.invoiceChanged.emit() |
|
|
|
|
|
|
|
|
|
@ -242,12 +246,11 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
def amountOverride(self, new_amount): |
|
|
|
|
self._logger.debug(f'set new override amount {repr(new_amount)}') |
|
|
|
|
self._amountOverride.copyFrom(new_amount) |
|
|
|
|
|
|
|
|
|
self.determine_can_pay() |
|
|
|
|
self.amountOverrideChanged.emit() |
|
|
|
|
|
|
|
|
|
@pyqtSlot() |
|
|
|
|
def _on_amountoverride_value_changed(self): |
|
|
|
|
self.update_userinfo() |
|
|
|
|
self.determine_can_pay() |
|
|
|
|
|
|
|
|
|
@pyqtProperty('quint64', notify=invoiceChanged) |
|
|
|
|
@ -338,6 +341,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
|
|
|
|
|
self.set_lnprops() |
|
|
|
|
|
|
|
|
|
self.update_userinfo() |
|
|
|
|
self.determine_can_pay() |
|
|
|
|
|
|
|
|
|
self.invoiceChanged.emit() |
|
|
|
|
@ -353,6 +357,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
self._timer.setInterval(interval) # msec |
|
|
|
|
self._timer.start() |
|
|
|
|
else: |
|
|
|
|
self.update_userinfo() |
|
|
|
|
self.determine_can_pay() # status went to PR_EXPIRED |
|
|
|
|
|
|
|
|
|
@pyqtSlot() |
|
|
|
|
@ -360,9 +365,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
self.statusChanged.emit() |
|
|
|
|
self.set_status_timer() |
|
|
|
|
|
|
|
|
|
def determine_can_pay(self): |
|
|
|
|
self.canPay = False |
|
|
|
|
self.canSave = False |
|
|
|
|
def update_userinfo(self): |
|
|
|
|
self.userinfo = '' |
|
|
|
|
|
|
|
|
|
if not self.amountOverride.isEmpty: |
|
|
|
|
@ -370,8 +373,6 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
else: |
|
|
|
|
amount = self.amount |
|
|
|
|
|
|
|
|
|
self.canSave = True |
|
|
|
|
|
|
|
|
|
if self.amount.isEmpty: |
|
|
|
|
self.userinfo = _('Enter the amount you want to send') |
|
|
|
|
|
|
|
|
|
@ -384,13 +385,9 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
lnaddr = self._effectiveInvoice._lnaddr |
|
|
|
|
if lnaddr.amount and amount.satsInt < lnaddr.amount * COIN: |
|
|
|
|
self.userinfo = _('Cannot pay less than the amount specified in the invoice') |
|
|
|
|
else: |
|
|
|
|
self.canPay = True |
|
|
|
|
elif self.address and self.get_max_spendable_onchain() > amount.satsInt: |
|
|
|
|
elif self.address and self.get_max_spendable_onchain() < amount.satsInt: |
|
|
|
|
# TODO: validate address? |
|
|
|
|
# TODO: subtract fee? |
|
|
|
|
self.canPay = True |
|
|
|
|
else: |
|
|
|
|
self.userinfo = _('Insufficient balance') |
|
|
|
|
else: |
|
|
|
|
self.userinfo = { |
|
|
|
|
@ -402,13 +399,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
}[self.status] |
|
|
|
|
elif self.invoiceType == QEInvoice.Type.OnchainInvoice: |
|
|
|
|
if self.status in [PR_UNPAID, PR_FAILED]: |
|
|
|
|
if amount.isMax and self.get_max_spendable_onchain() > 0: |
|
|
|
|
# TODO: dust limit? |
|
|
|
|
self.canPay = True |
|
|
|
|
elif self.get_max_spendable_onchain() >= amount.satsInt: |
|
|
|
|
# TODO: subtract fee? |
|
|
|
|
self.canPay = True |
|
|
|
|
else: |
|
|
|
|
if not ((amount.isMax and self.get_max_spendable_onchain() > 0) or (self.get_max_spendable_onchain() >= amount.satsInt)): |
|
|
|
|
self.userinfo = _('Insufficient balance') |
|
|
|
|
else: |
|
|
|
|
self.userinfo = { |
|
|
|
|
@ -418,6 +409,39 @@ class QEInvoiceParser(QEInvoice, QtEventListener):
|
|
|
|
|
PR_UNKNOWN: _('Invoice has unknown status'), |
|
|
|
|
}[self.status] |
|
|
|
|
|
|
|
|
|
def determine_can_pay(self): |
|
|
|
|
self.canPay = False |
|
|
|
|
self.canSave = False |
|
|
|
|
|
|
|
|
|
if not self.amountOverride.isEmpty: |
|
|
|
|
amount = self.amountOverride |
|
|
|
|
else: |
|
|
|
|
amount = self.amount |
|
|
|
|
|
|
|
|
|
self.canSave = True |
|
|
|
|
|
|
|
|
|
if amount.isEmpty and self.status == PR_UNPAID: # unspecified amount |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
if self.invoiceType == QEInvoice.Type.LightningInvoice: |
|
|
|
|
if self.status in [PR_UNPAID, PR_FAILED]: |
|
|
|
|
if self.get_max_spendable_lightning() >= amount.satsInt: |
|
|
|
|
lnaddr = self._effectiveInvoice._lnaddr |
|
|
|
|
if not (lnaddr.amount and amount.satsInt < lnaddr.amount * COIN): |
|
|
|
|
self.canPay = True |
|
|
|
|
elif self.address and self.get_max_spendable_onchain() > amount.satsInt: |
|
|
|
|
# TODO: validate address? |
|
|
|
|
# TODO: subtract fee? |
|
|
|
|
self.canPay = True |
|
|
|
|
elif self.invoiceType == QEInvoice.Type.OnchainInvoice: |
|
|
|
|
if self.status in [PR_UNPAID, PR_FAILED]: |
|
|
|
|
if amount.isMax and self.get_max_spendable_onchain() > 0: |
|
|
|
|
# TODO: dust limit? |
|
|
|
|
self.canPay = True |
|
|
|
|
elif self.get_max_spendable_onchain() >= amount.satsInt: |
|
|
|
|
# TODO: subtract fee? |
|
|
|
|
self.canPay = True |
|
|
|
|
|
|
|
|
|
def setValidOnchainInvoice(self, invoice: Invoice): |
|
|
|
|
self._logger.debug('setValidOnchainInvoice') |
|
|
|
|
if invoice.is_lightning(): |
|
|
|
|
|