diff --git a/node/src/chain_spec/gdev.rs b/node/src/chain_spec/gdev.rs index fe2a6d9a041408f66ac4c1730d6b30dde586e3af..c7b13c41a515f38ed716257f5eaa43b175c14ea9 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 c2303724fb7f1d3807d79aaf5ffce68a75fc0e82..bc8d197541d520cd6b7a8c4403a10ea584c51baa 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 c7244a4d9f383ca16156b651839d57ab4596a8ed..b72c113419c66b2fc3a2bf697e80964f0d15f4d1 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 f81235f99eec9c8bcd41c2c914f6b357affb1f1d..a6b48365569604c201874a827a381bd46a8fc522 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 ee04af70627433e9c9ec30de9f91ddff7d464273..4a7d6d2ede2066db1110f17ee54c345c37dc2d41 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 ececa8976115a6286dd948c0e4ffe1a4e551844b..6c48595d82bd51d7166acabff892f12f40f736fd 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 0f0510261b15c724e34919c8573d55ee5e938a71..2b48bef4cb364dbbfd0a8f97cd7ff1c11db0d918 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 46f27c0fe53d93c27e6778600dbfef38d138d866..54da96155e6c87628c36115ae1829c1361e481f5 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 cf6cfbbf3902b806225bba2181d35e7edd38ad7d..93afdda537fabbdca28822ab7947699b49589955 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 f1bf8f5b1f67c8d81f012ac0cdf8faad415d89cc..54617f36f98c105d23f1db49fb3b70f6777df88c 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 7802aaa513417e4bd481dc05e26262a26b76e6df..d064ffe75265bdd2c9113f87bcc4cc7e5c4a8dc9 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 d9a292ca24ca74a2dc485e1e6109b670f793f720..9bf3075898aa4b77cc64b37425d197d374715747 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 ece1ba7e91f005e5dd70705f5e695a5aac508519..ef26b0f20e40c46cdfa0417a792086a69694b284 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 } /*******/