Browse Source

Add ‘create_set_storage_role_parameters_proposal’ extrinsic

- add ‘create_set_storage_role_parameters_proposal’ extrinsic
- add tests
Shamil Gadelshin 5 years ago
parent
commit
e77768af7c

+ 2 - 2
Cargo.lock

@@ -4912,7 +4912,7 @@ dependencies = [
 
 [[package]]
 name = "substrate-membership-module"
-version = "1.0.0"
+version = "1.0.1"
 dependencies = [
  "parity-scale-codec",
  "serde",
@@ -5195,7 +5195,7 @@ dependencies = [
 
 [[package]]
 name = "substrate-roles-module"
-version = "1.0.0"
+version = "1.0.1"
 dependencies = [
  "parity-scale-codec",
  "serde",

+ 1 - 1
runtime-modules/membership/Cargo.toml

@@ -1,6 +1,6 @@
 [package]
 name = 'substrate-membership-module'
-version = '1.0.0'
+version = '1.0.1'
 authors = ['Joystream contributors']
 edition = '2018'
 

+ 4 - 0
runtime-modules/membership/src/role_types.rs

@@ -2,6 +2,10 @@ use codec::{Decode, Encode};
 use rstd::collections::btree_set::BTreeSet;
 use rstd::prelude::*;
 
+#[cfg(feature = "std")]
+use serde::{Deserialize, Serialize};
+
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 #[derive(Encode, Decode, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Debug)]
 pub enum Role {
     StorageProvider,

+ 32 - 0
runtime-modules/proposals/codex/src/lib.rs

@@ -22,6 +22,7 @@
 //! - [create_set_lead_proposal](./struct.Module.html#method.create_set_lead_proposal)
 //! - [create_evict_storage_provider_proposal](./struct.Module.html#method.create_evict_storage_provider_proposal)
 //! - [create_set_validator_count_proposal](./struct.Module.html#method.create_set_validator_count_proposal)
+//! - [create_set_storage_role_parameters_proposal](./struct.Module.html#method.create_set_storage_role_parameters_proposal)
 //!
 //! ### Proposal implementations of this module
 //! - execute_text_proposal - prints the proposal to the log
@@ -49,6 +50,7 @@ use codec::Encode;
 use common::origin_validator::ActorOriginValidator;
 use governance::election_params::ElectionParameters;
 use proposal_engine::ProposalParameters;
+use roles::actors::{Role, RoleParameters};
 use rstd::clone::Clone;
 use rstd::prelude::*;
 use rstd::str::from_utf8;
@@ -451,6 +453,36 @@ decl_module! {
             )?;
         }
 
+        /// Create 'Set storage roles parameters' proposal type.
+        /// This proposal uses `set_role_parameters()` extrinsic from the Substrate `roles::actors`  module.
+        pub fn create_set_storage_role_parameters_proposal(
+            origin,
+            member_id: MemberId<T>,
+            title: Vec<u8>,
+            description: Vec<u8>,
+            stake_balance: Option<BalanceOf<T>>,
+            role_parameters: RoleParameters<BalanceOfGovernanceCurrency<T>, T::BlockNumber>
+        ) {
+            let proposal_code = <roles::actors::Call<T>>::set_role_parameters(
+                Role::StorageProvider,
+                role_parameters.clone()
+            );
+
+            let proposal_parameters =
+                proposal_types::parameters::set_storage_role_parameters_proposal::<T>();
+
+            Self::create_proposal(
+                origin,
+                member_id,
+                title,
+                description,
+                stake_balance,
+                proposal_code.encode(),
+                proposal_parameters,
+                ProposalDetails::SetStorageRoleParameters(role_parameters),
+            )?;
+        }
+
 // *************** Extrinsic to execute
 
         /// Text proposal extrinsic. Should be used as callable object to pass to the `engine` module.

+ 13 - 9
runtime-modules/proposals/codex/src/proposal_types/mod.rs

@@ -6,37 +6,41 @@ use rstd::vec::Vec;
 use serde::{Deserialize, Serialize};
 
 use crate::ElectionParameters;
+use roles::actors::RoleParameters;
 
 /// Proposal details provide voters the information required for the perceived voting.
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 #[derive(Encode, Decode, Clone, PartialEq, Debug)]
 pub enum ProposalDetails<MintedBalance, CurrencyBalance, BlockNumber, AccountId, MemberId> {
-    /// The text of the `text proposal`
+    /// The text of the `text` proposal
     Text(Vec<u8>),
 
-    /// The hash of wasm code for the `runtime upgrade proposal`
+    /// The hash of wasm code for the `runtime upgrade` proposal
     RuntimeUpgrade(Vec<u8>),
 
-    /// Election parameters for the `set election parameters proposal`
+    /// Election parameters for the `set election parameters` proposal
     SetElectionParameters(ElectionParameters<CurrencyBalance, BlockNumber>),
 
-    /// Balance and destination account for the `spending proposal`
+    /// Balance and destination account for the `spending` proposal
     Spending(MintedBalance, AccountId),
 
-    /// New leader memberId and account_id for the `set lead proposal`
+    /// New leader memberId and account_id for the `set lead` proposal
     SetLead(Option<(MemberId, AccountId)>),
 
-    /// Balance for the `set council mint capacity proposal`
+    /// Balance for the `set council mint capacity` proposal
     SetCouncilMintCapacity(MintedBalance),
 
-    /// Balance for the `set content working group mint capacity proposal`
+    /// Balance for the `set content working group mint capacity` proposal
     SetContentWorkingGroupMintCapacity(MintedBalance),
 
-    /// AccountId for the `evict storage provider proposal`
+    /// AccountId for the `evict storage provider` proposal
     EvictStorageProvider(AccountId),
 
-    /// Validator count for the `set validator count proposal`
+    /// Validator count for the `set validator count` proposal
     SetValidatorCount(u32),
+
+    /// Role parameters for the `set storage role parameters` proposal
+    SetStorageRoleParameters(RoleParameters<CurrencyBalance, BlockNumber>),
 }
 
 impl<MintedBalance, CurrencyBalance, BlockNumber, AccountId, MemberId> Default

+ 14 - 0
runtime-modules/proposals/codex/src/proposal_types/parameters.rs

@@ -124,3 +124,17 @@ pub(crate) fn set_validator_count_proposal<T: crate::Trait>(
         required_stake: Some(<BalanceOf<T>>::from(500u32)),
     }
 }
+
+// Proposal parameters for the 'Set storage role parameters' proposal
+pub(crate) fn set_storage_role_parameters_proposal<T: crate::Trait>(
+) -> ProposalParameters<T::BlockNumber, BalanceOf<T>> {
+    ProposalParameters {
+        voting_period: T::BlockNumber::from(50000u32),
+        grace_period: T::BlockNumber::from(10000u32),
+        approval_quorum_percentage: 40,
+        approval_threshold_percentage: 51,
+        slashing_quorum_percentage: 82,
+        slashing_threshold_percentage: 88,
+        required_stake: Some(<BalanceOf<T>>::from(500u32)),
+    }
+}

+ 53 - 0
runtime-modules/proposals/codex/src/tests/mod.rs

@@ -8,6 +8,7 @@ use system::RawOrigin;
 use crate::{BalanceOf, Error, ProposalDetails};
 use mock::*;
 use proposal_engine::ProposalParameters;
+use roles::actors::RoleParameters;
 use runtime_io::blake2_256;
 use srml_support::dispatch::DispatchResult;
 
@@ -653,3 +654,55 @@ fn create_set_validator_count_proposal_common_checks_succeed() {
         proposal_fixture.check_all();
     });
 }
+
+#[test]
+fn create_set_storage_role_parameters_proposal_common_checks_succeed() {
+    initial_test_ext().execute_with(|| {
+        let proposal_fixture = ProposalTestFixture {
+            insufficient_rights_call: || {
+                ProposalCodex::create_set_storage_role_parameters_proposal(
+                    RawOrigin::None.into(),
+                    1,
+                    b"title".to_vec(),
+                    b"body".to_vec(),
+                    None,
+                    RoleParameters::default(),
+                )
+            },
+            empty_stake_call: || {
+                ProposalCodex::create_set_storage_role_parameters_proposal(
+                    RawOrigin::Signed(1).into(),
+                    1,
+                    b"title".to_vec(),
+                    b"body".to_vec(),
+                    None,
+                    RoleParameters::default(),
+                )
+            },
+            invalid_stake_call: || {
+                ProposalCodex::create_set_storage_role_parameters_proposal(
+                    RawOrigin::Signed(1).into(),
+                    1,
+                    b"title".to_vec(),
+                    b"body".to_vec(),
+                    Some(<BalanceOf<Test>>::from(5000u32)),
+                    RoleParameters::default(),
+                )
+            },
+            successful_call: || {
+                ProposalCodex::create_set_storage_role_parameters_proposal(
+                    RawOrigin::Signed(1).into(),
+                    1,
+                    b"title".to_vec(),
+                    b"body".to_vec(),
+                    Some(<BalanceOf<Test>>::from(500u32)),
+                    RoleParameters::default(),
+                )
+            },
+            proposal_parameters:
+                crate::proposal_types::parameters::set_storage_role_parameters_proposal::<Test>(),
+            proposal_details: ProposalDetails::SetStorageRoleParameters(RoleParameters::default()),
+        };
+        proposal_fixture.check_all();
+    });
+}

+ 1 - 1
runtime-modules/roles/Cargo.toml

@@ -1,6 +1,6 @@
 [package]
 name = 'substrate-roles-module'
-version = '1.0.0'
+version = '1.0.1'
 authors = ['Joystream contributors']
 edition = '2018'
 

+ 4 - 0
runtime-modules/roles/src/actors.rs

@@ -8,10 +8,14 @@ use srml_support::traits::{
 use srml_support::{decl_event, decl_module, decl_storage, ensure};
 use system::{self, ensure_root, ensure_signed};
 
+#[cfg(feature = "std")]
+use serde::{Deserialize, Serialize};
+
 pub use membership::members::Role;
 
 const STAKING_ID: LockIdentifier = *b"role_stk";
 
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 #[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, Debug)]
 pub struct RoleParameters<Balance, BlockNumber> {
     // minium balance required to stake to enter a role