From cd171db48844746ff10b5a0e2a4eff07446006c2 Mon Sep 17 00:00:00 2001
From: librelois <c@elo.tf>
Date: Mon, 2 May 2022 21:32:55 +0200
Subject: [PATCH] =?UTF-8?q?ref(pallet-ud):=C2=A0remove=20params=20UdFirstR?=
 =?UTF-8?q?eeval=20&=20UdReevalPeriodInBlocks?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 node/src/chain_spec/gdev.rs                |  9 +--
 node/src/chain_spec/gen_genesis_data.rs    |  4 ++
 pallets/duniter-test-parameters/src/lib.rs |  4 +-
 pallets/universal-dividend/Cargo.toml      |  4 --
 pallets/universal-dividend/src/lib.rs      | 81 ++++++++++------------
 pallets/universal-dividend/src/mock.rs     |  7 +-
 pallets/universal-dividend/src/tests.rs    |  1 +
 resources/gdev.json                        |  1 +
 runtime/common/src/pallets_config.rs       |  3 +-
 runtime/g1/src/parameters.rs               |  5 +-
 runtime/gdev/src/lib.rs                    |  2 -
 runtime/gdev/tests/common/mod.rs           |  5 +-
 runtime/gtest/src/parameters.rs            |  3 +-
 13 files changed, 54 insertions(+), 75 deletions(-)

diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs
index fe2a6d9a0..c7b13c41a 100644
--- a/node/src/chain_spec/gdev.rs
+++ b/node/src/chain_spec/gdev.rs
@@ -221,7 +221,7 @@ fn gen_genesis_conf(
         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", 20);
+    let ud_reeval_period = get_env_u32("DUNITER_UD_REEEVAL_PERIOD", 200);
 
     let initial_smiths = (0..initial_smiths_len)
         .map(|i| get_authority_keys_from_seed(NAMES[i]))
@@ -270,9 +270,7 @@ fn gen_genesis_conf(
                 membership_renewable_period,
                 pending_membership_period: 500,
                 ud_creation_period,
-                ud_first_reeval: 100,
-                ud_reeval_period: ud_reeval_period as u64,
-                ud_reeval_period_in_blocks: ud_creation_period * ud_reeval_period,
+                ud_reeval_period,
                 smith_cert_period: 15,
                 smith_cert_max_by_issuer: 8,
                 smith_cert_min_received_cert_to_issue_cert: 2,
@@ -381,6 +379,7 @@ fn gen_genesis_conf(
                 .collect(),
         },
         universal_dividend: UniversalDividendConfig {
+            first_reeval: 100,
             first_ud: 1_000,
             initial_monetary_mass: 0,
         },
@@ -415,6 +414,7 @@ fn genesis_data_to_gdev_genesis_conf(
         accounts,
         certs_by_issuer,
         first_ud,
+        first_ud_reeval,
         identities,
         initial_authorities,
         initial_monetary_mass,
@@ -483,6 +483,7 @@ fn genesis_data_to_gdev_genesis_conf(
         smiths_collective: Default::default(),
         ud_accounts_storage: UdAccountsStorageConfig { ud_accounts },
         universal_dividend: UniversalDividendConfig {
+            first_reeval: first_ud_reeval,
             first_ud,
             initial_monetary_mass,
         },
diff --git a/node/src/chain_spec/gen_genesis_data.rs b/node/src/chain_spec/gen_genesis_data.rs
index c2303724f..bc8d19754 100644
--- a/node/src/chain_spec/gen_genesis_data.rs
+++ b/node/src/chain_spec/gen_genesis_data.rs
@@ -28,6 +28,7 @@ pub struct GenesisData<Parameters: DeserializeOwned, SessionKeys: Decode> {
     pub accounts: BTreeMap<AccountId, GenesisAccountData<u64>>,
     pub certs_by_issuer: BTreeMap<u32, BTreeMap<u32, u32>>,
     pub first_ud: u64,
+    pub first_ud_reeval: u32,
     pub identities: Vec<(String, AccountId)>,
     pub initial_authorities: BTreeMap<u32, (AccountId, bool)>,
     pub initial_monetary_mass: u64,
@@ -53,6 +54,7 @@ pub struct ParamsAppliedAtGenesis {
 #[derive(Deserialize, Serialize)]
 struct GenesisConfig<Parameters> {
     first_ud: u64,
+    first_ud_reeval: u32,
     identities: BTreeMap<String, Idty>,
     #[serde(default)]
     parameters: Parameters,
@@ -132,6 +134,7 @@ where
     let GenesisConfig {
         sudo_key,
         first_ud,
+        first_ud_reeval,
         parameters,
         identities,
         smith_identities,
@@ -298,6 +301,7 @@ where
         accounts,
         certs_by_issuer,
         first_ud,
+        first_ud_reeval,
         identities: identities_,
         initial_authorities,
         initial_monetary_mass,
diff --git a/pallets/duniter-test-parameters/src/lib.rs b/pallets/duniter-test-parameters/src/lib.rs
index c7244a4d9..b72c11341 100644
--- a/pallets/duniter-test-parameters/src/lib.rs
+++ b/pallets/duniter-test-parameters/src/lib.rs
@@ -48,9 +48,7 @@ pub mod types {
         pub membership_renewable_period: BlockNumber,
         pub pending_membership_period: BlockNumber,
         pub ud_creation_period: BlockNumber,
-        pub ud_first_reeval: BlockNumber,
-        pub ud_reeval_period: PeriodCount,
-        pub ud_reeval_period_in_blocks: 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,
diff --git a/pallets/universal-dividend/Cargo.toml b/pallets/universal-dividend/Cargo.toml
index f81235f99..a6b483655 100644
--- a/pallets/universal-dividend/Cargo.toml
+++ b/pallets/universal-dividend/Cargo.toml
@@ -78,7 +78,6 @@ targets = ['x86_64-unknown-linux-gnu']
 ### DEV ###
 
 [dev-dependencies.pallet-balances]
-default-features = false
 git = 'https://github.com/librelois/substrate.git'
 branch = 'duniter-monthly-2022-02'
 
@@ -87,16 +86,13 @@ features = ["derive"]
 version = '1.0.119'
 
 [dev-dependencies.sp-core]
-default-features = false
 git = 'https://github.com/librelois/substrate.git'
 branch = 'duniter-monthly-2022-02'
 
 [dev-dependencies.sp-io]
-default-features = false
 git = 'https://github.com/librelois/substrate.git'
 branch = 'duniter-monthly-2022-02'
 
 [dev-dependencies.sp-runtime]
-default-features = false
 git = 'https://github.com/librelois/substrate.git'
 branch = 'duniter-monthly-2022-02'
diff --git a/pallets/universal-dividend/src/lib.rs b/pallets/universal-dividend/src/lib.rs
index ee04af706..4a7d6d2ed 100644
--- a/pallets/universal-dividend/src/lib.rs
+++ b/pallets/universal-dividend/src/lib.rs
@@ -30,7 +30,7 @@ mod benchmarking;
 use frame_support::traits::{tokens::ExistenceRequirement, Currency};
 use sp_arithmetic::{
     per_things::Permill,
-    traits::{CheckedSub, One, Saturating, Zero},
+    traits::{One, Saturating, Zero},
 };
 use sp_runtime::traits::StaticLookup;
 use sp_std::prelude::*;
@@ -43,7 +43,7 @@ pub mod pallet {
     use frame_support::pallet_prelude::*;
     use frame_support::traits::StorageVersion;
     use frame_system::pallet_prelude::*;
-    use scale_info::TypeInfo;
+    use sp_runtime::traits::Convert;
 
     pub type BalanceOf<T> =
         <<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
@@ -59,6 +59,8 @@ pub mod pallet {
 
     #[pallet::config]
     pub trait Config: frame_system::Config {
+        // BlockNumber into Balance converter
+        type BlockNumberIntoBalance: Convert<Self::BlockNumber, BalanceOf<Self>>;
         // The currency
         type Currency: Currency<Self::AccountId>;
         /// Because this pallet emits events, it depends on the runtime's definition of an event.
@@ -74,16 +76,8 @@ pub mod pallet {
         /// Universal dividend creation period
         type UdCreationPeriod: Get<Self::BlockNumber>;
         #[pallet::constant]
-        /// Universal dividend first reevaluation (in block number)
-        /// Must be leess than UdReevalPeriodInBlocks
-        type UdFirstReeval: Get<Self::BlockNumber>;
-        #[pallet::constant]
-        /// Universal dividend reevaluation period (in number of creation period)
-        type UdReevalPeriod: Get<BalanceOf<Self>>;
-        #[pallet::constant]
-        /// Universal dividend reevaluation period in number of blocks
-        /// Must be equal to UdReevalPeriod * UdCreationPeriod
-        type UdReevalPeriodInBlocks: Get<Self::BlockNumber>;
+        /// Universal dividend reevaluation period (in number of blocks)
+        type UdReevalPeriod: Get<Self::BlockNumber>;
         #[pallet::constant]
         /// The number of units to divide the amounts expressed in number of UDs
         /// Example: If you wish to express the UD amounts with a maximum precision of the order
@@ -93,36 +87,26 @@ pub mod pallet {
 
     // STORAGE //
 
-    #[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)]
-    pub struct LastReeval<T: Config> {
-        members_count: BalanceOf<T>,
-        monetary_mass: BalanceOf<T>,
-        ud_amount: BalanceOf<T>,
-    }
-    impl<T: Config> Default for LastReeval<T> {
-        fn default() -> Self {
-            Self {
-                monetary_mass: Default::default(),
-                members_count: Default::default(),
-                ud_amount: Default::default(),
-            }
-        }
-    }
-
-    /// Last reevaluation
+    /// Current UD amount
     #[pallet::storage]
     #[pallet::getter(fn current_ud)]
-    pub type CurrentUdStorage<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
+    pub type CurrentUd<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
 
     /// Total quantity of money created by universal dividend (does not take into account the possible destruction of money)
     #[pallet::storage]
     #[pallet::getter(fn total_money_created)]
-    pub type MonetaryMassStorage<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
+    pub type MonetaryMass<T: Config> = StorageValue<_, BalanceOf<T>, ValueQuery>;
+
+    /// Next UD reevaluation
+    #[pallet::storage]
+    #[pallet::getter(fn next_reeval)]
+    pub type NextReeval<T: Config> = StorageValue<_, T::BlockNumber, ValueQuery>;
 
     // GENESIS
 
     #[pallet::genesis_config]
     pub struct GenesisConfig<T: Config> {
+        pub first_reeval: T::BlockNumber,
         pub first_ud: BalanceOf<T>,
         pub initial_monetary_mass: BalanceOf<T>,
     }
@@ -131,6 +115,7 @@ pub mod pallet {
     impl<T: Config> Default for GenesisConfig<T> {
         fn default() -> Self {
             Self {
+                first_reeval: Default::default(),
                 first_ud: Default::default(),
                 initial_monetary_mass: Default::default(),
             }
@@ -143,8 +128,9 @@ pub mod pallet {
             assert!(!self.first_ud.is_zero());
             assert!(self.initial_monetary_mass >= T::Currency::total_issuance());
 
-            <CurrentUdStorage<T>>::put(self.first_ud);
-            <MonetaryMassStorage<T>>::put(self.initial_monetary_mass);
+            <CurrentUd<T>>::put(self.first_ud);
+            <MonetaryMass<T>>::put(self.initial_monetary_mass);
+            NextReeval::<T>::put(self.first_reeval);
         }
     }
 
@@ -155,13 +141,14 @@ pub mod pallet {
         fn on_initialize(n: T::BlockNumber) -> Weight {
             if (n % T::UdCreationPeriod::get()).is_zero() {
                 let current_members_count = T::MembersCount::get();
-                if (n % T::UdReevalPeriodInBlocks::get()).checked_sub(&T::UdFirstReeval::get())
-                    == Some(Zero::zero())
-                {
+                let next_reeval = NextReeval::<T>::get();
+                if n >= next_reeval {
+                    NextReeval::<T>::put(next_reeval.saturating_add(T::UdReevalPeriod::get()));
                     Self::reeval_ud(current_members_count)
                         + Self::create_ud(current_members_count, n)
+                        + T::DbWeight::get().reads_writes(2, 1)
                 } else {
-                    Self::create_ud(current_members_count, n)
+                    Self::create_ud(current_members_count, n) + T::DbWeight::get().reads(2)
                 }
             } else {
                 0
@@ -197,8 +184,8 @@ pub mod pallet {
         fn create_ud(members_count: BalanceOf<T>, n: T::BlockNumber) -> Weight {
             let total_weight: Weight = 0;
 
-            let ud_amount = <CurrentUdStorage<T>>::try_get().expect("corrupted storage");
-            let monetary_mass = <MonetaryMassStorage<T>>::try_get().expect("corrupted storage");
+            let ud_amount = <CurrentUd<T>>::try_get().expect("corrupted storage");
+            let monetary_mass = <MonetaryMass<T>>::try_get().expect("corrupted storage");
 
             for account_id in T::MembersIds::get() {
                 T::Currency::deposit_creating(&account_id, ud_amount);
@@ -207,7 +194,7 @@ pub mod pallet {
 
             let new_monetary_mass =
                 monetary_mass.saturating_add(ud_amount.saturating_mul(members_count));
-            MonetaryMassStorage::<T>::put(new_monetary_mass);
+            MonetaryMass::<T>::put(new_monetary_mass);
             Self::deposit_event(Event::NewUdCreated {
                 amount: ud_amount,
                 members_count,
@@ -224,8 +211,8 @@ pub mod pallet {
         ) -> DispatchResultWithPostInfo {
             let who = ensure_signed(origin)?;
             let dest = T::Lookup::lookup(dest)?;
-            let ud_amount = <CurrentUdStorage<T>>::try_get()
-                .map_err(|_| DispatchError::Other("corrupted storage"))?;
+            let ud_amount =
+                <CurrentUd<T>>::try_get().map_err(|_| DispatchError::Other("corrupted storage"))?;
             T::Currency::transfer(
                 &who,
                 &dest,
@@ -237,19 +224,21 @@ pub mod pallet {
         fn reeval_ud(members_count: BalanceOf<T>) -> Weight {
             let total_weight: Weight = 0;
 
-            let ud_amount = <CurrentUdStorage<T>>::try_get().expect("corrupted storage");
+            let ud_amount = <CurrentUd<T>>::try_get().expect("corrupted storage");
 
-            let monetary_mass = <MonetaryMassStorage<T>>::try_get().expect("corrupted storage");
+            let monetary_mass = <MonetaryMass<T>>::try_get().expect("corrupted storage");
 
             let new_ud_amount = Self::reeval_ud_formula(
                 ud_amount,
                 T::SquareMoneyGrowthRate::get(),
                 monetary_mass,
                 members_count,
-                T::UdReevalPeriod::get(),
+                T::BlockNumberIntoBalance::convert(
+                    T::UdReevalPeriod::get() / T::UdCreationPeriod::get(),
+                ),
             );
 
-            <CurrentUdStorage<T>>::put(new_ud_amount);
+            <CurrentUd<T>>::put(new_ud_amount);
 
             Self::deposit_event(Event::UdReevalued {
                 new_ud_amount,
diff --git a/pallets/universal-dividend/src/mock.rs b/pallets/universal-dividend/src/mock.rs
index ececa8976..6c48595d8 100644
--- a/pallets/universal-dividend/src/mock.rs
+++ b/pallets/universal-dividend/src/mock.rs
@@ -99,9 +99,7 @@ parameter_types! {
     pub const MembersCount: u64 = 3;
     pub const SquareMoneyGrowthRate: Permill = Permill::from_percent(10);
     pub const UdCreationPeriod: BlockNumber = 2;
-    pub const UdFirstReeval: BlockNumber = 0;
-    pub const UdReevalPeriod: Balance = 4;
-    pub const UdReevalPeriodInBlocks: BlockNumber = 8; // 2 * 4
+    pub const UdReevalPeriod: BlockNumber = 8;
 }
 
 pub struct FakeWot;
@@ -112,15 +110,14 @@ impl Get<Vec<u64>> for FakeWot {
 }
 
 impl pallet_universal_dividend::Config for Test {
+    type BlockNumberIntoBalance = sp_runtime::traits::ConvertInto;
     type Currency = pallet_balances::Pallet<Test>;
     type Event = Event;
     type MembersCount = MembersCount;
     type MembersIds = FakeWot;
     type SquareMoneyGrowthRate = SquareMoneyGrowthRate;
     type UdCreationPeriod = UdCreationPeriod;
-    type UdFirstReeval = UdFirstReeval;
     type UdReevalPeriod = UdReevalPeriod;
-    type UdReevalPeriodInBlocks = UdReevalPeriodInBlocks;
     type UnitsPerUd = frame_support::traits::ConstU64<1_000>;
 }
 
diff --git a/pallets/universal-dividend/src/tests.rs b/pallets/universal-dividend/src/tests.rs
index 0f0510261..2b48bef4c 100644
--- a/pallets/universal-dividend/src/tests.rs
+++ b/pallets/universal-dividend/src/tests.rs
@@ -20,6 +20,7 @@ use frame_system::{EventRecord, Phase};
 #[test]
 fn test_ud_creation() {
     new_test_ext(UniversalDividendConfig {
+        first_reeval: 8,
         first_ud: 1_000,
         initial_monetary_mass: 0,
     })
diff --git a/resources/gdev.json b/resources/gdev.json
index 46f27c0fe..54da96155 100644
--- a/resources/gdev.json
+++ b/resources/gdev.json
@@ -1,5 +1,6 @@
 {
   "first_ud": 1000,
+  "first_ud_reeval": 200,
   "identities": {
     "Elois1": {
       "balance": 1000,
diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs
index cf6cfbbf3..93afdda53 100644
--- a/runtime/common/src/pallets_config.rs
+++ b/runtime/common/src/pallets_config.rs
@@ -324,15 +324,14 @@ macro_rules! pallets_config {
 		// UNIVERSALĂ‚ DIVIDEND //
 
 		impl pallet_universal_dividend::Config for Runtime {
+			type BlockNumberIntoBalance = sp_runtime::traits::ConvertInto;
 			type Currency = pallet_balances::Pallet<Runtime>;
 			type Event = Event;
 			type MembersCount = common_runtime::providers::UdAccountsProvider<Runtime>;
 			type MembersIds = common_runtime::providers::UdAccountsProvider<Runtime>;
 			type SquareMoneyGrowthRate = SquareMoneyGrowthRate;
 			type UdCreationPeriod = UdCreationPeriod;
-			type UdFirstReeval = UdFirstReeval;
 			type UdReevalPeriod = UdReevalPeriod;
-			type UdReevalPeriodInBlocks = UdReevalPeriodInBlocks;
 			type UnitsPerUd = frame_support::traits::ConstU64<1_000>;
 		}
 
diff --git a/runtime/g1/src/parameters.rs b/runtime/g1/src/parameters.rs
index f1bf8f5b1..54617f36f 100644
--- a/runtime/g1/src/parameters.rs
+++ b/runtime/g1/src/parameters.rs
@@ -85,10 +85,7 @@ parameter_types! {
     // 0.002_381_440 = 0.0488^2
     pub const SquareMoneyGrowthRate: Permill = Permill::from_parts(2_381_440);
     pub const UdCreationPeriod: BlockNumber = DAYS;
-    // TODO: this value will depend on the date of the migration
-    pub const UdFirstReeval: BlockNumber = 45 * DAYS;
-    pub const UdReevalPeriod: Balance = 182;
-    pub const UdReevalPeriodInBlocks: BlockNumber = 2_620_800; // 86400 * 182 / 6
+    pub const UdReevalPeriod: BlockNumber = 2_620_800; // 86400 * 182 / 6
 }
 
 /*******/
diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs
index 7802aaa51..d064ffe75 100644
--- a/runtime/gdev/src/lib.rs
+++ b/runtime/gdev/src/lib.rs
@@ -196,9 +196,7 @@ common_runtime::pallets_config! {
     pub type RenewablePeriod = pallet_duniter_test_parameters::MembershipRenewablePeriod<Runtime>;
     pub type PendingMembershipPeriod = pallet_duniter_test_parameters::PendingMembershipPeriod<Runtime>;
     pub type UdCreationPeriod = pallet_duniter_test_parameters::UdCreationPeriod<Runtime>;
-    pub type UdFirstReeval = pallet_duniter_test_parameters::UdFirstReeval<Runtime>;
     pub type UdReevalPeriod = pallet_duniter_test_parameters::UdReevalPeriod<Runtime>;
-    pub type UdReevalPeriodInBlocks = pallet_duniter_test_parameters::UdReevalPeriodInBlocks<Runtime>;
     pub type WotFirstCertIssuableOn = pallet_duniter_test_parameters::WotFirstCertIssuableOn<Runtime>;
     pub type WotMinCertForMembership = pallet_duniter_test_parameters::WotMinCertForMembership<Runtime>;
     pub type WotMinCertForCreateIdtyRight =
diff --git a/runtime/gdev/tests/common/mod.rs b/runtime/gdev/tests/common/mod.rs
index d9a292ca2..9bf307589 100644
--- a/runtime/gdev/tests/common/mod.rs
+++ b/runtime/gdev/tests/common/mod.rs
@@ -107,9 +107,7 @@ impl ExtBuilder {
                 membership_renewable_period: 5,
                 pending_membership_period: 500,
                 ud_creation_period: 10,
-                ud_first_reeval: 100,
-                ud_reeval_period: 20,
-                ud_reeval_period_in_blocks: 10 * 20,
+                ud_reeval_period: 10 * 20,
                 smith_cert_period: 15,
                 smith_cert_max_by_issuer: 8,
                 smith_cert_min_received_cert_to_issue_cert: 2,
@@ -280,6 +278,7 @@ impl ExtBuilder {
         .unwrap();
 
         pallet_universal_dividend::GenesisConfig::<Runtime> {
+            first_reeval: 100,
             first_ud: 1_000,
             initial_monetary_mass: 0,
         }
diff --git a/runtime/gtest/src/parameters.rs b/runtime/gtest/src/parameters.rs
index ece1ba7e9..ef26b0f20 100644
--- a/runtime/gtest/src/parameters.rs
+++ b/runtime/gtest/src/parameters.rs
@@ -86,8 +86,7 @@ parameter_types! {
     pub const SquareMoneyGrowthRate: Permill = Permill::from_parts(2_381_440);
     pub const UdCreationPeriod: BlockNumber = DAYS;
     pub const UdFirstReeval: BlockNumber = 2 * DAYS;
-    pub const UdReevalPeriod: Balance = 7;
-    pub const UdReevalPeriodInBlocks: BlockNumber = 100800; // 86400 * 7 / 6
+    pub const UdReevalPeriod: BlockNumber = 100_800; // 86400 * 7 / 6
 }
 
 /*******/
-- 
GitLab