fedimint_client/sm/
dbtx.rs

1use fedimint_core::core::ModuleInstanceId;
2use fedimint_core::db::DatabaseTransaction;
3
4/// A transaction that acts as isolated for module code but can be accessed as a
5/// normal transaction in this crate.
6pub struct ClientSMDatabaseTransaction<'inner, 'parent> {
7    dbtx: &'inner mut DatabaseTransaction<'parent>,
8    module_instance: ModuleInstanceId,
9}
10
11impl<'inner, 'parent> ClientSMDatabaseTransaction<'inner, 'parent> {
12    pub fn new(
13        dbtx: &'inner mut DatabaseTransaction<'parent>,
14        module_instance: ModuleInstanceId,
15    ) -> Self {
16        Self {
17            dbtx,
18            module_instance,
19        }
20    }
21
22    /// Returns the isolated database transaction for the module.
23    pub fn module_tx(&mut self) -> DatabaseTransaction<'_> {
24        self.dbtx
25            .to_ref_with_prefix_module_id(self.module_instance)
26            .0
27            .into_nc()
28    }
29
30    /// Returns the non-isolated database transaction only accessible to the
31    /// client internal code. This is useful for submitting Fedimint
32    /// transactions from within state transitions.
33    #[allow(dead_code)]
34    pub(crate) fn global_tx(&mut self) -> &mut DatabaseTransaction<'parent> {
35        self.dbtx
36    }
37
38    pub(crate) fn module_id(&self) -> ModuleInstanceId {
39        self.module_instance
40    }
41}