diff --git a/crates/configuration/src/parachain.rs b/crates/configuration/src/parachain.rs
index d87d6e1a619c8812cef7051d83ac6a34d42ddb7f..b880d5233e3815134b517fc25cf73901218134ed 100644
--- a/crates/configuration/src/parachain.rs
+++ b/crates/configuration/src/parachain.rs
@@ -1,6 +1,7 @@
 use std::{cell::RefCell, error::Error, fmt::Display, marker::PhantomData, rc::Rc};
 
 use multiaddr::Multiaddr;
+use serde::Serialize;
 
 use crate::shared::{
     errors::{ConfigError, FieldError},
@@ -8,26 +9,29 @@ use crate::shared::{
     macros::states,
     node::{self, NodeConfig, NodeConfigBuilder},
     resources::{Resources, ResourcesBuilder},
-    types::{Arg, AssetLocation, Chain, ChainDefaultContext, Command, Image, ValidationContext},
+    types::{
+        Arg, AssetLocation, Chain, ChainDefaultContext, Command, Image, ValidationContext, U128,
+    },
 };
 
-#[derive(Debug, Clone, PartialEq)]
+#[derive(Debug, Clone, PartialEq, Serialize)]
 pub enum RegistrationStrategy {
     InGenesis,
     UsingExtrinsic,
 }
 
 /// A parachain configuration, composed of collators and fine-grained configuration options.
-#[derive(Debug, Clone, PartialEq)]
+#[derive(Debug, Clone, PartialEq, Serialize)]
 pub struct ParachainConfig {
     id: u32,
     chain: Option<Chain>,
     registration_strategy: Option<RegistrationStrategy>,
-    initial_balance: u128,
+    initial_balance: U128,
     default_command: Option<Command>,
     default_image: Option<Image>,
     default_resources: Option<Resources>,
     default_db_snapshot: Option<AssetLocation>,
+    #[serde(skip_serializing_if = "std::vec::Vec::is_empty")]
     default_args: Vec<Arg>,
     genesis_wasm_path: Option<AssetLocation>,
     genesis_wasm_generator: Option<Command>,
@@ -35,7 +39,9 @@ pub struct ParachainConfig {
     genesis_state_generator: Option<Command>,
     chain_spec_path: Option<AssetLocation>,
     is_cumulus_based: bool,
+    #[serde(skip_serializing_if = "std::vec::Vec::is_empty")]
     bootnodes_addresses: Vec<Multiaddr>,
+    #[serde(skip_serializing_if = "std::vec::Vec::is_empty")]
     collators: Vec<NodeConfig>,
 }
 
@@ -57,7 +63,7 @@ impl ParachainConfig {
 
     /// The initial balance of the parachain account.
     pub fn initial_balance(&self) -> u128 {
-        self.initial_balance
+        self.initial_balance.0
     }
 
     /// The default command used for collators.
@@ -148,7 +154,7 @@ impl Default for ParachainConfigBuilder<Initial> {
                 id: 100,
                 chain: None,
                 registration_strategy: Some(RegistrationStrategy::InGenesis),
-                initial_balance: 2_000_000_000_000,
+                initial_balance: 2_000_000_000_000.into(),
                 default_command: None,
                 default_image: None,
                 default_resources: None,
@@ -257,7 +263,7 @@ impl ParachainConfigBuilder<WithId> {
     pub fn with_initial_balance(self, initial_balance: u128) -> Self {
         Self::transition(
             ParachainConfig {
-                initial_balance,
+                initial_balance: initial_balance.into(),
                 ..self.config
             },
             self.validation_context,