Merge pull request #591 from thesimplekid/feat_mint_quote_status_check

feat: check mint ln payment status
This commit is contained in:
thesimplekid
2025-02-09 11:14:19 +00:00
committed by GitHub
6 changed files with 64 additions and 28 deletions

View File

@@ -866,8 +866,10 @@ async fn test_fake_mint_input_output_mismatch() -> Result<()> {
match response {
Err(err) => match err {
cdk::Error::UnsupportedUnit => (),
_ => {}
cdk::Error::UnitMismatch => (),
err => {
bail!("Wrong error returned: {}", err);
}
},
Ok(_) => {
bail!("Should not have allowed to mint with multiple units");

46
crates/cdk/src/mint/ln.rs Normal file
View File

@@ -0,0 +1,46 @@
use cdk_common::common::LnKey;
use cdk_common::MintQuoteState;
use super::Mint;
use crate::mint::Uuid;
use crate::Error;
impl Mint {
/// Check the status of an ln payment for a quote
pub async fn check_mint_quote_paid(&self, quote_id: &Uuid) -> Result<MintQuoteState, Error> {
let mut quote = self
.localstore
.get_mint_quote(quote_id)
.await?
.ok_or(Error::UnknownQuote)?;
let ln = match self.ln.get(&LnKey::new(
quote.unit.clone(),
cdk_common::PaymentMethod::Bolt11,
)) {
Some(ln) => ln,
None => {
tracing::info!("Could not get ln backend for {}, bolt11 ", quote.unit);
return Err(Error::UnsupportedUnit);
}
};
let ln_status = ln
.check_incoming_invoice_status(&quote.request_lookup_id)
.await?;
if ln_status != quote.state && quote.state != MintQuoteState::Issued {
self.localstore
.update_mint_quote_state(quote_id, ln_status)
.await?;
quote.state = ln_status;
self.pubsub_manager
.mint_quote_bolt11_status(quote.clone(), ln_status);
}
Ok(quote.state)
}
}

View File

@@ -147,6 +147,7 @@ impl Mint {
// a quote while waiting for the mint response.
let state = match quote.state {
MintQuoteState::Pending => MintQuoteState::Paid,
MintQuoteState::Unpaid => self.check_mint_quote_paid(quote_id).await?,
s => s,
};
@@ -274,6 +275,12 @@ impl Mint {
.update_mint_quote_state(&mint_request.quote, MintQuoteState::Pending)
.await?;
let state = if state == MintQuoteState::Unpaid {
self.check_mint_quote_paid(&mint_quote.id).await?
} else {
state
};
match state {
MintQuoteState::Unpaid => {
let _state = self

View File

@@ -27,6 +27,7 @@ use crate::Amount;
mod builder;
mod check_spendable;
mod keysets;
mod ln;
mod melt;
mod mint_nut04;
mod start_up_check;

View File

@@ -12,32 +12,12 @@ impl Mint {
/// with all the lighting backends. This check that any payments
/// received while the mint was offline are accounted for, and the wallet can mint associated ecash
pub async fn check_pending_mint_quotes(&self) -> Result<(), Error> {
let mut pending_quotes = self.get_pending_mint_quotes().await?;
let pending_quotes = self.get_pending_mint_quotes().await?;
tracing::info!("There are {} pending mint quotes.", pending_quotes.len());
let mut unpaid_quotes = self.get_unpaid_mint_quotes().await?;
tracing::info!("There are {} unpaid mint quotes.", unpaid_quotes.len());
unpaid_quotes.append(&mut pending_quotes);
for ln in self.ln.values() {
for quote in unpaid_quotes.iter() {
tracing::debug!("Checking status of mint quote: {}", quote.id);
let lookup_id = quote.request_lookup_id.as_str();
match ln.check_incoming_invoice_status(lookup_id).await {
Ok(state) => {
if state != quote.state {
tracing::trace!("Mint quote status changed: {}", quote.id);
self.localstore
.update_mint_quote_state(&quote.id, state)
.await?;
}
}
Err(err) => {
tracing::warn!("Could not check state of pending invoice: {}", lookup_id);
tracing::error!("{}", err);
}
}
for quote in pending_quotes.iter() {
tracing::debug!("Checking status of mint quote: {}", quote.id);
if let Err(err) = self.check_mint_quote_paid(&quote.id).await {
tracing::error!("Could not check status of {}, {}", quote.id, err);
}
}
Ok(())

View File

@@ -192,7 +192,7 @@ impl Mint {
output_verification.unit,
input_verification.unit
);
return Err(Error::MultipleUnits);
return Err(Error::UnitMismatch);
}
let fees = self.get_proofs_fee(inputs).await?;