|
@@ -1,290 +1,11 @@
|
|
|
//! CDK Database
|
|
|
|
|
|
-#[cfg(any(feature = "wallet", feature = "mint"))]
|
|
|
-use std::collections::HashMap;
|
|
|
-use std::fmt::Debug;
|
|
|
-
|
|
|
-#[cfg(any(feature = "wallet", feature = "mint"))]
|
|
|
-use async_trait::async_trait;
|
|
|
-use thiserror::Error;
|
|
|
-#[cfg(feature = "mint")]
|
|
|
-use uuid::Uuid;
|
|
|
-
|
|
|
-#[cfg(feature = "mint")]
|
|
|
-use crate::mint;
|
|
|
-#[cfg(feature = "mint")]
|
|
|
-use crate::mint::MintKeySetInfo;
|
|
|
-#[cfg(feature = "mint")]
|
|
|
-use crate::mint::MintQuote as MintMintQuote;
|
|
|
-#[cfg(feature = "wallet")]
|
|
|
-use crate::mint_url::MintUrl;
|
|
|
-#[cfg(feature = "mint")]
|
|
|
-use crate::nuts::MeltBolt11Request;
|
|
|
-#[cfg(feature = "mint")]
|
|
|
-use crate::nuts::{BlindSignature, MeltQuoteState, MintQuoteState, Proof, Proofs};
|
|
|
-#[cfg(any(feature = "wallet", feature = "mint"))]
|
|
|
-use crate::nuts::{CurrencyUnit, Id, PublicKey, State};
|
|
|
-#[cfg(feature = "wallet")]
|
|
|
-use crate::nuts::{KeySetInfo, Keys, MintInfo, SpendingConditions};
|
|
|
-#[cfg(feature = "mint")]
|
|
|
-use crate::types::LnKey;
|
|
|
-#[cfg(feature = "wallet")]
|
|
|
-use crate::types::ProofInfo;
|
|
|
-#[cfg(feature = "wallet")]
|
|
|
-use crate::wallet;
|
|
|
-#[cfg(feature = "wallet")]
|
|
|
-use crate::wallet::MintQuote as WalletMintQuote;
|
|
|
-
|
|
|
#[cfg(feature = "mint")]
|
|
|
pub mod mint_memory;
|
|
|
#[cfg(feature = "wallet")]
|
|
|
pub mod wallet_memory;
|
|
|
|
|
|
+/// re-export types
|
|
|
+pub use cdk_common::database::{Error, MintDatabase, WalletDatabase};
|
|
|
#[cfg(feature = "wallet")]
|
|
|
pub use wallet_memory::WalletMemoryDatabase;
|
|
|
-
|
|
|
-/// CDK_database error
|
|
|
-#[derive(Debug, Error)]
|
|
|
-pub enum Error {
|
|
|
- /// Database Error
|
|
|
- #[error(transparent)]
|
|
|
- Database(Box<dyn std::error::Error + Send + Sync>),
|
|
|
- /// DHKE error
|
|
|
- #[error(transparent)]
|
|
|
- DHKE(#[from] crate::dhke::Error),
|
|
|
- /// NUT00 Error
|
|
|
- #[error(transparent)]
|
|
|
- NUT00(#[from] crate::nuts::nut00::Error),
|
|
|
- /// NUT02 Error
|
|
|
- #[error(transparent)]
|
|
|
- NUT02(#[from] crate::nuts::nut02::Error),
|
|
|
- /// Serde Error
|
|
|
- #[error(transparent)]
|
|
|
- Serde(#[from] serde_json::Error),
|
|
|
- /// Unknown Quote
|
|
|
- #[error("Unknown Quote")]
|
|
|
- UnknownQuote,
|
|
|
-}
|
|
|
-
|
|
|
-/// Wallet Database trait
|
|
|
-#[cfg(feature = "wallet")]
|
|
|
-#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
|
|
|
-#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
|
|
|
-pub trait WalletDatabase: Debug {
|
|
|
- /// Wallet Database Error
|
|
|
- type Err: Into<Error> + From<Error>;
|
|
|
-
|
|
|
- /// Add Mint to storage
|
|
|
- async fn add_mint(
|
|
|
- &self,
|
|
|
- mint_url: MintUrl,
|
|
|
- mint_info: Option<MintInfo>,
|
|
|
- ) -> Result<(), Self::Err>;
|
|
|
- /// Remove Mint from storage
|
|
|
- async fn remove_mint(&self, mint_url: MintUrl) -> Result<(), Self::Err>;
|
|
|
- /// Get mint from storage
|
|
|
- async fn get_mint(&self, mint_url: MintUrl) -> Result<Option<MintInfo>, Self::Err>;
|
|
|
- /// Get all mints from storage
|
|
|
- async fn get_mints(&self) -> Result<HashMap<MintUrl, Option<MintInfo>>, Self::Err>;
|
|
|
- /// Update mint url
|
|
|
- async fn update_mint_url(
|
|
|
- &self,
|
|
|
- old_mint_url: MintUrl,
|
|
|
- new_mint_url: MintUrl,
|
|
|
- ) -> Result<(), Self::Err>;
|
|
|
-
|
|
|
- /// Add mint keyset to storage
|
|
|
- async fn add_mint_keysets(
|
|
|
- &self,
|
|
|
- mint_url: MintUrl,
|
|
|
- keysets: Vec<KeySetInfo>,
|
|
|
- ) -> Result<(), Self::Err>;
|
|
|
- /// Get mint keysets for mint url
|
|
|
- async fn get_mint_keysets(
|
|
|
- &self,
|
|
|
- mint_url: MintUrl,
|
|
|
- ) -> Result<Option<Vec<KeySetInfo>>, Self::Err>;
|
|
|
- /// Get mint keyset by id
|
|
|
- async fn get_keyset_by_id(&self, keyset_id: &Id) -> Result<Option<KeySetInfo>, Self::Err>;
|
|
|
-
|
|
|
- /// Add mint quote to storage
|
|
|
- async fn add_mint_quote(&self, quote: WalletMintQuote) -> Result<(), Self::Err>;
|
|
|
- /// Get mint quote from storage
|
|
|
- async fn get_mint_quote(&self, quote_id: &str) -> Result<Option<WalletMintQuote>, Self::Err>;
|
|
|
- /// Get mint quotes from storage
|
|
|
- async fn get_mint_quotes(&self) -> Result<Vec<WalletMintQuote>, Self::Err>;
|
|
|
- /// Remove mint quote from storage
|
|
|
- async fn remove_mint_quote(&self, quote_id: &str) -> Result<(), Self::Err>;
|
|
|
-
|
|
|
- /// Add melt quote to storage
|
|
|
- async fn add_melt_quote(&self, quote: wallet::MeltQuote) -> Result<(), Self::Err>;
|
|
|
- /// Get melt quote from storage
|
|
|
- async fn get_melt_quote(&self, quote_id: &str) -> Result<Option<wallet::MeltQuote>, Self::Err>;
|
|
|
- /// Remove melt quote from storage
|
|
|
- async fn remove_melt_quote(&self, quote_id: &str) -> Result<(), Self::Err>;
|
|
|
-
|
|
|
- /// Add [`Keys`] to storage
|
|
|
- async fn add_keys(&self, keys: Keys) -> Result<(), Self::Err>;
|
|
|
- /// Get [`Keys`] from storage
|
|
|
- async fn get_keys(&self, id: &Id) -> Result<Option<Keys>, Self::Err>;
|
|
|
- /// Remove [`Keys`] from storage
|
|
|
- async fn remove_keys(&self, id: &Id) -> Result<(), Self::Err>;
|
|
|
-
|
|
|
- /// Update the proofs in storage by adding new proofs or removing proofs by
|
|
|
- /// their Y value.
|
|
|
- async fn update_proofs(
|
|
|
- &self,
|
|
|
- added: Vec<ProofInfo>,
|
|
|
- removed_ys: Vec<PublicKey>,
|
|
|
- ) -> Result<(), Self::Err>;
|
|
|
- /// Set proofs as pending in storage. Proofs are identified by their Y
|
|
|
- /// value.
|
|
|
- async fn set_pending_proofs(&self, ys: Vec<PublicKey>) -> Result<(), Self::Err>;
|
|
|
- /// Reserve proofs in storage. Proofs are identified by their Y value.
|
|
|
- async fn reserve_proofs(&self, ys: Vec<PublicKey>) -> Result<(), Self::Err>;
|
|
|
- /// Set proofs as unspent in storage. Proofs are identified by their Y
|
|
|
- /// value.
|
|
|
- async fn set_unspent_proofs(&self, ys: Vec<PublicKey>) -> Result<(), Self::Err>;
|
|
|
- /// Get proofs from storage
|
|
|
- async fn get_proofs(
|
|
|
- &self,
|
|
|
- mint_url: Option<MintUrl>,
|
|
|
- unit: Option<CurrencyUnit>,
|
|
|
- state: Option<Vec<State>>,
|
|
|
- spending_conditions: Option<Vec<SpendingConditions>>,
|
|
|
- ) -> Result<Vec<ProofInfo>, Self::Err>;
|
|
|
-
|
|
|
- /// Increment Keyset counter
|
|
|
- async fn increment_keyset_counter(&self, keyset_id: &Id, count: u32) -> Result<(), Self::Err>;
|
|
|
- /// Get current Keyset counter
|
|
|
- async fn get_keyset_counter(&self, keyset_id: &Id) -> Result<Option<u32>, Self::Err>;
|
|
|
-
|
|
|
- /// Get when nostr key was last checked
|
|
|
- async fn get_nostr_last_checked(
|
|
|
- &self,
|
|
|
- verifying_key: &PublicKey,
|
|
|
- ) -> Result<Option<u32>, Self::Err>;
|
|
|
- /// Update last checked time
|
|
|
- async fn add_nostr_last_checked(
|
|
|
- &self,
|
|
|
- verifying_key: PublicKey,
|
|
|
- last_checked: u32,
|
|
|
- ) -> Result<(), Self::Err>;
|
|
|
-}
|
|
|
-
|
|
|
-/// Mint Database trait
|
|
|
-#[cfg(feature = "mint")]
|
|
|
-#[async_trait]
|
|
|
-pub trait MintDatabase {
|
|
|
- /// Mint Database Error
|
|
|
- type Err: Into<Error> + From<Error>;
|
|
|
-
|
|
|
- /// Add Active Keyset
|
|
|
- async fn set_active_keyset(&self, unit: CurrencyUnit, id: Id) -> Result<(), Self::Err>;
|
|
|
- /// Get Active Keyset
|
|
|
- async fn get_active_keyset_id(&self, unit: &CurrencyUnit) -> Result<Option<Id>, Self::Err>;
|
|
|
- /// Get all Active Keyset
|
|
|
- async fn get_active_keysets(&self) -> Result<HashMap<CurrencyUnit, Id>, Self::Err>;
|
|
|
-
|
|
|
- /// Add [`MintMintQuote`]
|
|
|
- async fn add_mint_quote(&self, quote: MintMintQuote) -> Result<(), Self::Err>;
|
|
|
- /// Get [`MintMintQuote`]
|
|
|
- async fn get_mint_quote(&self, quote_id: &Uuid) -> Result<Option<MintMintQuote>, Self::Err>;
|
|
|
- /// Update state of [`MintMintQuote`]
|
|
|
- async fn update_mint_quote_state(
|
|
|
- &self,
|
|
|
- quote_id: &Uuid,
|
|
|
- state: MintQuoteState,
|
|
|
- ) -> Result<MintQuoteState, Self::Err>;
|
|
|
- /// Get all [`MintMintQuote`]s
|
|
|
- async fn get_mint_quote_by_request(
|
|
|
- &self,
|
|
|
- request: &str,
|
|
|
- ) -> Result<Option<MintMintQuote>, Self::Err>;
|
|
|
- /// Get all [`MintMintQuote`]s
|
|
|
- async fn get_mint_quote_by_request_lookup_id(
|
|
|
- &self,
|
|
|
- request_lookup_id: &str,
|
|
|
- ) -> Result<Option<MintMintQuote>, Self::Err>;
|
|
|
- /// Get Mint Quotes
|
|
|
- async fn get_mint_quotes(&self) -> Result<Vec<MintMintQuote>, Self::Err>;
|
|
|
- /// Remove [`MintMintQuote`]
|
|
|
- async fn remove_mint_quote(&self, quote_id: &Uuid) -> Result<(), Self::Err>;
|
|
|
-
|
|
|
- /// Add [`mint::MeltQuote`]
|
|
|
- async fn add_melt_quote(&self, quote: mint::MeltQuote) -> Result<(), Self::Err>;
|
|
|
- /// Get [`mint::MeltQuote`]
|
|
|
- async fn get_melt_quote(&self, quote_id: &Uuid) -> Result<Option<mint::MeltQuote>, Self::Err>;
|
|
|
- /// Update [`mint::MeltQuote`] state
|
|
|
- async fn update_melt_quote_state(
|
|
|
- &self,
|
|
|
- quote_id: &Uuid,
|
|
|
- state: MeltQuoteState,
|
|
|
- ) -> Result<MeltQuoteState, Self::Err>;
|
|
|
- /// Get all [`mint::MeltQuote`]s
|
|
|
- async fn get_melt_quotes(&self) -> Result<Vec<mint::MeltQuote>, Self::Err>;
|
|
|
- /// Remove [`mint::MeltQuote`]
|
|
|
- async fn remove_melt_quote(&self, quote_id: &Uuid) -> Result<(), Self::Err>;
|
|
|
-
|
|
|
- /// Add melt request
|
|
|
- async fn add_melt_request(
|
|
|
- &self,
|
|
|
- melt_request: MeltBolt11Request<Uuid>,
|
|
|
- ln_key: LnKey,
|
|
|
- ) -> Result<(), Self::Err>;
|
|
|
- /// Get melt request
|
|
|
- async fn get_melt_request(
|
|
|
- &self,
|
|
|
- quote_id: &Uuid,
|
|
|
- ) -> Result<Option<(MeltBolt11Request<Uuid>, LnKey)>, Self::Err>;
|
|
|
-
|
|
|
- /// Add [`MintKeySetInfo`]
|
|
|
- async fn add_keyset_info(&self, keyset: MintKeySetInfo) -> Result<(), Self::Err>;
|
|
|
- /// Get [`MintKeySetInfo`]
|
|
|
- async fn get_keyset_info(&self, id: &Id) -> Result<Option<MintKeySetInfo>, Self::Err>;
|
|
|
- /// Get [`MintKeySetInfo`]s
|
|
|
- async fn get_keyset_infos(&self) -> Result<Vec<MintKeySetInfo>, Self::Err>;
|
|
|
-
|
|
|
- /// Add spent [`Proofs`]
|
|
|
- async fn add_proofs(&self, proof: Proofs, quote_id: Option<Uuid>) -> Result<(), Self::Err>;
|
|
|
- /// Get [`Proofs`] by ys
|
|
|
- async fn get_proofs_by_ys(&self, ys: &[PublicKey]) -> Result<Vec<Option<Proof>>, Self::Err>;
|
|
|
- /// Get ys by quote id
|
|
|
- async fn get_proof_ys_by_quote_id(&self, quote_id: &Uuid) -> Result<Vec<PublicKey>, Self::Err>;
|
|
|
- /// Get [`Proofs`] state
|
|
|
- async fn get_proofs_states(&self, ys: &[PublicKey]) -> Result<Vec<Option<State>>, Self::Err>;
|
|
|
- /// Get [`Proofs`] state
|
|
|
- async fn update_proofs_states(
|
|
|
- &self,
|
|
|
- ys: &[PublicKey],
|
|
|
- proofs_state: State,
|
|
|
- ) -> Result<Vec<Option<State>>, Self::Err>;
|
|
|
- /// Get [`Proofs`] by state
|
|
|
- async fn get_proofs_by_keyset_id(
|
|
|
- &self,
|
|
|
- keyset_id: &Id,
|
|
|
- ) -> Result<(Proofs, Vec<Option<State>>), Self::Err>;
|
|
|
-
|
|
|
- /// Add [`BlindSignature`]
|
|
|
- async fn add_blind_signatures(
|
|
|
- &self,
|
|
|
- blinded_messages: &[PublicKey],
|
|
|
- blind_signatures: &[BlindSignature],
|
|
|
- quote_id: Option<Uuid>,
|
|
|
- ) -> Result<(), Self::Err>;
|
|
|
- /// Get [`BlindSignature`]s
|
|
|
- async fn get_blind_signatures(
|
|
|
- &self,
|
|
|
- blinded_messages: &[PublicKey],
|
|
|
- ) -> Result<Vec<Option<BlindSignature>>, Self::Err>;
|
|
|
- /// Get [`BlindSignature`]s for keyset_id
|
|
|
- async fn get_blind_signatures_for_keyset(
|
|
|
- &self,
|
|
|
- keyset_id: &Id,
|
|
|
- ) -> Result<Vec<BlindSignature>, Self::Err>;
|
|
|
- /// Get [`BlindSignature`]s for quote
|
|
|
- async fn get_blind_signatures_for_quote(
|
|
|
- &self,
|
|
|
- quote_id: &Uuid,
|
|
|
- ) -> Result<Vec<BlindSignature>, Self::Err>;
|
|
|
-}
|