Skip to main content

cdk_sqlite/mint/
memory.rs

1//! In-memory database that is provided by the `cdk-sqlite` crate, mainly for testing purposes.
2use std::collections::HashMap;
3
4use cdk_common::database::{self, MintDatabase, MintKeysDatabase};
5use cdk_common::mint::{self, MintKeySetInfo, MintQuote, Operation};
6use cdk_common::nuts::{CurrencyUnit, Id, Proofs};
7use cdk_common::MintInfo;
8
9use super::MintSqliteDatabase;
10
11const CDK_MINT_PRIMARY_NAMESPACE: &str = "cdk_mint";
12const CDK_MINT_CONFIG_SECONDARY_NAMESPACE: &str = "config";
13const CDK_MINT_CONFIG_KV_KEY: &str = "mint_info";
14
15/// Creates a new in-memory [`MintSqliteDatabase`] instance
16pub async fn empty() -> Result<MintSqliteDatabase, database::Error> {
17    #[cfg(not(feature = "sqlcipher"))]
18    let path = ":memory:";
19    #[cfg(feature = "sqlcipher")]
20    let path = (":memory:", "memory");
21
22    MintSqliteDatabase::new(path).await
23}
24
25/// Creates a new in-memory [`MintSqliteDatabase`] instance with the given state
26#[allow(clippy::too_many_arguments)]
27pub async fn new_with_state(
28    active_keysets: HashMap<CurrencyUnit, Id>,
29    keysets: Vec<MintKeySetInfo>,
30    mint_quotes: Vec<MintQuote>,
31    melt_quotes: Vec<mint::MeltQuote>,
32    pending_proofs: Proofs,
33    spent_proofs: Proofs,
34    mint_info: MintInfo,
35) -> Result<MintSqliteDatabase, database::Error> {
36    let db = empty().await?;
37    let mut tx = MintKeysDatabase::begin_transaction(&db).await?;
38
39    for active_keyset in active_keysets {
40        tx.set_active_keyset(active_keyset.0, active_keyset.1)
41            .await?;
42    }
43
44    for keyset in keysets {
45        tx.add_keyset_info(keyset).await?;
46    }
47    tx.commit().await?;
48
49    let mut tx = MintDatabase::begin_transaction(&db).await?;
50
51    for quote in mint_quotes {
52        tx.add_mint_quote(quote).await?;
53    }
54
55    for quote in melt_quotes {
56        tx.add_melt_quote(quote).await?;
57    }
58
59    if !spent_proofs.is_empty() {
60        tx.add_proofs(
61            pending_proofs,
62            None,
63            &Operation::new_swap(Default::default(), Default::default(), Default::default()),
64        )
65        .await?;
66        tx.add_proofs(
67            spent_proofs,
68            None,
69            &Operation::new_swap(Default::default(), Default::default(), Default::default()),
70        )
71        .await?;
72    }
73    let mint_info_bytes = serde_json::to_vec(&mint_info)?;
74    tx.kv_write(
75        CDK_MINT_PRIMARY_NAMESPACE,
76        CDK_MINT_CONFIG_SECONDARY_NAMESPACE,
77        CDK_MINT_CONFIG_KV_KEY,
78        &mint_info_bytes,
79    )
80    .await?;
81    tx.commit().await?;
82
83    Ok(db)
84}