Skip to main content

breez_sdk_liquid/wallet/
persister.rs

1use anyhow::Result;
2use lwk_wollet::{BoxError, DynStore};
3use std::fmt;
4use std::sync::Arc;
5
6pub use lwk_wollet;
7
8use crate::persist::Persister;
9
10pub type LwkPersister = Arc<dyn DynStore>;
11
12#[sdk_macros::async_trait]
13pub trait WalletCachePersister: Send + Sync {
14    fn get_lwk_persister(&self) -> Result<LwkPersister>;
15
16    async fn clear_cache(&self) -> Result<()>;
17}
18
19#[derive(Clone)]
20pub struct SqliteWalletCachePersister {
21    persister: Arc<Persister>,
22}
23
24impl SqliteWalletCachePersister {
25    pub fn new(persister: Arc<Persister>) -> Result<Self> {
26        Ok(Self { persister })
27    }
28}
29
30#[sdk_macros::async_trait]
31impl WalletCachePersister for SqliteWalletCachePersister {
32    fn get_lwk_persister(&self) -> Result<LwkPersister> {
33        Ok(Arc::new(SqliteDynStore {
34            persister: Arc::clone(&self.persister),
35        }))
36    }
37
38    async fn clear_cache(&self) -> Result<()> {
39        self.persister.clear_wallet_cache()
40    }
41}
42
43/// A [`DynStore`] implementation backed by the SDK's SQLite [`Persister`].
44///
45/// LWK owns serialization, merging and (when persisted) encryption of the wallet
46/// cache: this store only persists opaque key-value pairs.
47struct SqliteDynStore {
48    persister: Arc<Persister>,
49}
50
51impl fmt::Debug for SqliteDynStore {
52    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
53        f.debug_struct("SqliteDynStore").finish()
54    }
55}
56
57impl DynStore for SqliteDynStore {
58    fn get(&self, key: &str) -> Result<Option<Vec<u8>>, BoxError> {
59        self.persister
60            .get_wallet_cache(key)
61            .map_err(|e| e.to_string().into())
62    }
63
64    fn put(&self, key: &str, value: &[u8]) -> Result<(), BoxError> {
65        self.persister
66            .set_wallet_cache(key, value)
67            .map_err(|e| e.to_string().into())
68    }
69
70    fn remove(&self, key: &str) -> Result<(), BoxError> {
71        self.persister
72            .remove_wallet_cache(key)
73            .map_err(|e| e.to_string().into())
74    }
75
76    /// The cache is persisted across restarts, so LWK encrypts it with the
77    /// descriptor-derived key.
78    fn is_persisted(&self) -> bool {
79        true
80    }
81}