From 4358acc74337b4e08e3b1729748d53d88a79d715 Mon Sep 17 00:00:00 2001
From: bgallois <benjamin@gallois.cc>
Date: Sat, 3 Feb 2024 17:06:23 +0100
Subject: [PATCH] upgrade genesis builder

---
 Cargo.lock                   |   3 +
 node/src/chain_spec/gdev.rs  | 265 ++++++++++++++---------------------
 node/src/chain_spec/gtest.rs | 207 +++++++++++----------------
 runtime/common/src/apis.rs   |   9 ++
 runtime/g1/Cargo.toml        |   2 +
 runtime/gdev/Cargo.toml      |   3 +
 runtime/gtest/Cargo.toml     |   2 +
 7 files changed, 205 insertions(+), 286 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 44d19b957..04c3050b0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3605,6 +3605,7 @@ dependencies = [
  "sp-consensus-grandpa",
  "sp-core",
  "sp-distance",
+ "sp-genesis-builder",
  "sp-inherents",
  "sp-keyring",
  "sp-membership",
@@ -3680,6 +3681,7 @@ dependencies = [
  "sp-consensus-grandpa",
  "sp-core",
  "sp-distance",
+ "sp-genesis-builder",
  "sp-inherents",
  "sp-io",
  "sp-keyring",
@@ -4003,6 +4005,7 @@ dependencies = [
  "sp-consensus-grandpa",
  "sp-core",
  "sp-distance",
+ "sp-genesis-builder",
  "sp-inherents",
  "sp-keyring",
  "sp-membership",
diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index f43332a4c..45a6f0514 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -14,20 +14,17 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-#![allow(deprecated)]
-
 use super::*;
 use crate::chain_spec::gen_genesis_data::{
     AuthorityKeys, CommonParameters, GenesisIdentity, SessionKeysProvider,
 };
 use common_runtime::constants::*;
 use common_runtime::entities::IdtyData;
-use common_runtime::*;
+use common_runtime::GenesisIdty;
+use common_runtime::IdtyStatus;
 use gdev_runtime::{
-    opaque::SessionKeys, pallet_universal_dividend, parameters, AccountConfig,
-    AuthorityMembersConfig, BabeConfig, BalancesConfig, CertificationConfig, IdentityConfig,
-    MembershipConfig, ParametersConfig, QuotaConfig, Runtime, RuntimeGenesisConfig, SessionConfig,
-    SmithMembersConfig, SudoConfig, TechnicalCommitteeConfig, UniversalDividendConfig, WASM_BINARY,
+    opaque::SessionKeys, pallet_universal_dividend, parameters, Runtime, RuntimeGenesisConfig,
+    WASM_BINARY,
 };
 use jsonrpsee::core::JsonValue;
 use sc_network::config::MultiaddrWithPeerId;
@@ -108,48 +105,32 @@ fn get_parameters(parameters_from_file: &Option<GenesisParameters>) -> CommonPar
 
 /// generate development chainspec with Alice validator
 pub fn gdev_development_chain_spec(config_file_path: String) -> Result<ChainSpec, String> {
-    let wasm_binary =
-        get_wasm_binary().ok_or_else(|| "Development wasm not available".to_string())?;
-    Ok(ChainSpec::from_genesis(
-        // Name
-        "Development",
-        // ID
-        "gdev",
-        // chain type
-        sc_service::ChainType::Development,
-        // constructor
-        move || {
-            let genesis_data =
-                gen_genesis_data::generate_genesis_data::<_, _, SessionKeys, GDevSKP>(
-                    config_file_path.clone(),
-                    get_parameters,
-                    Some("Alice".to_owned()),
-                )
-                .expect("Genesis Data must be buildable");
-            genesis_data_to_gdev_genesis_conf(genesis_data)
-        },
-        // Bootnodes
-        vec![],
-        // Telemetry
-        None,
-        // Protocol ID
-        None,
-        //Fork ID
+    Ok(ChainSpec::builder(
+        &get_wasm_binary().ok_or_else(|| "Development wasm not available".to_string())?,
         None,
-        // Properties
-        Some(
-            serde_json::json!({
-                "tokenDecimals": TOKEN_DECIMALS,
-                "tokenSymbol": TOKEN_SYMBOL,
-            })
-            .as_object()
-            .expect("must be a map")
-            .clone(),
-        ),
-        // Extensions
-        None,
-        &wasm_binary.to_vec().clone(), // TODO upgrade to builder
-    ))
+    )
+    .with_name("Development")
+    .with_id("gdev")
+    .with_chain_type(ChainType::Development)
+    .with_genesis_config_patch({
+        let genesis_data = gen_genesis_data::generate_genesis_data::<_, _, SessionKeys, GDevSKP>(
+            config_file_path.clone(),
+            get_parameters,
+            Some("Alice".to_owned()),
+        )
+        .expect("Genesis Data must be buildable");
+        genesis_data_to_gdev_genesis_conf(genesis_data)
+    })
+    .with_properties(
+        serde_json::json!({
+            "tokenDecimals": TOKEN_DECIMALS,
+            "tokenSymbol": TOKEN_SYMBOL,
+        })
+        .as_object()
+        .expect("must be a map")
+        .clone(),
+    )
+    .build())
 }
 
 // === client specifications ===
@@ -177,38 +158,26 @@ pub fn gen_live_conf(
     client_spec: ClientSpec,
     config_file_path: String,
 ) -> Result<ChainSpec, String> {
-    let wasm_binary = get_wasm_binary().ok_or_else(|| "wasm not available".to_string())?;
-    Ok(ChainSpec::from_genesis(
-        // Name
-        client_spec.name.as_str(),
-        // ID
-        client_spec.id.as_str(),
-        // chain type
-        client_spec.chain_type,
-        move || {
-            let genesis_data =
-                gen_genesis_data::generate_genesis_data::<_, _, SessionKeys, GDevSKP>(
-                    config_file_path.clone(),
-                    get_parameters,
-                    None,
-                )
-                .expect("Genesis Data must be buildable");
-            genesis_data_to_gdev_genesis_conf(genesis_data)
-        },
-        // Bootnodes
-        client_spec.boot_nodes,
-        // Telemetry (by default, enable telemetry, can be disabled with argument)
-        client_spec.telemetry_endpoints,
-        // Protocol ID
-        Some("gdev2"),
-        //Fork ID
-        None,
-        // Properties
-        client_spec.properties,
-        // Extensions
+    Ok(ChainSpec::builder(
+        &get_wasm_binary().ok_or_else(|| "Development wasm not available".to_string())?,
         None,
-        &wasm_binary.clone(), // TODO upgrade to builder
-    ))
+    )
+    .with_name(client_spec.name.as_str())
+    .with_id(client_spec.id.as_str())
+    .with_chain_type(client_spec.chain_type)
+    .with_genesis_config_patch({
+        let genesis_data = gen_genesis_data::generate_genesis_data::<_, _, SessionKeys, GDevSKP>(
+            config_file_path.clone(),
+            get_parameters,
+            None,
+        )
+        .expect("Genesis Data must be buildable");
+        genesis_data_to_gdev_genesis_conf(genesis_data)
+    })
+    .with_telemetry_endpoints(client_spec.telemetry_endpoints.unwrap())
+    .with_properties(client_spec.properties.unwrap())
+    .with_boot_nodes(client_spec.boot_nodes)
+    .build())
 }
 
 /// generate local network chainspects
@@ -217,21 +186,16 @@ pub fn local_testnet_config(
     initial_smiths_len: usize,
     initial_identities_len: usize,
 ) -> Result<ChainSpec, String> {
-    let wasm_binary = get_wasm_binary().ok_or_else(|| "wasm not available".to_string())?;
-    Ok(ChainSpec::from_genesis(
-        // Name
-        "Äždev Local Testnet",
-        // ID
-        "gdev_local",
-        ChainType::Local,
-        // constructor
-        move || {
-            let genesis_data = gen_genesis_data::generate_genesis_data_for_local_chain::<
-                _,
-                _,
-                SessionKeys,
-                GDevSKP,
-            >(
+    Ok(ChainSpec::builder(
+        &get_wasm_binary().ok_or_else(|| "Development wasm not available".to_string())?,
+        None,
+    )
+    .with_name("Äždev Local Testnet")
+    .with_id("gdev_local")
+    .with_chain_type(ChainType::Local)
+    .with_genesis_config_patch({
+        let genesis_data =
+            gen_genesis_data::generate_genesis_data_for_local_chain::<_, _, SessionKeys, GDevSKP>(
                 // Initial authorities len
                 initial_authorities_len,
                 // Initial smiths len,
@@ -245,36 +209,24 @@ pub fn local_testnet_config(
                 get_parameters,
             )
             .expect("Genesis Data must be buildable");
-            genesis_data_to_gdev_genesis_conf(genesis_data)
-        },
-        // Bootnodes
-        vec![],
-        // Telemetry
-        None,
-        // Protocol ID
-        None,
-        //Fork ID
-        None,
-        // Properties
-        Some(
-            serde_json::json!({
-                "tokenDecimals": TOKEN_DECIMALS,
-                "tokenSymbol": TOKEN_SYMBOL,
-            })
-            .as_object()
-            .expect("must be a map")
-            .clone(),
-        ),
-        // Extensions
-        None,
-        &wasm_binary.clone(), // TODO upgrade to builder
-    ))
+        genesis_data_to_gdev_genesis_conf(genesis_data)
+    })
+    .with_properties(
+        serde_json::json!({
+            "tokenDecimals": TOKEN_DECIMALS,
+            "tokenSymbol": TOKEN_SYMBOL,
+        })
+        .as_object()
+        .expect("must be a map")
+        .clone(),
+    )
+    .build())
 }
 
 /// custom genesis
 fn genesis_data_to_gdev_genesis_conf(
     genesis_data: super::gen_genesis_data::GenesisData<GenesisParameters, SessionKeys>,
-) -> gdev_runtime::RuntimeGenesisConfig {
+) -> serde_json::Value {
     let super::gen_genesis_data::GenesisData {
         accounts,
         treasury_balance,
@@ -294,45 +246,38 @@ fn genesis_data_to_gdev_genesis_conf(
         ud,
     } = genesis_data;
 
-    gdev_runtime::RuntimeGenesisConfig {
-        system: Default::default(),
-        account: AccountConfig {
-            accounts,
-            treasury_balance,
+    serde_json::json!({
+        "account": {
+            "accounts": accounts,
+            "treasuryBalance": treasury_balance,
         },
-        parameters: ParametersConfig {
-            parameters: parameters.expect("mandatory for GDev"),
+        "parameters": {
+            "parameters": parameters.expect("mandatory for GDev"),
         },
-        authority_discovery: Default::default(),
-        authority_members: AuthorityMembersConfig {
-            initial_authorities,
+        "authorityMembers": {
+            "initialAuthorities": initial_authorities,
         },
-        balances: BalancesConfig {
-            total_issuance: initial_monetary_mass,
+        "balances": {
+            "totalIssuance": initial_monetary_mass,
         },
-        babe: BabeConfig {
-            authorities: Vec::with_capacity(0),
-            epoch_config: Some(BABE_GENESIS_EPOCH_CONFIG),
-            _config: Default::default(),
+        "babe": {
+            "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG),
         },
-        grandpa: Default::default(),
-        im_online: Default::default(),
-        session: SessionConfig {
-            keys: session_keys_map
+        "session": {
+            "keys": session_keys_map
                 .into_iter()
                 .map(|(account_id, session_keys)| (account_id.clone(), account_id, session_keys))
                 .collect::<Vec<_>>(),
         },
-        sudo: SudoConfig { key: sudo_key },
-        technical_committee: TechnicalCommitteeConfig {
-            members: technical_committee_members,
-            ..Default::default()
+        "sudo": { "key": sudo_key },
+        "technicalCommittee": {
+            "members": technical_committee_members,
         },
-        quota: QuotaConfig {
-            identities: identities.iter().map(|i| i.idty_index).collect(),
+        "quota": {
+            "identities": identities.iter().map(|i| i.idty_index).collect::<Vec<_>>(),
         },
-        identity: IdentityConfig {
-            identities: identities
+        "identity": {
+            "identities": identities
                 .into_iter()
                 .map(
                     |GenesisIdentity {
@@ -364,23 +309,21 @@ fn genesis_data_to_gdev_genesis_conf(
                         },
                     },
                 )
-                .collect(),
+                .collect::<Vec<GenesisIdty<gdev_runtime::Runtime>>>(),
         },
-        certification: CertificationConfig {
-            apply_cert_period_at_genesis: false,
-            certs_by_receiver,
+        "certification": {
+            "applyCertPeriodAtGenesis": false,
+            "certsByReceiver": certs_by_receiver,
         },
-        membership: MembershipConfig { memberships },
-        smith_members: SmithMembersConfig { initial_smiths },
-        universal_dividend: UniversalDividendConfig {
-            first_reeval: first_ud_reeval,
-            first_ud,
-            initial_monetary_mass,
-            ud,
+        "membership": { "memberships": memberships },
+        "smithMembers": { "initialSmiths": initial_smiths},
+        "universalDividend": {
+            "firstReeval": first_ud_reeval,
+            "firstUd": first_ud,
+            "initialMonetaryMass": initial_monetary_mass,
+            "ud": ud,
         },
-        treasury: Default::default(),
-        transaction_payment: Default::default(),
-    }
+    })
 }
 
 fn get_local_chain_parameters() -> Option<GenesisParameters> {
diff --git a/node/src/chain_spec/gtest.rs b/node/src/chain_spec/gtest.rs
index b4c37dbe6..018b130b0 100644
--- a/node/src/chain_spec/gtest.rs
+++ b/node/src/chain_spec/gtest.rs
@@ -14,19 +14,16 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.
 
-#![allow(deprecated)]
-
 use super::*;
 use crate::chain_spec::gen_genesis_data::{CommonParameters, GenesisIdentity, SessionKeysProvider};
 use common_runtime::constants::*;
 use common_runtime::entities::IdtyData;
-use common_runtime::*;
-use gtest_runtime::SmithMembersConfig;
+use common_runtime::GenesisIdty;
+use common_runtime::IdtyStatus;
+use gtest_runtime::ImOnlineId;
 use gtest_runtime::{
-    opaque::SessionKeys, pallet_universal_dividend, parameters, AccountConfig, AccountId,
-    AuthorityMembersConfig, BabeConfig, BalancesConfig, CertificationConfig, GenesisConfig,
-    IdentityConfig, ImOnlineId, MembershipConfig, Perbill, QuotaConfig, Runtime, SessionConfig,
-    SudoConfig, TechnicalCommitteeConfig, UniversalDividendConfig, WASM_BINARY,
+    opaque::SessionKeys, pallet_universal_dividend, parameters, AccountId, Perbill, Runtime,
+    RuntimeGenesisConfig, WASM_BINARY,
 };
 use jsonrpsee::core::JsonValue;
 use sc_consensus_grandpa::AuthorityId as GrandpaId;
@@ -39,7 +36,7 @@ use sp_consensus_babe::AuthorityId as BabeId;
 use sp_core::Get;
 use std::{env, fs};
 
-pub type ChainSpec = sc_service::GenericChainSpec<GenesisConfig>;
+pub type ChainSpec = sc_service::GenericChainSpec<RuntimeGenesisConfig>;
 pub type AuthorityKeys = (
     AccountId,
     GrandpaId,
@@ -134,47 +131,32 @@ pub struct ClientSpec {
 /// generate development chainspec with Alice validator
 // there is some code duplication because we can not use ClientSpec
 pub fn development_chainspecs(config_file_path: String) -> Result<ChainSpec, String> {
-    let wasm_binary = get_wasm_binary().ok_or_else(|| "wasm not available".to_string())?;
-    Ok(ChainSpec::from_genesis(
-        // Name
-        "ÄžTest Development",
-        // ID
-        "gtest_dev",
-        // chain type
-        sc_service::ChainType::Development,
-        // constructor
-        move || {
-            let genesis_data =
-                gen_genesis_data::generate_genesis_data::<_, _, SessionKeys, GTestSKP>(
-                    config_file_path.clone(),
-                    get_parameters,
-                    Some("Alice".to_owned()),
-                )
-                .expect("Genesis Data must be buildable");
-            genesis_data_to_gtest_genesis_conf(genesis_data)
-        },
-        // Bootnodes
-        vec![],
-        // Telemetry
-        None,
-        // Protocol ID
-        None,
-        //Fork ID
-        None,
-        // Properties
-        Some(
-            serde_json::json!({
-                "tokenDecimals": TOKEN_DECIMALS,
-                "tokenSymbol": TOKEN_SYMBOL,
-            })
-            .as_object()
-            .expect("must be a map")
-            .clone(),
-        ),
-        // Extensions
+    Ok(ChainSpec::builder(
+        &get_wasm_binary().ok_or_else(|| "Development wasm not available".to_string())?,
         None,
-        &wasm_binary.clone(), // TODO upgrade to builder
-    ))
+    )
+    .with_name("ÄžTest Development")
+    .with_id("gtest_dev")
+    .with_chain_type(ChainType::Development)
+    .with_genesis_config_patch({
+        let genesis_data = gen_genesis_data::generate_genesis_data::<_, _, SessionKeys, GTestSKP>(
+            config_file_path.clone(),
+            get_parameters,
+            Some("Alice".to_owned()),
+        )
+        .expect("Genesis Data must be buildable");
+        genesis_data_to_gtest_genesis_conf(genesis_data)
+    })
+    .with_properties(
+        serde_json::json!({
+            "tokenDecimals": TOKEN_DECIMALS,
+            "tokenSymbol": TOKEN_SYMBOL,
+        })
+        .as_object()
+        .expect("must be a map")
+        .clone(),
+    )
+    .build())
 }
 
 // === live chainspecs ===
@@ -185,45 +167,32 @@ pub fn live_chainspecs(
     client_spec: ClientSpec,
     config_file_path: String,
 ) -> Result<ChainSpec, String> {
-    let wasm_binary = get_wasm_binary().ok_or_else(|| "wasm not available".to_string())?;
-    Ok(ChainSpec::from_genesis(
-        // Name
-        client_spec.name.as_str(),
-        // ID
-        client_spec.id.as_str(),
-        // chain type
-        client_spec.chain_type,
-        // genesis config constructor
-        move || {
-            let genesis_data =
-                gen_genesis_data::generate_genesis_data::<_, _, SessionKeys, GTestSKP>(
-                    config_file_path.clone(),
-                    get_parameters,
-                    None,
-                )
-                .expect("Genesis Data must be buildable");
-            genesis_data_to_gtest_genesis_conf(genesis_data)
-        },
-        // Bootnodes
-        client_spec.boot_nodes,
-        // Telemetry (by default, enable telemetry, can be disabled with argument)
-        client_spec.telemetry_endpoints,
-        // Protocol ID
-        None,
-        // Fork ID
+    Ok(ChainSpec::builder(
+        &get_wasm_binary().ok_or_else(|| "Development wasm not available".to_string())?,
         None,
-        // Properties
-        client_spec.properties,
-        // Extensions
-        None,
-        &wasm_binary.clone(), // TODO upgrade to builder
-    ))
+    )
+    .with_name(client_spec.name.as_str())
+    .with_id(client_spec.id.as_str())
+    .with_chain_type(client_spec.chain_type)
+    .with_genesis_config_patch({
+        let genesis_data = gen_genesis_data::generate_genesis_data::<_, _, SessionKeys, GTestSKP>(
+            config_file_path.clone(),
+            get_parameters,
+            None,
+        )
+        .expect("Genesis Data must be buildable");
+        genesis_data_to_gtest_genesis_conf(genesis_data)
+    })
+    .with_telemetry_endpoints(client_spec.telemetry_endpoints.unwrap())
+    .with_properties(client_spec.properties.unwrap())
+    .with_boot_nodes(client_spec.boot_nodes)
+    .build())
 }
 
 /// custom genesis
 fn genesis_data_to_gtest_genesis_conf(
     genesis_data: super::gen_genesis_data::GenesisData<GenesisParameters, SessionKeys>,
-) -> gtest_runtime::GenesisConfig {
+) -> serde_json::Value {
     let super::gen_genesis_data::GenesisData {
         accounts,
         treasury_balance,
@@ -243,43 +212,35 @@ fn genesis_data_to_gtest_genesis_conf(
         ud,
     } = genesis_data;
 
-    gtest_runtime::GenesisConfig {
-        system: Default::default(),
-        account: AccountConfig {
-            accounts,
-            treasury_balance,
+    serde_json::json!({
+        "account": {
+            "accounts": accounts,
+            "treasuryBalance": treasury_balance,
         },
-        authority_discovery: Default::default(),
-        authority_members: AuthorityMembersConfig {
-            initial_authorities,
+        "authorityMembers": {
+            "initialAuthorities": initial_authorities,
         },
-        // Necessary to initialize TotalIssuence
-        balances: BalancesConfig {
-            total_issuance: initial_monetary_mass,
+        "balances": {
+            "totalIssuance": initial_monetary_mass,
         },
-        babe: BabeConfig {
-            authorities: Vec::with_capacity(0),
-            epoch_config: Some(BABE_GENESIS_EPOCH_CONFIG),
-            _config: Default::default(),
+        "babe": {
+            "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG),
         },
-        grandpa: Default::default(),
-        im_online: Default::default(),
-        session: SessionConfig {
-            keys: session_keys_map
+        "session": {
+            "keys": session_keys_map
                 .into_iter()
                 .map(|(account_id, session_keys)| (account_id.clone(), account_id, session_keys))
                 .collect::<Vec<_>>(),
         },
-        sudo: SudoConfig { key: sudo_key },
-        technical_committee: TechnicalCommitteeConfig {
-            members: technical_committee_members,
-            ..Default::default()
+        "sudo": { "key": sudo_key },
+        "technicalCommittee": {
+            "members": technical_committee_members,
         },
-        quota: QuotaConfig {
-            identities: identities.iter().map(|i| i.idty_index).collect(),
+        "quota": {
+            "identities": identities.iter().map(|i| i.idty_index).collect::<Vec<_>>(),
         },
-        identity: IdentityConfig {
-            identities: identities
+        "identity": {
+            "identities": identities
                 .into_iter()
                 .map(
                     |GenesisIdentity {
@@ -311,25 +272,21 @@ fn genesis_data_to_gtest_genesis_conf(
                         },
                     },
                 )
-                .collect(),
+                .collect::<Vec<GenesisIdty<gtest_runtime::Runtime>>>(),
         },
-        certification: CertificationConfig {
-            apply_cert_period_at_genesis: true,
-            certs_by_receiver,
+        "certification": {
+            "applyCertPeriodAtGenesis": false,
+            "certsByReceiver": certs_by_receiver,
         },
-        membership: MembershipConfig { memberships },
-        smith_members: SmithMembersConfig { initial_smiths },
-        universal_dividend: UniversalDividendConfig {
-            first_reeval: first_ud_reeval,
-            first_ud,
-            initial_monetary_mass,
-            ud,
-            #[cfg(test)]
-            initial_members: vec![],
+        "membership": { "memberships": memberships },
+        "smithMembers": { "initialSmiths": initial_smiths},
+        "universalDividend": {
+            "firstReeval": first_ud_reeval,
+            "firstUd": first_ud,
+            "initialMonetaryMass": initial_monetary_mass,
+            "ud": ud,
         },
-        treasury: Default::default(),
-        transaction_payment: Default::default(),
-    }
+    })
 }
 
 /// Get the WASM bytes either from filesytem (`WASM_FILE` env variable giving the path to the wasm blob)
diff --git a/runtime/common/src/apis.rs b/runtime/common/src/apis.rs
index ef895c58c..af95e113f 100644
--- a/runtime/common/src/apis.rs
+++ b/runtime/common/src/apis.rs
@@ -220,6 +220,15 @@ macro_rules! runtime_apis {
 			TransactionPayment::length_to_fee(length)
 		}
             }
+	impl sp_genesis_builder::GenesisBuilder<Block> for Runtime {
+		fn create_default_config() -> Vec<u8> {
+			frame_support::genesis_builder_helper::create_default_config::<RuntimeGenesisConfig>()
+		}
+
+		fn build_config(config: Vec<u8>) -> sp_genesis_builder::Result {
+			frame_support::genesis_builder_helper::build_config::<RuntimeGenesisConfig>(config)
+		}
+	}
 
             #[cfg(feature = "try-runtime")]
             impl frame_try_runtime::TryRuntime<Block> for Runtime where <Runtime as frame_system::Config>::BlockNumber: Clone + sp_std::fmt::Debug + sp_runtime::traits::AtLeast32BitUnsigned {
diff --git a/runtime/g1/Cargo.toml b/runtime/g1/Cargo.toml
index fb0cc1285..464713907 100644
--- a/runtime/g1/Cargo.toml
+++ b/runtime/g1/Cargo.toml
@@ -115,6 +115,7 @@ std = [
     'sp-staking/std',
     'node-primitives/std',
     'substrate-wasm-builder',
+    'sp-genesis-builder/std',
 ]
 try-runtime = [
     'common-runtime/try-runtime',
@@ -239,6 +240,7 @@ sp-std = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'du
 sp-transaction-pool = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 sp-version = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 node-primitives = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
+sp-genesis-builder = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 
 [package.metadata.docs.rs]
 targets = ['x86_64-unknown-linux-gnu']
diff --git a/runtime/gdev/Cargo.toml b/runtime/gdev/Cargo.toml
index 7a1066381..397c596dd 100644
--- a/runtime/gdev/Cargo.toml
+++ b/runtime/gdev/Cargo.toml
@@ -115,8 +115,10 @@ std = [
     'sp-version/std',
     'sp-staking/std',
     'sp-io/std',
+    'sp-genesis-builder/std',
     'node-primitives/std',
     'substrate-wasm-builder',
+    'sp-genesis-builder/std',
 ]
 try-runtime = [
     'common-runtime/try-runtime',
@@ -241,6 +243,7 @@ sp-session = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch =
 sp-std = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 sp-transaction-pool = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 sp-version = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
+sp-genesis-builder = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 node-primitives = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 
 [package.metadata.docs.rs]
diff --git a/runtime/gtest/Cargo.toml b/runtime/gtest/Cargo.toml
index 9c7a497a0..4f90ede28 100644
--- a/runtime/gtest/Cargo.toml
+++ b/runtime/gtest/Cargo.toml
@@ -115,6 +115,7 @@ std = [
     'sp-staking/std',
     'node-primitives/std',
     'substrate-wasm-builder',
+    'sp-genesis-builder/std',
 ]
 try-runtime = [
     'common-runtime/try-runtime',
@@ -238,6 +239,7 @@ sp-session = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch =
 sp-std = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 sp-transaction-pool = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 sp-version = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
+sp-genesis-builder = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 node-primitives = { git = 'https://github.com/duniter/duniter-polkadot-sdk', branch = 'duniter-substrate-v1.6.0', default-features = false }
 
 [package.metadata.docs.rs]
-- 
GitLab