Bläddra i källkod

Add ‘create_evict_storage_provider_proposal’ extrinsic

- add ‘create_evict_storage_provider_proposal’ extrinsic to the codex module
- add tests
Shamil Gadelshin 5 år sedan
förälder
incheckning
51cde50fb4

+ 1 - 0
Cargo.lock

@@ -5122,6 +5122,7 @@ dependencies = [
  "substrate-proposals-discussion-module",
  "substrate-proposals-engine-module",
  "substrate-recurring-reward-module",
+ "substrate-roles-module",
  "substrate-stake-module",
  "substrate-token-mint-module",
  "substrate-versioned-store",

+ 6 - 0
runtime-modules/proposals/codex/Cargo.toml

@@ -23,6 +23,7 @@ std = [
     'membership/std',
     'governance/std',
     'mint/std',
+    'roles/std',
 ]
 
 
@@ -129,6 +130,11 @@ default_features = false
 package = 'substrate-content-working-group-module'
 path = '../../content-working-group'
 
+[dependencies.roles]
+default_features = false
+package = 'substrate-roles-module'
+path = '../../roles'
+
 [dev-dependencies.hiring]
 default_features = false
 package = 'substrate-hiring-module'

+ 31 - 1
runtime-modules/proposals/codex/src/lib.rs

@@ -20,6 +20,7 @@
 //! - [create_set_content_working_group_mint_capacity_proposal](./struct.Module.html#method.create_set_content_working_group_mint_capacity_proposal)
 //! - [create_spending_proposal](./struct.Module.html#method.create_spending_proposal)
 //! - [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)
 //!
 //! ### Proposal implementations of this module
 //! - execute_text_proposal - prints the proposal to the log
@@ -68,6 +69,7 @@ pub trait Trait:
     + membership::members::Trait
     + governance::election::Trait
     + content_working_group::Trait
+    + roles::actors::Trait
 {
     /// Defines max allowed text proposal length.
     type TextProposalMaxLength: Get<u32>;
@@ -228,7 +230,7 @@ decl_module! {
             let proposal_code =
                 <Call<T>>::execute_runtime_upgrade_proposal(title.clone(), description.clone(), wasm);
 
-            let proposal_parameters = proposal_types::parameters::upgrade_runtime::<T>();
+            let proposal_parameters = proposal_types::parameters::runtime_upgrade_proposal::<T>();
 
             Self::create_proposal(
                 origin,
@@ -391,6 +393,34 @@ decl_module! {
             )?;
         }
 
+        /// Create 'Evict storage provider' proposal type.
+        /// This proposal uses `remove_actor()` extrinsic from the `roles::actors`  module.
+        pub fn create_evict_storage_provider_proposal(
+            origin,
+            member_id: MemberId<T>,
+            title: Vec<u8>,
+            description: Vec<u8>,
+            stake_balance: Option<BalanceOf<T>>,
+            actor_account: T::AccountId,
+        ) {
+            let proposal_code =
+                <roles::actors::Call<T>>::remove_actor(actor_account.clone());
+
+            let proposal_parameters =
+                proposal_types::parameters::evict_storage_provider_proposal::<T>();
+
+            Self::create_proposal(
+                origin,
+                member_id,
+                title,
+                description,
+                stake_balance,
+                proposal_code.encode(),
+                proposal_parameters,
+                ProposalDetails::EvictStorageProvider(actor_account),
+            )?;
+        }
+
 // *************** Extrinsic to execute
 
         /// Text proposal extrinsic. Should be used as callable object to pass to the `engine` module.

+ 3 - 0
runtime-modules/proposals/codex/src/proposal_types/mod.rs

@@ -31,6 +31,9 @@ pub enum ProposalDetails<MintedBalance, CurrencyBalance, BlockNumber, AccountId,
 
     /// Balance for the `set content working group mint capacity proposal`
     SetContentWorkingGroupMintCapacity(MintedBalance),
+
+    /// AccountId for the `evict storage provider proposal`
+    EvictStorageProvider(AccountId),
 }
 
 impl<MintedBalance, CurrencyBalance, BlockNumber, AccountId, MemberId> Default

+ 16 - 2
runtime-modules/proposals/codex/src/proposal_types/parameters.rs

@@ -1,8 +1,8 @@
 use crate::{BalanceOf, ProposalParameters};
 
 // Proposal parameters for the upgrade runtime proposal
-pub(crate) fn upgrade_runtime<T: crate::Trait>() -> ProposalParameters<T::BlockNumber, BalanceOf<T>>
-{
+pub(crate) fn runtime_upgrade_proposal<T: crate::Trait>(
+) -> ProposalParameters<T::BlockNumber, BalanceOf<T>> {
     ProposalParameters {
         voting_period: T::BlockNumber::from(50000u32),
         grace_period: T::BlockNumber::from(10000u32),
@@ -96,3 +96,17 @@ pub(crate) fn set_lead_proposal<T: crate::Trait>(
         required_stake: Some(<BalanceOf<T>>::from(500u32)),
     }
 }
+
+// Proposal parameters for the 'Evict storage provider' proposal
+pub(crate) fn evict_storage_provider_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: 81,
+        slashing_threshold_percentage: 87,
+        required_stake: Some(<BalanceOf<T>>::from(500u32)),
+    }
+}

+ 9 - 0
runtime-modules/proposals/codex/src/tests/mock.rs

@@ -187,6 +187,15 @@ impl hiring::Trait for Test {
     type StakeHandlerProvider = hiring::Module<Self>;
 }
 
+impl roles::actors::Trait for Test {
+    type Event = ();
+    type OnActorRemoved = ();
+}
+
+impl roles::actors::ActorRemoved<Test> for () {
+    fn actor_removed(_: &u64) {}
+}
+
 impl crate::Trait for Test {
     type TextProposalMaxLength = TextProposalMaxLength;
     type RuntimeUpgradeWasmProposalMaxLength = RuntimeUpgradeWasmProposalMaxLength;

+ 52 - 1
runtime-modules/proposals/codex/src/tests/mod.rs

@@ -201,7 +201,7 @@ fn create_runtime_upgrade_common_checks_succeed() {
                     b"wasm".to_vec(),
                 )
             },
-            proposal_parameters: crate::proposal_types::parameters::upgrade_runtime::<Test>(),
+            proposal_parameters: crate::proposal_types::parameters::runtime_upgrade_proposal::<Test>(),
             proposal_details: ProposalDetails::RuntimeUpgrade(blake2_256(b"wasm").to_vec()),
         };
         proposal_fixture.check_all();
@@ -549,3 +549,54 @@ fn create_set_lead_proposal_common_checks_succeed() {
         proposal_fixture.check_all();
     });
 }
+
+#[test]
+fn create_evict_storage_provider_common_checks_succeed() {
+    initial_test_ext().execute_with(|| {
+        let proposal_fixture = ProposalTestFixture {
+            insufficient_rights_call: || {
+                ProposalCodex::create_evict_storage_provider_proposal(
+                    RawOrigin::None.into(),
+                    1,
+                    b"title".to_vec(),
+                    b"body".to_vec(),
+                    None,
+                    1,
+                )
+            },
+            empty_stake_call: || {
+                ProposalCodex::create_evict_storage_provider_proposal(
+                    RawOrigin::Signed(1).into(),
+                    1,
+                    b"title".to_vec(),
+                    b"body".to_vec(),
+                    None,
+                    1,
+                )
+            },
+            invalid_stake_call: || {
+                ProposalCodex::create_evict_storage_provider_proposal(
+                    RawOrigin::Signed(1).into(),
+                    1,
+                    b"title".to_vec(),
+                    b"body".to_vec(),
+                    Some(<BalanceOf<Test>>::from(5000u32)),
+                    1,
+                )
+            },
+            successful_call: || {
+                ProposalCodex::create_evict_storage_provider_proposal(
+                    RawOrigin::Signed(1).into(),
+                    1,
+                    b"title".to_vec(),
+                    b"body".to_vec(),
+                    Some(<BalanceOf<Test>>::from(500u32)),
+                    1,
+                )
+            },
+            proposal_parameters: crate::proposal_types::parameters::evict_storage_provider_proposal::<Test>(),
+            proposal_details: ProposalDetails::EvictStorageProvider(1),
+        };
+        proposal_fixture.check_all();
+    });
+}