Mint: lookup internal quote settlement by request (#478)

This commit is contained in:
callebtc
2024-03-16 17:14:50 +01:00
committed by GitHub
parent e7b1e0c0ed
commit 86b8f5811f
3 changed files with 28 additions and 12 deletions

View File

@@ -155,10 +155,10 @@ class LedgerCrud(ABC):
... ...
@abstractmethod @abstractmethod
async def get_mint_quote_by_checking_id( async def get_mint_quote_by_request(
self, self,
*, *,
checking_id: str, request: str,
db: Database, db: Database,
conn: Optional[Connection] = None, conn: Optional[Connection] = None,
) -> Optional[MintQuote]: ) -> Optional[MintQuote]:
@@ -403,19 +403,19 @@ class LedgerCrudSqlite(LedgerCrud):
) )
return MintQuote.from_row(row) if row else None return MintQuote.from_row(row) if row else None
async def get_mint_quote_by_checking_id( async def get_mint_quote_by_request(
self, self,
*, *,
checking_id: str, request: str,
db: Database, db: Database,
conn: Optional[Connection] = None, conn: Optional[Connection] = None,
) -> Optional[MintQuote]: ) -> Optional[MintQuote]:
row = await (conn or db).fetchone( row = await (conn or db).fetchone(
f""" f"""
SELECT * from {table_with_schema(db, 'mint_quotes')} SELECT * from {table_with_schema(db, 'mint_quotes')}
WHERE checking_id = ? WHERE request = ?
""", """,
(checking_id,), (request,),
) )
return MintQuote.from_row(row) if row else None return MintQuote.from_row(row) if row else None

View File

@@ -475,8 +475,8 @@ class Ledger(LedgerVerification, LedgerSpendingConditions):
# check if there is a mint quote with the same payment request # check if there is a mint quote with the same payment request
# so that we can handle the transaction internally without lightning # so that we can handle the transaction internally without lightning
# and respond with zero fees # and respond with zero fees
mint_quote = await self.crud.get_mint_quote_by_checking_id( mint_quote = await self.crud.get_mint_quote_by_request(
checking_id=invoice_obj.payment_hash, db=self.db request=melt_quote.request, db=self.db
) )
if mint_quote: if mint_quote:
# internal transaction, validate and return amount from # internal transaction, validate and return amount from
@@ -561,8 +561,8 @@ class Ledger(LedgerVerification, LedgerSpendingConditions):
# we only check the state with the backend if there is no associated internal # we only check the state with the backend if there is no associated internal
# mint quote for this melt quote # mint quote for this melt quote
mint_quote = await self.crud.get_mint_quote_by_checking_id( mint_quote = await self.crud.get_mint_quote_by_request(
checking_id=melt_quote.checking_id, db=self.db request=melt_quote.request, db=self.db
) )
if not melt_quote.paid and not mint_quote and check_quote_with_backend: if not melt_quote.paid and not mint_quote and check_quote_with_backend:
@@ -600,8 +600,8 @@ class Ledger(LedgerVerification, LedgerSpendingConditions):
""" """
# first we check if there is a mint quote with the same payment request # first we check if there is a mint quote with the same payment request
# so that we can handle the transaction internally without the backend # so that we can handle the transaction internally without the backend
mint_quote = await self.crud.get_mint_quote_by_checking_id( mint_quote = await self.crud.get_mint_quote_by_request(
checking_id=melt_quote.checking_id, db=self.db request=melt_quote.request, db=self.db
) )
if not mint_quote: if not mint_quote:
return melt_quote return melt_quote

View File

@@ -46,6 +46,22 @@ async def test_mint_quote(wallet1: Wallet, ledger: Ledger):
assert quote.created_time assert quote.created_time
@pytest.mark.asyncio
async def test_get_mint_quote_by_request(wallet1: Wallet, ledger: Ledger):
invoice = await wallet1.request_mint(128)
assert invoice is not None
quote = await ledger.crud.get_mint_quote_by_request(
request=invoice.bolt11, db=ledger.db
)
assert quote is not None
assert quote.quote == invoice.id
assert quote.amount == 128
assert quote.unit == "sat"
assert not quote.paid
assert quote.paid_time is None
assert quote.created_time
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_melt_quote(wallet1: Wallet, ledger: Ledger): async def test_melt_quote(wallet1: Wallet, ledger: Ledger):
invoice = await wallet1.request_mint(128) invoice = await wallet1.request_mint(128)