diff --git a/README.md b/README.md
index 9fd03a656831356502a2ac5fa6d5b6c393151e54..5ba77afbe7d9844f636862f81736eea4426723d8 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
 [![Latest Version](https://img.shields.io/badge/latest-v0.1.1--a1-orange.svg)](https://git.duniter.org/nodes/rust/duniter-rs/tags/v0.1.1-a1)
 [![docs](https://librelois.fr/img/docs-read%20now-green.svg)](https://nodes.duniter.io/rust/duniter-rs/dunitrust/)
 [![build status](https://git.duniter.org/nodes/rust/duniter-rs/badges/dev/build.svg)](https://git.duniter.org/nodes/rust/duniter-rs/commits/dev)
-[![Minimum rustc version](https://img.shields.io/badge/rustc-1.37.0+-yellow.svg)](https://github.com/rust-lang/rust/blob/master/RELEASES.md)
+[![Minimum rustc version](https://img.shields.io/badge/rustc-1.40.0+-yellow.svg)](https://github.com/rust-lang/rust/blob/master/RELEASES.md)
 
 ## What is Duniter
 
diff --git a/lib/dubp/block-doc/src/parser.rs b/lib/dubp/block-doc/src/parser.rs
index e85bffa269123c24fa7d65457bdf910511b553d4..8e8ae54db0168805e5e36d2b4382a30d5a15e2f7 100644
--- a/lib/dubp/block-doc/src/parser.rs
+++ b/lib/dubp/block-doc/src/parser.rs
@@ -73,11 +73,9 @@ pub fn parse_json_block(json_block: &JSONValue<DefaultHasher>) -> Result<BlockDo
             "signature",
         )?)?)],
         hash: Some(BlockHash(Hash::from_hex(get_str(json_block, "hash")?)?)),
-        parameters: if let Some(params) = get_optional_str_not_empty(json_block, "parameters")? {
-            Some(BlockV10Parameters::from_str(params)?)
-        } else {
-            None
-        },
+        parameters: get_optional_str_not_empty(json_block, "parameters")?
+            .map(BlockV10Parameters::from_str)
+            .transpose()?,
         previous_hash: if block_number == 0 {
             None
         } else {
diff --git a/lib/dubp/currency-params/src/db.rs b/lib/dubp/currency-params/src/db.rs
index 5b8baa0771d9ee468644ce6da5f994bc6b52625a..322e80afe6d1543a3553ce5b12e59a325126cb4e 100644
--- a/lib/dubp/currency-params/src/db.rs
+++ b/lib/dubp/currency-params/src/db.rs
@@ -42,11 +42,7 @@ pub fn get_currency_name(
 ) -> Result<Option<CurrencyName>, CurrencyParamsDbError> {
     let db_datas: CurrencyParamsDbDatas = read_currency_params_db(datas_path)?;
 
-    if let Some((currency_name, _genesis_block_params)) = db_datas {
-        Ok(Some(currency_name))
-    } else {
-        Ok(None)
-    }
+    Ok(db_datas.map(|(currency_name, _genesis_block_params)| currency_name))
 }
 
 /// Get currency parameters
@@ -55,16 +51,14 @@ pub fn get_currency_params(
 ) -> Result<Option<(CurrencyName, CurrencyParameters)>, CurrencyParamsDbError> {
     let db_datas: CurrencyParamsDbDatas = read_currency_params_db(datas_path)?;
 
-    if let Some((currency_name, genesis_block_params)) = db_datas {
+    Ok(db_datas.map(|(currency_name, genesis_block_params)| {
         let currency_params = match genesis_block_params {
             GenesisBlockParams::V10(genesis_block_v10_params) => {
                 CurrencyParameters::from((&currency_name, genesis_block_v10_params))
             }
         };
-        Ok(Some((currency_name, currency_params)))
-    } else {
-        Ok(None)
-    }
+        (currency_name, currency_params)
+    }))
 }
 
 fn read_currency_params_db(
diff --git a/lib/dubp/user-docs/src/parsers/transactions.rs b/lib/dubp/user-docs/src/parsers/transactions.rs
index 6902f5d3dd5f2685e3a7a24682e6e3f5911a3903..c9736e998036f5b7379de3b6f6aadd86e97bd187 100644
--- a/lib/dubp/user-docs/src/parsers/transactions.rs
+++ b/lib/dubp/user-docs/src/parsers/transactions.rs
@@ -67,11 +67,9 @@ pub fn parse_json_transaction(
             .map(|i| TransactionOutput::from_str(i))
             .collect::<Result<Vec<TransactionOutput>, TextDocumentParseError>>()?,
         comment: &durs_common_tools::fns::str_escape::unescape_str(get_str(json_tx, "comment")?),
-        hash: if let Some(hash_str) = get_optional_str(json_tx, "hash")? {
-            Some(Hash::from_hex(hash_str)?)
-        } else {
-            None
-        },
+        hash: get_optional_str(json_tx, "hash")?
+            .map(Hash::from_hex)
+            .transpose()?,
     };
 
     Ok(tx_doc_builder.build_with_signature(
diff --git a/lib/modules-lib/bc-db-reader/src/blocks.rs b/lib/modules-lib/bc-db-reader/src/blocks.rs
index 3cf2c7052bcc7f4693673b165ed05eb19ce41535..e013a39031fb739cbcc21c9c967d4e594e2a8542 100644
--- a/lib/modules-lib/bc-db-reader/src/blocks.rs
+++ b/lib/modules-lib/bc-db-reader/src/blocks.rs
@@ -129,13 +129,10 @@ pub fn get_block_hash<DB: BcDbInReadTx>(
     db: &DB,
     block_number: BlockNumber,
 ) -> Result<Option<BlockHash>, DbError> {
-    Ok(
-        if let Some(block) = get_block_in_local_blockchain(db, block_number)? {
-            block.hash()
-        } else {
-            None
-        },
-    )
+    Ok(get_block_in_local_blockchain(db, block_number)?
+        .as_ref()
+        .map(BlockDocument::hash)
+        .flatten())
 }
 
 /// Get block in local blockchain
diff --git a/lib/modules-lib/bc-db-reader/src/blocks/fork_tree.rs b/lib/modules-lib/bc-db-reader/src/blocks/fork_tree.rs
index c8e3b9b6959d4ed8aa066edecf2425e850a1223e..a522a728c479da1a02a98781b32e9ad820c19a5c 100644
--- a/lib/modules-lib/bc-db-reader/src/blocks/fork_tree.rs
+++ b/lib/modules-lib/bc-db-reader/src/blocks/fork_tree.rs
@@ -199,11 +199,7 @@ impl ForkTree {
     /// Get main branch node
     #[inline]
     pub fn get_main_branch_node_id(&self, block_id: BlockNumber) -> Option<TreeNodeId> {
-        if let Some(node_id) = self.main_branch.get(&block_id) {
-            Some(*node_id)
-        } else {
-            None
-        }
+        self.main_branch.get(&block_id).copied()
     }
     /// Get main branch block hash
     #[inline]
diff --git a/lib/modules-lib/bc-db-reader/src/current_metadata.rs b/lib/modules-lib/bc-db-reader/src/current_metadata.rs
index 4e9ecb888ccb780172fdd0d23750b32fd91dfec7..183c822508ecf52e017bed0183f52d9f802b9fd2 100644
--- a/lib/modules-lib/bc-db-reader/src/current_metadata.rs
+++ b/lib/modules-lib/bc-db-reader/src/current_metadata.rs
@@ -80,39 +80,33 @@ pub fn get_db_version<DB: DbReadable>(db: &DB) -> Result<usize, DbError> {
 
 /// Get currency name
 pub fn get_currency_name<DB: BcDbInReadTx>(db: &DB) -> Result<Option<CurrencyName>, DbError> {
-    if let Some(v) = db
-        .db()
+    db.db()
         .get_int_store(CURRENT_METADATA)
         .get(db.r(), CurrentMetaDataKey::CurrencyName.to_u32())?
-    {
-        if let DbValue::Str(curency_name) = v {
-            Ok(Some(CurrencyName(curency_name.to_owned())))
-        } else {
-            Err(DbError::DBCorrupted)
-        }
-    } else {
-        Ok(None)
-    }
+        .map(|v| {
+            if let DbValue::Str(curency_name) = v {
+                Ok(CurrencyName(curency_name.to_owned()))
+            } else {
+                Err(DbError::DBCorrupted)
+            }
+        })
+        .transpose()
 }
 
 /// Get current blockstamp
 pub fn get_current_blockstamp<DB: BcDbInReadTx>(db: &DB) -> Result<Option<Blockstamp>, DbError> {
-    if let Some(v) = db
-        .db()
+    db.db()
         .get_int_store(CURRENT_METADATA)
         .get(db.r(), CurrentMetaDataKey::CurrentBlockstamp.to_u32())?
-    {
-        if let DbValue::Blob(current_blockstamp_bytes) = v {
-            Ok(Some(
-                Blockstamp::from_bytes(current_blockstamp_bytes)
-                    .map_err(|_| DbError::DBCorrupted)?,
-            ))
-        } else {
-            Err(DbError::DBCorrupted)
-        }
-    } else {
-        Ok(None)
-    }
+        .map(|v| {
+            if let DbValue::Blob(current_blockstamp_bytes) = v {
+                Ok(Blockstamp::from_bytes(current_blockstamp_bytes)
+                    .map_err(|_| DbError::DBCorrupted)?)
+            } else {
+                Err(DbError::DBCorrupted)
+            }
+        })
+        .transpose()
 }
 /// Get current common time (also named "blockchain time")
 pub fn get_current_common_time_<DB: BcDbInReadTx>(db: &DB) -> Result<u64, DbError> {
@@ -164,13 +158,12 @@ pub fn get_greatest_wot_id_<DB: BcDbInReadTx>(db: &DB) -> Result<WotId, DbError>
 
 /// Get current UD
 pub fn get_current_ud<DB: BcDbInReadTx>(db: &DB) -> Result<Option<CurrentUdDb>, DbError> {
-    if let Some(v) = db
+    Ok(db
         .db()
         .get_int_store(CURRENT_METADATA)
         .get(db.r(), CurrentMetaDataKey::CurrentUd.to_u32())?
-    {
-        Ok(from_db_value::<CurrentUdDbInternal>(v)?.into())
-    } else {
-        Ok(None)
-    }
+        .map(from_db_value::<CurrentUdDbInternal>)
+        .transpose()?
+        .map(Into::into)
+        .flatten())
 }
diff --git a/lib/modules-lib/bc-db-reader/src/indexes/identities.rs b/lib/modules-lib/bc-db-reader/src/indexes/identities.rs
index 73f85cd6c58ab2bc83ea200af46bef35b67ab5c6..45f9310078f1aba5319b43741f696b17f94e001a 100644
--- a/lib/modules-lib/bc-db-reader/src/indexes/identities.rs
+++ b/lib/modules-lib/bc-db-reader/src/indexes/identities.rs
@@ -140,11 +140,10 @@ pub fn get_identity_by_pubkey<DB: BcDbInReadTx>(
     db: &DB,
     pubkey: &PubKey,
 ) -> Result<Option<IdentityDb>, DbError> {
-    if let Some(wot_id) = get_wot_id(db, pubkey)? {
-        get_identity_by_wot_id(db, wot_id)
-    } else {
-        Ok(None)
-    }
+    Ok(get_wot_id(db, pubkey)?
+        .map(|wot_id| get_identity_by_wot_id(db, wot_id))
+        .transpose()?
+        .flatten())
 }
 
 /// Get identity by pubkey
diff --git a/lib/modules-lib/bc-db-reader/src/indexes/sources.rs b/lib/modules-lib/bc-db-reader/src/indexes/sources.rs
index e3dcc2b40380a39774f1d56438cc9723cd82d410..b721db72b5c8728024633d35caf0c20ecf35d54b 100644
--- a/lib/modules-lib/bc-db-reader/src/indexes/sources.rs
+++ b/lib/modules-lib/bc-db-reader/src/indexes/sources.rs
@@ -131,11 +131,11 @@ pub fn get_utxo_v10<DB: BcDbInReadTx>(
     utxo_id: UniqueIdUTXOv10,
 ) -> Result<Option<TransactionOutput>, DbError> {
     let utxo_id_bytes: Vec<u8> = utxo_id.into();
-    if let Some(v) = db.db().get_store(UTXOS).get(db.r(), &utxo_id_bytes)? {
-        Ok(Some(from_db_value(v)?))
-    } else {
-        Ok(None)
-    }
+    db.db()
+        .get_store(UTXOS)
+        .get(db.r(), &utxo_id_bytes)?
+        .map(from_db_value)
+        .transpose()
 }
 
 /// Get block consumed sources
@@ -143,13 +143,9 @@ pub fn get_block_consumed_sources_<DB: BcDbInReadTx>(
     db: &DB,
     block_number: BlockNumber,
 ) -> Result<Option<HashMap<UniqueIdUTXOv10, TransactionOutput>>, DbError> {
-    if let Some(v) = db
-        .db()
+    db.db()
         .get_int_store(CONSUMED_UTXOS)
         .get(db.r(), block_number.0)?
-    {
-        Ok(Some(from_db_value(v)?))
-    } else {
-        Ok(None)
-    }
+        .map(from_db_value)
+        .transpose()
 }
diff --git a/lib/modules/ws2p/ws2p/src/services/outgoing.rs b/lib/modules/ws2p/ws2p/src/services/outgoing.rs
index 3b5546cbbbd29af7a2f8e8041650207e762c15ef..0e055f80500085bd0cf574fb08572befba28015c 100644
--- a/lib/modules/ws2p/ws2p/src/services/outgoing.rs
+++ b/lib/modules/ws2p/ws2p/src/services/outgoing.rs
@@ -91,13 +91,10 @@ impl WS2POutgoingOrchestrator {
     pub fn connect_to_ws2p_v2_endpoint(
         &self,
         endpoint: &EndpointEnum,
-        remote_node_id: Option<NodeId>,
+        remote_node_id_opt: Option<NodeId>,
     ) -> Result<(), WsError> {
-        let expected_remote_full_id = if let Some(remote_node_id) = remote_node_id {
-            Some(NodeFullId(remote_node_id, endpoint.pubkey()))
-        } else {
-            None
-        };
+        let expected_remote_full_id =
+            remote_node_id_opt.map(|remote_node_id| NodeFullId(remote_node_id, endpoint.pubkey()));
         match controllers::outgoing_connections::connect_to_ws2p_v2_endpoint(
             &self.currency,
             &self.sender,