mirror of
https://github.com/aljazceru/cdk.git
synced 2026-01-10 00:16:02 +01:00
Merge pull request #591 from thesimplekid/feat_mint_quote_status_check
feat: check mint ln payment status
This commit is contained in:
@@ -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
46
crates/cdk/src/mint/ln.rs
Normal 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("e.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)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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("e.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("e.id).await {
|
||||
tracing::error!("Could not check status of {}, {}", quote.id, err);
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
||||
@@ -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?;
|
||||
|
||||
Reference in New Issue
Block a user