diff --git a/lib/dubp/user-docs/src/documents/certification.rs b/lib/dubp/user-docs/src/documents/certification.rs
index d4b0e4fec508c4a9f92ec6802aa4d6dd84f548e5..407b8a75aa3330903c64292c437f2136c767d901 100644
--- a/lib/dubp/user-docs/src/documents/certification.rs
+++ b/lib/dubp/user-docs/src/documents/certification.rs
@@ -94,20 +94,19 @@ impl TextDocumentParser<Rule> for CertificationDocumentParser {
     fn parse(doc: &str) -> Result<Self::DocumentType, TextDocumentParseError> {
         match DocumentsParser::parse(Rule::cert, doc) {
             Ok(mut cert_pairs) => {
-                let cert_pair = cert_pairs.next().unwrap(); // get and unwrap the `cert` rule; never fails
+                let cert_pair = unwrap!(cert_pairs.next()); // get and unwrap the `cert` rule; never fails
                 Self::from_pest_pair(cert_pair)
             }
             Err(pest_error) => fatal_error!("{}", pest_error), //Err(TextDocumentParseError::PestError()),
         }
     }
     fn from_pest_pair(cert_pair: Pair<Rule>) -> Result<Self::DocumentType, TextDocumentParseError> {
-        let cert_vx_pair = cert_pair.into_inner().next().unwrap(); // get and unwrap the `cert_vX` rule; never fails
+        let cert_vx_pair = unwrap!(cert_pair.into_inner().next()); // get and unwrap the `cert_vX` rule; never fails
 
         match cert_vx_pair.as_rule() {
-            Rule::cert_v10 => Ok(CertificationDocumentParser::from_versioned_pest_pair(
-                10,
-                cert_vx_pair,
-            )?),
+            Rule::cert_v10 => {
+                CertificationDocumentParser::from_versioned_pest_pair(10, cert_vx_pair)
+            }
             _ => Err(TextDocumentParseError::UnexpectedVersion(format!(
                 "{:#?}",
                 cert_vx_pair.as_rule()
diff --git a/lib/dubp/user-docs/src/documents/certification/v10.rs b/lib/dubp/user-docs/src/documents/certification/v10.rs
index 52a36ade4a79312c484ada09b8fd6e313b9ea9d1..c0dbf79a6486a319cd643742494b942d354eda56 100644
--- a/lib/dubp/user-docs/src/documents/certification/v10.rs
+++ b/lib/dubp/user-docs/src/documents/certification/v10.rs
@@ -171,7 +171,7 @@ impl CertificationDocumentV10 {
             match field.as_rule() {
                 Rule::currency => currency = field.as_str(),
                 Rule::pubkey => pubkeys.push(PubKey::Ed25519(
-                    ed25519::PublicKey::from_base58(field.as_str()).unwrap(), // Grammar ensures that we have a base58 string.
+                    unwrap!(ed25519::PublicKey::from_base58(field.as_str())), // Grammar ensures that we have a base58 string.
                 )),
                 Rule::uid => {
                     uid = field.as_str();
@@ -179,16 +179,16 @@ impl CertificationDocumentV10 {
                 Rule::blockstamp => {
                     let mut inner_rules = field.into_inner(); // { integer ~ "-" ~ hash }
 
-                    let block_id: &str = inner_rules.next().unwrap().as_str();
-                    let block_hash: &str = inner_rules.next().unwrap().as_str();
+                    let block_id: &str = unwrap!(inner_rules.next()).as_str();
+                    let block_hash: &str = unwrap!(inner_rules.next()).as_str();
                     blockstamps.push(Blockstamp {
-                        id: BlockNumber(block_id.parse().unwrap()), // Grammar ensures that we have a digits string.
-                        hash: BlockHash(Hash::from_hex(block_hash).unwrap()), // Grammar ensures that we have an hexadecimal string.
+                        id: BlockNumber(unwrap!(block_id.parse())), // Grammar ensures that we have a digits string.
+                        hash: BlockHash(unwrap!(Hash::from_hex(block_hash))), // Grammar ensures that we have an hexadecimal string.
                     });
                 }
                 Rule::ed25519_sig => {
                     sigs.push(Sig::Ed25519(
-                        ed25519::Signature::from_base64(field.as_str()).unwrap(), // Grammar ensures that we have a base64 string.
+                        unwrap!(ed25519::Signature::from_base64(field.as_str())), // Grammar ensures that we have a base64 string.
                     ));
                 }
                 Rule::EOI => (),
@@ -339,34 +339,41 @@ mod tests {
 
     #[test]
     fn generate_real_certification_document() {
-        let seed = Seed32::from_base58("4tNQ7d9pj2Da5wUVoW9mFn7JjuPoowF977au8DdhEjVR").unwrap();
+        let seed = unwrap!(
+            Seed32::from_base58("4tNQ7d9pj2Da5wUVoW9mFn7JjuPoowF977au8DdhEjVR"),
+            "fail to build Seed32"
+        );
         let keypair = ed25519::KeyPairFromSeed32Generator::generate(seed);
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
             SignatorEnum::Ed25519(keypair.generate_signator().expect("fail to gen signator"));
 
-        let sig = Sig::Ed25519(ed25519::Signature::from_base64(
+        let sig = Sig::Ed25519(unwrap!(ed25519::Signature::from_base64(
             "sYbaZp3pP9F/CveT1LPiJXECTBHlNurDXqmBo71N7JX/rvmHw6m/sid9bGdIa8cUq+vDD4DMB/F7r7As1p4rAg==",
-        ).unwrap());
-
-        let target = PubKey::Ed25519(
-            ed25519::PublicKey::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV")
-                .unwrap(),
+        ), "Fail to build Signature"));
+
+        let target = PubKey::Ed25519(unwrap!(
+            ed25519::PublicKey::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV"),
+            "Fail to build PublicKey"
+        ));
+
+        let identity_blockstamp = unwrap!(
+            Blockstamp::from_string(
+                "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+            ),
+            "Fail to build Blockstamp"
         );
 
-        let identity_blockstamp = Blockstamp::from_string(
-            "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
-        )
-        .unwrap();
-
-        let identity_sig = Sig::Ed25519(ed25519::Signature::from_base64(
+        let identity_sig = Sig::Ed25519(unwrap!(ed25519::Signature::from_base64(
             "1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==",
-        ).unwrap());
+        ), "Fail to build Signature"));
 
-        let blockstamp = Blockstamp::from_string(
-            "36-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B865",
-        )
-        .unwrap();
+        let blockstamp = unwrap!(
+            Blockstamp::from_string(
+                "36-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B865",
+            ),
+            "Fail to build Blockstamp"
+        );
 
         let builder = CertificationDocumentV10Builder {
             currency: "duniter_unit_test_currency",
@@ -411,7 +418,8 @@ IdtySignature: SmSweUD4lEMwiZfY8ux9maBjrQQDkC85oMNsin6oSQCPdXG8sFCZ4FisUaWqKsfOl
 CertTimestamp: 167884-0001DFCA28002A8C96575E53B8CEF8317453A7B0BA255542CCF0EC8AB5E99038
 wqZxPEGxLrHGv8VdEIfUGvUcf+tDdNTMXjLzVRCQ4UhlhDRahOMjfcbP7byNYr5OfIl83S1MBxF7VJgu8YasCA==";
 
-        let doc = CertificationDocumentParser::parse(doc).unwrap();
+        let doc = CertificationDocumentParser::parse(doc)
+            .expect("fail to parse test certification document !");
         println!("Doc : {:?}", doc);
         assert!(doc.verify_signatures().is_ok());
         /*assert_eq!(
diff --git a/lib/dubp/user-docs/src/documents/identity.rs b/lib/dubp/user-docs/src/documents/identity.rs
index 1056cec5219dced342929a28ca15ce07408f95d0..74ec431b0647365e764af47a06be3b3c79759b54 100644
--- a/lib/dubp/user-docs/src/documents/identity.rs
+++ b/lib/dubp/user-docs/src/documents/identity.rs
@@ -87,15 +87,15 @@ impl TextDocumentParser<Rule> for IdentityDocumentParser {
 
     fn parse(doc: &str) -> Result<Self::DocumentType, TextDocumentParseError> {
         let mut doc_pairs = DocumentsParser::parse(Rule::idty, doc)?;
-        let idty_pair = doc_pairs.next().unwrap(); // get and unwrap the `idty` rule; never fails
+        let idty_pair = unwrap!(doc_pairs.next()); // get and unwrap the `idty` rule; never fails
         Self::from_pest_pair(idty_pair)
     }
     #[inline]
     fn from_pest_pair(pair: Pair<Rule>) -> Result<Self::DocumentType, TextDocumentParseError> {
-        let idty_vx_pair = pair.into_inner().next().unwrap(); // get and unwrap the `idty_vx` rule; never fails
+        let idty_vx_pair = unwrap!(pair.into_inner().next()); // get and unwrap the `idty_vx` rule; never fails
 
         match idty_vx_pair.as_rule() {
-            Rule::idty_v10 => Ok(Self::from_versioned_pest_pair(10, idty_vx_pair)?),
+            Rule::idty_v10 => Self::from_versioned_pest_pair(10, idty_vx_pair),
             _ => Err(TextDocumentParseError::UnexpectedVersion(format!(
                 "{:#?}",
                 idty_vx_pair.as_rule()
diff --git a/lib/dubp/user-docs/src/documents/identity/v10.rs b/lib/dubp/user-docs/src/documents/identity/v10.rs
index e5ffd676777b2fbae23db99f7d253478f8188c14..24fa6f258a7df35fa4f13ff130278934f1afe5c3 100644
--- a/lib/dubp/user-docs/src/documents/identity/v10.rs
+++ b/lib/dubp/user-docs/src/documents/identity/v10.rs
@@ -104,11 +104,11 @@ impl IdentityDocumentV10 {
                 Rule::blockstamp => {
                     let mut inner_rules = field.into_inner(); // { integer ~ "-" ~ hash }
 
-                    let block_id: &str = inner_rules.next().unwrap().as_str();
-                    let block_hash: &str = inner_rules.next().unwrap().as_str();
+                    let block_id: &str = unwrap!(inner_rules.next()).as_str();
+                    let block_hash: &str = unwrap!(inner_rules.next()).as_str();
                     blockstamp = Blockstamp {
-                        id: BlockNumber(block_id.parse().unwrap()), // Grammar ensures that we have a digits string.
-                        hash: BlockHash(Hash::from_hex(block_hash).unwrap()), // Grammar ensures that we have an hexadecimal string.
+                        id: BlockNumber(unwrap!(block_id.parse())), // Grammar ensures that we have a digits string.
+                        hash: BlockHash(unwrap!(Hash::from_hex(block_hash))), // Grammar ensures that we have an hexadecimal string.
                     };
                 }
                 Rule::ed25519_sig => sig_str = field.as_str(),
@@ -122,12 +122,12 @@ impl IdentityDocumentV10 {
             currency: currency.to_owned(),
             username: uid.to_owned(),
             blockstamp,
-            issuers: vec![PubKey::Ed25519(
-                ed25519::PublicKey::from_base58(pubkey_str).unwrap(),
-            )], // Grammar ensures that we have a base58 string.
-            signatures: vec![Sig::Ed25519(
-                ed25519::Signature::from_base64(sig_str).unwrap(),
-            )], // Grammar ensures that we have a base64 string.
+            issuers: vec![PubKey::Ed25519(unwrap!(ed25519::PublicKey::from_base58(
+                pubkey_str
+            )))], // Grammar ensures that we have a base58 string.
+            signatures: vec![Sig::Ed25519(unwrap!(ed25519::Signature::from_base64(
+                sig_str
+            )))], // Grammar ensures that we have a base64 string.
         })
     }
 }
@@ -272,24 +272,27 @@ mod tests {
 
     #[test]
     fn generate_real_document() {
-        let keypair = ed25519::KeyPairFromSeed32Generator::generate(
-            Seed32::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
-        );
+        let keypair = ed25519::KeyPairFromSeed32Generator::generate(unwrap!(
+            Seed32::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV"),
+            "fail to build Seed32"
+        ));
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
             SignatorEnum::Ed25519(keypair.generate_signator().expect("fail to gen signator"));
 
         let sig = Sig::Ed25519(
-            ed25519::Signature::from_base64(
+            unwrap!(ed25519::Signature::from_base64(
                 "mmFepRsiOjILKnCvEvN3IZScLOfg8+e0JPAl5VkiuTLZRGJKgKhPy8nQlCKbeg0jefQm/2HJ78e/Sj+NMqYLCw==",
             )
-            .unwrap(),
+            , "fail to build Signature"),
         );
 
-        let block = Blockstamp::from_string(
-            "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
-        )
-        .unwrap();
+        let block = unwrap!(
+            Blockstamp::from_string(
+                "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+            ),
+            "fail to build Blockstamp"
+        );
 
         let builder = IdentityDocumentV10Builder {
             currency: "duniter_unit_test_currency",
diff --git a/lib/dubp/user-docs/src/documents/membership.rs b/lib/dubp/user-docs/src/documents/membership.rs
index c011b90a611de1cea51b719c48ee05ac2b57ad03..51b5f2dc9abf22698f4e15af85efceceb1f0ec32 100644
--- a/lib/dubp/user-docs/src/documents/membership.rs
+++ b/lib/dubp/user-docs/src/documents/membership.rs
@@ -115,15 +115,18 @@ impl TextDocumentParser<Rule> for MembershipDocumentParser {
 
     fn parse(doc: &str) -> Result<Self::DocumentType, TextDocumentParseError> {
         let mut ms_pairs = DocumentsParser::parse(Rule::membership, doc)?;
-        let ms_pair = ms_pairs.next().unwrap(); // get and unwrap the `membership` rule; never fails
+        let ms_pair = unwrap!(ms_pairs.next(), "Fail to parse Rule::membership"); // get and unwrap the `membership` rule; never fails
         Self::from_pest_pair(ms_pair)
     }
     #[inline]
     fn from_pest_pair(pair: Pair<Rule>) -> Result<Self::DocumentType, TextDocumentParseError> {
-        let ms_vx_pair = pair.into_inner().next().unwrap(); // get and unwrap the `membership_vX` rule; never fails
+        let ms_vx_pair = unwrap!(
+            pair.into_inner().next(),
+            "Fail to parse Rule::membership_vX"
+        ); // get and unwrap the `membership_vX` rule; never fails
 
         match ms_vx_pair.as_rule() {
-            Rule::membership_v10 => Ok(Self::from_versioned_pest_pair(10, ms_vx_pair)?),
+            Rule::membership_v10 => Self::from_versioned_pest_pair(10, ms_vx_pair),
             _ => Err(TextDocumentParseError::UnexpectedVersion(format!(
                 "{:#?}",
                 ms_vx_pair.as_rule()
diff --git a/lib/dubp/user-docs/src/documents/membership/v10.rs b/lib/dubp/user-docs/src/documents/membership/v10.rs
index 4599a568d5f7a3855e95a06cea8bea820a1ae8f2..ab20cf58a53f2947486f022a4714852fcb9ed477 100644
--- a/lib/dubp/user-docs/src/documents/membership/v10.rs
+++ b/lib/dubp/user-docs/src/documents/membership/v10.rs
@@ -161,11 +161,11 @@ impl MembershipDocumentV10 {
                 Rule::blockstamp => {
                     let mut inner_rules = field.into_inner(); // { integer ~ "-" ~ hash }
 
-                    let block_id: &str = inner_rules.next().unwrap().as_str();
-                    let block_hash: &str = inner_rules.next().unwrap().as_str();
+                    let block_id: &str = unwrap!(inner_rules.next()).as_str();
+                    let block_hash: &str = unwrap!(inner_rules.next()).as_str();
                     blockstamps.push(Blockstamp {
-                        id: BlockNumber(block_id.parse().unwrap()), // Grammar ensures that we have a digits string.
-                        hash: BlockHash(Hash::from_hex(block_hash).unwrap()), // Grammar ensures that we have an hexadecimal string.
+                        id: BlockNumber(unwrap!(block_id.parse())), // Grammar ensures that we have a digits string.
+                        hash: BlockHash(unwrap!(Hash::from_hex(block_hash))), // Grammar ensures that we have an hexadecimal string.
                     });
                 }
                 Rule::ed25519_sig => sig_str = field.as_str(),
@@ -176,17 +176,17 @@ impl MembershipDocumentV10 {
 
         Ok(MembershipDocumentV10 {
             text: Some(doc.to_owned()),
-            issuers: vec![PubKey::Ed25519(
-                ed25519::PublicKey::from_base58(pubkey_str).unwrap(),
-            )], // Grammar ensures that we have a base58 string.
+            issuers: vec![PubKey::Ed25519(unwrap!(ed25519::PublicKey::from_base58(
+                pubkey_str
+            )))], // Grammar ensures that we have a base58 string.
             currency: currency.to_owned(),
             blockstamp: blockstamps[0],
             membership,
             identity_username: uid.to_owned(),
             identity_blockstamp: blockstamps[1],
-            signatures: vec![Sig::Ed25519(
-                ed25519::Signature::from_base64(sig_str).unwrap(),
-            )], // Grammar ensures that we have a base64 string.
+            signatures: vec![Sig::Ed25519(unwrap!(ed25519::Signature::from_base64(
+                sig_str
+            )))], // Grammar ensures that we have a base64 string.
         })
     }
 }
@@ -335,24 +335,27 @@ mod tests {
 
     #[test]
     fn generate_real_document() {
-        let keypair = ed25519::KeyPairFromSeed32Generator::generate(
-            Seed32::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
-        );
+        let keypair = ed25519::KeyPairFromSeed32Generator::generate(unwrap!(
+            Seed32::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV"),
+            "fail to build Seed32"
+        ));
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
             SignatorEnum::Ed25519(keypair.generate_signator().expect("fail to gen signator"));
 
         let sig = Sig::Ed25519(
-            ed25519::Signature::from_base64(
+            unwrap!(ed25519::Signature::from_base64(
                 "cUgoc8AI+Tae/AZmRfTnW+xq3XFtmYoUi2LXlmXr8/7LaXiUccQb8+Ds1nZoBp/8+t031HMwqAUpVIqww2FGCg==",
             )
-            .unwrap(),
+            , "fail to build Signature"),
         );
 
-        let block = Blockstamp::from_string(
-            "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
-        )
-        .unwrap();
+        let block = unwrap!(
+            Blockstamp::from_string(
+                "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+            ),
+            "fail to build Blockstamp"
+        );
 
         let builder = MembershipDocumentV10Builder {
             currency: "duniter_unit_test_currency",
@@ -394,7 +397,8 @@ UserID: tic
 CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw==";
 
-        let doc = MembershipDocumentParser::parse(doc).unwrap();
+        let doc =
+            MembershipDocumentParser::parse(doc).expect("fail to parse test membership document !");
         println!("Doc : {:?}", doc);
         assert!(doc.verify_signatures().is_ok());
         assert_eq!(
diff --git a/lib/dubp/user-docs/src/documents/mod.rs b/lib/dubp/user-docs/src/documents/mod.rs
index 8497715da6d52cb77062d6fc6908816aca1eee77..dca2bb7a89006dba91b64e01249563819c67f80e 100644
--- a/lib/dubp/user-docs/src/documents/mod.rs
+++ b/lib/dubp/user-docs/src/documents/mod.rs
@@ -25,6 +25,7 @@ use dubp_common_doc::traits::ToStringObject;
 use durs_common_tools::fatal_error;
 use pest::iterators::Pair;
 use pest::Parser;
+use unwrap::unwrap;
 
 pub mod certification;
 pub mod identity;
@@ -99,16 +100,16 @@ impl TextDocumentParser<Rule> for UserDocumentDUBP {
 
     fn parse(doc: &str) -> Result<UserDocumentDUBP, TextDocumentParseError> {
         match DocumentsParser::parse(Rule::document, doc) {
-            Ok(mut doc_pairs) => Ok(UserDocumentDUBP::from_pest_pair(doc_pairs.next().unwrap())?), // get and unwrap the `document` rule; never fails
+            Ok(mut doc_pairs) => UserDocumentDUBP::from_pest_pair(unwrap!(doc_pairs.next())), // get and unwrap the `document` rule; never fails
             Err(pest_error) => Err(pest_error.into()),
         }
     }
     #[inline]
     fn from_pest_pair(pair: Pair<Rule>) -> Result<Self::DocumentType, TextDocumentParseError> {
-        let doc_vx_pair = pair.into_inner().next().unwrap(); // get and unwrap the `document_vX` rule; never fails
+        let doc_vx_pair = unwrap!(pair.into_inner().next()); // get and unwrap the `document_vX` rule; never fails
 
         match doc_vx_pair.as_rule() {
-            Rule::document_v10 => Ok(UserDocumentDUBP::from_versioned_pest_pair(10, doc_vx_pair)?),
+            Rule::document_v10 => UserDocumentDUBP::from_versioned_pest_pair(10, doc_vx_pair),
             _ => fatal_error!("unexpected rule: {:?}", doc_vx_pair.as_rule()), // Grammar ensures that we never reach this line
         }
     }
@@ -131,7 +132,7 @@ impl UserDocumentDUBP {
     pub fn from_pest_pair_v10(
         pair: Pair<Rule>,
     ) -> Result<UserDocumentDUBP, TextDocumentParseError> {
-        let doc_type_v10_pair = pair.into_inner().next().unwrap(); // get and unwrap the `{DOC_TYPE}_v10` rule; never fails
+        let doc_type_v10_pair = unwrap!(pair.into_inner().next()); // get and unwrap the `{DOC_TYPE}_v10` rule; never fails
 
         match doc_type_v10_pair.as_rule() {
             Rule::idty_v10 => Ok(UserDocumentDUBP::Identity(IdentityDocument::V10(
@@ -158,16 +159,11 @@ impl UserDocumentDUBP {
 
 #[cfg(test)]
 mod tests {
+    use super::*;
     use dubp_common_doc::parser::TextDocumentParser;
     use dubp_common_doc::traits::Document;
     use dubp_common_doc::Blockstamp;
 
-    use super::certification::CertificationDocumentParser;
-    use super::identity::IdentityDocumentParser;
-    use super::membership::MembershipDocumentParser;
-    use super::revocation::RevocationDocumentParser;
-    use super::transaction::TransactionDocumentParser;
-
     use dup_crypto::keys::*;
 
     // simple text document for signature testing
@@ -217,32 +213,32 @@ Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 ";
 
         // good pair
-        let issuer1 = PubKey::Ed25519(
-            ed25519::PublicKey::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV")
-                .unwrap(),
-        );
+        let issuer1 = PubKey::Ed25519(unwrap!(
+            ed25519::PublicKey::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV"),
+            "Fail to parse PublicKey from base58"
+        ));
 
-        let sig1 = Sig::Ed25519(
+        let sig1 = Sig::Ed25519(unwrap!(
             ed25519::Signature::from_base64(
                 "1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMM\
                  mQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==",
-            )
-            .unwrap(),
-        );
+            ),
+            "Fail to parse Signature from base64"
+        ));
 
         // incorrect pair
-        let issuer2 = PubKey::Ed25519(
-            ed25519::PublicKey::from_base58("DNann1Lh55eZMEDXeYt32bzHbA3NJR46DeQYCS2qQdLV")
-                .unwrap(),
-        );
+        let issuer2 = PubKey::Ed25519(unwrap!(
+            ed25519::PublicKey::from_base58("DNann1Lh55eZMEDXeYt32bzHbA3NJR46DeQYCS2qQdLV"),
+            "Fail to parse PublicKey from base58"
+        ));
 
-        let sig2 = Sig::Ed25519(
+        let sig2 = Sig::Ed25519(unwrap!(
             ed25519::Signature::from_base64(
                 "1eubHHbuNfilHHH0G2bI30iZzebQ2cQ1PC7uPAw08FGMM\
                  mQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==",
-            )
-            .unwrap(),
-        );
+            ),
+            "Fail to parse Signature from base64"
+        ));
 
         {
             let doc = PlainTextDocument {
@@ -317,7 +313,10 @@ UniqueID: elois
 Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 Ydnclvw76/JHcKSmU9kl9Ie0ne5/X8NYOqPqbGnufIK3eEPRYYdEYaQh+zffuFhbtIRjv6m/DkVLH5cLy/IyAg==";
 
-        let doc = IdentityDocumentParser::parse(text).unwrap();
+        let doc = unwrap!(
+            IdentityDocumentParser::parse(text),
+            "Fail to parse IdentityDocument"
+        );
         println!("Doc : {:?}", doc);
         assert!(doc.verify_signatures().is_ok());
     }
@@ -334,7 +333,10 @@ UserID: elois
 CertTS: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 FFeyrvYio9uYwY5aMcDGswZPNjGLrl8THn9l3EPKSNySD3SDSHjCljSfFEwb87sroyzJQoVzPwER0sW/cbZMDg==";
 
-        let doc = MembershipDocumentParser::parse(text).unwrap();
+        let doc = unwrap!(
+            MembershipDocumentParser::parse(text),
+            "Fail to parse MembershipDocument"
+        );
         println!("Doc : {:?}", doc);
         assert!(doc.verify_signatures().is_ok());
     }
@@ -352,7 +354,10 @@ IdtySignature: DjeipIeb/RF0tpVCnVnuw6mH1iLJHIsDfPGLR90Twy3PeoaDz6Yzhc/UjLWqHCi5Y
 CertTimestamp: 99956-00000472758331FDA8388E30E50CA04736CBFD3B7C21F34E74707107794B56DD
 Hkps1QU4HxIcNXKT8YmprYTVByBhPP1U2tIM7Z8wENzLKIWAvQClkAvBE7pW9dnVa18sJIJhVZUcRrPAZfmjBA==";
 
-        let doc = CertificationDocumentParser::parse(text).unwrap();
+        let doc = unwrap!(
+            CertificationDocumentParser::parse(text),
+            "Fail to parse CertificationDocument"
+        );
         println!("Doc : {:?}", doc);
         assert!(doc.verify_signatures().is_ok());
     }
@@ -368,7 +373,10 @@ IdtyTimestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B85
 IdtySignature: 1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==
 XXOgI++6qpY9O31ml/FcfbXCE6aixIrgkT5jL7kBle3YOMr+8wrp7Rt+z9hDVjrNfYX2gpeJsuMNfG4T/fzVDQ==";
 
-        let doc = RevocationDocumentParser::parse(text).unwrap();
+        let doc = unwrap!(
+            RevocationDocumentParser::parse(text),
+            "Fail to parse RevocationDocument"
+        );
         println!("Doc : {:?}", doc);
         assert!(doc.verify_signatures().is_ok());
     }
@@ -393,7 +401,10 @@ Outputs:
 Comment: c est pour 2 mois d adhesion ressourcerie
 lnpuFsIymgz7qhKF/GsZ3n3W8ZauAAfWmT4W0iJQBLKJK2GFkesLWeMj/+GBfjD6kdkjreg9M6VfkwIZH+hCCQ==";
 
-        let doc = TransactionDocumentParser::parse(text).unwrap();
+        let doc = unwrap!(
+            TransactionDocumentParser::parse(text),
+            "Fail to parse TransactionDocument"
+        );
         println!("Doc : {:?}", doc);
         assert!(doc.verify_signatures().is_ok());
     }
diff --git a/lib/dubp/user-docs/src/documents/revocation.rs b/lib/dubp/user-docs/src/documents/revocation.rs
index bc4826bebb3a3e0b9e4173b76f3ec97973e4c04b..543b76e3aafe4032c3f9658a62f8150f42bdc377 100644
--- a/lib/dubp/user-docs/src/documents/revocation.rs
+++ b/lib/dubp/user-docs/src/documents/revocation.rs
@@ -102,12 +102,12 @@ impl TextDocumentParser<Rule> for RevocationDocumentParser {
 
     fn parse(doc: &str) -> Result<Self::DocumentType, TextDocumentParseError> {
         let mut revoc_pairs = DocumentsParser::parse(Rule::revoc, doc)?;
-        let revoc_pair = revoc_pairs.next().unwrap(); // get and unwrap the `revoc` rule; never fails
+        let revoc_pair = unwrap!(revoc_pairs.next(), "Fail to parse Rule::revoc"); // get and unwrap the `revoc` rule; never fails
         Self::from_pest_pair(revoc_pair)
     }
     #[inline]
     fn from_pest_pair(pair: Pair<Rule>) -> Result<Self::DocumentType, TextDocumentParseError> {
-        let revoc_vx_pair = pair.into_inner().next().unwrap(); // get and unwrap the `revoc_vX` rule; never fails
+        let revoc_vx_pair = unwrap!(pair.into_inner().next(), "Fail to parse Rule::revoc_vX"); // get and unwrap the `revoc_vX` rule; never fails
 
         match revoc_vx_pair.as_rule() {
             Rule::revoc_v10 => Self::from_versioned_pest_pair(10, revoc_vx_pair),
diff --git a/lib/dubp/user-docs/src/documents/revocation/v10.rs b/lib/dubp/user-docs/src/documents/revocation/v10.rs
index 5809e977fbb2fc5e38be9095a587e239188f307b..8f5dffa4d4c4f32ac8334f3c182da1328429084e 100644
--- a/lib/dubp/user-docs/src/documents/revocation/v10.rs
+++ b/lib/dubp/user-docs/src/documents/revocation/v10.rs
@@ -154,7 +154,7 @@ impl RevocationDocumentV10 {
             match field.as_rule() {
                 Rule::currency => currency = field.as_str(),
                 Rule::pubkey => pubkeys.push(PubKey::Ed25519(
-                    ed25519::PublicKey::from_base58(field.as_str()).unwrap(), // Grammar ensures that we have a base58 string.
+                    unwrap!(ed25519::PublicKey::from_base58(field.as_str())), // Grammar ensures that we have a base58 string.
                 )),
                 Rule::uid => {
                     uid = field.as_str();
@@ -162,16 +162,16 @@ impl RevocationDocumentV10 {
                 Rule::blockstamp => {
                     let mut inner_rules = field.into_inner(); // { integer ~ "-" ~ hash }
 
-                    let block_id: &str = inner_rules.next().unwrap().as_str();
-                    let block_hash: &str = inner_rules.next().unwrap().as_str();
+                    let block_id: &str = unwrap!(inner_rules.next()).as_str();
+                    let block_hash: &str = unwrap!(inner_rules.next()).as_str();
                     blockstamps.push(Blockstamp {
-                        id: BlockNumber(block_id.parse().unwrap()), // Grammar ensures that we have a digits string.
-                        hash: BlockHash(Hash::from_hex(block_hash).unwrap()), // Grammar ensures that we have an hexadecimal string.
+                        id: BlockNumber(unwrap!(block_id.parse())), // Grammar ensures that we have a digits string.
+                        hash: BlockHash(unwrap!(Hash::from_hex(block_hash))), // Grammar ensures that we have an hexadecimal string.
                     });
                 }
                 Rule::ed25519_sig => {
                     sigs.push(Sig::Ed25519(
-                        ed25519::Signature::from_base64(field.as_str()).unwrap(), // Grammar ensures that we have a base64 string.
+                        unwrap!(ed25519::Signature::from_base64(field.as_str())), // Grammar ensures that we have a base64 string.
                     ));
                 }
                 Rule::EOI => (),
@@ -303,25 +303,28 @@ mod tests {
 
     #[test]
     fn generate_real_document() {
-        let keypair = ed25519::KeyPairFromSeed32Generator::generate(
-            Seed32::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
-        );
+        let keypair = ed25519::KeyPairFromSeed32Generator::generate(unwrap!(
+            Seed32::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV"),
+            "fail to build Seed32"
+        ));
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
             SignatorEnum::Ed25519(keypair.generate_signator().expect("fail to gen signator"));
 
-        let sig = Sig::Ed25519(ed25519::Signature::from_base64(
+        let sig = Sig::Ed25519(unwrap!(ed25519::Signature::from_base64(
             "gBD2mCr7E/tW8u3wqVK7IWtQB6IKxddg13UMl9ypVsv/VhqhAFTBba9BwoK5t6H9eqF1d+4sCB3WY2eJ/yuUAg==",
-        ).unwrap());
+        ), "Fail to build Signature"));
 
-        let identity_blockstamp = Blockstamp::from_string(
-            "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
-        )
-        .unwrap();
+        let identity_blockstamp = unwrap!(
+            Blockstamp::from_string(
+                "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+            ),
+            "Fail to build Blockstamp"
+        );
 
-        let identity_sig = Sig::Ed25519(ed25519::Signature::from_base64(
+        let identity_sig = Sig::Ed25519(unwrap!(ed25519::Signature::from_base64(
             "1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==",
-        ).unwrap());
+        ), "Fail to build Signature"));
 
         let builder = RevocationDocumentV10Builder {
             currency: "g1",
@@ -362,7 +365,8 @@ IdtyTimestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B85
 IdtySignature: 1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==
 XXOgI++6qpY9O31ml/FcfbXCE6aixIrgkT5jL7kBle3YOMr+8wrp7Rt+z9hDVjrNfYX2gpeJsuMNfG4T/fzVDQ==";
 
-        let doc = RevocationDocumentParser::parse(doc).unwrap();
+        let doc =
+            RevocationDocumentParser::parse(doc).expect("fail to parse test revocation document !");
         println!("Doc : {:?}", doc);
         assert!(doc.verify_signatures().is_ok())
     }
diff --git a/lib/dubp/user-docs/src/documents/transaction.rs b/lib/dubp/user-docs/src/documents/transaction.rs
index cffe0763f7260fc5f78cbbb9483e4fa5ca16598d..ea2d33a57ab86500179077b48966c59eddb16cb8 100644
--- a/lib/dubp/user-docs/src/documents/transaction.rs
+++ b/lib/dubp/user-docs/src/documents/transaction.rs
@@ -81,29 +81,28 @@ impl ToString for TransactionInput {
 
 impl TransactionInput {
     fn from_pest_pair(mut pairs: Pairs<Rule>) -> TransactionInput {
-        let tx_input_type_pair = pairs.next().unwrap();
+        let tx_input_type_pair = unwrap!(pairs.next());
         match tx_input_type_pair.as_rule() {
             Rule::tx_input_du => {
                 let mut inner_rules = tx_input_type_pair.into_inner(); // ${ tx_amount ~ ":" ~ tx_amount_base ~ ":D:" ~ pubkey ~ ":" ~ du_block_id }
 
                 TransactionInput::D(
-                    TxAmount(inner_rules.next().unwrap().as_str().parse().unwrap()),
-                    TxBase(inner_rules.next().unwrap().as_str().parse().unwrap()),
-                    PubKey::Ed25519(
-                        ed25519::PublicKey::from_base58(inner_rules.next().unwrap().as_str())
-                            .unwrap(),
-                    ),
-                    BlockNumber(inner_rules.next().unwrap().as_str().parse().unwrap()),
+                    TxAmount(unwrap!(unwrap!(inner_rules.next()).as_str().parse())),
+                    TxBase(unwrap!(unwrap!(inner_rules.next()).as_str().parse())),
+                    PubKey::Ed25519(unwrap!(ed25519::PublicKey::from_base58(
+                        unwrap!(inner_rules.next()).as_str()
+                    ))),
+                    BlockNumber(unwrap!(unwrap!(inner_rules.next()).as_str().parse())),
                 )
             }
             Rule::tx_input_tx => {
                 let mut inner_rules = tx_input_type_pair.into_inner(); // ${ tx_amount ~ ":" ~ tx_amount_base ~ ":D:" ~ pubkey ~ ":" ~ du_block_id }
 
                 TransactionInput::T(
-                    TxAmount(inner_rules.next().unwrap().as_str().parse().unwrap()),
-                    TxBase(inner_rules.next().unwrap().as_str().parse().unwrap()),
-                    Hash::from_hex(inner_rules.next().unwrap().as_str()).unwrap(),
-                    OutputIndex(inner_rules.next().unwrap().as_str().parse().unwrap()),
+                    TxAmount(unwrap!(unwrap!(inner_rules.next()).as_str().parse())),
+                    TxBase(unwrap!(unwrap!(inner_rules.next()).as_str().parse())),
+                    unwrap!(Hash::from_hex(unwrap!(inner_rules.next()).as_str())),
+                    OutputIndex(unwrap!(unwrap!(inner_rules.next()).as_str().parse())),
                 )
             }
             _ => fatal_error!("unexpected rule: {:?}", tx_input_type_pair.as_rule()), // Grammar ensures that we never reach this line
@@ -117,7 +116,7 @@ impl FromStr for TransactionInput {
     fn from_str(source: &str) -> Result<Self, Self::Err> {
         match DocumentsParser::parse(Rule::tx_input, source) {
             Ok(mut pairs) => Ok(TransactionInput::from_pest_pair(
-                pairs.next().unwrap().into_inner(),
+                unwrap!(pairs.next()).into_inner(),
             )),
             Err(_) => Err(TextDocumentParseError::InvalidInnerFormat(
                 "Invalid unlocks !".to_owned(),
@@ -211,18 +210,16 @@ impl TransactionInputUnlocks {
         for unlock_field in pairs {
             // ${ input_index ~ ":" ~ unlock_cond ~ (" " ~ unlock_cond)* }
             match unlock_field.as_rule() {
-                Rule::input_index => input_index = unlock_field.as_str().parse().unwrap(),
-                Rule::unlock_sig => unlock_conds.push(TransactionUnlockProof::Sig(
-                    unlock_field
+                Rule::input_index => input_index = unwrap!(unlock_field.as_str().parse()),
+                Rule::unlock_sig => {
+                    unlock_conds.push(TransactionUnlockProof::Sig(unwrap!(unwrap!(unlock_field
                         .into_inner()
-                        .next()
-                        .unwrap()
-                        .as_str()
-                        .parse()
-                        .unwrap(),
-                )),
+                        .next())
+                    .as_str()
+                    .parse())))
+                }
                 Rule::unlock_xhx => unlock_conds.push(TransactionUnlockProof::Xhx(String::from(
-                    unlock_field.into_inner().next().unwrap().as_str(),
+                    unwrap!(unlock_field.into_inner().next()).as_str(),
                 ))),
                 _ => fatal_error!("unexpected rule: {:?}", unlock_field.as_rule()), // Grammar ensures that we never reach this line
             }
@@ -240,7 +237,7 @@ impl FromStr for TransactionInputUnlocks {
     fn from_str(source: &str) -> Result<Self, Self::Err> {
         match DocumentsParser::parse(Rule::tx_unlock, source) {
             Ok(mut pairs) => Ok(TransactionInputUnlocks::from_pest_pair(
-                pairs.next().unwrap().into_inner(),
+                unwrap!(pairs.next()).into_inner(),
             )),
             Err(_) => Err(TextDocumentParseError::InvalidInnerFormat(
                 "Invalid unlocks !".to_owned(),
@@ -331,8 +328,8 @@ macro_rules! utxo_conds_wrap_op_chain {
                     Box::new(conds_subgroups[1].clone()),
                 )
             } else if conds_subgroups.len() > 2 {
-                let last_subgroup = conds_subgroups.pop().unwrap();
-                let previous_last_subgroup = conds_subgroups.pop().unwrap();
+                let last_subgroup = unwrap!(conds_subgroups.pop());
+                let previous_last_subgroup = unwrap!(conds_subgroups.pop());
                 conds_subgroups.push($op(
                     Box::new(previous_last_subgroup),
                     Box::new(last_subgroup),
@@ -373,23 +370,26 @@ impl UTXOConditionsGroup {
                     &mut conds_subgroups,
                 )))
             }
-            Rule::output_cond_sig => {
-                UTXOConditionsGroup::Single(TransactionOutputCondition::Sig(PubKey::Ed25519(
-                    ed25519::PublicKey::from_base58(pair.into_inner().next().unwrap().as_str())
-                        .unwrap(),
-                )))
-            }
-            Rule::output_cond_xhx => UTXOConditionsGroup::Single(TransactionOutputCondition::Xhx(
-                Hash::from_hex(pair.into_inner().next().unwrap().as_str()).unwrap(),
+            Rule::output_cond_sig => UTXOConditionsGroup::Single(TransactionOutputCondition::Sig(
+                PubKey::Ed25519(unwrap!(ed25519::PublicKey::from_base58(
+                    unwrap!(pair.into_inner().next()).as_str()
+                ))),
             )),
-            Rule::output_cond_csv => UTXOConditionsGroup::Single(TransactionOutputCondition::Csv(
-                pair.into_inner().next().unwrap().as_str().parse().unwrap(),
+            Rule::output_cond_xhx => UTXOConditionsGroup::Single(TransactionOutputCondition::Xhx(
+                unwrap!(Hash::from_hex(unwrap!(pair.into_inner().next()).as_str())),
             )),
-            Rule::output_cond_cltv => {
-                UTXOConditionsGroup::Single(TransactionOutputCondition::Cltv(
-                    pair.into_inner().next().unwrap().as_str().parse().unwrap(),
-                ))
+            Rule::output_cond_csv => {
+                UTXOConditionsGroup::Single(TransactionOutputCondition::Csv(unwrap!(unwrap!(pair
+                    .into_inner()
+                    .next())
+                .as_str()
+                .parse())))
             }
+            Rule::output_cond_cltv => UTXOConditionsGroup::Single(
+                TransactionOutputCondition::Cltv(unwrap!(unwrap!(pair.into_inner().next())
+                    .as_str()
+                    .parse())),
+            ),
             _ => fatal_error!("unexpected rule: {:?}", pair.as_rule()), // Grammar ensures that we never reach this line
         }
     }
@@ -451,9 +451,9 @@ impl ToString for TransactionOutput {
 
 impl TransactionOutput {
     fn from_pest_pair(mut utxo_pairs: Pairs<Rule>) -> TransactionOutput {
-        let amount = TxAmount(utxo_pairs.next().unwrap().as_str().parse().unwrap());
-        let base = TxBase(utxo_pairs.next().unwrap().as_str().parse().unwrap());
-        let conditions_pairs = utxo_pairs.next().unwrap();
+        let amount = TxAmount(unwrap!(unwrap!(utxo_pairs.next()).as_str().parse()));
+        let base = TxBase(unwrap!(unwrap!(utxo_pairs.next()).as_str().parse()));
+        let conditions_pairs = unwrap!(utxo_pairs.next());
         let conditions_origin_str = conditions_pairs.as_str();
         TransactionOutput {
             amount,
@@ -490,14 +490,14 @@ impl FromStr for TransactionOutput {
         match DocumentsParser::parse(Rule::tx_output, &str_to_parse) {
             Ok(mut utxo_pairs) => {
                 let mut output =
-                    TransactionOutput::from_pest_pair(utxo_pairs.next().unwrap().into_inner());
+                    TransactionOutput::from_pest_pair(unwrap!(utxo_pairs.next()).into_inner());
                 output.conditions.origin_str = conditions_origin_str.map(ToString::to_string);
                 Ok(output)
             }
             Err(_) => match DocumentsParser::parse(Rule::tx_output, source) {
                 Ok(mut utxo_pairs) => {
                     let mut output =
-                        TransactionOutput::from_pest_pair(utxo_pairs.next().unwrap().into_inner());
+                        TransactionOutput::from_pest_pair(unwrap!(utxo_pairs.next()).into_inner());
                     output.conditions.origin_str = conditions_origin_str.map(ToString::to_string);
                     Ok(output)
                 }
@@ -667,16 +667,16 @@ impl TransactionDocument {
                 Rule::blockstamp => {
                     let mut inner_rules = field.into_inner(); // ${ block_id ~ "-" ~ hash }
 
-                    let block_id: &str = inner_rules.next().unwrap().as_str();
-                    let block_hash: &str = inner_rules.next().unwrap().as_str();
+                    let block_id: &str = unwrap!(inner_rules.next()).as_str();
+                    let block_hash: &str = unwrap!(inner_rules.next()).as_str();
                     blockstamp = Blockstamp {
-                        id: BlockNumber(block_id.parse().unwrap()), // Grammar ensures that we have a digits string.
-                        hash: BlockHash(Hash::from_hex(block_hash).unwrap()), // Grammar ensures that we have an hexadecimal string.
+                        id: BlockNumber(unwrap!(block_id.parse())), // Grammar ensures that we have a digits string.
+                        hash: BlockHash(unwrap!(Hash::from_hex(block_hash))), // Grammar ensures that we have an hexadecimal string.
                     };
                 }
-                Rule::tx_locktime => locktime = field.as_str().parse().unwrap(), // Grammar ensures that we have digits characters.
+                Rule::tx_locktime => locktime = unwrap!(field.as_str().parse()), // Grammar ensures that we have digits characters.
                 Rule::pubkey => issuers.push(PubKey::Ed25519(
-                    ed25519::PublicKey::from_base58(field.as_str()).unwrap(), // Grammar ensures that we have a base58 string.
+                    unwrap!(ed25519::PublicKey::from_base58(field.as_str())), // Grammar ensures that we have a base58 string.
                 )),
                 Rule::tx_input => inputs.push(TransactionInput::from_pest_pair(field.into_inner())),
                 Rule::tx_unlock => {
@@ -688,7 +688,7 @@ impl TransactionDocument {
                 Rule::tx_comment => comment = field.as_str(),
                 Rule::ed25519_sig => {
                     sigs.push(Sig::Ed25519(
-                        ed25519::Signature::from_base64(field.as_str()).unwrap(), // Grammar ensures that we have a base64 string.
+                        unwrap!(ed25519::Signature::from_base64(field.as_str())), // Grammar ensures that we have a base64 string.
                     ));
                 }
                 Rule::EOI => (),
@@ -915,15 +915,15 @@ impl TextDocumentParser<Rule> for TransactionDocumentParser {
 
     fn parse(doc: &str) -> Result<Self::DocumentType, TextDocumentParseError> {
         let mut tx_pairs = DocumentsParser::parse(Rule::tx, doc)?;
-        let tx_pair = tx_pairs.next().unwrap(); // get and unwrap the `tx` rule; never fails
+        let tx_pair = unwrap!(tx_pairs.next()); // get and unwrap the `tx` rule; never fails
         Self::from_pest_pair(tx_pair)
     }
     #[inline]
     fn from_pest_pair(pair: Pair<Rule>) -> Result<Self::DocumentType, TextDocumentParseError> {
-        let tx_vx_pair = pair.into_inner().next().unwrap(); // get and unwrap the `tx_vX` rule; never fails
+        let tx_vx_pair = unwrap!(pair.into_inner().next()); // get and unwrap the `tx_vX` rule; never fails
 
         match tx_vx_pair.as_rule() {
-            Rule::tx_v10 => Ok(TransactionDocument::from_pest_pair(tx_vx_pair)?),
+            Rule::tx_v10 => TransactionDocument::from_pest_pair(tx_vx_pair),
             _ => Err(TextDocumentParseError::UnexpectedRule(format!(
                 "{:#?}",
                 tx_vx_pair.as_rule()
@@ -952,21 +952,24 @@ mod tests {
 
     #[test]
     fn generate_real_document() {
-        let keypair = ed25519::KeyPairFromSeed32Generator::generate(
-            Seed32::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
-        );
+        let keypair = ed25519::KeyPairFromSeed32Generator::generate(unwrap!(
+            Seed32::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV"),
+            "Fail to parse Seed32"
+        ));
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
             SignatorEnum::Ed25519(keypair.generate_signator().expect("fail to gen signator"));
 
-        let sig = Sig::Ed25519(ed25519::Signature::from_base64(
+        let sig = Sig::Ed25519(unwrap!(ed25519::Signature::from_base64(
             "cq86RugQlqAEyS8zFkB9o0PlWPSb+a6D/MEnLe8j+okyFYf/WzI6pFiBkQ9PSOVn5I0dwzVXg7Q4N1apMWeGAg==",
-        ).unwrap());
+        ), "Fail to parse Signature"));
 
-        let block = Blockstamp::from_string(
-            "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
-        )
-        .unwrap();
+        let block = unwrap!(
+            Blockstamp::from_string(
+                "0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
+            ),
+            "Fail to parse blockstamp"
+        );
 
         let builder = TransactionDocumentBuilder {
             currency: "duniter_unit_test_currency",
@@ -976,10 +979,10 @@ mod tests {
             inputs: &vec![TransactionInput::D(
                 TxAmount(10),
                 TxBase(0),
-                PubKey::Ed25519(
-                    ed25519::PublicKey::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV")
-                        .unwrap(),
-                ),
+                PubKey::Ed25519(unwrap!(
+                    ed25519::PublicKey::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV"),
+                    "Fail to parse PublicKey"
+                )),
                 BlockNumber(0),
             )],
             unlocks: &vec![TransactionInputUnlocks {
@@ -1013,19 +1016,21 @@ mod tests {
 
     #[test]
     fn compute_transaction_hash() {
-        let pubkey = PubKey::Ed25519(
-            ed25519::PublicKey::from_base58("FEkbc4BfJukSWnCU6Hed6dgwwTuPFTVdgz5LpL4iHr9J")
-                .unwrap(),
-        );
+        let pubkey = PubKey::Ed25519(unwrap!(
+            ed25519::PublicKey::from_base58("FEkbc4BfJukSWnCU6Hed6dgwwTuPFTVdgz5LpL4iHr9J"),
+            "Fail to parse PublicKey"
+        ));
 
-        let sig = Sig::Ed25519(ed25519::Signature::from_base64(
+        let sig = Sig::Ed25519(unwrap!(ed25519::Signature::from_base64(
             "XEwKwKF8AI1gWPT7elR4IN+bW3Qn02Dk15TEgrKtY/S2qfZsNaodsLofqHLI24BBwZ5aadpC88ntmjo/UW9oDQ==",
-        ).unwrap());
+        ), "Fail to parse Signature"));
 
-        let block = Blockstamp::from_string(
-            "60-00001FE00410FCD5991EDD18AA7DDF15F4C8393A64FA92A1DB1C1CA2E220128D",
-        )
-        .unwrap();
+        let block = unwrap!(
+            Blockstamp::from_string(
+                "60-00001FE00410FCD5991EDD18AA7DDF15F4C8393A64FA92A1DB1C1CA2E220128D",
+            ),
+            "Fail to parse Blockstamp"
+        );
 
         let builder = TransactionDocumentBuilder {
             currency: "g1",
@@ -1035,8 +1040,12 @@ mod tests {
             inputs: &vec![TransactionInput::T(
                 TxAmount(950),
                 TxBase(0),
-                Hash::from_hex("2CF1ACD8FE8DC93EE39A1D55881C50D87C55892AE8E4DB71D4EBAB3D412AA8FD")
-                    .unwrap(),
+                unwrap!(
+                    Hash::from_hex(
+                        "2CF1ACD8FE8DC93EE39A1D55881C50D87C55892AE8E4DB71D4EBAB3D412AA8FD"
+                    ),
+                    "Fail to parse Hash"
+                ),
                 OutputIndex(1),
             )],
             unlocks: &vec![
diff --git a/lib/dubp/user-docs/src/lib.rs b/lib/dubp/user-docs/src/lib.rs
index 56608e3ed66f5164ccd2b28325c88f4429565e1f..fd680b6193e99586ae7d944c988bedafe84ff64a 100644
--- a/lib/dubp/user-docs/src/lib.rs
+++ b/lib/dubp/user-docs/src/lib.rs
@@ -16,6 +16,8 @@
 //! Implements the Dunitrust Documents Protocol.
 
 #![deny(
+    clippy::option_unwrap_used,
+    clippy::result_unwrap_used,
     missing_debug_implementations,
     missing_copy_implementations,
     trivial_casts,