瀏覽代碼

feat: check mint quote

thesimplekid 1 年之前
父節點
當前提交
4f3248495a
共有 1 個文件被更改,包括 47 次插入5 次删除
  1. 47 5
      crates/cashu-sdk/src/mint/mod.rs

+ 47 - 5
crates/cashu-sdk/src/mint/mod.rs

@@ -42,6 +42,8 @@ pub enum Error {
     TokenSpent,
     #[error("Token Pending")]
     TokenPending,
+    #[error("Quote not paid")]
+    UnpaidQuote,
     #[error("`{0}`")]
     Custom(String),
     #[error("`{0}`")]
@@ -113,9 +115,23 @@ impl Mint {
         Ok(quote)
     }
 
+    pub async fn check_mint_quote(&self, quote_id: &str) -> Result<MintQuoteBolt11Response, Error> {
+        let quote = self
+            .localstore
+            .get_mint_quote(quote_id)
+            .await?
+            .ok_or(Error::UnknownQuote)?;
+
+        Ok(MintQuoteBolt11Response {
+            quote: quote.id,
+            request: quote.request,
+            paid: quote.paid,
+            expiry: quote.expiry,
+        })
+    }
+
     pub async fn update_mint_quote(&self, quote: MintQuote) -> Result<(), Error> {
         self.localstore.add_mint_quote(quote).await?;
-
         Ok(())
     }
 
@@ -229,6 +245,16 @@ impl Mint {
         &mut self,
         mint_request: nut04::MintBolt11Request,
     ) -> Result<nut04::MintBolt11Response, Error> {
+        let quote = self
+            .localstore
+            .get_mint_quote(&mint_request.quote)
+            .await?
+            .ok_or(Error::UnknownQuote)?;
+
+        if !quote.paid {
+            return Err(Error::UnpaidQuote);
+        }
+
         let mut blind_signatures = Vec::with_capacity(mint_request.outputs.len());
 
         for blinded_message in mint_request.outputs {
@@ -396,13 +422,13 @@ impl Mint {
     }
 
     #[cfg(feature = "nut07")]
-    pub async fn check_spendable(
+    pub async fn check_state(
         &self,
-        check_spendable: &CheckStateRequest,
+        check_state: &CheckStateRequest,
     ) -> Result<CheckStateResponse, Error> {
-        let mut states = Vec::with_capacity(check_spendable.secrets.len());
+        let mut states = Vec::with_capacity(check_state.secrets.len());
 
-        for secret in &check_spendable.secrets {
+        for secret in &check_state.secrets {
             let state = if self.localstore.get_spent_proof(secret).await?.is_some() {
                 State::Spent
             } else if self.localstore.get_pending_proof(secret).await?.is_some() {
@@ -558,6 +584,22 @@ impl Mint {
             change,
         })
     }
+
+    pub async fn check_melt_quote(&self, quote_id: &str) -> Result<MeltQuoteBolt11Response, Error> {
+        let quote = self
+            .localstore
+            .get_melt_quote(quote_id)
+            .await?
+            .ok_or(Error::UnknownQuote)?;
+
+        Ok(MeltQuoteBolt11Response {
+            quote: quote.id,
+            paid: quote.paid,
+            expiry: quote.expiry,
+            amount: u64::from(quote.amount),
+            fee_reserve: u64::from(quote.fee_reserve),
+        })
+    }
 }
 
 #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]