Просмотр исходного кода

fix: default state sql

fix(mint/sqlite): add pending proof state

fix(mint): adding proof to pending before checking current

fix(mint): remove double call to verify melt quote
thesimplekid 8 месяцев назад
Родитель
Сommit
5db6eaa858

+ 1 - 1
crates/cdk-redb/src/mint/mod.rs

@@ -34,7 +34,7 @@ const CONFIG_TABLE: TableDefinition<&str, &str> = TableDefinition::new("config")
 const BLINDED_SIGNATURES: TableDefinition<[u8; 33], &str> =
     TableDefinition::new("blinded_signatures");
 
-const DATABASE_VERSION: u32 = 0;
+const DATABASE_VERSION: u32 = 1;
 
 /// Mint Redbdatabase
 #[derive(Debug, Clone)]

+ 1 - 0
crates/cdk-redb/src/wallet/mod.rs

@@ -68,6 +68,7 @@ impl WalletRedbDatabase {
             match db_version {
                 Some(db_version) => {
                     let mut current_file_version = u32::from_str(&db_version)?;
+                    tracing::info!("Current file version {}", current_file_version);
 
                     match current_file_version.cmp(&DATABASE_VERSION) {
                         Ordering::Less => {

+ 1 - 1
crates/cdk-sqlite/src/mint/migrations/20240618195700_quote_state.sql

@@ -1,4 +1,4 @@
-ALTER TABLE melt_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID' ) ) NOT NULL;
+ALTER TABLE melt_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID' ) ) NOT NULL DEFAULT 'UNPAID';
 ALTER TABLE melt_quote ADD payment_preimage TEXT;
 ALTER TABLE melt_quote DROP COLUMN paid;
 CREATE INDEX IF NOT EXISTS melt_quote_state_index ON melt_quote(state);

+ 1 - 1
crates/cdk-sqlite/src/mint/migrations/20240626092101_nut04_state.sql

@@ -1,3 +1,3 @@
-ALTER TABLE mint_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID', 'ISSUED' ) ) NOT NULL;
+ALTER TABLE mint_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID', 'ISSUED' ) ) NOT NULL DEFAULT 'UNPAID';
 ALTER TABLE mint_quote DROP COLUMN paid;
 CREATE INDEX IF NOT EXISTS mint_quote_state_index ON mint_quote(state);

+ 1 - 1
crates/cdk-sqlite/src/mint/mod.rs

@@ -486,7 +486,7 @@ AND state="SPENT";
             sqlx::query(
                 r#"
 INSERT OR REPLACE INTO proof
-(y, amount, keyset_id, secret, c, witness, spent, pending)
+(y, amount, keyset_id, secret, c, witness, state)
 VALUES (?, ?, ?, ?, ?, ?, ?);
         "#,
             )

+ 1 - 1
crates/cdk-sqlite/src/wallet/migrations/20240618200350_quote_state.sql

@@ -1,4 +1,4 @@
-ALTER TABLE melt_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID' ) ) NOT NULL;
+ALTER TABLE melt_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID' ) ) NOT NULL DEFAULT 'UNPAID';
 ALTER TABLE melt_quote ADD payment_preimage TEXT;
 ALTER TABLE melt_quote DROP COLUMN paid;
 CREATE INDEX IF NOT EXISTS melt_quote_state_index ON melt_quote(state);

+ 1 - 1
crates/cdk-sqlite/src/wallet/migrations/20240626091921_nut04_state.sql

@@ -1,3 +1,3 @@
-ALTER TABLE mint_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID', 'ISSUED' ) ) NOT NULL;
+ALTER TABLE mint_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID', 'ISSUED' ) ) NOT NULL DEFAULT 'UNPAID';
 ALTER TABLE mint_quote DROP COLUMN paid;
 CREATE INDEX IF NOT EXISTS mint_quote_state_index ON mint_quote(state);

+ 13 - 5
crates/cdk/src/mint/mod.rs

@@ -592,10 +592,6 @@ impl Mint {
             self.verify_proof(proof).await?;
         }
 
-        self.localstore
-            .add_pending_proofs(melt_request.inputs.clone())
-            .await?;
-
         let state = self
             .localstore
             .update_melt_quote_state(&melt_request.quote, MeltQuoteState::Pending)
@@ -694,17 +690,29 @@ impl Mint {
             return Err(Error::DuplicateProofs);
         }
 
+        // Add proofs to pending
+        self.localstore
+            .add_pending_proofs(melt_request.inputs.clone())
+            .await?;
+
+        tracing::debug!("Verified melt quote: {}", melt_request.quote);
         Ok(quote)
     }
 
     /// Process melt request marking [`Proofs`] as spent
+    /// The melt request must be verifyed using [`Self::verify_melt_request`] before calling [`Self::process_melt_request`]
     pub async fn process_melt_request(
         &self,
         melt_request: &MeltBolt11Request,
         preimage: &str,
         total_spent: Amount,
     ) -> Result<MeltQuoteBolt11Response, Error> {
-        let quote = self.verify_melt_request(melt_request).await?;
+        tracing::debug!("Processing melt quote: {}", melt_request.quote);
+        let quote = self
+            .localstore
+            .get_melt_quote(&melt_request.quote)
+            .await?
+            .ok_or(Error::UnknownQuote)?;
 
         if let Some(outputs) = &melt_request.outputs {
             for blinded_message in outputs {