浏览代码

Share the kv-store with the wallet and the mint

Cesar Rodas 1 月之前
父节点
当前提交
066b147f8e

+ 185 - 0
crates/cdk-common/src/database/error.rs

@@ -0,0 +1,185 @@
+//! Database errors
+//!
+/// Data conversion error
+#[derive(thiserror::Error, Debug)]
+pub enum ConversionError {
+    /// Missing columns
+    #[error("Not enough elements: expected {0}, got {1}")]
+    MissingColumn(usize, usize),
+
+    /// Missing parameter
+    #[error("Missing parameter {0}")]
+    MissingParameter(String),
+
+    /// Invalid db type
+    #[error("Invalid type from db, expected {0} got {1}")]
+    InvalidType(String, String),
+
+    /// Invalid data conversion in column
+    #[error("Error converting {1}, expecting type {0}")]
+    InvalidConversion(String, String),
+
+    /// Mint Url Error
+    #[error(transparent)]
+    MintUrl(#[from] crate::mint_url::Error),
+
+    /// NUT00 Error
+    #[error(transparent)]
+    CDKNUT00(#[from] crate::nuts::nut00::Error),
+
+    /// NUT01 Error
+    #[error(transparent)]
+    CDKNUT01(#[from] crate::nuts::nut01::Error),
+
+    /// NUT02 Error
+    #[error(transparent)]
+    CDKNUT02(#[from] crate::nuts::nut02::Error),
+
+    /// NUT04 Error
+    #[error(transparent)]
+    CDKNUT04(#[from] crate::nuts::nut04::Error),
+
+    /// NUT05 Error
+    #[error(transparent)]
+    CDKNUT05(#[from] crate::nuts::nut05::Error),
+
+    /// NUT07 Error
+    #[error(transparent)]
+    CDKNUT07(#[from] crate::nuts::nut07::Error),
+
+    /// NUT23 Error
+    #[error(transparent)]
+    CDKNUT23(#[from] crate::nuts::nut23::Error),
+
+    /// Secret Error
+    #[error(transparent)]
+    CDKSECRET(#[from] crate::secret::Error),
+
+    /// Serde Error
+    #[error(transparent)]
+    Serde(#[from] serde_json::Error),
+
+    /// BIP32 Error
+    #[error(transparent)]
+    BIP32(#[from] bitcoin::bip32::Error),
+
+    /// Generic error
+    #[error(transparent)]
+    Generic(#[from] Box<crate::Error>),
+}
+
+impl From<crate::Error> for ConversionError {
+    fn from(err: crate::Error) -> Self {
+        ConversionError::Generic(Box::new(err))
+    }
+}
+
+/// CDK_database error
+#[derive(Debug, thiserror::Error)]
+pub enum Error {
+    /// Database Error
+    #[error(transparent)]
+    Database(Box<dyn std::error::Error + Send + Sync>),
+
+    /// Duplicate entry
+    #[error("Duplicate entry")]
+    Duplicate,
+    /// Amount overflow
+    #[error("Amount overflow")]
+    AmountOverflow,
+    /// Amount zero
+    #[error("Amount zero")]
+    AmountZero,
+
+    /// DHKE error
+    #[error(transparent)]
+    DHKE(#[from] crate::dhke::Error),
+    /// NUT00 Error
+    #[error(transparent)]
+    NUT00(#[from] crate::nuts::nut00::Error),
+    /// NUT01 Error
+    #[error(transparent)]
+    NUT01(#[from] crate::nuts::nut01::Error),
+    /// NUT02 Error
+    #[error(transparent)]
+    NUT02(#[from] crate::nuts::nut02::Error),
+    /// NUT22 Error
+    #[error(transparent)]
+    #[cfg(feature = "auth")]
+    NUT22(#[from] crate::nuts::nut22::Error),
+    /// NUT04 Error
+    #[error(transparent)]
+    NUT04(#[from] crate::nuts::nut04::Error),
+    /// Quote ID Error
+    #[error(transparent)]
+    #[cfg(feature = "mint")]
+    QuoteId(#[from] crate::quote_id::QuoteIdError),
+    /// Serde Error
+    #[error(transparent)]
+    Serde(#[from] serde_json::Error),
+    /// Unknown Quote
+    #[error("Unknown Quote")]
+    UnknownQuote,
+    /// Attempt to remove spent proof
+    #[error("Attempt to remove spent proof")]
+    AttemptRemoveSpentProof,
+    /// Attempt to update state of spent proof
+    #[error("Attempt to update state of spent proof")]
+    AttemptUpdateSpentProof,
+    /// Proof not found
+    #[error("Proof not found")]
+    ProofNotFound,
+    /// Invalid keyset
+    #[error("Unknown or invalid keyset")]
+    InvalidKeysetId,
+    #[cfg(feature = "mint")]
+    /// Invalid state transition
+    #[error("Invalid state transition")]
+    InvalidStateTransition(crate::state::Error),
+
+    /// Invalid connection settings
+    #[error("Invalid credentials {0}")]
+    InvalidConnectionSettings(String),
+
+    /// Unexpected database response
+    #[error("Invalid database response")]
+    InvalidDbResponse,
+
+    /// Internal error
+    #[error("Internal {0}")]
+    Internal(String),
+
+    /// Data conversion error
+    #[error(transparent)]
+    Conversion(#[from] ConversionError),
+
+    /// Missing Placeholder value
+    #[error("Missing placeholder value {0}")]
+    MissingPlaceholder(String),
+
+    /// Unknown quote ttl
+    #[error("Unknown quote ttl")]
+    UnknownQuoteTTL,
+
+    /// Invalid UUID
+    #[error("Invalid UUID: {0}")]
+    InvalidUuid(String),
+
+    /// QuoteNotFound
+    #[error("Quote not found")]
+    QuoteNotFound,
+
+    /// KV Store invalid key or namespace
+    #[error("Invalid KV store key or namespace: {0}")]
+    KVStoreInvalidKey(String),
+}
+
+#[cfg(feature = "mint")]
+impl From<crate::state::Error> for Error {
+    fn from(state: crate::state::Error) -> Self {
+        match state {
+            crate::state::Error::AlreadySpent => Error::AttemptUpdateSpentProof,
+            _ => Error::InvalidStateTransition(state),
+        }
+    }
+}

+ 132 - 0
crates/cdk-common/src/database/key_value.rs

@@ -0,0 +1,132 @@
+//! Key Value generic traits and helper functions
+//!
+//! This generic key-value store is shared between the wallet and the mint
+
+use super::{DbTransactionFinalizer, Error};
+
+/// Valid ASCII characters for namespace and key strings in KV store
+pub const KVSTORE_NAMESPACE_KEY_ALPHABET: &str =
+    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-";
+
+/// Maximum length for namespace and key strings in KV store
+pub const KVSTORE_NAMESPACE_KEY_MAX_LEN: usize = 120;
+
+/// Validates that a string contains only valid KV store characters and is within length limits
+pub fn validate_kvstore_string(s: &str) -> Result<(), Error> {
+    if s.len() > KVSTORE_NAMESPACE_KEY_MAX_LEN {
+        return Err(Error::KVStoreInvalidKey(format!(
+            "{} exceeds maximum length of key characters",
+            KVSTORE_NAMESPACE_KEY_MAX_LEN
+        )));
+    }
+
+    if !s
+        .chars()
+        .all(|c| KVSTORE_NAMESPACE_KEY_ALPHABET.contains(c))
+    {
+        return Err(Error::KVStoreInvalidKey("key contains invalid characters. Only ASCII letters, numbers, underscore, and hyphen are allowed".to_string()));
+    }
+
+    Ok(())
+}
+
+/// Validates namespace and key parameters for KV store operations
+pub fn validate_kvstore_params(
+    primary_namespace: &str,
+    secondary_namespace: &str,
+    key: &str,
+) -> Result<(), Error> {
+    // Validate primary namespace
+    validate_kvstore_string(primary_namespace)?;
+
+    // Validate secondary namespace
+    validate_kvstore_string(secondary_namespace)?;
+
+    // Validate key
+    validate_kvstore_string(key)?;
+
+    // Check empty namespace rules
+    if primary_namespace.is_empty() && !secondary_namespace.is_empty() {
+        return Err(Error::KVStoreInvalidKey(
+            "If primary_namespace is empty, secondary_namespace must also be empty".to_string(),
+        ));
+    }
+
+    // Check for potential collisions between keys and namespaces in the same namespace
+    let namespace_key = format!("{}/{}", primary_namespace, secondary_namespace);
+    if key == primary_namespace || key == secondary_namespace || key == namespace_key {
+        return Err(Error::KVStoreInvalidKey(format!(
+            "Key '{}' conflicts with namespace names",
+            key
+        )));
+    }
+
+    Ok(())
+}
+
+/// Key-Value Store Transaction trait
+#[async_trait::async_trait]
+pub trait KVStoreTransaction<'a, Error>: DbTransactionFinalizer<Err = Error> {
+    /// Read value from key-value store
+    async fn kv_read(
+        &mut self,
+        primary_namespace: &str,
+        secondary_namespace: &str,
+        key: &str,
+    ) -> Result<Option<Vec<u8>>, Error>;
+
+    /// Write value to key-value store
+    async fn kv_write(
+        &mut self,
+        primary_namespace: &str,
+        secondary_namespace: &str,
+        key: &str,
+        value: &[u8],
+    ) -> Result<(), Error>;
+
+    /// Remove value from key-value store
+    async fn kv_remove(
+        &mut self,
+        primary_namespace: &str,
+        secondary_namespace: &str,
+        key: &str,
+    ) -> Result<(), Error>;
+
+    /// List keys in a namespace
+    async fn kv_list(
+        &mut self,
+        primary_namespace: &str,
+        secondary_namespace: &str,
+    ) -> Result<Vec<String>, Error>;
+}
+
+/// Key-Value Store Database trait
+#[async_trait::async_trait]
+pub trait KVStoreDatabase {
+    /// KV Store Database Error
+    type Err: Into<Error> + From<Error>;
+
+    /// Read value from key-value store
+    async fn kv_read(
+        &self,
+        primary_namespace: &str,
+        secondary_namespace: &str,
+        key: &str,
+    ) -> Result<Option<Vec<u8>>, Self::Err>;
+
+    /// List keys in a namespace
+    async fn kv_list(
+        &self,
+        primary_namespace: &str,
+        secondary_namespace: &str,
+    ) -> Result<Vec<String>, Self::Err>;
+}
+
+/// Key-Value Store Database trait
+#[async_trait::async_trait]
+pub trait KVStore: KVStoreDatabase {
+    /// Beings a KV transaction
+    async fn begin_transaction<'a>(
+        &'a self,
+    ) -> Result<Box<dyn KVStoreTransaction<'a, Self::Err> + Send + Sync + 'a>, Error>;
+}

+ 2 - 143
crates/cdk-common/src/database/mint/mod.rs

@@ -1,72 +1,11 @@
 //! CDK Database
 //! CDK Database
 
 
-use std::collections::HashMap;
-
-/// Valid ASCII characters for namespace and key strings in KV store
-pub const KVSTORE_NAMESPACE_KEY_ALPHABET: &str =
-    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-";
-
-/// Maximum length for namespace and key strings in KV store
-pub const KVSTORE_NAMESPACE_KEY_MAX_LEN: usize = 120;
-
-/// Validates that a string contains only valid KV store characters and is within length limits
-pub fn validate_kvstore_string(s: &str) -> Result<(), Error> {
-    if s.len() > KVSTORE_NAMESPACE_KEY_MAX_LEN {
-        return Err(Error::KVStoreInvalidKey(format!(
-            "{} exceeds maximum length of key characters",
-            KVSTORE_NAMESPACE_KEY_MAX_LEN
-        )));
-    }
-
-    if !s
-        .chars()
-        .all(|c| KVSTORE_NAMESPACE_KEY_ALPHABET.contains(c))
-    {
-        return Err(Error::KVStoreInvalidKey("key contains invalid characters. Only ASCII letters, numbers, underscore, and hyphen are allowed".to_string()));
-    }
-
-    Ok(())
-}
-
-/// Validates namespace and key parameters for KV store operations
-pub fn validate_kvstore_params(
-    primary_namespace: &str,
-    secondary_namespace: &str,
-    key: &str,
-) -> Result<(), Error> {
-    // Validate primary namespace
-    validate_kvstore_string(primary_namespace)?;
-
-    // Validate secondary namespace
-    validate_kvstore_string(secondary_namespace)?;
-
-    // Validate key
-    validate_kvstore_string(key)?;
-
-    // Check empty namespace rules
-    if primary_namespace.is_empty() && !secondary_namespace.is_empty() {
-        return Err(Error::KVStoreInvalidKey(
-            "If primary_namespace is empty, secondary_namespace must also be empty".to_string(),
-        ));
-    }
-
-    // Check for potential collisions between keys and namespaces in the same namespace
-    let namespace_key = format!("{}/{}", primary_namespace, secondary_namespace);
-    if key == primary_namespace || key == secondary_namespace || key == namespace_key {
-        return Err(Error::KVStoreInvalidKey(format!(
-            "Key '{}' conflicts with namespace names",
-            key
-        )));
-    }
-
-    Ok(())
-}
-
 use async_trait::async_trait;
 use async_trait::async_trait;
 use cashu::quote_id::QuoteId;
 use cashu::quote_id::QuoteId;
 use cashu::{Amount, MintInfo};
 use cashu::{Amount, MintInfo};
+use std::collections::HashMap;
 
 
-use super::Error;
+use super::{DbTransactionFinalizer, Error, KVStoreDatabase, KVStoreTransaction};
 use crate::common::QuoteTTL;
 use crate::common::QuoteTTL;
 use crate::mint::{self, MintKeySetInfo, MintQuote as MintMintQuote};
 use crate::mint::{self, MintKeySetInfo, MintQuote as MintMintQuote};
 use crate::nuts::{
 use crate::nuts::{
@@ -310,55 +249,6 @@ pub trait SignaturesDatabase {
     ) -> Result<Vec<BlindSignature>, Self::Err>;
     ) -> Result<Vec<BlindSignature>, Self::Err>;
 }
 }
 
 
-#[async_trait]
-/// Commit and Rollback
-pub trait DbTransactionFinalizer {
-    /// Mint Signature Database Error
-    type Err: Into<Error> + From<Error>;
-
-    /// Commits all the changes into the database
-    async fn commit(self: Box<Self>) -> Result<(), Self::Err>;
-
-    /// Rollbacks the write transaction
-    async fn rollback(self: Box<Self>) -> Result<(), Self::Err>;
-}
-
-/// Key-Value Store Transaction trait
-#[async_trait]
-pub trait KVStoreTransaction<'a, Error>: DbTransactionFinalizer<Err = Error> {
-    /// Read value from key-value store
-    async fn kv_read(
-        &mut self,
-        primary_namespace: &str,
-        secondary_namespace: &str,
-        key: &str,
-    ) -> Result<Option<Vec<u8>>, Error>;
-
-    /// Write value to key-value store
-    async fn kv_write(
-        &mut self,
-        primary_namespace: &str,
-        secondary_namespace: &str,
-        key: &str,
-        value: &[u8],
-    ) -> Result<(), Error>;
-
-    /// Remove value from key-value store
-    async fn kv_remove(
-        &mut self,
-        primary_namespace: &str,
-        secondary_namespace: &str,
-        key: &str,
-    ) -> Result<(), Error>;
-
-    /// List keys in a namespace
-    async fn kv_list(
-        &mut self,
-        primary_namespace: &str,
-        secondary_namespace: &str,
-    ) -> Result<Vec<String>, Error>;
-}
-
 /// Base database writer
 /// Base database writer
 #[async_trait]
 #[async_trait]
 pub trait Transaction<'a, Error>:
 pub trait Transaction<'a, Error>:
@@ -375,37 +265,6 @@ pub trait Transaction<'a, Error>:
     async fn set_mint_info(&mut self, mint_info: MintInfo) -> Result<(), Error>;
     async fn set_mint_info(&mut self, mint_info: MintInfo) -> Result<(), Error>;
 }
 }
 
 
-/// Key-Value Store Database trait
-#[async_trait]
-pub trait KVStoreDatabase {
-    /// KV Store Database Error
-    type Err: Into<Error> + From<Error>;
-
-    /// Read value from key-value store
-    async fn kv_read(
-        &self,
-        primary_namespace: &str,
-        secondary_namespace: &str,
-        key: &str,
-    ) -> Result<Option<Vec<u8>>, Self::Err>;
-
-    /// List keys in a namespace
-    async fn kv_list(
-        &self,
-        primary_namespace: &str,
-        secondary_namespace: &str,
-    ) -> Result<Vec<String>, Self::Err>;
-}
-
-/// Key-Value Store Database trait
-#[async_trait]
-pub trait KVStore: KVStoreDatabase {
-    /// Beings a KV transaction
-    async fn begin_transaction<'a>(
-        &'a self,
-    ) -> Result<Box<dyn KVStoreTransaction<'a, Self::Err> + Send + Sync + 'a>, Error>;
-}
-
 /// Mint Database trait
 /// Mint Database trait
 #[async_trait]
 #[async_trait]
 pub trait Database<Error>:
 pub trait Database<Error>:

+ 1 - 1
crates/cdk-common/src/database/mint/test/kvstore.rs

@@ -2,7 +2,7 @@
 
 
 #[cfg(test)]
 #[cfg(test)]
 mod tests {
 mod tests {
-    use crate::database::mint::{
+    use crate::database::{
         validate_kvstore_params, validate_kvstore_string, KVSTORE_NAMESPACE_KEY_ALPHABET,
         validate_kvstore_params, validate_kvstore_string, KVSTORE_NAMESPACE_KEY_ALPHABET,
         KVSTORE_NAMESPACE_KEY_MAX_LEN,
         KVSTORE_NAMESPACE_KEY_MAX_LEN,
     };
     };

+ 1 - 2
crates/cdk-common/src/database/mint/test/mod.rs

@@ -12,7 +12,6 @@ use cashu::secret::Secret;
 use cashu::{Amount, CurrencyUnit, SecretKey};
 use cashu::{Amount, CurrencyUnit, SecretKey};
 
 
 use super::*;
 use super::*;
-use crate::database::MintKVStoreDatabase;
 use crate::mint::MintKeySetInfo;
 use crate::mint::MintKeySetInfo;
 
 
 mod kvstore;
 mod kvstore;
@@ -93,7 +92,7 @@ where
 /// Test KV store functionality including write, read, list, update, and remove operations
 /// Test KV store functionality including write, read, list, update, and remove operations
 pub async fn kvstore_functionality<DB>(db: DB)
 pub async fn kvstore_functionality<DB>(db: DB)
 where
 where
-    DB: Database<crate::database::Error> + MintKVStoreDatabase<Err = crate::database::Error>,
+    DB: Database<crate::database::Error> + KVStoreDatabase<Err = crate::database::Error>,
 {
 {
     // Test basic read/write operations in transaction
     // Test basic read/write operations in transaction
     {
     {

+ 12 - 187
crates/cdk-common/src/database/mod.rs

@@ -5,201 +5,26 @@ pub mod mint;
 #[cfg(feature = "wallet")]
 #[cfg(feature = "wallet")]
 mod wallet;
 mod wallet;
 
 
+mod error;
+mod key_value;
+mod transaction;
+
+pub use self::{
+    error::{ConversionError, Error},
+    key_value::*,
+    transaction::DbTransactionFinalizer,
+};
+
 #[cfg(feature = "mint")]
 #[cfg(feature = "mint")]
 pub use mint::{
 pub use mint::{
-    Database as MintDatabase, DbTransactionFinalizer as MintDbWriterFinalizer,
-    KVStore as MintKVStore, KVStoreDatabase as MintKVStoreDatabase,
-    KVStoreTransaction as MintKVStoreTransaction, KeysDatabase as MintKeysDatabase,
+    Database as MintDatabase, KeysDatabase as MintKeysDatabase,
     KeysDatabaseTransaction as MintKeyDatabaseTransaction, ProofsDatabase as MintProofsDatabase,
     KeysDatabaseTransaction as MintKeyDatabaseTransaction, ProofsDatabase as MintProofsDatabase,
     ProofsTransaction as MintProofsTransaction, QuotesDatabase as MintQuotesDatabase,
     ProofsTransaction as MintProofsTransaction, QuotesDatabase as MintQuotesDatabase,
     QuotesTransaction as MintQuotesTransaction, SignaturesDatabase as MintSignaturesDatabase,
     QuotesTransaction as MintQuotesTransaction, SignaturesDatabase as MintSignaturesDatabase,
     SignaturesTransaction as MintSignatureTransaction, Transaction as MintTransaction,
     SignaturesTransaction as MintSignatureTransaction, Transaction as MintTransaction,
 };
 };
+
 #[cfg(all(feature = "mint", feature = "auth"))]
 #[cfg(all(feature = "mint", feature = "auth"))]
 pub use mint::{MintAuthDatabase, MintAuthTransaction};
 pub use mint::{MintAuthDatabase, MintAuthTransaction};
 #[cfg(feature = "wallet")]
 #[cfg(feature = "wallet")]
 pub use wallet::Database as WalletDatabase;
 pub use wallet::Database as WalletDatabase;
-
-/// Data conversion error
-#[derive(thiserror::Error, Debug)]
-pub enum ConversionError {
-    /// Missing columns
-    #[error("Not enough elements: expected {0}, got {1}")]
-    MissingColumn(usize, usize),
-
-    /// Missing parameter
-    #[error("Missing parameter {0}")]
-    MissingParameter(String),
-
-    /// Invalid db type
-    #[error("Invalid type from db, expected {0} got {1}")]
-    InvalidType(String, String),
-
-    /// Invalid data conversion in column
-    #[error("Error converting {1}, expecting type {0}")]
-    InvalidConversion(String, String),
-
-    /// Mint Url Error
-    #[error(transparent)]
-    MintUrl(#[from] crate::mint_url::Error),
-
-    /// NUT00 Error
-    #[error(transparent)]
-    CDKNUT00(#[from] crate::nuts::nut00::Error),
-
-    /// NUT01 Error
-    #[error(transparent)]
-    CDKNUT01(#[from] crate::nuts::nut01::Error),
-
-    /// NUT02 Error
-    #[error(transparent)]
-    CDKNUT02(#[from] crate::nuts::nut02::Error),
-
-    /// NUT04 Error
-    #[error(transparent)]
-    CDKNUT04(#[from] crate::nuts::nut04::Error),
-
-    /// NUT05 Error
-    #[error(transparent)]
-    CDKNUT05(#[from] crate::nuts::nut05::Error),
-
-    /// NUT07 Error
-    #[error(transparent)]
-    CDKNUT07(#[from] crate::nuts::nut07::Error),
-
-    /// NUT23 Error
-    #[error(transparent)]
-    CDKNUT23(#[from] crate::nuts::nut23::Error),
-
-    /// Secret Error
-    #[error(transparent)]
-    CDKSECRET(#[from] crate::secret::Error),
-
-    /// Serde Error
-    #[error(transparent)]
-    Serde(#[from] serde_json::Error),
-
-    /// BIP32 Error
-    #[error(transparent)]
-    BIP32(#[from] bitcoin::bip32::Error),
-
-    /// Generic error
-    #[error(transparent)]
-    Generic(#[from] Box<crate::Error>),
-}
-
-impl From<crate::Error> for ConversionError {
-    fn from(err: crate::Error) -> Self {
-        ConversionError::Generic(Box::new(err))
-    }
-}
-
-/// CDK_database error
-#[derive(Debug, thiserror::Error)]
-pub enum Error {
-    /// Database Error
-    #[error(transparent)]
-    Database(Box<dyn std::error::Error + Send + Sync>),
-
-    /// Duplicate entry
-    #[error("Duplicate entry")]
-    Duplicate,
-    /// Amount overflow
-    #[error("Amount overflow")]
-    AmountOverflow,
-    /// Amount zero
-    #[error("Amount zero")]
-    AmountZero,
-
-    /// DHKE error
-    #[error(transparent)]
-    DHKE(#[from] crate::dhke::Error),
-    /// NUT00 Error
-    #[error(transparent)]
-    NUT00(#[from] crate::nuts::nut00::Error),
-    /// NUT01 Error
-    #[error(transparent)]
-    NUT01(#[from] crate::nuts::nut01::Error),
-    /// NUT02 Error
-    #[error(transparent)]
-    NUT02(#[from] crate::nuts::nut02::Error),
-    /// NUT22 Error
-    #[error(transparent)]
-    #[cfg(feature = "auth")]
-    NUT22(#[from] crate::nuts::nut22::Error),
-    /// NUT04 Error
-    #[error(transparent)]
-    NUT04(#[from] crate::nuts::nut04::Error),
-    /// Quote ID Error
-    #[error(transparent)]
-    #[cfg(feature = "mint")]
-    QuoteId(#[from] crate::quote_id::QuoteIdError),
-    /// Serde Error
-    #[error(transparent)]
-    Serde(#[from] serde_json::Error),
-    /// Unknown Quote
-    #[error("Unknown Quote")]
-    UnknownQuote,
-    /// Attempt to remove spent proof
-    #[error("Attempt to remove spent proof")]
-    AttemptRemoveSpentProof,
-    /// Attempt to update state of spent proof
-    #[error("Attempt to update state of spent proof")]
-    AttemptUpdateSpentProof,
-    /// Proof not found
-    #[error("Proof not found")]
-    ProofNotFound,
-    /// Invalid keyset
-    #[error("Unknown or invalid keyset")]
-    InvalidKeysetId,
-    #[cfg(feature = "mint")]
-    /// Invalid state transition
-    #[error("Invalid state transition")]
-    InvalidStateTransition(crate::state::Error),
-
-    /// Invalid connection settings
-    #[error("Invalid credentials {0}")]
-    InvalidConnectionSettings(String),
-
-    /// Unexpected database response
-    #[error("Invalid database response")]
-    InvalidDbResponse,
-
-    /// Internal error
-    #[error("Internal {0}")]
-    Internal(String),
-
-    /// Data conversion error
-    #[error(transparent)]
-    Conversion(#[from] ConversionError),
-
-    /// Missing Placeholder value
-    #[error("Missing placeholder value {0}")]
-    MissingPlaceholder(String),
-
-    /// Unknown quote ttl
-    #[error("Unknown quote ttl")]
-    UnknownQuoteTTL,
-
-    /// Invalid UUID
-    #[error("Invalid UUID: {0}")]
-    InvalidUuid(String),
-
-    /// QuoteNotFound
-    #[error("Quote not found")]
-    QuoteNotFound,
-
-    /// KV Store invalid key or namespace
-    #[error("Invalid KV store key or namespace: {0}")]
-    KVStoreInvalidKey(String),
-}
-
-#[cfg(feature = "mint")]
-impl From<crate::state::Error> for Error {
-    fn from(state: crate::state::Error) -> Self {
-        match state {
-            crate::state::Error::AlreadySpent => Error::AttemptUpdateSpentProof,
-            _ => Error::InvalidStateTransition(state),
-        }
-    }
-}

+ 16 - 0
crates/cdk-common/src/database/transaction.rs

@@ -0,0 +1,16 @@
+//! Transaction common common trait
+
+use super::Error;
+
+#[async_trait::async_trait]
+/// Commit and Rollback
+pub trait DbTransactionFinalizer {
+    /// Mint Signature Database Error
+    type Err: Into<Error> + From<Error>;
+
+    /// Commits all the changes into the database
+    async fn commit(self: Box<Self>) -> Result<(), Self::Err>;
+
+    /// Rollbacks the write transaction
+    async fn rollback(self: Box<Self>) -> Result<(), Self::Err>;
+}

+ 11 - 11
crates/cdk-sql-common/src/mint/mod.rs

@@ -16,9 +16,9 @@ use std::sync::Arc;
 use async_trait::async_trait;
 use async_trait::async_trait;
 use bitcoin::bip32::DerivationPath;
 use bitcoin::bip32::DerivationPath;
 use cdk_common::common::QuoteTTL;
 use cdk_common::common::QuoteTTL;
-use cdk_common::database::mint::validate_kvstore_params;
+use cdk_common::database::validate_kvstore_params;
 use cdk_common::database::{
 use cdk_common::database::{
-    self, ConversionError, Error, MintDatabase, MintDbWriterFinalizer, MintKeyDatabaseTransaction,
+    self, ConversionError, DbTransactionFinalizer, Error, MintDatabase, MintKeyDatabaseTransaction,
     MintKeysDatabase, MintProofsDatabase, MintQuotesDatabase, MintQuotesTransaction,
     MintKeysDatabase, MintProofsDatabase, MintQuotesDatabase, MintQuotesTransaction,
     MintSignatureTransaction, MintSignaturesDatabase,
     MintSignatureTransaction, MintSignaturesDatabase,
 };
 };
@@ -294,7 +294,7 @@ where
 }
 }
 
 
 #[async_trait]
 #[async_trait]
-impl<RM> MintDbWriterFinalizer for SQLTransaction<RM>
+impl<RM> DbTransactionFinalizer for SQLTransaction<RM>
 where
 where
     RM: DatabasePool + 'static,
     RM: DatabasePool + 'static,
 {
 {
@@ -1668,7 +1668,7 @@ where
 }
 }
 
 
 #[async_trait]
 #[async_trait]
-impl<RM> database::MintKVStoreTransaction<'_, Error> for SQLTransaction<RM>
+impl<RM> database::KVStoreTransaction<'_, Error> for SQLTransaction<RM>
 where
 where
     RM: DatabasePool + 'static,
     RM: DatabasePool + 'static,
 {
 {
@@ -1766,8 +1766,8 @@ where
         secondary_namespace: &str,
         secondary_namespace: &str,
     ) -> Result<Vec<String>, Error> {
     ) -> Result<Vec<String>, Error> {
         // Validate namespace parameters according to KV store requirements
         // Validate namespace parameters according to KV store requirements
-        cdk_common::database::mint::validate_kvstore_string(primary_namespace)?;
-        cdk_common::database::mint::validate_kvstore_string(secondary_namespace)?;
+        cdk_common::database::validate_kvstore_string(primary_namespace)?;
+        cdk_common::database::validate_kvstore_string(secondary_namespace)?;
 
 
         // Check empty namespace rules
         // Check empty namespace rules
         if primary_namespace.is_empty() && !secondary_namespace.is_empty() {
         if primary_namespace.is_empty() && !secondary_namespace.is_empty() {
@@ -1795,7 +1795,7 @@ where
 }
 }
 
 
 #[async_trait]
 #[async_trait]
-impl<RM> database::MintKVStoreDatabase for SQLMintDatabase<RM>
+impl<RM> database::KVStoreDatabase for SQLMintDatabase<RM>
 where
 where
     RM: DatabasePool + 'static,
     RM: DatabasePool + 'static,
 {
 {
@@ -1837,8 +1837,8 @@ where
         secondary_namespace: &str,
         secondary_namespace: &str,
     ) -> Result<Vec<String>, Error> {
     ) -> Result<Vec<String>, Error> {
         // Validate namespace parameters according to KV store requirements
         // Validate namespace parameters according to KV store requirements
-        cdk_common::database::mint::validate_kvstore_string(primary_namespace)?;
-        cdk_common::database::mint::validate_kvstore_string(secondary_namespace)?;
+        cdk_common::database::validate_kvstore_string(primary_namespace)?;
+        cdk_common::database::validate_kvstore_string(secondary_namespace)?;
 
 
         // Check empty namespace rules
         // Check empty namespace rules
         if primary_namespace.is_empty() && !secondary_namespace.is_empty() {
         if primary_namespace.is_empty() && !secondary_namespace.is_empty() {
@@ -1868,13 +1868,13 @@ where
 }
 }
 
 
 #[async_trait]
 #[async_trait]
-impl<RM> database::MintKVStore for SQLMintDatabase<RM>
+impl<RM> database::KVStore for SQLMintDatabase<RM>
 where
 where
     RM: DatabasePool + 'static,
     RM: DatabasePool + 'static,
 {
 {
     async fn begin_transaction<'a>(
     async fn begin_transaction<'a>(
         &'a self,
         &'a self,
-    ) -> Result<Box<dyn database::MintKVStoreTransaction<'a, Self::Err> + Send + Sync + 'a>, Error>
+    ) -> Result<Box<dyn database::KVStoreTransaction<'a, Self::Err> + Send + Sync + 'a>, Error>
     {
     {
         Ok(Box::new(SQLTransaction {
         Ok(Box::new(SQLTransaction {
             inner: ConnectionWithTransaction::new(
             inner: ConnectionWithTransaction::new(