Parcourir la source

feat: allow minting after expiry

thesimplekid il y a 5 mois
Parent
commit
d9fb5f814a
1 fichiers modifiés avec 41 ajouts et 16 suppressions
  1. 41 16
      crates/cdk/src/mint/mint_nut04.rs

+ 41 - 16
crates/cdk/src/mint/mint_nut04.rs

@@ -198,13 +198,41 @@ impl Mint {
             .await
         {
             tracing::debug!(
-                "Quote {} paid by lookup id {}",
-                mint_quote.id,
-                request_lookup_id
+                "Received payment notification for mint quote {}",
+                mint_quote.id
             );
-            self.localstore
-                .update_mint_quote_state(&mint_quote.id, MintQuoteState::Paid)
-                .await?;
+
+            if mint_quote.state != MintQuoteState::Issued
+                && mint_quote.state != MintQuoteState::Paid
+            {
+                let unix_time = unix_time();
+
+                if mint_quote.expiry < unix_time {
+                    tracing::warn!(
+                        "Mint quote {} paid at {} expired at {}, leaving current state",
+                        mint_quote.id,
+                        mint_quote.expiry,
+                        unix_time,
+                    );
+                    return Err(Error::ExpiredQuote(mint_quote.expiry, unix_time));
+                }
+
+                tracing::debug!(
+                    "Marking quote {} paid by lookup id {}",
+                    mint_quote.id,
+                    request_lookup_id
+                );
+
+                self.localstore
+                    .update_mint_quote_state(&mint_quote.id, MintQuoteState::Paid)
+                    .await?;
+            } else {
+                tracing::debug!(
+                    "{} Quote already {} continuing",
+                    mint_quote.id,
+                    mint_quote.state
+                );
+            }
         }
         Ok(())
     }
@@ -215,16 +243,13 @@ impl Mint {
         &self,
         mint_request: nut04::MintBolt11Request,
     ) -> Result<nut04::MintBolt11Response, Error> {
-        // Check quote is known and not expired
-        match self.localstore.get_mint_quote(&mint_request.quote).await? {
-            Some(quote) => {
-                if quote.expiry < unix_time() {
-                    return Err(Error::ExpiredQuote(quote.expiry, unix_time()));
-                }
-            }
-            None => {
-                return Err(Error::UnknownQuote);
-            }
+        if self
+            .localstore
+            .get_mint_quote(&mint_request.quote)
+            .await?
+            .is_none()
+        {
+            return Err(Error::UnknownQuote);
         }
 
         let state = self