diff --git a/crates/configuration/src/global_settings.rs b/crates/configuration/src/global_settings.rs
index 45a596b53e4bc97b65cc4f3f20ea346c9443000c..fd89a41c0d3782d51a92aeccf269c4c2fcfc9b3a 100644
--- a/crates/configuration/src/global_settings.rs
+++ b/crates/configuration/src/global_settings.rs
@@ -1,8 +1,12 @@
-use std::{net::IpAddr, str::FromStr};
+use std::{error::Error, net::IpAddr, str::FromStr};
 
 use multiaddr::Multiaddr;
 
-use crate::shared::{helpers::merge_errors, types::Duration};
+use crate::shared::{
+    errors::FieldError,
+    helpers::{merge_errors, merge_errors_vecs},
+    types::Duration,
+};
 
 /// Global settings applied to an entire network.
 #[derive(Debug, Clone, PartialEq)]
@@ -47,7 +51,7 @@ impl GlobalSettings {
 #[derive(Debug)]
 pub struct GlobalSettingsBuilder {
     config: GlobalSettings,
-    errors: Vec<String>,
+    errors: Vec<Box<dyn Error>>,
 }
 
 impl Default for GlobalSettingsBuilder {
@@ -65,25 +69,26 @@ impl Default for GlobalSettingsBuilder {
 }
 
 impl GlobalSettingsBuilder {
-    pub fn new() -> GlobalSettingsBuilder {
+    pub fn new() -> Self {
         Self::default()
     }
 
-    fn transition(config: GlobalSettings, errors: Vec<String>) -> Self {
+    fn transition(config: GlobalSettings, errors: Vec<Box<dyn Error>>) -> Self {
         Self { config, errors }
     }
 
-    pub fn with_bootnodes_addresses(
-        self,
-        bootnode_addresses: Vec<impl TryInto<Multiaddr>>,
-    ) -> Self {
+    pub fn with_bootnodes_addresses<T>(self, bootnode_addresses: Vec<T>) -> Self
+    where
+        T: TryInto<Multiaddr>,
+        T::Error: Error + 'static,
+    {
         let mut addrs = vec![];
         let mut errors = vec![];
 
         for addr in bootnode_addresses {
             match addr.try_into() {
                 Ok(addr) => addrs.push(addr),
-                Err(error) => errors.push(error),
+                Err(error) => errors.push(error.into()),
             }
         }
 
@@ -92,8 +97,7 @@ impl GlobalSettingsBuilder {
                 bootnodes_addresses: addrs,
                 ..self.config
             },
-            // vec![self.errors, errors].concat(),
-            self.errors,
+            merge_errors_vecs(self.errors, errors),
         )
     }
 
@@ -128,7 +132,7 @@ impl GlobalSettingsBuilder {
             ),
             Err(error) => Self::transition(
                 self.config,
-                merge_errors(self.errors, format!("local_ip: {error}")),
+                merge_errors(self.errors, FieldError::InvalidLocalIp(error).into()),
             ),
         }
     }