浏览代码

Read the latest mint quote status in a transaction to avoid race conditions

Fixes #1162
Cesar Rodas 1 月之前
父节点
当前提交
e552643d0b
共有 1 个文件被更改,包括 14 次插入0 次删除
  1. 14 0
      crates/cdk/src/mint/ln.rs

+ 14 - 0
crates/cdk/src/mint/ln.rs

@@ -45,6 +45,20 @@ impl Mint {
 
         let mut tx = self.localstore.begin_transaction().await?;
 
+        if quote.payment_method == PaymentMethod::Bolt11 {
+            // reload the quote, as it state may have changed
+            *quote = tx
+                .get_mint_quote(&quote.id)
+                .await?
+                .ok_or(Error::UnknownQuote)?;
+
+            let current_state = quote.state();
+
+            if current_state == MintQuoteState::Issued || current_state == MintQuoteState::Paid {
+                return Ok(());
+            }
+        }
+
         for payment in ln_status {
             if !quote.payment_ids().contains(&&payment.payment_id)
                 && payment.payment_amount > Amount::ZERO