mod kvstore;
#[cfg(feature = "mint")]
pub mod mint;
#[cfg(feature = "wallet")]
pub mod wallet;
pub use kvstore::{
validate_kvstore_params, validate_kvstore_string, KVStore, KVStoreDatabase, KVStoreTransaction,
KVSTORE_NAMESPACE_KEY_ALPHABET, KVSTORE_NAMESPACE_KEY_MAX_LEN,
};
pub type DynKVStore = std::sync::Arc<dyn KVStore<Err = Error> + Send + Sync>;
#[cfg(feature = "mint")]
pub use mint::{
Database as MintDatabase, DynMintDatabase, DynMintTransaction,
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(feature = "mint")]
pub use mint::{DynMintAuthDatabase, MintAuthDatabase, MintAuthTransaction};
#[cfg(feature = "wallet")]
pub use wallet::Database as WalletDatabase;
#[derive(thiserror::Error, Debug)]
pub enum ConversionError {
#[error("Not enough elements: expected {0}, got {1}")]
MissingColumn(usize, usize),
#[error("Missing parameter {0}")]
MissingParameter(String),
#[error("Invalid type from db, expected {0} got {1}")]
InvalidType(String, String),
#[error("Error converting {1}, expecting type {0}")]
InvalidConversion(String, String),
#[error(transparent)]
MintUrl(#[from] crate::mint_url::Error),
#[error(transparent)]
CDKNUT00(#[from] crate::nuts::nut00::Error),
#[error(transparent)]
CDKNUT01(#[from] crate::nuts::nut01::Error),
#[error(transparent)]
CDKNUT02(#[from] crate::nuts::nut02::Error),
#[error(transparent)]
CDKNUT04(#[from] crate::nuts::nut04::Error),
#[error(transparent)]
CDKNUT05(#[from] crate::nuts::nut05::Error),
#[error(transparent)]
CDKNUT07(#[from] crate::nuts::nut07::Error),
#[error(transparent)]
CDKNUT23(#[from] crate::nuts::nut23::Error),
#[error(transparent)]
CDKSECRET(#[from] crate::secret::Error),
#[error(transparent)]
Serde(#[from] serde_json::Error),
#[error(transparent)]
BIP32(#[from] bitcoin::bip32::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))
}
}
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error(transparent)]
Database(Box<dyn std::error::Error + Send + Sync>),
#[error("Duplicate entry")]
Duplicate,
#[error("Locked resource")]
Locked,
#[error("Amount overflow")]
AmountOverflow,
#[error("Amount zero")]
AmountZero,
#[error(transparent)]
DHKE(#[from] crate::dhke::Error),
#[error(transparent)]
NUT00(#[from] crate::nuts::nut00::Error),
#[error(transparent)]
NUT01(#[from] crate::nuts::nut01::Error),
#[error(transparent)]
NUT02(#[from] crate::nuts::nut02::Error),
#[error(transparent)]
NUT22(#[from] crate::nuts::nut22::Error),
#[error(transparent)]
NUT04(#[from] crate::nuts::nut04::Error),
#[error(transparent)]
#[cfg(feature = "mint")]
QuoteId(#[from] crate::quote_id::QuoteIdError),
#[error(transparent)]
Serde(#[from] serde_json::Error),
#[error("Unknown Quote")]
UnknownQuote,
#[error("Attempt to remove spent proof")]
AttemptRemoveSpentProof,
#[error("Attempt to update state of spent proof")]
AttemptUpdateSpentProof,
#[error("Proof not found")]
ProofNotFound,
#[error("Proof not in unspent state")]
ProofNotUnspent,
#[error("Quote already in use by another operation")]
QuoteAlreadyInUse,
#[error("Unknown or invalid keyset")]
InvalidKeysetId,
#[cfg(feature = "mint")]
#[error("Invalid state transition")]
InvalidStateTransition(crate::state::Error),
#[error("Invalid credentials {0}")]
InvalidConnectionSettings(String),
#[error("Invalid database response")]
InvalidDbResponse,
#[error("Internal {0}")]
Internal(String),
#[error(transparent)]
Conversion(#[from] ConversionError),
#[error("Missing placeholder value {0}")]
MissingPlaceholder(String),
#[error("Unknown quote ttl")]
UnknownQuoteTTL,
#[error("Invalid UUID: {0}")]
InvalidUuid(String),
#[error("Quote not found")]
QuoteNotFound,
#[error("Invalid KV store key or namespace: {0}")]
KVStoreInvalidKey(String),
#[error("Concurrent update detected")]
ConcurrentUpdate,
}
#[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),
}
}
}
#[async_trait::async_trait]
pub trait DbTransactionFinalizer {
type Err: Into<Error> + From<Error>;
async fn commit(self: Box<Self>) -> Result<(), Self::Err>;
async fn rollback(self: Box<Self>) -> Result<(), Self::Err>;
}