Browse Source

fix(wallet): stop sqlite from overwritting keyset counter

thesimplekid 4 months ago
parent
commit
bc490ed208
3 changed files with 27 additions and 10 deletions
  1. 4 2
      crates/cdk-cli/src/main.rs
  2. 17 8
      crates/cdk-sqlite/src/wallet/mod.rs
  3. 6 0
      crates/cdk/src/wallet/mint.rs

+ 4 - 2
crates/cdk-cli/src/main.rs

@@ -85,7 +85,7 @@ async fn main() -> Result<()> {
     let args: Cli = Cli::parse();
     let default_filter = args.log_level;
 
-    let sqlx_filter = "sqlx=warn";
+    let sqlx_filter = "sqlx=warn,hyper_util=warn,reqwest=warn";
 
     let env_filter = EnvFilter::new(format!("{},{}", default_filter, sqlx_filter));
 
@@ -132,7 +132,9 @@ async fn main() -> Result<()> {
             let random_bytes: [u8; 32] = rng.gen();
 
             let mnemonic = Mnemonic::from_entropy(&random_bytes)?;
-            tracing::info!("Using randomly generated seed you will not be able to restore");
+            tracing::info!("Creating new seed");
+
+            fs::write(seed_path, mnemonic.to_string())?;
 
             mnemonic
         }

+ 17 - 8
crates/cdk-sqlite/src/wallet/mod.rs

@@ -260,10 +260,15 @@ FROM mint
         for keyset in keysets {
             sqlx::query(
                 r#"
-INSERT OR REPLACE INTO keyset
-(mint_url, id, unit, active, input_fee_ppk)
-VALUES (?, ?, ?, ?, ?);
-        "#,
+    INSERT INTO keyset
+    (mint_url, id, unit, active, input_fee_ppk)
+    VALUES (?, ?, ?, ?, ?)
+    ON CONFLICT(id) DO UPDATE SET
+        mint_url = excluded.mint_url,
+        unit = excluded.unit,
+        active = excluded.active,
+        input_fee_ppk = excluded.input_fee_ppk;
+    "#,
             )
             .bind(mint_url.to_string())
             .bind(keyset.id.to_string())
@@ -675,19 +680,23 @@ FROM proof;
 
     #[instrument(skip(self), fields(keyset_id = %keyset_id))]
     async fn increment_keyset_counter(&self, keyset_id: &Id, count: u32) -> Result<(), Self::Err> {
+        let mut transaction = self.pool.begin().await.map_err(Error::from)?;
+
         sqlx::query(
             r#"
 UPDATE keyset
-SET counter = counter + ?
-WHERE id IS ?;
+SET counter=counter+?
+WHERE id=?;
         "#,
         )
-        .bind(count)
+        .bind(count as i64)
         .bind(keyset_id.to_string())
-        .execute(&self.pool)
+        .execute(&mut transaction)
         .await
         .map_err(Error::from)?;
 
+        transaction.commit().await.map_err(Error::from)?;
+
         Ok(())
     }
 

+ 6 - 0
crates/cdk/src/wallet/mint.rs

@@ -256,6 +256,12 @@ impl Wallet {
         self.localstore.remove_mint_quote(&quote_info.id).await?;
 
         if spending_conditions.is_none() {
+            tracing::debug!(
+                "Incrementing keyset {} counter by {}",
+                active_keyset_id,
+                proofs.len()
+            );
+
             // Update counter for keyset
             self.localstore
                 .increment_keyset_counter(&active_keyset_id, proofs.len() as u32)