Parcourir la source

Share the kv-store with the wallet and the mint

Cesar Rodas il y a 1 mois
Parent
commit
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
 
-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 cashu::quote_id::QuoteId;
 use cashu::{Amount, MintInfo};
+use std::collections::HashMap;
 
-use super::Error;
+use super::{DbTransactionFinalizer, Error, KVStoreDatabase, KVStoreTransaction};
 use crate::common::QuoteTTL;
 use crate::mint::{self, MintKeySetInfo, MintQuote as MintMintQuote};
 use crate::nuts::{
@@ -310,55 +249,6 @@ pub trait SignaturesDatabase {
     ) -> 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
 #[async_trait]
 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>;
 }
 
-/// 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
 #[async_trait]
 pub trait Database<Error>:

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

@@ -2,7 +2,7 @@
 
 #[cfg(test)]
 mod tests {
-    use crate::database::mint::{
+    use crate::database::{
         validate_kvstore_params, validate_kvstore_string, KVSTORE_NAMESPACE_KEY_ALPHABET,
         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 super::*;
-use crate::database::MintKVStoreDatabase;
 use crate::mint::MintKeySetInfo;
 
 mod kvstore;
@@ -93,7 +92,7 @@ where
 /// Test KV store functionality including write, read, list, update, and remove operations
 pub async fn kvstore_functionality<DB>(db: DB)
 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
     {

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

@@ -5,201 +5,26 @@ pub mod mint;
 #[cfg(feature = "wallet")]
 mod wallet;
 
+mod error;
+mod key_value;
+mod transaction;
+
+pub use self::{
+    error::{ConversionError, Error},
+    key_value::*,
+    transaction::DbTransactionFinalizer,
+};
+
 #[cfg(feature = "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,
     ProofsTransaction as MintProofsTransaction, QuotesDatabase as MintQuotesDatabase,
     QuotesTransaction as MintQuotesTransaction, SignaturesDatabase as MintSignaturesDatabase,
     SignaturesTransaction as MintSignatureTransaction, Transaction as MintTransaction,
 };
+
 #[cfg(all(feature = "mint", feature = "auth"))]
 pub use mint::{MintAuthDatabase, MintAuthTransaction};
 #[cfg(feature = "wallet")]
 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 bitcoin::bip32::DerivationPath;
 use cdk_common::common::QuoteTTL;
-use cdk_common::database::mint::validate_kvstore_params;
+use cdk_common::database::validate_kvstore_params;
 use cdk_common::database::{
-    self, ConversionError, Error, MintDatabase, MintDbWriterFinalizer, MintKeyDatabaseTransaction,
+    self, ConversionError, DbTransactionFinalizer, Error, MintDatabase, MintKeyDatabaseTransaction,
     MintKeysDatabase, MintProofsDatabase, MintQuotesDatabase, MintQuotesTransaction,
     MintSignatureTransaction, MintSignaturesDatabase,
 };
@@ -294,7 +294,7 @@ where
 }
 
 #[async_trait]
-impl<RM> MintDbWriterFinalizer for SQLTransaction<RM>
+impl<RM> DbTransactionFinalizer for SQLTransaction<RM>
 where
     RM: DatabasePool + 'static,
 {
@@ -1668,7 +1668,7 @@ where
 }
 
 #[async_trait]
-impl<RM> database::MintKVStoreTransaction<'_, Error> for SQLTransaction<RM>
+impl<RM> database::KVStoreTransaction<'_, Error> for SQLTransaction<RM>
 where
     RM: DatabasePool + 'static,
 {
@@ -1766,8 +1766,8 @@ where
         secondary_namespace: &str,
     ) -> Result<Vec<String>, Error> {
         // 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
         if primary_namespace.is_empty() && !secondary_namespace.is_empty() {
@@ -1795,7 +1795,7 @@ where
 }
 
 #[async_trait]
-impl<RM> database::MintKVStoreDatabase for SQLMintDatabase<RM>
+impl<RM> database::KVStoreDatabase for SQLMintDatabase<RM>
 where
     RM: DatabasePool + 'static,
 {
@@ -1837,8 +1837,8 @@ where
         secondary_namespace: &str,
     ) -> Result<Vec<String>, Error> {
         // 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
         if primary_namespace.is_empty() && !secondary_namespace.is_empty() {
@@ -1868,13 +1868,13 @@ where
 }
 
 #[async_trait]
-impl<RM> database::MintKVStore for SQLMintDatabase<RM>
+impl<RM> database::KVStore for SQLMintDatabase<RM>
 where
     RM: DatabasePool + 'static,
 {
     async fn begin_transaction<'a>(
         &'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 {
             inner: ConnectionWithTransaction::new(