From b6d3b28cb03eefe196147ecd7b856a3791fa2ba7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=89lo=C3=AFs?= <c@elo.tf>
Date: Wed, 13 Jul 2022 02:58:21 +0200
Subject: [PATCH] Remove useless rules RenewablePeriod and CertRenewablePeriod
 (!87)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* ci: not execute live tests on jobs tests_debug & tests_release

* mod(membership): remove rule RenewablePeriod

* fix live tests compilation

* mod(cert): remove rule CertRenewablePeriod
---
 .cargo/config                               |   2 +-
 .gitlab-ci.yml                              |   4 +-
 end2end-tests/cucumber-genesis/default.json |   4 --
 end2end-tests/cucumber-genesis/wot.json     |   4 --
 live-tests/tests/sanity_gdev.rs             |   8 +++-
 node/src/chain_spec/gdev.rs                 |  31 +--------------
 node/src/chain_spec/gen_genesis_data.rs     |   6 ---
 node/src/chain_spec/gtest.rs                |   2 -
 pallets/certification/src/lib.rs            |  40 ++------------------
 pallets/certification/src/mock.rs           |   2 -
 pallets/certification/src/tests.rs          |  33 ----------------
 pallets/certification/src/types.rs          |   1 -
 pallets/duniter-test-parameters/src/lib.rs  |   4 --
 pallets/duniter-wot/src/mock.rs             |  10 -----
 pallets/identity/src/mock.rs                |   1 -
 pallets/membership/src/lib.rs               |  28 +++-----------
 pallets/membership/src/mock.rs              |   2 -
 pallets/membership/src/tests.rs             |  33 +++-------------
 primitives/membership/src/lib.rs            |   1 -
 resources/gdev.json                         |   4 --
 resources/metadata.scale                    | Bin 115699 -> 120061 bytes
 runtime/common/src/pallets_config.rs        |   4 --
 runtime/g1/src/parameters.rs                |   4 --
 runtime/gdev/src/lib.rs                     |   6 ---
 runtime/gdev/tests/common/mod.rs            |   6 ---
 runtime/gtest/src/parameters.rs             |   4 --
 26 files changed, 25 insertions(+), 219 deletions(-)

diff --git a/.cargo/config b/.cargo/config
index 3a03e9a4f..f5990d7a2 100644
--- a/.cargo/config
+++ b/.cargo/config
@@ -1,7 +1,7 @@
 [alias]
 cucumber = "test -p duniter-end2end-tests --test cucumber_tests --"
 sanity-gdev = "test -p duniter-live-tests --test sanity_gdev -- --nocapture"
-tu = "test --workspace --exclude duniter-end2end-tests"
+tu = "test --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests"
 tb = "test --features runtime-benchmarks -p"
 xtask = "run --package xtask --"
 
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fba75a181..626da5ddf 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -158,7 +158,7 @@ tests_debug:
     DUNITER_BINARY_PATH: "../build/duniter"
     DUNITER_END2END_TESTS_SPAWN_NODE_TIMEOUT: "20"
   script:
-    - cargo test --workspace --exclude duniter-end2end-tests
+    - cargo test --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests
     - cargo cucumber -i balance*
     - cargo cucumber -i monetary*
     - cargo cucumber -i transfer*
@@ -182,7 +182,7 @@ tests_release:
     DUNITER_BINARY_PATH: "../build/duniter"
     DUNITER_END2END_TESTS_SPAWN_NODE_TIMEOUT: "20"
   script:
-    - cargo test --workspace --exclude duniter-end2end-tests
+    - cargo test --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests
     - cargo cucumber -i balance*
     - cargo cucumber -i monetary*
     - cargo cucumber -i transfer*
diff --git a/end2end-tests/cucumber-genesis/default.json b/end2end-tests/cucumber-genesis/default.json
index 7a9780910..32abeaa56 100644
--- a/end2end-tests/cucumber-genesis/default.json
+++ b/end2end-tests/cucumber-genesis/default.json
@@ -23,22 +23,18 @@
     "cert_period": 15,
     "cert_max_by_issuer": 10,
     "cert_min_received_cert_to_issue_cert": 2,
-    "cert_renewable_period": 50,
     "cert_validity_period": 1000,
     "idty_confirm_period": 40,
     "idty_creation_period": 50,
     "membership_period": 1000,
-    "membership_renewable_period": 50,
     "pending_membership_period": 500,
     "ud_creation_period": 10,
     "ud_reeval_period": 100,
     "smith_cert_period": 15,
     "smith_cert_max_by_issuer": 8,
     "smith_cert_min_received_cert_to_issue_cert": 2,
-    "smith_cert_renewable_period": 50,
     "smith_cert_validity_period": 1000,
     "smith_membership_period": 1000,
-    "smith_membership_renewable_period": 20,
     "smith_pending_membership_period": 500,
     "smiths_wot_first_cert_issuable_on": 20,
     "smiths_wot_min_cert_for_membership": 2,
diff --git a/end2end-tests/cucumber-genesis/wot.json b/end2end-tests/cucumber-genesis/wot.json
index 988e6857f..7b4639842 100644
--- a/end2end-tests/cucumber-genesis/wot.json
+++ b/end2end-tests/cucumber-genesis/wot.json
@@ -28,22 +28,18 @@
     "cert_period": 15,
     "cert_max_by_issuer": 10,
     "cert_min_received_cert_to_issue_cert": 2,
-    "cert_renewable_period": 50,
     "cert_validity_period": 1000,
     "idty_confirm_period": 40,
     "idty_creation_period": 50,
     "membership_period": 1000,
-    "membership_renewable_period": 50,
     "pending_membership_period": 500,
     "ud_creation_period": 10,
     "ud_reeval_period": 100,
     "smith_cert_period": 15,
     "smith_cert_max_by_issuer": 8,
     "smith_cert_min_received_cert_to_issue_cert": 2,
-    "smith_cert_renewable_period": 50,
     "smith_cert_validity_period": 1000,
     "smith_membership_period": 1000,
-    "smith_membership_renewable_period": 20,
     "smith_pending_membership_period": 500,
     "smiths_wot_first_cert_issuable_on": 20,
     "smiths_wot_min_cert_for_membership": 2,
diff --git a/live-tests/tests/sanity_gdev.rs b/live-tests/tests/sanity_gdev.rs
index 4e6e14938..115eeadda 100644
--- a/live-tests/tests/sanity_gdev.rs
+++ b/live-tests/tests/sanity_gdev.rs
@@ -41,9 +41,13 @@ type AccountInfo = gdev_runtime::runtime_types::frame_system::AccountInfo<
     Index,
     gdev_runtime::runtime_types::pallet_duniter_account::types::AccountData<Balance>,
 >;
+type IdtyData = gdev_runtime::runtime_types::common_runtime::entities::IdtyData;
 type IdtyIndex = u32;
-type IdtyValue =
-    gdev_runtime::runtime_types::pallet_identity::types::IdtyValue<BlockNumber, AccountId32>;
+type IdtyValue = gdev_runtime::runtime_types::pallet_identity::types::IdtyValue<
+    BlockNumber,
+    AccountId32,
+    IdtyData,
+>;
 use gdev_runtime::runtime_types::pallet_identity::types::IdtyStatus;
 
 struct Storage {
diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index b31c4f7da..299482d17 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -100,9 +100,7 @@ pub fn development_chain_spec() -> Result<ChainSpec, String> {
                 genesis_certs_expire_on: 100_000,
                 genesis_smith_certs_expire_on: 100_000,
                 genesis_memberships_expire_on: 100_000,
-                genesis_memberships_renewable_on: 50,
                 genesis_smith_memberships_expire_on: 100_000,
-                genesis_smith_memberships_renewable_on: 50,
             }),
         )
     } else {
@@ -189,9 +187,7 @@ pub fn gen_live_conf() -> Result<ChainSpec, String> {
             genesis_certs_expire_on: 100_000,
             genesis_smith_certs_expire_on: 100_000,
             genesis_memberships_expire_on: 100_000,
-            genesis_memberships_renewable_on: 50,
             genesis_smith_memberships_expire_on: 100_000,
-            genesis_smith_memberships_renewable_on: 50,
         }),
     )
 }
@@ -262,10 +258,7 @@ fn gen_genesis_for_local_chain(
     let cert_validity_period = get_env_u32("DUNITER_CERT_VALIDITY_PERIOD", 1_000);
     let first_ud = 1_000;
     let membership_period = get_env_u32("DUNITER_MEMBERSHIP_PERIOD", 1_000);
-    let membership_renewable_period = get_env_u32("DUNITER_MEMBERSHIP_RENEWABLE_PERIOD", 50);
     let smith_cert_validity_period = get_env_u32("DUNITER_SMITH_CERT_VALIDITY_PERIOD", 1_000);
-    let smith_membership_renewable_period =
-        get_env_u32("DUNITER_SMITH_MEMBERSHIP_RENEWABLE_PERIOD", 20);
     let smith_membership_period = get_env_u32("DUNITER_SMITH_MEMBERSHIP_PERIOD", 1_000);
     let ud_creation_period = get_env_u32("DUNITER_UD_CREATION_PERIOD", 10);
     let ud_reeval_period = get_env_u32("DUNITER_UD_REEEVAL_PERIOD", 200);
@@ -309,22 +302,18 @@ fn gen_genesis_for_local_chain(
                 cert_period: 15,
                 cert_max_by_issuer: 10,
                 cert_min_received_cert_to_issue_cert: 2,
-                cert_renewable_period: 50,
                 cert_validity_period,
                 idty_confirm_period: 40,
                 idty_creation_period: 50,
                 membership_period,
-                membership_renewable_period,
                 pending_membership_period: 500,
                 ud_creation_period,
                 ud_reeval_period,
                 smith_cert_period: 15,
                 smith_cert_max_by_issuer: 8,
                 smith_cert_min_received_cert_to_issue_cert: 2,
-                smith_cert_renewable_period: 50,
                 smith_cert_validity_period: 1_000,
                 smith_membership_period,
-                smith_membership_renewable_period: 50,
                 smith_pending_membership_period: 500,
                 smiths_wot_first_cert_issuable_on: 20,
                 smiths_wot_min_cert_for_membership: 2,
@@ -386,15 +375,7 @@ fn gen_genesis_for_local_chain(
         },
         membership: MembershipConfig {
             memberships: (1..=initial_identities.len())
-                .map(|i| {
-                    (
-                        i as u32,
-                        MembershipData {
-                            expire_on: 0,
-                            renewable_on: membership_renewable_period,
-                        },
-                    )
-                })
+                .map(|i| (i as u32, MembershipData { expire_on: 0 }))
                 .collect(),
         },
         cert: CertConfig {
@@ -403,15 +384,7 @@ fn gen_genesis_for_local_chain(
         },
         smiths_membership: SmithsMembershipConfig {
             memberships: (1..=initial_smiths_len)
-                .map(|i| {
-                    (
-                        i as u32,
-                        MembershipData {
-                            expire_on: 0,
-                            renewable_on: smith_membership_renewable_period,
-                        },
-                    )
-                })
+                .map(|i| (i as u32, MembershipData { expire_on: 0 }))
                 .collect(),
         },
         smiths_cert: SmithsCertConfig {
diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs
index d9c66c76a..24751d615 100644
--- a/node/src/chain_spec/gen_genesis_data.rs
+++ b/node/src/chain_spec/gen_genesis_data.rs
@@ -45,9 +45,7 @@ pub struct ParamsAppliedAtGenesis {
     pub genesis_certs_expire_on: u32,
     pub genesis_smith_certs_expire_on: u32,
     pub genesis_memberships_expire_on: u32,
-    pub genesis_memberships_renewable_on: u32,
     pub genesis_smith_memberships_expire_on: u32,
-    pub genesis_smith_memberships_renewable_on: u32,
 }
 
 #[derive(Deserialize, Serialize)]
@@ -96,9 +94,7 @@ where
         genesis_certs_expire_on,
         genesis_smith_certs_expire_on,
         genesis_memberships_expire_on,
-        genesis_memberships_renewable_on,
         genesis_smith_memberships_expire_on,
-        genesis_smith_memberships_renewable_on,
     } = params_applied_at_genesis.unwrap_or_default();
 
     let genesis_timestamp: u64 =
@@ -203,7 +199,6 @@ where
                     .map_or(genesis_memberships_expire_on, |expire_on| {
                         to_bn(genesis_timestamp, expire_on)
                     }),
-                renewable_on: genesis_memberships_renewable_on,
             },
         );
 
@@ -303,7 +298,6 @@ where
             *idty_index,
             MembershipData {
                 expire_on: genesis_smith_memberships_expire_on,
-                renewable_on: genesis_smith_memberships_renewable_on,
             },
         );
     }
diff --git a/node/src/chain_spec/gtest.rs b/node/src/chain_spec/gtest.rs
index 0b1f682e5..5d2ea9201 100644
--- a/node/src/chain_spec/gtest.rs
+++ b/node/src/chain_spec/gtest.rs
@@ -223,7 +223,6 @@ fn gen_genesis_for_local_chain(
                         i as u32,
                         MembershipData {
                             expire_on: gtest_runtime::MembershipPeriod::get(),
-                            renewable_on: gtest_runtime::RenewablePeriod::get(),
                         },
                     )
                 })
@@ -243,7 +242,6 @@ fn gen_genesis_for_local_chain(
                         i as u32,
                         MembershipData {
                             expire_on: gtest_runtime::SmithMembershipPeriod::get(),
-                            renewable_on: gtest_runtime::SmithRenewablePeriod::get(),
                         },
                     )
                 })
diff --git a/pallets/certification/src/lib.rs b/pallets/certification/src/lib.rs
index cc577701f..5d333e7be 100644
--- a/pallets/certification/src/lib.rs
+++ b/pallets/certification/src/lib.rs
@@ -83,9 +83,6 @@ pub mod pallet {
         /// Handler for Removed event
         type OnRemovedCert: OnRemovedCert<Self::IdtyIndex>;
         #[pallet::constant]
-        /// Duration after which a certification is renewable
-        type CertRenewablePeriod: Get<Self::BlockNumber>;
-        #[pallet::constant]
         /// Duration of validity of a certification
         type ValidityPeriod: Get<Self::BlockNumber>;
     }
@@ -169,15 +166,11 @@ pub mod pallet {
                             }
                         }
                     }
-                    let renewable_on = removable_on.saturating_sub(
-                        T::ValidityPeriod::get().saturating_sub(T::CertRenewablePeriod::get()),
-                    );
 
                     <StorageCertsByIssuer<T, I>>::insert(
                         issuer,
                         receiver,
                         CertValue {
-                            renewable_on,
                             removable_on: *removable_on,
                         },
                     );
@@ -274,8 +267,6 @@ pub mod pallet {
         NotEnoughCertReceived,
         /// This identity has already issued a certification too recently
         NotRespectCertPeriod,
-        /// This certification has already been issued or renewed recently
-        NotRespectRenewablePeriod,
         /// Receiver not found
         ReceiverNotFound,
     }
@@ -302,7 +293,7 @@ pub mod pallet {
 
             let block_number = frame_system::pallet::Pallet::<T>::block_number();
 
-            let create = if verify_rules {
+            if verify_rules {
                 let issuer_idty_cert_meta = <StorageIdtyCertMeta<T, I>>::get(issuer);
                 if issuer_idty_cert_meta.received_count == 0 {
                     return Err(Error::<T, I>::IdtyMustReceiveCertsBeforeCanIssue.into());
@@ -317,22 +308,9 @@ pub mod pallet {
                 } else if issuer_idty_cert_meta.issued_count >= T::MaxByIssuer::get() {
                     return Err(Error::<T, I>::IssuedTooManyCert.into());
                 }
-
-                // Verify rule CertRenewablePeriod
-                if let Ok(CertValue { renewable_on, .. }) =
-                    <StorageCertsByIssuer<T, I>>::try_get(issuer, receiver)
-                {
-                    if renewable_on > block_number {
-                        return Err(Error::<T, I>::NotRespectRenewablePeriod.into());
-                    }
-                    false
-                } else {
-                    true
-                }
-            } else {
-                !StorageCertsByIssuer::<T, I>::contains_key(issuer, receiver)
             };
 
+            let create = !StorageCertsByIssuer::<T, I>::contains_key(issuer, receiver);
             Self::do_add_cert(block_number, create, issuer, receiver)
         }
         /// Add a new certification or renew an existing one
@@ -370,18 +348,7 @@ pub mod pallet {
                 return Err(Error::<T, I>::IssuedTooManyCert.into());
             }
 
-            // Verify rule CertRenewablePeriod
-            let create = if let Ok(CertValue { renewable_on, .. }) =
-                <StorageCertsByIssuer<T, I>>::try_get(issuer, receiver)
-            {
-                if renewable_on > block_number {
-                    return Err(Error::<T, I>::NotRespectRenewablePeriod.into());
-                }
-                false
-            } else {
-                true
-            };
-
+            let create = !StorageCertsByIssuer::<T, I>::contains_key(issuer, receiver);
             Self::do_add_cert(block_number, create, issuer, receiver)
         }
 
@@ -439,7 +406,6 @@ pub mod pallet {
 
             // Write StorageCertsRemovableOn and StorageCertsByIssuer
             let cert_value = CertValue {
-                renewable_on: block_number + T::CertRenewablePeriod::get(),
                 removable_on: block_number + T::ValidityPeriod::get(),
             };
             <StorageCertsRemovableOn<T, I>>::append(cert_value.removable_on, (issuer, receiver));
diff --git a/pallets/certification/src/mock.rs b/pallets/certification/src/mock.rs
index b33804637..96a467257 100644
--- a/pallets/certification/src/mock.rs
+++ b/pallets/certification/src/mock.rs
@@ -94,7 +94,6 @@ impl frame_support::traits::EnsureOrigin<(Origin, IdtyIndex, IdtyIndex)> for Ens
 parameter_types! {
     pub const MaxByIssuer: u32 = 3;
     pub const MinReceivedCertToBeAbleToIssueCert: u32 = 2;
-    pub const RenewablePeriod: BlockNumber = 4;
     pub const CertPeriod: u64 = 2;
     pub const ValidityPeriod: u64 = 10;
 }
@@ -109,7 +108,6 @@ impl pallet_certification::Config for Test {
     type MinReceivedCertToBeAbleToIssueCert = MinReceivedCertToBeAbleToIssueCert;
     type OnNewcert = ();
     type OnRemovedCert = ();
-    type CertRenewablePeriod = RenewablePeriod;
     type ValidityPeriod = ValidityPeriod;
 }
 
diff --git a/pallets/certification/src/tests.rs b/pallets/certification/src/tests.rs
index 64b77fb2a..25998c16b 100644
--- a/pallets/certification/src/tests.rs
+++ b/pallets/certification/src/tests.rs
@@ -115,11 +115,6 @@ fn test_genesis_build() {
             DefaultCertification::certs_removable_on(3),
             Some(vec![(2, 1)]),
         );
-        // Cert 2->0 cannot be renewed before #5
-        assert_eq!(
-            DefaultCertification::add_cert(Origin::signed(2), 0),
-            Err(Error::<Test, _>::NotRespectRenewablePeriod.into())
-        );
 
         run_to_block(3);
         // Cert 2->1 must have expired
@@ -162,31 +157,3 @@ fn test_cert_period() {
         assert_ok!(DefaultCertification::add_cert(Origin::signed(0), 3));
     });
 }
-
-#[test]
-fn test_renewable_period() {
-    new_test_ext(DefaultCertificationConfig {
-        apply_cert_period_at_genesis: true,
-        certs_by_issuer: btreemap![
-            0 => btreemap![1 => 10],
-            2 => btreemap![0 => 10],
-            3 => btreemap![0 => 10],
-        ],
-    })
-    .execute_with(|| {
-        run_to_block(CertPeriod::get());
-        assert_eq!(
-            DefaultCertification::add_cert(Origin::signed(0), 1),
-            Err(Error::<Test, _>::NotRespectRenewablePeriod.into())
-        );
-        run_to_block(RenewablePeriod::get());
-        assert_ok!(DefaultCertification::add_cert(Origin::signed(0), 1));
-        run_to_block(RenewablePeriod::get() + CertPeriod::get());
-        assert_eq!(
-            DefaultCertification::add_cert(Origin::signed(0), 1),
-            Err(Error::<Test, _>::NotRespectRenewablePeriod.into())
-        );
-        run_to_block((2 * RenewablePeriod::get()) + 1);
-        assert_ok!(DefaultCertification::add_cert(Origin::signed(0), 1));
-    });
-}
diff --git a/pallets/certification/src/types.rs b/pallets/certification/src/types.rs
index d1b858f9f..4d2534c57 100644
--- a/pallets/certification/src/types.rs
+++ b/pallets/certification/src/types.rs
@@ -22,7 +22,6 @@ use scale_info::TypeInfo;
 
 #[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub struct CertValue<BlockNumber> {
-    pub renewable_on: BlockNumber,
     pub removable_on: BlockNumber,
 }
 
diff --git a/pallets/duniter-test-parameters/src/lib.rs b/pallets/duniter-test-parameters/src/lib.rs
index b72c11341..d7232aa03 100644
--- a/pallets/duniter-test-parameters/src/lib.rs
+++ b/pallets/duniter-test-parameters/src/lib.rs
@@ -40,22 +40,18 @@ pub mod types {
         pub cert_period: BlockNumber,
         pub cert_max_by_issuer: CertCount,
         pub cert_min_received_cert_to_issue_cert: CertCount,
-        pub cert_renewable_period: BlockNumber,
         pub cert_validity_period: BlockNumber,
         pub idty_confirm_period: BlockNumber,
         pub idty_creation_period: BlockNumber,
         pub membership_period: BlockNumber,
-        pub membership_renewable_period: BlockNumber,
         pub pending_membership_period: BlockNumber,
         pub ud_creation_period: BlockNumber,
         pub ud_reeval_period: BlockNumber,
         pub smith_cert_period: BlockNumber,
         pub smith_cert_max_by_issuer: CertCount,
         pub smith_cert_min_received_cert_to_issue_cert: CertCount,
-        pub smith_cert_renewable_period: BlockNumber,
         pub smith_cert_validity_period: BlockNumber,
         pub smith_membership_period: BlockNumber,
-        pub smith_membership_renewable_period: BlockNumber,
         pub smith_pending_membership_period: BlockNumber,
         pub smiths_wot_first_cert_issuable_on: BlockNumber,
         pub smiths_wot_min_cert_for_membership: CertCount,
diff --git a/pallets/duniter-wot/src/mock.rs b/pallets/duniter-wot/src/mock.rs
index 9a8be5817..082388a87 100644
--- a/pallets/duniter-wot/src/mock.rs
+++ b/pallets/duniter-wot/src/mock.rs
@@ -132,7 +132,6 @@ impl pallet_identity::Config for Test {
 parameter_types! {
     pub const MembershipPeriod: u64 = 8;
     pub const PendingMembershipPeriod: u64 = 3;
-    pub const RenewablePeriod: u64 = 2;
     pub const RevocationPeriod: u64 = 4;
 }
 
@@ -146,7 +145,6 @@ impl pallet_membership::Config<Instance1> for Test {
     type MetaData = crate::MembershipMetaData<u64>;
     type OnEvent = DuniterWot;
     type PendingMembershipPeriod = PendingMembershipPeriod;
-    type RenewablePeriod = RenewablePeriod;
     type RevocationPeriod = RevocationPeriod;
 }
 
@@ -154,7 +152,6 @@ impl pallet_membership::Config<Instance1> for Test {
 parameter_types! {
     pub const MaxByIssuer: u8 = 8;
     pub const MinReceivedCertToBeAbleToIssueCert: u32 = 2;
-    pub const CertRenewablePeriod: u64 = 4;
     pub const CertPeriod: u64 = 2;
     pub const ValidityPeriod: u64 = 20;
 }
@@ -169,7 +166,6 @@ impl pallet_certification::Config<Instance1> for Test {
     type MinReceivedCertToBeAbleToIssueCert = MinReceivedCertToBeAbleToIssueCert;
     type OnNewcert = DuniterWot;
     type OnRemovedCert = DuniterWot;
-    type CertRenewablePeriod = CertRenewablePeriod;
     type ValidityPeriod = ValidityPeriod;
 }
 
@@ -191,7 +187,6 @@ impl pallet_duniter_wot::Config<Instance2> for Test {
 parameter_types! {
     pub const SmithsMembershipPeriod: u64 = 20;
     pub const SmithsPendingMembershipPeriod: u64 = 3;
-    pub const SmithsRenewablePeriod: u64 = 2;
     pub const SmithsRevocationPeriod: u64 = 4;
 }
 
@@ -205,7 +200,6 @@ impl pallet_membership::Config<Instance2> for Test {
     type MetaData = crate::MembershipMetaData<u64>;
     type OnEvent = SmithsSubWot;
     type PendingMembershipPeriod = SmithsPendingMembershipPeriod;
-    type RenewablePeriod = SmithsRenewablePeriod;
     type RevocationPeriod = SmithsRevocationPeriod;
 }
 
@@ -213,7 +207,6 @@ impl pallet_membership::Config<Instance2> for Test {
 parameter_types! {
     pub const SmithsMaxByIssuer: u8 = 8;
     pub const SmithsMinReceivedCertToBeAbleToIssueCert: u32 = 2;
-    pub const SmithsCertRenewablePeriod: u64 = 4;
     pub const SmithsCertPeriod: u64 = 2;
     pub const SmithsValidityPeriod: u64 = 10;
 }
@@ -228,7 +221,6 @@ impl pallet_certification::Config<Instance2> for Test {
     type MinReceivedCertToBeAbleToIssueCert = SmithsMinReceivedCertToBeAbleToIssueCert;
     type OnNewcert = SmithsSubWot;
     type OnRemovedCert = SmithsSubWot;
-    type CertRenewablePeriod = SmithsCertRenewablePeriod;
     type ValidityPeriod = SmithsValidityPeriod;
 }
 
@@ -269,7 +261,6 @@ pub fn new_test_ext(
                     i as u32,
                     sp_membership::MembershipData {
                         expire_on: MembershipPeriod::get(),
-                        renewable_on: RenewablePeriod::get(),
                     },
                 )
             })
@@ -292,7 +283,6 @@ pub fn new_test_ext(
                     i as u32,
                     sp_membership::MembershipData {
                         expire_on: SmithsMembershipPeriod::get(),
-                        renewable_on: SmithsRenewablePeriod::get(),
                     },
                 )
             })
diff --git a/pallets/identity/src/mock.rs b/pallets/identity/src/mock.rs
index 2e34e7494..d6f973e04 100644
--- a/pallets/identity/src/mock.rs
+++ b/pallets/identity/src/mock.rs
@@ -80,7 +80,6 @@ parameter_types! {
     pub const ConfirmPeriod: u64 = 2;
     pub const IdtyCreationPeriod: u64 = 3;
     pub const MaxInactivityPeriod: u64 = 5;
-    pub const RenewablePeriod: u64 = 3;
     pub const ValidationPeriod: u64 = 2;
 }
 
diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs
index af1e859d2..1232c04d9 100644
--- a/pallets/membership/src/lib.rs
+++ b/pallets/membership/src/lib.rs
@@ -78,9 +78,6 @@ pub mod pallet {
         /// Maximum period (in number of blocks), where an identity can remain pending subscription.
         type PendingMembershipPeriod: Get<Self::BlockNumber>;
         #[pallet::constant]
-        /// Duration after which a membership is renewable
-        type RenewablePeriod: Get<Self::BlockNumber>;
-        #[pallet::constant]
         /// Minimum duration (in number of blocks between a revocation and a new entry request
         type RevocationPeriod: Get<Self::BlockNumber>;
     }
@@ -184,8 +181,6 @@ pub mod pallet {
         MembershipAlreadyAcquired,
         /// Membership already requested
         MembershipAlreadyRequested,
-        /// Membership not yet renewable
-        MembershipNotYetRenewable,
         /// Membership not found
         MembershipNotFound,
         /// Origin not allowed to use this identity
@@ -280,14 +275,10 @@ pub mod pallet {
                 return Err(Error::<T, I>::IdtyNotAllowedToRenewMembership.into());
             }
 
-            if let Some(membership_data) = Self::get_membership(&idty_id) {
-                let block_number = frame_system::pallet::Pallet::<T>::block_number();
-                if membership_data.renewable_on > block_number {
-                    return Err(Error::<T, I>::MembershipNotYetRenewable.into());
-                }
-            } else {
-                return Err(Error::<T, I>::MembershipNotFound.into());
-            }
+            ensure!(
+                Self::get_membership(&idty_id).is_some(),
+                Error::<T, I>::MembershipNotFound
+            );
 
             let _ = Self::do_renew_membership(idty_id);
 
@@ -321,15 +312,8 @@ pub mod pallet {
         fn do_renew_membership_inner(idty_id: T::IdtyId) -> Weight {
             let block_number = frame_system::pallet::Pallet::<T>::block_number();
             let expire_on = block_number + T::MembershipPeriod::get();
-            let renewable_on = block_number + T::RenewablePeriod::get();
-
-            Self::insert_membership(
-                idty_id,
-                MembershipData {
-                    expire_on,
-                    renewable_on,
-                },
-            );
+
+            Self::insert_membership(idty_id, MembershipData { expire_on });
             MembershipsExpireOn::<T, I>::append(expire_on, idty_id);
             0
         }
diff --git a/pallets/membership/src/mock.rs b/pallets/membership/src/mock.rs
index e21a41537..4e1b49dd5 100644
--- a/pallets/membership/src/mock.rs
+++ b/pallets/membership/src/mock.rs
@@ -80,7 +80,6 @@ impl system::Config for Test {
 parameter_types! {
     pub const MembershipPeriod: BlockNumber = 5;
     pub const PendingMembershipPeriod: BlockNumber = 3;
-    pub const RenewablePeriod: BlockNumber = 2;
     pub const RevocationPeriod: BlockNumber = 4;
 }
 
@@ -94,7 +93,6 @@ impl pallet_membership::Config for Test {
     type MetaData = ();
     type OnEvent = ();
     type PendingMembershipPeriod = PendingMembershipPeriod;
-    type RenewablePeriod = RenewablePeriod;
     type RevocationPeriod = RevocationPeriod;
 }
 
diff --git a/pallets/membership/src/tests.rs b/pallets/membership/src/tests.rs
index 8e9635597..67fa62fd0 100644
--- a/pallets/membership/src/tests.rs
+++ b/pallets/membership/src/tests.rs
@@ -28,7 +28,6 @@ fn default_gen_conf() -> DefaultMembershipConfig {
         memberships: btreemap![
             0 => MembershipData {
                 expire_on: 3,
-                renewable_on: 2
             }
         ],
     }
@@ -41,27 +40,12 @@ fn test_genesis_build() {
         // Verify state
         assert_eq!(
             DefaultMembership::membership(0),
-            Some(MembershipData {
-                expire_on: 3,
-                renewable_on: 2
-            })
+            Some(MembershipData { expire_on: 3 })
         );
         assert_eq!(DefaultMembership::members_count(), 1);
     });
 }
 
-#[test]
-fn test_membership_not_yet_renewable() {
-    new_test_ext(default_gen_conf()).execute_with(|| {
-        run_to_block(1);
-        // Merbership 0 cannot be renewed before #2
-        assert_eq!(
-            DefaultMembership::renew_membership(Origin::signed(0), None),
-            Err(Error::<Test, _>::MembershipNotYetRenewable.into())
-        );
-    });
-}
-
 #[test]
 fn test_membership_already_acquired() {
     new_test_ext(default_gen_conf()).execute_with(|| {
@@ -190,23 +174,16 @@ fn test_membership_workflow() {
             RuntimeEvent::DefaultMembership(Event::MembershipAcquired(0))
         );
 
-        // Then, idty 0 claim renewal, should fail
-        run_to_block(3);
-        assert_eq!(
-            DefaultMembership::renew_membership(Origin::signed(0), None),
-            Err(Error::<Test, _>::MembershipNotYetRenewable.into())
-        );
-
-        // Then, idty 0 claim renewal after renewable period, should success
-        run_to_block(2 + RenewablePeriod::get());
+        // Then, idty 0 claim renewal, should success
+        run_to_block(2);
         assert_ok!(DefaultMembership::renew_membership(Origin::signed(0), None),);
 
         // Then, idty 0 shoul still member until membership period ended
-        run_to_block(2 + RenewablePeriod::get() + MembershipPeriod::get() - 1);
+        run_to_block(2 + MembershipPeriod::get() - 1);
         assert!(DefaultMembership::is_member(&0));
 
         // Then, idty 0 shoul expire after membership period
-        run_to_block(2 + RenewablePeriod::get() + MembershipPeriod::get());
+        run_to_block(2 + MembershipPeriod::get());
         assert!(!DefaultMembership::is_member(&0),);
         assert_eq!(
             System::events()[0].event,
diff --git a/primitives/membership/src/lib.rs b/primitives/membership/src/lib.rs
index 600ae3661..97194ce0d 100644
--- a/primitives/membership/src/lib.rs
+++ b/primitives/membership/src/lib.rs
@@ -46,5 +46,4 @@ pub enum Event<IdtyId, MetaData = ()> {
 #[derive(Encode, Decode, Default, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)]
 pub struct MembershipData<BlockNumber: Decode + Encode + TypeInfo> {
     pub expire_on: BlockNumber,
-    pub renewable_on: BlockNumber,
 }
diff --git a/resources/gdev.json b/resources/gdev.json
index aba51b912..45aa222ba 100644
--- a/resources/gdev.json
+++ b/resources/gdev.json
@@ -137,22 +137,18 @@
     "cert_period": 14400,
     "cert_max_by_issuer": 100,
     "cert_min_received_cert_to_issue_cert": 5,
-    "cert_renewable_period": 172800,
     "cert_validity_period": 2102400,
     "idty_confirm_period": 14400,
     "idty_creation_period": 14400,
     "membership_period": 1051200,
-    "membership_renewable_period": 172800,
     "pending_membership_period": 172800,
     "ud_creation_period": 14400,
     "ud_reeval_period": 100800,
     "smith_cert_period": 14400,
     "smith_cert_max_by_issuer": 12,
     "smith_cert_min_received_cert_to_issue_cert": 3,
-    "smith_cert_renewable_period": 172800,
     "smith_cert_validity_period": 2102400,
     "smith_membership_period": 1051200,
-    "smith_membership_renewable_period": 172800,
     "smith_pending_membership_period": 172800,
     "smiths_wot_first_cert_issuable_on": 14400,
     "smiths_wot_min_cert_for_membership": 3,
diff --git a/resources/metadata.scale b/resources/metadata.scale
index 1f01cc4a16551841453d80d1d36da2e23037db3f..968b774a7abe5dd37311695ef4112ee05e6e9946 100644
GIT binary patch
delta 12198
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

delta 8857
zcmc&)eOOgh*5AK#4sbEli}G<1(5nIhf&z*GA#qVuLX=MnmGH_vz)iRp@4YBgR92Qu
znL0b&+DPT7HRMMU`rMebGONiNd!_O%n{4!%nnx>VbjF&R$$8&(&b<iM%=_`jJmYgc
zXMe1{_TFpnwbpN~!`1GfKR+B4*sOZ2Bdk4v+hip1r{!3r@|WcaShn+=Eb-95F!=-Q
z5})QFYFtiE;VRYP$t`bnc<jw;9vjEZMK)@&d)gKD5nmRVE}zBs+!{2RKN~m$pYaVr
zb9h{kN&f0uYcjt(XcR6{&+WLv{}5D$Z@I;gfdK9?WMeqrZ<vB`e#Vf3@qAct0^)nq
zgX^NjnLJG7e~b?fHKZ+2S6A6)xm2r1wS~aM_a;=z%<w38B}|OGZHcwn+3HC#H>=Id
zRhPTA&Pi*n;ad_`NQMJko|KY$aEU`*UE6A_)hHbrsnbCcaJAPqTixy-jO6E%@4!d=
zz#bF-#mEr;YU0}?KLPF8)4ssktTGT!V{$m(pEMGa_>rW0`1<4|SvIujt?wpx1bxC-
zfW*#<19K76yD@F1B!3oC%FhLciTjEX+<P&@3Y_m<I6WUh=ZTcDuZECb`X{8gBGyzA
zzrC3$+UV0Wo|H+7UH#Gg@tj*o(r0t(ah}h;=@^wma_0cNB6li1AINQ#0>Jw}^z9~e
zrdJ6DZ2aWMQQUEJ29L~ZzP{o8ynBW=yoq3*nO{Mtbk-8XcjrHgP~LxOG+$=9mr7?X
z8|dU(3f@5!&z+SZ#iF-vRw1YsdL@a!H~Stcl@&%yAtBsT7(a}~f;OzM@es}sME1U0
z_zk3Zi1d1l={-BwtldTwSB*?1GRe%+wO13%<ZAJa$mU(e6YvRtwK$e84P${uHj{r|
zJRO$aG4m4@6!KZ61t{r#sPrsg;SJ?eqYAb0MPT$}iXkzPm1qr#tc)+KjNosS&p{Or
zsYsBjNIpo(ss^LG<#4*1txeT{Qpu3wY*AfSkKO6G))d!lb=a&Pr>osZ!>V;|`zvx$
z!@sPErDt$uOn42DwXj7SnR}~hZ)o)7F;>HKD&t`#`edm5k;*ZWs?W^dubd{?wPGY6
zSCxroUR9M$TfMI;nx5OM7Gov<OI6~ul~6)vIae!6C0fB0Mh~Vxq;@d+(Iz`!WF1tJ
z4b){|YkJEUy(guw)%M*9)(OSrTa?CQJzy{{AWa}rV}-L>RoHqWq~Cg8Rh@uM{O;<p
zILd!kT~6gcRGXA8;BmfVg^5pC91(F;!t_#WQ<Lg(FLc=(><-2@!N|`=hVx6I!+7)J
zkzt!*oM&}6!VE*$B5PAC&9IqoTpSg@8HTh5o4Tsj<ufbBS;UCJW~yj+d(>uy%>?%G
zmbw}~dC6F18_=g$o?8;5>;QK2(we0_VQH*#T<g&)JC}}E`hi1wC9WnB=Xgm?r*Z)}
zLQTtg?(NaaWuQlA^WyEX%2lnRjm)ear=&~%kq2vIP{#Xf?^CKI9M}7MmW|OYBIuZ{
zcZFVO{b~k=&09V}>5youjcN^lXL&3-iAOD;R~Lu%e2q=z@72XAn>B)#y5)SSEe_kL
zxl`%Vno4VG_zHDAcJTG;I@<LzYb|fBPf&U!bn7elTYZeuC;6AVx?!AhVqo5H8X}}^
z;2TCp@kxy{(Z!!!p&iv_I-!$|hp(%DYu|WX{mLEPL+Yof{HvyTTEoSrB9iY$#|-rK
zI-198!uC~u<v35m>^;!(fYvtMm6qKNLy-+VU`Cjo_4TU5rn-9QP8Hc0jP53<=MZ45
zpf^KWz1`*Z)HbSCqUq*cuBhSNfN7pyXRMnab4{bI|HYL^dTw?vrt)3xINI{l?i=Z7
zK5{3}Iscct5GB0OGo6I?v^$JH=9!dx6i7^LoiRPdOphdn>2!~rt5sXAHoyA~AkE@y
z(AMGB?)FjouNX`w_6EP~X{AGMXq}1^y`pu8WH>>6fhN|^^V@F3Dba5t3;$GG5OqJ>
zwodW4B*LtDlX{n`o}k$)b8-r-O;$%8xrQ{Y!=<`a*DBR^qW9j8C*U6x1fxxLd#>ZT
z`rgQaZr?2Y<@>($(+@}D3RP{XwKmyTspoq?U2{wxSkUpc`*Di5J!Hjc{_#V_ac2PY
zlGd!7%o%AlWE9wGZ4+(m487zq-3pw8h|zrO9S;vf7;k-e+WgPSI?=+5)pqx-E^7-J
zIVQ3BEu@WVt+h^fptW{et+QT1%79z7+uV;Lf00_3OCw8kUt46$V=_Pda55A=(pwVp
zxi;s0`kWVd{<=I|<oB*?557pvQa9LTj?QWLx;L}4FaTfkyB=$z6F&dgWB87*-Y}b<
zhd1O(SHb_fp_n|^vzum1sS<ZKkLAy8{NC4q)ZVW)<tS8{w55DpfP{I4D_iZWoOQa5
z&YhQHUO;v>Kr+mCx770AY>nlIwuCFe65Xmak;ebNWeSNQRoq5S?W3(pfx{)Gg1lJJ
zwyEY=38utFDdq~gL?*Xd=XBVHG_m1a*;*onO8n~BDBiSn#O>iUw`$AC%uLVD$*Hh6
zIINyl7g^G9DI|vGu5-H77=M4<kZy%VN&e%SF};RSjU<+@ODvX(ieWfS!p7^XiyvHF
z(vMd+q>07zMcWpJB<T#|H3q4?XWM8gUE<5eMe*Nm8;?wmClXP#Gx-UL%9FP*CW$<>
zeFZ)Lv^@hed3;w~v_(RxcDxH)tSej9lGY}V-D<PBNT4&ht!q-Sh4@Q_5-a47cTGbP
zf2%8#^zrXqk@Sps(rmnbXJryUIX;Xpelil9MOrvPm&cw=fWOS6c8~7;>?!ND``^6d
z;-IF~krL};Vtb$Y`3gu?65l>?Y@F^S$Z;_!`8K<|#p<bRthKspT~4RR0OPe$F~ofo
zU%6{JSDu+KRZHTNJWLojINFfnaakSideudckOp3_n4?Ik)BGB}us*kvw$I1znay8$
zZtQ>t>L!8T@mv*OzGpr!edY$<w`VRG-?KM%#C1@S@!#%CugZ0)tDGxTQYas6HXx?O
z+TP@}+N=_uE~if4^)2-^YU*Y2>0ps9#Y{ELhvpF&@sFx?+Z$BA@A)y3%y>diR>VpP
z`F^Z108{gr!aY6lmR54o+L;cv2e1~Op4-XMURzVGove48uJCDo1K_4kcRPRT<8TCO
z+HJ8)A-OGdG^*#?urN=1i|U^JqdgenuI+%_gAW5RgFp&QCZsi}4%KaU*EZ6=%sz;~
zn93KvkVIgz{e=not%|q-EUd83=C&%#&X2qh>97x~R+y@FT(4No(tu)Rl43Q}WtA<u
zVy%>hqMlEF1bPUslYwg0ZucjwU3)RsA!(R=3~%$!!y10nJC&Z7y%|``aWG4NhVz97
z<NT$)FD{_|j}FeKdi<eya{oPjcM}|+^2;f7Ex!Ndo6`Cr{5I+Q$W8xG{G?5icsHNm
zb9mnrh3smGE<9e_H$un2G5jZeBcjNR&#O?~ZbF$uO*w(AAI`r`(!z%^{L_~bp`B?&
zZ|vc!0Bq(V$I_AAyZh*TL}vpjKD$0ki;@`3EiPw^(`{`UAj>;erNj`~^iqFEk#=hs
zV#tNKoSLJ0{#T<lV|(m)B2MtHj+=;gz}p*w2wrUOUkUV%crR9_SIViK5`m4AAC~x5
z6F5YBdl!8)MT&_9LR!;jFwAy(8c9>>&Xb9Cy6mccCld&R4Ero0P9N7zm)vKxG#II=
zEE3&BtJZ2Z;e4<0H!m9g4-9*UefEdI|BWtUM4T1}w>a$%&p;s6Tl(cY%H-YGT{G(Y
zA-E2vTSmWb$p?~`T#6pO83fX^sgZ5g0}i%N;^!>UeAlHEJ<fVS>XG=$f^fd#at;m&
z5sa||*7V%vsS=`kL$9RLOAEJp8^8HhD_Xxx)8eq7eixu5MUgEd1475u)?P`f$`Gb2
z`ZejA8uj2Lo4;~3md@(T)xI09pU3-NFx*noq3bqBY=5}9DBtG#gd+s$IO2Ue1S{l`
z*X9{=zTQkDnh5v`B8l<7JPKtJjtXNq#$mIU9K{_7KB6fh$>ylo8G%H+A$}c!88|NF
zNGwojzoCSSEy0VNcAKWFZ-}QNQAXXDBXOT}Lej!XlX%30IGhj%OcZ^b@)DHm1hTzL
z#?b2My*?VNAoWXxouj?xSejHiC5eqHBE?HLA};YX`Cf9z><l?x9rBPHI8AdYh8~!x
zmDWeqbNY~sXvIhT`4HmIH4=qg5V_+JkBegYIHaflKhY|??0tP4UI)Gwo#U|-jpFy?
zv3X==o$B%s%p|aBUEZV$%S2lBT@$b|yvdK%8tpAV?7v|mE`>L_o9&*)+J7|uZxc}=
z?ukQSc<n!B;$0AjC`jK)!X8hOzB)u;;gEeY2$ly0260mYrlLcvNWhd40WxCBRjb?S
za1%rm&n95{uwa>_1epz&HQ8r`hx)mM58)CjQYIl|bO&PmUYQQS0E6AuAy!U8QgFD&
zBUENlV&^1GlVW9VX)}2*O~Psk<3(dKl1IhMFt(;=WHA;`!~sDpN$g6-%weh8&~%xl
z%UbL$q{+BtiUo)%Rb9*NT0lxjzk#47SvDA#JDt>GvZ)P({AmHL#4b}rryyEvo{Y70
zsi+((1<%x&T4ZJsnNzS{Dx~$S8{_?S3i^Q}aUc!1XSe&kayi)%mq*ngRtb$#43ATC
zLK|KsGx|{j`x>lTFV)D2tVYaD$7IPW^SfiByzA3Z1gPS}3~Yg2IHtjdX7T<sObT5q
zA<mBoG(g;}i`RFx#hmFFC9RbCp4cd_dpf4dQtM#%<cRhmqHovMa*%b%y2TQqS%@69
zh7xZ+leI?HawKex$jKsQS}S_8a5Fl^<t)<ZwSJaMvN1#I9ONH2X|4Z=*AJOzy*AHU
znQhW{Y9wnY6LO6f#vJ@w+9nf_j1X6HP>C+_+Rc~{Ye*?*a@MU_(5fZ;U>piIm{FMX
zks_oNI#7|1_|P3P5;gc!;US1lS8s=Cu%IGrw>D?D%;-mQHtvwwK3Plp-5OTtayeZ(
z&b)12kz*BwV79qF#G(NiqHgk6%{qXwIaRmW;q;iBH9&fsf5Z?-MEJCxK~Op>$?VaS
zm`>LMr^n(8Oe>wfyr#B9CW%o6$QK6-5GLvi5DP^-Sb#JHh(iUKjzIB60SXZ$(q<v;
zUW3v!kcl-rC^c!eHc^Ju)^1kY>~7CB$md@W3sz=pbNEQ@zI`p#aiP;Q%juv9y;-#t
zv@cxkplEQIa`zx_+8f0~J_7UdcC%9>NfYO1VK{CO-^{|q_z*>(&nE{xHq7_4ro4}x
z@@1-x4HpHok%|$bWj12QEWJ(yKK8l{MvA3{xCutFwGb2Xa*3>hHm7sb@~@%FZPa9T
zYa1Rw)cT%gmuqP@i%$j?n~i21CHm$dZq#TcSMSqTrwd2?vJhkEhAC|tE0^kSQR_T<
zidR1if>UGx>`q&$E(|}ECDKAouq<3zs<)f{Kv{e-2W{vPb#pP*U_hMO)?#;w9r*|g
zOw+BjC@V%Jxz*?AA_*zp({oXSg*G45a+9ql&ef`?e88ZyK&54{Q(ttusx8xR@aGM7
z(#Sc4)od(C6c>?aGl-5N%to*nSBh*56W<r%5v5P|=aiqi1uo^tkXoRaT8uHY=D~GF
zh+B#=RyjIAMJelW#Cf+A<18v{G+((-TGv+VlN1Y5zO8JuyUm(!vDe#u5sjuG*KXx<
zRdtx{Zg;C{Gdo?r?Wi`<T!Ls?cV`LiCrAHp64CL0$9AO?x?Ri&H~U;?DrLk5utvWu
zPFBEyc5!nhO!T^~5|gA;vX@Z&N$G~uy3x|`iL8AC@UFfUzk_s67E7x!myUl|HOj`5
zm&wxjT?@s?6MU`>4C$7biCrM4_o2x<Wid7>!!Byp@UqM<%Y;A2i!W{`Px`f1jutt!
zI2iJsKH*i_#IE`m4L|4!PzF~GVOfS75hdD}k+q5v`<EeZH0Arr$17xiG($UFF_9tI
zpki8hsGmdl5DuXt)rxzDg==F%DOsWr`i=Dd+KLWIidFQl24cAlKPS%~pc15u*H{%w
zNeXW)A1kh?Fs7s`hUxV#G7q)x))vjbntfSnN=uT!I>^22*|IDO64OOmJuV|tz>aWn
zV*}D>o`Rkzz-A0amr$j!!Zu18AX_08i3HcFz?7JoibW|@ij*>?N~xx#wYakpV?;<J
zCd1+@mp5V(3bk@BIe)#ozYz(;N)&_?x~$~)y)<`^5oNy46YUr~k|HcE?Dqv%tV;Z~
z9XY5LnRjC5=pSb%YP@UjM1g{I?_2j^38i;L+#0w8&eKv$gz<h%6tAqoe4G~{_v1b!
ziS_p*@z$9XIhxXRFY5a|;VvTx!~PVItOX;?d`ovf74oayL0T2BI<`DRp)7?jTmO<*
zqZhPx`Zq}O&3WTa5%K_*!z!E)-~d4q^Mj}jYo@a^YRP{6p|Q6y@v{eUgrXEty%t|#
zjhOQg?j{6r>>=#MHgC(r$O8IB_d47{IhQNzFomq=#7=bJkatHXC{cAp{O%DPCSd>c
zqxczcPUJp@YFrRo9>Z>2@aAs7YMD^?!JpzzdQIi@v15n#2*;fgE{m)!SWNQZTaba{
z-Z!@pjq<hB15vgWm15ae#ERWpVbg%Fr32%=Dcg`CYjAhjc07XN;;ZchbfQE`7Z#%5
zdv_OIc^Y!?N#xPB{PU9(cO-dDPa$4GsyA;Zf<R|7XBTn<&H?K}#MRBn7O(E2O=XKe
z?!rXO6r*>efL63<H>u49@yKqHUZKc+hWd)cvS;9tOXO7VhtJ?`kSX~2FX+n9adzV;
zDD#SLa4kZZyoW4)wNUrqmblBnRtBp)B4#dSx@;|03=~XZ8VpjwRPnwx!0sKs7r_!`
zU4>~siDRX=ct2K2Xcey=KsiD8@E!t}o5bE8JOEOc7w`cEpaH$8yqChZw-~m`VbiNx
z8eEjv_kRTfeL6WwiO|_qHoxU@S5Po+ZBX&!CPU&N6-B@jYh$cbPd})xIZoG*PG%%r
zNJ_WY-z!GEj5zvu%Gg*Da*$%I5Rq{Z$>PC-cqtIo5<W1BR}Ucq7Vn3LunQ6!C+_u<
z(7VKbFYdx8BKbuMDt8O(i<l5lBjF=Ota}mV684G2J|vSv|Lh3)q&1@9Wi$qKNH}X0
zAH0l@=jQ&v_Zf{D+QJT-XSe#k6`HN}1nSMJ8|`(CX6wLrX>#=B{s!H+*#8O{_(S5+
zm&io)iLzHwj3ZkPV-v}F>QP!#r-aXpqVF)CUNC<axz&F>?OXqB+Uq^>bu(8VK|aOY
zPaL5D!oST;zHP3T@YTO!n{SBNS267$Zj-)?UDCJNC|*8_tbfH`rQ@>5dJXBC$6fIn
z8JEps*K3$9k(d4AHK?RhrN?mCuuZ}hhEuW#dmWR>$9_*n9$gZ?_0E4CH%ihOS*(2%
zams0#Jng<WDSrK2)<||p2=IRSCXD2xAijT#4Acc#+<crA>7p#W#}TW&|MNI(%07wg
zN8a05N#0fTyp0&?J6Zh4+jxnb_9O2gJA}Uag~ODuXKX~zyNK}q{vFgSp;5}sF;yOW
z6aCo*L!TDe)|{l%ixtnFL_O6;^i!A+FK+I~?64COsY6WKK$5P2zGWnNML&6^8*0cA
zD@8DuSlh(1_pm@jzfV{@N!<EA79myae;?1^k*-)W6(uHrR-;<CqJp6DBKoTe!o)Kb
zW0u}l+2(JtD8@9s#UBtADrO%=3AtUu{hszB#hj>9(0ArKwM=PC(Q7`RQzg!Pfari~
IrL9K!Z-Z{&cmMzZ

diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs
index 510c6e237..bc5e82e5a 100644
--- a/runtime/common/src/pallets_config.rs
+++ b/runtime/common/src/pallets_config.rs
@@ -447,7 +447,6 @@ macro_rules! pallets_config {
             type MetaData = pallet_duniter_wot::MembershipMetaData<AccountId>;
             type OnEvent = OnMembershipEventHandler<Wot, Runtime>;
             type PendingMembershipPeriod = PendingMembershipPeriod;
-            type RenewablePeriod = RenewablePeriod;
             type RevocationPeriod = frame_support::traits::ConstU32<0>;
         }
 
@@ -461,7 +460,6 @@ macro_rules! pallets_config {
             type MinReceivedCertToBeAbleToIssueCert = MinReceivedCertToBeAbleToIssueCert;
             type OnNewcert = Wot;
             type OnRemovedCert = Wot;
-            type CertRenewablePeriod = CertRenewablePeriod;
             type ValidityPeriod = ValidityPeriod;
         }
 
@@ -485,7 +483,6 @@ macro_rules! pallets_config {
             type MetaData = SmithsMembershipMetaData<opaque::SessionKeysWrapper>;
             type OnEvent = OnSmithMembershipEventHandler<SmithsSubWot, Runtime>;
             type PendingMembershipPeriod = SmithPendingMembershipPeriod;
-            type RenewablePeriod = SmithRenewablePeriod;
             type RevocationPeriod = frame_support::traits::ConstU32<0>;
         }
 
@@ -499,7 +496,6 @@ macro_rules! pallets_config {
             type MinReceivedCertToBeAbleToIssueCert = SmithMinReceivedCertToBeAbleToIssueCert;
             type OnNewcert = SmithsSubWot;
             type OnRemovedCert = SmithsSubWot;
-            type CertRenewablePeriod = SmithCertRenewablePeriod;
             type ValidityPeriod = SmithValidityPeriod;
         }
 
diff --git a/runtime/g1/src/parameters.rs b/runtime/g1/src/parameters.rs
index 44e8ced87..24a32ac67 100644
--- a/runtime/g1/src/parameters.rs
+++ b/runtime/g1/src/parameters.rs
@@ -111,7 +111,6 @@ parameter_types! {
 parameter_types! {
     pub const MembershipPeriod: BlockNumber = YEARS;
     pub const PendingMembershipPeriod: BlockNumber = 2 * MONTHS;
-    pub const RenewablePeriod: BlockNumber = 2 * MONTHS;
 }
 
 // Certification
@@ -119,7 +118,6 @@ parameter_types! {
     pub const CertPeriod: BlockNumber = 5 * DAYS;
     pub const MaxByIssuer: u32 = 100;
     pub const MinReceivedCertToBeAbleToIssueCert: u32 = 5;
-    pub const CertRenewablePeriod: BlockNumber = 6 * MONTHS;
     pub const ValidityPeriod: BlockNumber = 2 * YEARS;
 }
 
@@ -136,7 +134,6 @@ parameter_types! {
 parameter_types! {
     pub const SmithMembershipPeriod: BlockNumber = 73 * DAYS;
     pub const SmithPendingMembershipPeriod: BlockNumber = 12 * DAYS;
-    pub const SmithRenewablePeriod: BlockNumber = 12 * DAYS;
 }
 
 // Certification
@@ -144,7 +141,6 @@ parameter_types! {
     pub const SmithCertPeriod: BlockNumber = 5 * DAYS;
     pub const SmithMaxByIssuer: u32 = 12;
     pub const SmithMinReceivedCertToBeAbleToIssueCert: u32 = 5;
-    pub const SmithCertRenewablePeriod: BlockNumber = 12 * DAYS;
     pub const SmithValidityPeriod: BlockNumber = 146 * DAYS;
 }
 
diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs
index 99f886d16..807446155 100644
--- a/runtime/gdev/src/lib.rs
+++ b/runtime/gdev/src/lib.rs
@@ -227,12 +227,10 @@ common_runtime::pallets_config! {
     pub type MaxByIssuer = pallet_duniter_test_parameters::CertMaxByIssuer<Runtime>;
     pub type MinReceivedCertToBeAbleToIssueCert =
         pallet_duniter_test_parameters::CertMinReceivedCertToIssueCert<Runtime>;
-    pub type CertRenewablePeriod = pallet_duniter_test_parameters::CertRenewablePeriod<Runtime>;
     pub type ValidityPeriod = pallet_duniter_test_parameters::CertValidityPeriod<Runtime>;
     pub type ConfirmPeriod = pallet_duniter_test_parameters::IdtyConfirmPeriod<Runtime>;
     pub type IdtyCreationPeriod = pallet_duniter_test_parameters::IdtyCreationPeriod<Runtime>;
     pub type MembershipPeriod = pallet_duniter_test_parameters::MembershipPeriod<Runtime>;
-    pub type RenewablePeriod = pallet_duniter_test_parameters::MembershipRenewablePeriod<Runtime>;
     pub type PendingMembershipPeriod = pallet_duniter_test_parameters::PendingMembershipPeriod<Runtime>;
     #[cfg(not(test))]
     pub type UdCreationPeriod = pallet_duniter_test_parameters::UdCreationPeriod<Runtime>;
@@ -247,14 +245,10 @@ common_runtime::pallets_config! {
     pub type SmithMaxByIssuer = pallet_duniter_test_parameters::SmithCertMaxByIssuer<Runtime>;
     pub type SmithMinReceivedCertToBeAbleToIssueCert =
         pallet_duniter_test_parameters::SmithCertMinReceivedCertToIssueCert<Runtime>;
-    pub type SmithCertRenewablePeriod =
-        pallet_duniter_test_parameters::SmithCertRenewablePeriod<Runtime>;
     pub type SmithValidityPeriod = pallet_duniter_test_parameters::SmithCertValidityPeriod<Runtime>;
     pub type SmithMembershipPeriod = pallet_duniter_test_parameters::SmithMembershipPeriod<Runtime>;
     pub type SmithPendingMembershipPeriod =
         pallet_duniter_test_parameters::SmithPendingMembershipPeriod<Runtime>;
-    pub type SmithRenewablePeriod =
-        pallet_duniter_test_parameters::SmithMembershipRenewablePeriod<Runtime>;
     pub type SmithsWotFirstCertIssuableOn =
         pallet_duniter_test_parameters::SmithsWotFirstCertIssuableOn<Runtime>;
     pub type SmithsWotMinCertForMembership =
diff --git a/runtime/gdev/tests/common/mod.rs b/runtime/gdev/tests/common/mod.rs
index 4bcb9d45a..323fbeca5 100644
--- a/runtime/gdev/tests/common/mod.rs
+++ b/runtime/gdev/tests/common/mod.rs
@@ -99,22 +99,18 @@ impl ExtBuilder {
                 cert_period: 15,
                 cert_max_by_issuer: 10,
                 cert_min_received_cert_to_issue_cert: 2,
-                cert_renewable_period: 50,
                 cert_validity_period: 10_000,
                 idty_confirm_period: 40,
                 idty_creation_period: 50,
                 membership_period: 1_000,
-                membership_renewable_period: 5,
                 pending_membership_period: 500,
                 ud_creation_period: 10,
                 ud_reeval_period: 10 * 20,
                 smith_cert_period: 15,
                 smith_cert_max_by_issuer: 8,
                 smith_cert_min_received_cert_to_issue_cert: 2,
-                smith_cert_renewable_period: 50,
                 smith_cert_validity_period: 1_000,
                 smith_membership_period: 1_000,
-                smith_membership_renewable_period: 50,
                 smith_pending_membership_period: 500,
                 smiths_wot_first_cert_issuable_on: 20,
                 smiths_wot_min_cert_for_membership: 2,
@@ -226,7 +222,6 @@ impl ExtBuilder {
                         i as u32,
                         MembershipData {
                             expire_on: parameters.membership_period,
-                            renewable_on: parameters.membership_renewable_period,
                         },
                     )
                 })
@@ -249,7 +244,6 @@ impl ExtBuilder {
                         i as u32,
                         MembershipData {
                             expire_on: parameters.smith_membership_period,
-                            renewable_on: parameters.smith_membership_renewable_period,
                         },
                     )
                 })
diff --git a/runtime/gtest/src/parameters.rs b/runtime/gtest/src/parameters.rs
index 8193b10c4..745786181 100644
--- a/runtime/gtest/src/parameters.rs
+++ b/runtime/gtest/src/parameters.rs
@@ -112,14 +112,12 @@ frame_support::parameter_types! {
 parameter_types! {
     pub const MembershipPeriod: BlockNumber = 73 * DAYS;
     pub const PendingMembershipPeriod: BlockNumber = 12 * DAYS;
-    pub const RenewablePeriod: BlockNumber = 12 * DAYS;
 }
 
 // Certification
 parameter_types! {
     pub const CertPeriod: BlockNumber = DAYS;
     pub const MaxByIssuer: u32 = 100;
-    pub const CertRenewablePeriod: BlockNumber = 12 * DAYS;
     pub const ValidityPeriod: BlockNumber = 146 * DAYS;
 }
 
@@ -136,7 +134,6 @@ parameter_types! {
 parameter_types! {
     pub const SmithMembershipPeriod: BlockNumber = 73 * DAYS;
     pub const SmithPendingMembershipPeriod: BlockNumber = 12 * DAYS;
-    pub const SmithRenewablePeriod: BlockNumber = 12 * DAYS;
 }
 
 // Certification
@@ -144,7 +141,6 @@ parameter_types! {
     pub const SmithCertPeriod: BlockNumber = DAYS;
     pub const SmithMaxByIssuer: u32 = 100;
     pub const SmithMinReceivedCertToBeAbleToIssueCert: u32 = 5;
-    pub const SmithCertRenewablePeriod: BlockNumber = 12 * DAYS;
     pub const SmithValidityPeriod: BlockNumber = 146 * DAYS;
 }
 
-- 
GitLab