mirror of
https://github.com/lnbits/lnbits-legend.git
synced 2024-11-20 10:39:59 +01:00
2ee10e28c5
* first attempts * lndrest works * fix details * optional fee update * use base64.urlsafe_b64encode * return paymentstatus * CLN: return pending for pending invoices * grpc wip * lndgrpc works * cln: return pending for pending invoices really this time * retry wallet out of exception * wip eclair * take all routines into try except * cliche: return error * rename payment.check_pending() to payment.check_status() * rename payment.check_pending() to payment.check_status() * eclair: works * eclair: better error check * opennode: works * check payment.checking_id istead of payment.ok * payment.ok check as well * cln: works? * cln: works * lntxbot: works * lnbits/wallets/lnpay.py * cln: error handling * make format * lndhub full detail update * spark: wip * error to False * wallets: return clean PaymentResponse * opennode: strict error * cliche: works * lnbits: works * cln: dont throw error * preimage not error * fix cln * do not add duplicate payments * revert cln * extra safety for cln * undo crud changes until tests work * tasks: better logging and 0.5s sleep for regular status check * 0.1 s * check if wallet exists * lnbits unhashed description * remove sleep * revert app.py * cleanup * add check * clean error * readd app.py * fix eclaid
89 lines
2.1 KiB
Python
89 lines
2.1 KiB
Python
from abc import ABC, abstractmethod
|
|
from typing import AsyncGenerator, Coroutine, NamedTuple, Optional
|
|
|
|
|
|
class StatusResponse(NamedTuple):
|
|
error_message: Optional[str]
|
|
balance_msat: int
|
|
|
|
|
|
class InvoiceResponse(NamedTuple):
|
|
ok: bool
|
|
checking_id: Optional[str] = None # payment_hash, rpc_id
|
|
payment_request: Optional[str] = None
|
|
error_message: Optional[str] = None
|
|
|
|
|
|
class PaymentResponse(NamedTuple):
|
|
# when ok is None it means we don't know if this succeeded
|
|
ok: Optional[bool] = None
|
|
checking_id: Optional[str] = None # payment_hash, rcp_id
|
|
fee_msat: Optional[int] = None
|
|
preimage: Optional[str] = None
|
|
error_message: Optional[str] = None
|
|
|
|
|
|
class PaymentStatus(NamedTuple):
|
|
paid: Optional[bool] = None
|
|
fee_msat: Optional[int] = None
|
|
preimage: Optional[str] = None
|
|
|
|
@property
|
|
def pending(self) -> bool:
|
|
return self.paid is not True
|
|
|
|
@property
|
|
def failed(self) -> bool:
|
|
return self.paid == False
|
|
|
|
def __str__(self) -> str:
|
|
if self.paid == True:
|
|
return "settled"
|
|
elif self.paid == False:
|
|
return "failed"
|
|
elif self.paid == None:
|
|
return "still pending"
|
|
else:
|
|
return "unknown (should never happen)"
|
|
|
|
|
|
class Wallet(ABC):
|
|
@abstractmethod
|
|
def status(self) -> Coroutine[None, None, StatusResponse]:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def create_invoice(
|
|
self,
|
|
amount: int,
|
|
memo: Optional[str] = None,
|
|
description_hash: Optional[bytes] = None,
|
|
) -> Coroutine[None, None, InvoiceResponse]:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def pay_invoice(
|
|
self, bolt11: str, fee_limit_msat: int
|
|
) -> Coroutine[None, None, PaymentResponse]:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_invoice_status(
|
|
self, checking_id: str
|
|
) -> Coroutine[None, None, PaymentStatus]:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_payment_status(
|
|
self, checking_id: str
|
|
) -> Coroutine[None, None, PaymentStatus]:
|
|
pass
|
|
|
|
@abstractmethod
|
|
def paid_invoices_stream(self) -> AsyncGenerator[str, None]:
|
|
pass
|
|
|
|
|
|
class Unsupported(Exception):
|
|
pass
|