diff --git a/crates/cdk-redb/src/mint/mod.rs b/crates/cdk-redb/src/mint/mod.rs index e0d3a4f2..d5f1a11e 100644 --- a/crates/cdk-redb/src/mint/mod.rs +++ b/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)] diff --git a/crates/cdk-redb/src/wallet/mod.rs b/crates/cdk-redb/src/wallet/mod.rs index 47f42208..7f4b5d3a 100644 --- a/crates/cdk-redb/src/wallet/mod.rs +++ b/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 => { diff --git a/crates/cdk-sqlite/src/mint/migrations/20240618195700_quote_state.sql b/crates/cdk-sqlite/src/mint/migrations/20240618195700_quote_state.sql index ae1aa0c8..82d8d479 100644 --- a/crates/cdk-sqlite/src/mint/migrations/20240618195700_quote_state.sql +++ b/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); diff --git a/crates/cdk-sqlite/src/mint/migrations/20240626092101_nut04_state.sql b/crates/cdk-sqlite/src/mint/migrations/20240626092101_nut04_state.sql index 9aed133e..ec3918e2 100644 --- a/crates/cdk-sqlite/src/mint/migrations/20240626092101_nut04_state.sql +++ b/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); diff --git a/crates/cdk-sqlite/src/mint/mod.rs b/crates/cdk-sqlite/src/mint/mod.rs index b836938c..25b5b89f 100644 --- a/crates/cdk-sqlite/src/mint/mod.rs +++ b/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 (?, ?, ?, ?, ?, ?, ?); "#, ) diff --git a/crates/cdk-sqlite/src/wallet/migrations/20240618200350_quote_state.sql b/crates/cdk-sqlite/src/wallet/migrations/20240618200350_quote_state.sql index ae1aa0c8..82d8d479 100644 --- a/crates/cdk-sqlite/src/wallet/migrations/20240618200350_quote_state.sql +++ b/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); diff --git a/crates/cdk-sqlite/src/wallet/migrations/20240626091921_nut04_state.sql b/crates/cdk-sqlite/src/wallet/migrations/20240626091921_nut04_state.sql index 9aed133e..ec3918e2 100644 --- a/crates/cdk-sqlite/src/wallet/migrations/20240626091921_nut04_state.sql +++ b/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); diff --git a/crates/cdk/src/mint/mod.rs b/crates/cdk/src/mint/mod.rs index 940b07aa..ff164beb 100644 --- a/crates/cdk/src/mint/mod.rs +++ b/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 { - 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 {