diff --git a/rust-bins/duniter-dbex/src/migrate.rs b/rust-bins/duniter-dbex/src/migrate.rs
index 149791a136fd1bd2c88c90ced9a68e166af5a3e3..b4bcc7abf868780453ad8a1921a1f7191d75a7df 100644
--- a/rust-bins/duniter-dbex/src/migrate.rs
+++ b/rust-bins/duniter-dbex/src/migrate.rs
@@ -26,15 +26,15 @@ const CHUNK_SIZE: usize = 250;
 
 pub(crate) fn migrate(profile_path: PathBuf) -> anyhow::Result<()> {
     let start_time = Instant::now();
-    let dbs = duniter_dbs::open_dbs(Some(profile_path.as_path()));
+    let (bc_db, dbs) = duniter_dbs::open_dbs(Some(profile_path.as_path()));
 
     // Clear bc_db and gva_db
-    dbs.bc_db.clear()?;
+    bc_db.clear()?;
     dbs.gva_db.clear()?;
 
-    if let Err(e) = migrate_inner(dbs.clone(), profile_path, start_time) {
+    if let Err(e) = migrate_inner(&bc_db, dbs.clone(), profile_path, start_time) {
         // Clear bc_db and gva_db
-        dbs.bc_db.clear()?;
+        bc_db.clear()?;
         dbs.gva_db.clear()?;
 
         Err(e)
@@ -44,6 +44,7 @@ pub(crate) fn migrate(profile_path: PathBuf) -> anyhow::Result<()> {
 }
 
 fn migrate_inner(
+    bc_db: &BcV2Db<FileBackend>,
     dbs: DuniterDbs<FileBackend>,
     profile_path: PathBuf,
     start_time: Instant,
@@ -121,7 +122,7 @@ fn migrate_inner(
                     })
                     .expect("gva:apply_chunk: dbs pool disconnected");
                 current = Some(duniter_dbs_write_ops::apply_block::apply_chunk(
-                    current, &dbs_pool, chunk,
+                    bc_db, current, &dbs_pool, chunk,
                 )?);
                 gva_handle
                     .join()
@@ -133,8 +134,8 @@ fn migrate_inner(
         parser_handle.join().expect("parser thread panic")?;
 
         println!("Flush DBs caches on disk...");
+        bc_db.save()?;
         dbs_pool.execute(|dbs| {
-            dbs.bc_db.save()?;
             dbs.gva_db.save()?;
             Ok::<(), KvError>(())
         })??;
diff --git a/rust-libs/duniter-dbs-write-ops/src/apply_block.rs b/rust-libs/duniter-dbs-write-ops/src/apply_block.rs
index 216b9354a144a700e35082a30602c85b463daa2e..756d07b81cf83972d133d39feb4d87e0af5fbd06 100644
--- a/rust-libs/duniter-dbs-write-ops/src/apply_block.rs
+++ b/rust-libs/duniter-dbs-write-ops/src/apply_block.rs
@@ -16,6 +16,7 @@
 use crate::*;
 
 pub fn apply_block(
+    bc_db: &BcV2Db<FileBackend>,
     block: Arc<DubpBlockV10>,
     current_opt: Option<BlockMetaV2>,
     dbs_pool: &fast_threadpool::ThreadPoolSyncHandler<DuniterDbs<FileBackend>>,
@@ -23,7 +24,7 @@ pub fn apply_block(
 ) -> KvResult<BlockMetaV2> {
     if let Some(current) = current_opt {
         if block.number().0 == current.number + 1 {
-            apply_block_inner(dbs_pool, block)
+            apply_block_inner(bc_db, dbs_pool, block)
         } else if throw_chainability {
             Err(KvError::Custom(
                 format!(
@@ -37,7 +38,7 @@ pub fn apply_block(
             Ok(current)
         }
     } else if block.number() == BlockNumber(0) {
-        apply_block_inner(dbs_pool, block)
+        apply_block_inner(bc_db, dbs_pool, block)
     } else {
         Err(KvError::Custom(
             "Try to apply non genesis block on empty blockchain".into(),
@@ -47,12 +48,13 @@ pub fn apply_block(
 
 #[inline(always)]
 pub fn apply_chunk(
+    bc_db: &BcV2Db<FileBackend>,
     current_opt: Option<BlockMetaV2>,
     dbs_pool: &fast_threadpool::ThreadPoolSyncHandler<DuniterDbs<FileBackend>>,
     blocks: Arc<[DubpBlockV10]>,
 ) -> KvResult<BlockMetaV2> {
     verify_chunk_chainability(current_opt, &blocks)?;
-    apply_chunk_inner(dbs_pool, blocks)
+    apply_chunk_inner(bc_db, dbs_pool, blocks)
 }
 
 fn verify_chunk_chainability(
@@ -100,57 +102,58 @@ fn verify_chunk_chainability(
 }
 
 fn apply_block_inner(
+    bc_db: &BcV2Db<FileBackend>,
     dbs_pool: &fast_threadpool::ThreadPoolSyncHandler<DuniterDbs<FileBackend>>,
     block: Arc<DubpBlockV10>,
 ) -> KvResult<BlockMetaV2> {
-    // Bc
-    let block_arc = Arc::clone(&block);
-    let bc_recv = dbs_pool
-        .launch(move |dbs| crate::bc::apply_block(&dbs.bc_db, &block_arc))
-        .expect("dbs pool disconnected");
+    let block_arc_clone = Arc::clone(&block);
+
     //TxsMp
-    let block_arc = Arc::clone(&block);
     let txs_mp_recv = dbs_pool
         .launch(move |dbs| {
-            crate::txs_mp::apply_block(block_arc.transactions(), &dbs.txs_mp_db)?;
+            crate::txs_mp::apply_block(block_arc_clone.transactions(), &dbs.txs_mp_db)?;
             Ok::<_, KvError>(())
         })
         .expect("dbs pool disconnected");
 
+    // Bc
+    let new_current = crate::bc::apply_block(bc_db, &block)?;
+
     txs_mp_recv.join().expect("dbs pool disconnected")?;
-    bc_recv.join().expect("dbs pool disconnected")
+
+    Ok(new_current)
 }
 
 fn apply_chunk_inner(
+    bc_db: &BcV2Db<FileBackend>,
     dbs_pool: &fast_threadpool::ThreadPoolSyncHandler<DuniterDbs<FileBackend>>,
     blocks: Arc<[DubpBlockV10]>,
 ) -> KvResult<BlockMetaV2> {
-    // Bc
     let blocks_len = blocks.len();
-    let blocks_arc = Arc::clone(&blocks);
-    //log::info!("apply_chunk: launch bc job...");
-    let bc_handle = dbs_pool
-        .launch(move |dbs| {
-            for block in &blocks_arc[..(blocks_len - 1)] {
-                crate::bc::apply_block(&dbs.bc_db, block)?;
-            }
-            crate::bc::apply_block(&dbs.bc_db, &blocks_arc[blocks_len - 1])
-        })
-        .expect("apply_chunk_inner:bc: dbs pool disconnected");
+    let blocks_arc_clone = Arc::clone(&blocks);
+
     //TxsMp
-    let blocks_arc = Arc::clone(&blocks);
     //log::info!("apply_chunk: launch txs_mp job...");
     let txs_mp_handle = dbs_pool
         .launch(move |dbs| {
-            for block in blocks_arc.deref() {
+            for block in blocks_arc_clone.deref() {
                 crate::txs_mp::apply_block(block.transactions(), &dbs.txs_mp_db)?;
             }
             Ok::<_, KvError>(())
         })
         .expect("apply_chunk_inner:txs_mp: dbs pool disconnected");
+
+    // Bc
+    //log::info!("apply_chunk: launch bc job...");
+    for block in &blocks[..(blocks_len - 1)] {
+        crate::bc::apply_block(bc_db, block)?;
+    }
+    let current_block = crate::bc::apply_block(bc_db, &blocks[blocks_len - 1])?;
+
     txs_mp_handle
         .join()
         .expect("txs_mp_recv: dbs pool disconnected")?;
     //log::info!("apply_chunk: txs_mp job finish.");
-    bc_handle.join().expect("bc_recv: dbs pool disconnected")
+
+    Ok(current_block)
 }
diff --git a/rust-libs/duniter-dbs-write-ops/src/lib.rs b/rust-libs/duniter-dbs-write-ops/src/lib.rs
index d97f5c75fb493d8a6015969521ce0298f40e9e82..04edc631a143ea7e156f60bf13e0770d8a52514b 100644
--- a/rust-libs/duniter-dbs-write-ops/src/lib.rs
+++ b/rust-libs/duniter-dbs-write-ops/src/lib.rs
@@ -37,9 +37,9 @@ use dubp::documents::{
 };
 use dubp::wallet::prelude::*;
 use duniter_dbs::{
-    kv_typed::prelude::*, BlockMetaV2, DuniterDbs, FileBackend, HashKeyV2, PendingTxDbV2,
-    PubKeyKeyV2, PubKeyValV2, SourceAmountValV2, TxsMpV2Db, TxsMpV2DbReadable, TxsMpV2DbWritable,
-    UtxoValV2, WalletConditionsV2,
+    bc_v2::BcV2Db, kv_typed::prelude::*, BlockMetaV2, DuniterDbs, FileBackend, HashKeyV2,
+    PendingTxDbV2, PubKeyKeyV2, PubKeyValV2, SourceAmountValV2, TxsMpV2Db, TxsMpV2DbReadable,
+    TxsMpV2DbWritable, UtxoValV2, WalletConditionsV2,
 };
 use resiter::filter_map::FilterMap;
 use resiter::flatten::Flatten;
diff --git a/rust-libs/duniter-dbs/src/lib.rs b/rust-libs/duniter-dbs/src/lib.rs
index 550b9d63c94c2ab9c2482e2b271686c1d614270c..4ff45f4362517a739e43659e593ec19bf2463b76 100644
--- a/rust-libs/duniter-dbs/src/lib.rs
+++ b/rust-libs/duniter-dbs/src/lib.rs
@@ -121,7 +121,7 @@ pub type FileBackend = kv_typed::backend::memory::Mem;
 
 #[derive(Clone, Debug)]
 pub struct DuniterDbs<B: Backend> {
-    pub bc_db: bc_v2::BcV2Db<B>,
+    pub bc_db_ro: bc_v2::BcV2DbRo<B>,
     pub cm_db: cm_v1::CmV1Db<MemSingleton>,
     pub gva_db: GvaV1Db<B>,
     pub txs_mp_db: TxsMpV2Db<B>,
@@ -132,7 +132,7 @@ impl DuniterDbs<Mem> {
         use bc_v2::BcV2DbWritable as _;
         use cm_v1::CmV1DbWritable as _;
         Ok(DuniterDbs {
-            bc_db: bc_v2::BcV2Db::<Mem>::open(MemConf::default())?,
+            bc_db_ro: bc_v2::BcV2Db::<Mem>::open(MemConf::default())?.get_ro_handler(),
             cm_db: cm_v1::CmV1Db::<MemSingleton>::open(MemSingletonConf::default())?,
             gva_db: GvaV1Db::<Mem>::open(MemConf::default())?,
             txs_mp_db: TxsMpV2Db::<Mem>::open(MemConf::default())?,
diff --git a/rust-libs/duniter-dbs/src/open_dbs.rs b/rust-libs/duniter-dbs/src/open_dbs.rs
index 8a01ae5507262bfeb57a5dcf9fd66008e42a8c61..001a06718c591ec1661728d3389d10c7684285eb 100644
--- a/rust-libs/duniter-dbs/src/open_dbs.rs
+++ b/rust-libs/duniter-dbs/src/open_dbs.rs
@@ -17,17 +17,21 @@ use crate::bc_v2::BcV2DbWritable as _;
 use crate::cm_v1::CmV1DbWritable as _;
 use crate::*;
 
-pub fn open_dbs<B: BackendConf>(home_path_opt: Option<&Path>) -> DuniterDbs<B> {
-    DuniterDbs {
-        bc_db: crate::bc_v2::BcV2Db::<B>::open(B::gen_backend_conf("bc_v2", home_path_opt))
-            .expect("fail to open BcV2 DB"),
+pub fn open_dbs<B: BackendConf>(
+    home_path_opt: Option<&Path>,
+) -> (crate::bc_v2::BcV2Db<B>, DuniterDbs<B>) {
+    let bc_db = crate::bc_v2::BcV2Db::<B>::open(B::gen_backend_conf("bc_v2", home_path_opt))
+        .expect("fail to open BcV2 DB");
+    let dbs = DuniterDbs {
+        bc_db_ro: bc_db.get_ro_handler(),
         cm_db: crate::cm_v1::CmV1Db::<MemSingleton>::open(MemSingletonConf::default())
             .expect("fail to open CmV1 DB"),
         gva_db: GvaV1Db::<B>::open(B::gen_backend_conf("gva_v1", home_path_opt))
             .expect("fail to open Gva DB"),
         txs_mp_db: TxsMpV2Db::<B>::open(B::gen_backend_conf("txs_mp_v2", home_path_opt))
             .expect("fail to open TxsMp DB"),
-    }
+    };
+    (bc_db, dbs)
 }
 
 pub trait BackendConf: Backend {
diff --git a/rust-libs/duniter-server/src/lib.rs b/rust-libs/duniter-server/src/lib.rs
index 1b9c6375def724c6a35acb5fa254dbf6e483ea04..6068fce648e2a1d2f51910276df71dbd88fedba4 100644
--- a/rust-libs/duniter-server/src/lib.rs
+++ b/rust-libs/duniter-server/src/lib.rs
@@ -33,6 +33,7 @@ use dubp::documents::{prelude::*, transaction::TransactionDocumentV10};
 use dubp::{
     block::prelude::*, common::crypto::hashs::Hash, documents_parser::prelude::FromStringObject,
 };
+use duniter_dbs::bc_v2::BcV2Db;
 use duniter_dbs::cm_v1::{CmV1DbReadable, CmV1DbWritable};
 use duniter_dbs::{
     kv_typed::prelude::*, GvaV1DbReadable, HashKeyV2, PendingTxDbV2, TxsMpV2DbReadable,
@@ -52,6 +53,7 @@ pub enum DuniterCommand {
 }
 
 pub struct DuniterServer {
+    bc_db: BcV2Db<FileBackend>,
     conf: DuniterConf,
     current: Option<BlockMetaV2>,
     dbs_pool: fast_threadpool::ThreadPoolSyncHandler<DuniterDbs<FileBackend>>,
@@ -77,9 +79,9 @@ impl DuniterServer {
         let txs_mempool = TxsMempool::new(conf.txs_mempool_size);
 
         log::info!("open duniter databases...");
-        let dbs = duniter_dbs::open_dbs(home_path_opt);
+        let (bc_db, dbs) = duniter_dbs::open_dbs(home_path_opt);
         log::info!("Databases successfully opened.");
-        let current = duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db)
+        let current = duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db_ro)
             .context("Fail to get current")?;
         if let Some(current) = current {
             log::info!("Current block: #{}-{}", current.number, current.hash);
@@ -123,6 +125,7 @@ impl DuniterServer {
         };
 
         Ok(DuniterServer {
+            bc_db,
             conf,
             current,
             dbs_pool: threadpool.into_sync_handler(),
@@ -154,7 +157,7 @@ impl DuniterServer {
         match self
             .dbs_pool
             .execute(move |dbs| {
-                txs_mempool.accept_new_tx(&dbs.bc_db, server_pubkey, tx, &dbs.txs_mp_db)
+                txs_mempool.accept_new_tx(&dbs.bc_db_ro, server_pubkey, tx, &dbs.txs_mp_db)
             })
             .expect("dbs pool discorrected")
         {
@@ -262,16 +265,17 @@ impl DuniterServer {
                 .map_err(|e| KvError::DeserError(format!("{}", e)))?,
         );
         let block_arc_clone = Arc::clone(&block);
-        self.current = self
+        let txs_mp_job_handle = self
             .dbs_pool
-            .execute(move |dbs| {
+            .launch(move |dbs| {
                 duniter_dbs_write_ops::txs_mp::revert_block(
                     block_arc_clone.transactions(),
                     &dbs.txs_mp_db,
-                )?;
-                duniter_dbs_write_ops::bc::revert_block(&dbs.bc_db, &block_arc_clone)
+                )
             })
-            .expect("dbs pool disconnected")?;
+            .expect("dbs pool disconnected");
+        self.current = duniter_dbs_write_ops::bc::revert_block(&self.bc_db, &block)?;
+        txs_mp_job_handle.join().expect("dbs pool disconnected")?;
         revert_block_modules(block, &self.conf, &self.dbs_pool, None)
     }
     pub fn apply_block(&mut self, block: DubpBlockV10Stringified) -> KvResult<()> {
@@ -280,6 +284,7 @@ impl DuniterServer {
                 .map_err(|e| KvError::DeserError(format!("{}", e)))?,
         );
         self.current = Some(duniter_dbs_write_ops::apply_block::apply_block(
+            &self.bc_db,
             block.clone(),
             self.current,
             &self.dbs_pool,
@@ -297,6 +302,7 @@ impl DuniterServer {
                 .map_err(|e| KvError::DeserError(format!("{}", e)))?,
         );
         self.current = Some(duniter_dbs_write_ops::apply_block::apply_chunk(
+            &self.bc_db,
             self.current,
             &self.dbs_pool,
             blocks.clone(),
diff --git a/rust-libs/modules/gva/dbs-reader/src/lib.rs b/rust-libs/modules/gva/dbs-reader/src/lib.rs
index 5b8667c44ed5171980c5e1c7c7688a2071075f77..b7c7c59d730bdf095df507f165c89b02fdcaeb47 100644
--- a/rust-libs/modules/gva/dbs-reader/src/lib.rs
+++ b/rust-libs/modules/gva/dbs-reader/src/lib.rs
@@ -35,7 +35,7 @@ use dubp::common::crypto::hashs::Hash;
 use dubp::common::crypto::keys::ed25519::PublicKey;
 use dubp::documents::transaction::TransactionDocumentV10;
 use dubp::{common::prelude::BlockNumber, wallet::prelude::*};
-use duniter_dbs::bc_v2::BcV2DbReadable;
+use duniter_dbs::bc_v2::{BcV2DbReadable, BcV2DbRo};
 use duniter_dbs::{
     kv_typed::prelude::*, GvaV1DbReadable, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, TxDbV2,
     TxsMpV2DbReadable, UtxoIdDbV2,
diff --git a/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs b/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs
index adb197a413de0f67ee6779e5c88f3e37d21bf345..454d6be377088e1ed243b0fc559660e2900bd758 100644
--- a/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs
+++ b/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs
@@ -16,7 +16,7 @@
 use crate::*;
 use duniter_dbs::smallvec::SmallVec;
 use duniter_dbs::{
-    bc_v2::{BcV2Db, UdsEvent, UdsRevalEvent},
+    bc_v2::{UdsEvent, UdsRevalEvent},
     GvaIdtyDbV1, GvaV1Db, UdIdV2,
 };
 
@@ -27,7 +27,7 @@ pub struct UdsWithSum {
 }
 
 pub fn all_uds_of_pubkey<B: Backend>(
-    bc_db: &BcV2Db<B>,
+    bc_db: &BcV2DbRo<B>,
     gva_db: &GvaV1Db<B>,
     pubkey: PublicKey,
     page_info: PageInfo<BlockNumber>,
@@ -531,6 +531,7 @@ mod tests {
         };
 
         let bc_db = duniter_dbs::bc_v2::BcV2Db::<Mem>::open(MemConf::default())?;
+        let bc_db_ro = bc_db.get_ro_handler();
         let gva_db = duniter_dbs::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?;
 
         bc_db
@@ -555,7 +556,7 @@ mod tests {
             data: UdsWithSum { uds, sum },
             has_previous_page,
             has_next_page,
-        } = all_uds_of_pubkey(&bc_db, &gva_db, pk, PageInfo::default())?;
+        } = all_uds_of_pubkey(&bc_db_ro, &gva_db, pk, PageInfo::default())?;
         assert_eq!(
             uds,
             vec![
@@ -574,7 +575,7 @@ mod tests {
             has_previous_page,
             has_next_page,
         } = all_uds_of_pubkey(
-            &bc_db,
+            &bc_db_ro,
             &gva_db,
             pk,
             PageInfo {
@@ -599,7 +600,7 @@ mod tests {
             has_previous_page,
             has_next_page,
         } = all_uds_of_pubkey(
-            &bc_db,
+            &bc_db_ro,
             &gva_db,
             pk,
             PageInfo {
@@ -624,7 +625,7 @@ mod tests {
             has_previous_page,
             has_next_page,
         } = all_uds_of_pubkey(
-            &bc_db,
+            &bc_db_ro,
             &gva_db,
             pk,
             PageInfo {
@@ -650,7 +651,7 @@ mod tests {
             has_previous_page,
             has_next_page,
         } = all_uds_of_pubkey(
-            &bc_db,
+            &bc_db_ro,
             &gva_db,
             pk,
             PageInfo {
@@ -676,7 +677,7 @@ mod tests {
             has_previous_page,
             has_next_page,
         } = all_uds_of_pubkey(
-            &bc_db,
+            &bc_db_ro,
             &gva_db,
             pk,
             PageInfo {
diff --git a/rust-libs/modules/gva/src/mutations.rs b/rust-libs/modules/gva/src/mutations.rs
index 7ee8dff61ea9c2bdcc4bdab52ffb1830972fea8a..04fb31309111fd85c0cf08b24ce7f1108d2b9e42 100644
--- a/rust-libs/modules/gva/src/mutations.rs
+++ b/rust-libs/modules/gva/src/mutations.rs
@@ -40,7 +40,7 @@ impl MutationRoot {
             .dbs_pool
             .execute(move |dbs| {
                 txs_mempool
-                    .add_pending_tx(&dbs.bc_db, server_pubkey, &dbs.txs_mp_db, &tx)
+                    .add_pending_tx(&dbs.bc_db_ro, server_pubkey, &dbs.txs_mp_db, &tx)
                     .map(|()| tx)
             })
             .await??;
@@ -72,7 +72,7 @@ impl MutationRoot {
                 .dbs_pool
                 .execute(move |dbs| {
                     txs_mempool
-                        .add_pending_tx(&dbs.bc_db, server_pubkey, &dbs.txs_mp_db, &tx)
+                        .add_pending_tx(&dbs.bc_db_ro, server_pubkey, &dbs.txs_mp_db, &tx)
                         .map(|()| tx)
                 })
                 .await??;
diff --git a/rust-libs/modules/gva/src/queries/gen_tx.rs b/rust-libs/modules/gva/src/queries/gen_tx.rs
index 61ce75360762682141481f3741ce251d28b8fe41..82de55336e75efca7be741b9e16877610ff9991f 100644
--- a/rust-libs/modules/gva/src/queries/gen_tx.rs
+++ b/rust-libs/modules/gva/src/queries/gen_tx.rs
@@ -119,12 +119,12 @@ impl GenTxsQuery {
             .dbs_pool
             .execute(move |dbs| {
                 if let Some(current_block) =
-                    duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db)?
+                    duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db_ro)?
                 {
                     Ok((
                         current_block,
                         duniter_gva_dbs_reader::find_inputs::find_inputs(
-                            &dbs.bc_db,
+                            &dbs.bc_db_ro,
                             &dbs.gva_db,
                             &dbs.txs_mp_db,
                             SourceAmount::new(amount as i64, current_block.unit_base as i64),
@@ -195,13 +195,13 @@ impl GenTxsQuery {
             .dbs_pool
             .execute(move |dbs| {
                 if let Some(current_block) =
-                    duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db)?
+                    duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db_ro)?
                 {
                     let mut issuers_inputs_with_sum = Vec::new();
                     for issuer in issuers {
                         issuers_inputs_with_sum.push((
                             duniter_gva_dbs_reader::find_inputs::find_inputs(
-                                &dbs.bc_db,
+                                &dbs.bc_db_ro,
                                 &dbs.gva_db,
                                 &dbs.txs_mp_db,
                                 SourceAmount::new(
diff --git a/rust-libs/modules/gva/src/queries/uds.rs b/rust-libs/modules/gva/src/queries/uds.rs
index e8252485e42780d5457d7886cd8747891f3831a8..5473f059d13eeb323dce7c3b379c40c9b3c8f5bc 100644
--- a/rust-libs/modules/gva/src/queries/uds.rs
+++ b/rust-libs/modules/gva/src/queries/uds.rs
@@ -32,7 +32,7 @@ impl UdsQuery {
 
         Ok(data
             .dbs_pool
-            .execute(move |dbs| dbs_reader.get_current_ud(&dbs.bc_db))
+            .execute(move |dbs| dbs_reader.get_current_ud(&dbs.bc_db_ro))
             .await??
             .map(|sa| CurrentUdGva {
                 amount: sa.amount(),
@@ -67,18 +67,18 @@ impl UdsQuery {
             .dbs_pool
             .execute(move |dbs| {
                 if let Some(current_block) =
-                    duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db)?
+                    duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db_ro)?
                 {
                     let paged_data = match filter {
                         UdsFilter::All => duniter_gva_dbs_reader::uds_of_pubkey::all_uds_of_pubkey(
-                            &dbs.bc_db,
+                            &dbs.bc_db_ro,
                             &dbs.gva_db,
                             pubkey,
                             pagination,
                         ),
                         UdsFilter::Unspent => {
                             duniter_gva_dbs_reader::uds_of_pubkey::unspent_uds_of_pubkey(
-                                &dbs.bc_db,
+                                &dbs.bc_db_ro,
                                 pubkey,
                                 pagination,
                                 None,
@@ -144,7 +144,7 @@ impl UdsQuery {
         Ok(data
             .dbs_pool
             .execute(move |dbs| {
-                dbs.bc_db.uds_reval().iter(.., |it| {
+                dbs.bc_db_ro.uds_reval().iter(.., |it| {
                     it.map_ok(|(block_number, sa)| RevalUdGva {
                         amount: sa.0.amount(),
                         base: sa.0.base(),
@@ -165,9 +165,9 @@ mod tests {
     #[tokio::test]
     async fn query_current_ud() -> anyhow::Result<()> {
         let mut dbs_reader = MockDbsReader::new();
-        use duniter_dbs::bc_v2::BcV2Db;
+        use duniter_dbs::bc_v2::BcV2DbRo;
         dbs_reader
-            .expect_get_current_ud::<BcV2Db<FileBackend>>()
+            .expect_get_current_ud::<BcV2DbRo<FileBackend>>()
             .times(1)
             .returning(|_| Ok(Some(SourceAmount::with_base0(100))));
         let schema = create_schema(dbs_reader)?;
diff --git a/rust-libs/modules/gva/src/queries/utxos_of_script.rs b/rust-libs/modules/gva/src/queries/utxos_of_script.rs
index 8892ac8ee7380439bc905eb99f40b0cb243af3e4..e9837962b3ee00fe5a37530e40e9dc0f2e390a61 100644
--- a/rust-libs/modules/gva/src/queries/utxos_of_script.rs
+++ b/rust-libs/modules/gva/src/queries/utxos_of_script.rs
@@ -51,7 +51,7 @@ impl UtxosQuery {
             .dbs_pool
             .execute(move |dbs| {
                 if let Some(current_block) =
-                    duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db)?
+                    duniter_dbs_read_ops::get_current_block_meta(&dbs.bc_db_ro)?
                 {
                     let paged_data = duniter_gva_dbs_reader::utxos::find_script_utxos(
                         &dbs.gva_db,