From 6445771e6ddf2f74a3a75435b80b252de5af7000 Mon Sep 17 00:00:00 2001 From: iorveth Date: Tue, 15 Sep 2020 18:55:57 +0300 Subject: [PATCH 01/13] proposals_codex: Remove SetLead proposal type --- node/src/chain_spec.rs | 2 - runtime-modules/proposals/codex/src/lib.rs | 48 ----------- .../proposals/codex/src/proposal_types/mod.rs | 7 -- .../codex/src/proposal_types/parameters.rs | 14 ---- .../proposals/codex/src/tests/mod.rs | 79 ------------------- .../integration/proposals/proposal_encoder.rs | 3 - .../src/tests/proposals_integration/mod.rs | 26 ------ 7 files changed, 179 deletions(-) diff --git a/node/src/chain_spec.rs b/node/src/chain_spec.rs index 5856b57c37..41236a4536 100644 --- a/node/src/chain_spec.rs +++ b/node/src/chain_spec.rs @@ -359,8 +359,6 @@ pub fn testnet_genesis( .set_content_working_group_mint_capacity_proposal_voting_period, set_content_working_group_mint_capacity_proposal_grace_period: cpcp .set_content_working_group_mint_capacity_proposal_grace_period, - set_lead_proposal_voting_period: cpcp.set_lead_proposal_voting_period, - set_lead_proposal_grace_period: cpcp.set_lead_proposal_grace_period, spending_proposal_voting_period: cpcp.spending_proposal_voting_period, spending_proposal_grace_period: cpcp.spending_proposal_grace_period, add_working_group_opening_proposal_voting_period: cpcp diff --git a/runtime-modules/proposals/codex/src/lib.rs b/runtime-modules/proposals/codex/src/lib.rs index 7ecd7289d7..6ab2402951 100644 --- a/runtime-modules/proposals/codex/src/lib.rs +++ b/runtime-modules/proposals/codex/src/lib.rs @@ -22,7 +22,6 @@ //! - [create_spending_proposal](./struct.Module.html#method.create_spending_proposal) //! //! ### Content working group proposals -//! - [create_set_lead_proposal](./struct.Module.html#method.create_set_lead_proposal) //! - [create_set_content_working_group_mint_capacity_proposal](./struct.Module.html#method.create_set_content_working_group_mint_capacity_proposal) //! //! ### Working group proposals @@ -302,14 +301,6 @@ decl_storage! { pub SetContentWorkingGroupMintCapacityProposalGracePeriod get(fn set_content_working_group_mint_capacity_proposal_grace_period) config(): T::BlockNumber; - /// Voting period for the 'set lead' proposal - pub SetLeadProposalVotingPeriod get(fn set_lead_proposal_voting_period) - config(): T::BlockNumber; - - /// Grace period for the 'set lead' proposal - pub SetLeadProposalGracePeriod get(fn set_lead_proposal_grace_period) - config(): T::BlockNumber; - /// Voting period for the 'spending' proposal pub SpendingProposalVotingPeriod get(fn spending_proposal_voting_period) config(): T::BlockNumber; @@ -541,39 +532,6 @@ decl_module! { Self::create_proposal(params)?; } - /// Create 'Set lead' proposal type. - /// This proposal uses `replace_lead()` extrinsic from the `content_working_group` module. - #[weight = 10_000_000] // TODO: adjust weight - pub fn create_set_lead_proposal( - origin, - member_id: MemberId, - title: Vec, - description: Vec, - stake_balance: Option>, - new_lead: Option<(T::MemberId, T::AccountId)> - ) { - if let Some(lead) = new_lead.clone() { - let account_id = lead.1; - ensure!( - !>::is_councilor(&account_id), - Error::::InvalidSetLeadParameterCannotBeCouncilor - ); - } - let proposal_details = ProposalDetails::SetLead(new_lead); - let params = CreateProposalParameters{ - origin, - member_id, - title, - description, - stake_balance, - proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::set_lead_proposal::(), - proposal_code: T::ProposalEncoder::encode_proposal(proposal_details) - }; - - Self::create_proposal(params)?; - } - /// Create 'Evict storage provider' proposal type. /// This proposal uses `set_validator_count()` extrinsic from the Substrate `staking` module. #[weight = 10_000_000] // TODO: adjust weight @@ -1069,12 +1027,6 @@ impl Module { >::put(T::BlockNumber::from( p.set_content_working_group_mint_capacity_proposal_grace_period, )); - >::put(T::BlockNumber::from( - p.set_lead_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.set_lead_proposal_grace_period, - )); >::put(T::BlockNumber::from( p.spending_proposal_voting_period, )); diff --git a/runtime-modules/proposals/codex/src/proposal_types/mod.rs b/runtime-modules/proposals/codex/src/proposal_types/mod.rs index 8145cd467c..cd8242adf5 100644 --- a/runtime-modules/proposals/codex/src/proposal_types/mod.rs +++ b/runtime-modules/proposals/codex/src/proposal_types/mod.rs @@ -22,7 +22,6 @@ pub type ProposalDetailsOf = ProposalDetails< crate::BalanceOfGovernanceCurrency, ::BlockNumber, ::AccountId, - crate::MemberId, working_group::OpeningId, working_group::ApplicationId, crate::BalanceOf, @@ -37,7 +36,6 @@ pub enum ProposalDetails< CurrencyBalance, BlockNumber, AccountId, - MemberId, OpeningId, ApplicationId, StakeBalance, @@ -55,9 +53,6 @@ pub enum ProposalDetails< /// Balance and destination account for the `spending` proposal Spending(MintedBalance, AccountId), - /// New leader memberId and account_id for the `set lead` proposal - SetLead(Option<(MemberId, AccountId)>), - /// Balance for the `set content working group mint capacity` proposal SetContentWorkingGroupMintCapacity(MintedBalance), @@ -106,7 +101,6 @@ impl< CurrencyBalance, BlockNumber, AccountId, - MemberId, OpeningId, ApplicationId, StakeBalance, @@ -117,7 +111,6 @@ impl< CurrencyBalance, BlockNumber, AccountId, - MemberId, OpeningId, ApplicationId, StakeBalance, diff --git a/runtime-modules/proposals/codex/src/proposal_types/parameters.rs b/runtime-modules/proposals/codex/src/proposal_types/parameters.rs index 64919efd0b..7c3cedd514 100644 --- a/runtime-modules/proposals/codex/src/proposal_types/parameters.rs +++ b/runtime-modules/proposals/codex/src/proposal_types/parameters.rs @@ -84,20 +84,6 @@ pub(crate) fn spending_proposal( } } -// Proposal parameters for the 'Set lead' proposal -pub(crate) fn set_lead_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::set_lead_proposal_voting_period(), - grace_period: >::set_lead_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 75, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(50000u32)), - } -} - // Proposal parameters for the 'Add working group leader' proposal pub(crate) fn add_working_group_leader_opening_proposal( ) -> ProposalParameters> { diff --git a/runtime-modules/proposals/codex/src/tests/mod.rs b/runtime-modules/proposals/codex/src/tests/mod.rs index aa5242c7a9..e6d8d1999f 100644 --- a/runtime-modules/proposals/codex/src/tests/mod.rs +++ b/runtime-modules/proposals/codex/src/tests/mod.rs @@ -633,85 +633,6 @@ fn create_spending_proposal_call_fails_with_incorrect_balance() { }); } -#[test] -fn create_set_lead_proposal_fails_with_proposed_councilor() { - initial_test_ext().execute_with(|| { - increase_total_balance_issuance_using_account_id(1, 500000); - - let lead_account_id = 20; - >::set_council( - RawOrigin::Root.into(), - vec![lead_account_id], - ) - .unwrap(); - - assert_eq!( - ProposalCodex::create_set_lead_proposal( - RawOrigin::Signed(1).into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - Some(>::from(1250u32)), - Some((20, lead_account_id)), - ), - Err(Error::::InvalidSetLeadParameterCannotBeCouncilor.into()) - ); - }); -} - -#[test] -fn create_set_lead_proposal_common_checks_succeed() { - initial_test_ext().execute_with(|| { - increase_total_balance_issuance(500000); - - let proposal_fixture = ProposalTestFixture { - insufficient_rights_call: || { - ProposalCodex::create_set_lead_proposal( - RawOrigin::None.into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - None, - Some((20, 10)), - ) - }, - empty_stake_call: || { - ProposalCodex::create_set_lead_proposal( - RawOrigin::Signed(1).into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - None, - Some((20, 10)), - ) - }, - invalid_stake_call: || { - ProposalCodex::create_set_lead_proposal( - RawOrigin::Signed(1).into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - Some(>::from(5000u32)), - Some((20, 10)), - ) - }, - successful_call: || { - ProposalCodex::create_set_lead_proposal( - RawOrigin::Signed(1).into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - Some(>::from(50000u32)), - Some((20, 10)), - ) - }, - proposal_parameters: crate::proposal_types::parameters::set_lead_proposal::(), - proposal_details: ProposalDetails::SetLead(Some((20, 10))), - }; - proposal_fixture.check_all(); - }); -} - #[test] fn create_set_validator_count_proposal_common_checks_succeed() { initial_test_ext().execute_with(|| { diff --git a/runtime/src/integration/proposals/proposal_encoder.rs b/runtime/src/integration/proposals/proposal_encoder.rs index d924d95aa4..ff5f26508e 100644 --- a/runtime/src/integration/proposals/proposal_encoder.rs +++ b/runtime/src/integration/proposals/proposal_encoder.rs @@ -43,9 +43,6 @@ impl ProposalEncoder for ExtrinsicProposalEncoder { ProposalDetails::Spending(balance, destination) => Call::Council( governance::council::Call::spend_from_council_mint(balance, destination), ), - ProposalDetails::SetLead(new_lead) => { - Call::ContentWorkingGroup(content_working_group::Call::replace_lead(new_lead)) - } ProposalDetails::SetValidatorCount(new_validator_count) => Call::Staking( pallet_staking::Call::set_validator_count(new_validator_count), ), diff --git a/runtime/src/tests/proposals_integration/mod.rs b/runtime/src/tests/proposals_integration/mod.rs index 44ab718938..85ac733558 100644 --- a/runtime/src/tests/proposals_integration/mod.rs +++ b/runtime/src/tests/proposals_integration/mod.rs @@ -567,32 +567,6 @@ fn text_proposal_execution_succeeds() { }); } -#[test] -fn set_lead_proposal_execution_succeeds() { - initial_test_ext().execute_with(|| { - let member_id = 10; - let account_id: [u8; 32] = [member_id; 32]; - - let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { - ProposalCodex::create_set_lead_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, - b"title".to_vec(), - b"body".to_vec(), - Some(>::from(50000u32)), - Some((member_id as u64, account_id.into())), - ) - }) - .with_member_id(member_id as u64); - - assert!(content_working_group::Module::::ensure_lead_is_set().is_err()); - - codex_extrinsic_test_fixture.call_extrinsic_and_assert(); - - assert!(content_working_group::Module::::ensure_lead_is_set().is_ok()); - }); -} - #[test] fn spending_proposal_execution_succeeds() { initial_test_ext().execute_with(|| { From bf8c282d79eccabf7c5c9161b3a8623bfbf125f2 Mon Sep 17 00:00:00 2001 From: iorveth Date: Tue, 15 Sep 2020 19:19:12 +0300 Subject: [PATCH 02/13] proposals_codex: Remove set_content_working_group_mint_capacity proposal type & related logic --- node/src/chain_spec.rs | 8 +-- runtime-modules/proposals/codex/src/lib.rs | 50 --------------- .../proposals/codex/src/proposal_types/mod.rs | 13 ---- .../codex/src/proposal_types/parameters.rs | 15 ----- .../proposals/codex/src/tests/mod.rs | 61 ------------------- .../integration/proposals/proposal_encoder.rs | 5 -- .../src/tests/proposals_integration/mod.rs | 30 --------- 7 files changed, 2 insertions(+), 180 deletions(-) diff --git a/node/src/chain_spec.rs b/node/src/chain_spec.rs index 41236a4536..373c5aff65 100644 --- a/node/src/chain_spec.rs +++ b/node/src/chain_spec.rs @@ -355,10 +355,6 @@ pub fn testnet_genesis( .set_election_parameters_proposal_voting_period, set_election_parameters_proposal_grace_period: cpcp .set_election_parameters_proposal_grace_period, - set_content_working_group_mint_capacity_proposal_voting_period: cpcp - .set_content_working_group_mint_capacity_proposal_voting_period, - set_content_working_group_mint_capacity_proposal_grace_period: cpcp - .set_content_working_group_mint_capacity_proposal_grace_period, spending_proposal_voting_period: cpcp.spending_proposal_voting_period, spending_proposal_grace_period: cpcp.spending_proposal_grace_period, add_working_group_opening_proposal_voting_period: cpcp @@ -374,9 +370,9 @@ pub fn testnet_genesis( fill_working_group_leader_opening_proposal_grace_period: cpcp .fill_working_group_leader_opening_proposal_grace_period, set_working_group_mint_capacity_proposal_voting_period: cpcp - .set_content_working_group_mint_capacity_proposal_voting_period, + .set_working_group_mint_capacity_proposal_voting_period, set_working_group_mint_capacity_proposal_grace_period: cpcp - .set_content_working_group_mint_capacity_proposal_grace_period, + .set_working_group_mint_capacity_proposal_grace_period, decrease_working_group_leader_stake_proposal_voting_period: cpcp .decrease_working_group_leader_stake_proposal_voting_period, decrease_working_group_leader_stake_proposal_grace_period: cpcp diff --git a/runtime-modules/proposals/codex/src/lib.rs b/runtime-modules/proposals/codex/src/lib.rs index 6ab2402951..93e8dd6197 100644 --- a/runtime-modules/proposals/codex/src/lib.rs +++ b/runtime-modules/proposals/codex/src/lib.rs @@ -21,9 +21,6 @@ //! - [create_set_election_parameters_proposal](./struct.Module.html#method.create_set_election_parameters_proposal) //! - [create_spending_proposal](./struct.Module.html#method.create_spending_proposal) //! -//! ### Content working group proposals -//! - [create_set_content_working_group_mint_capacity_proposal](./struct.Module.html#method.create_set_content_working_group_mint_capacity_proposal) -//! //! ### Working group proposals //! - [create_add_working_group_leader_opening_proposal](./struct.Module.html#method.create_add_working_group_leader_opening_proposal) //! - [create_begin_review_working_group_leader_applications_proposal](./struct.Module.html#method.create_begin_review_working_group_leader_applications_proposal) @@ -85,8 +82,6 @@ pub use proposal_types::{ProposalDetails, ProposalDetailsOf, ProposalEncoder}; // 'Set working group mint capacity' proposal limit const WORKING_GROUP_MINT_CAPACITY_MAX_VALUE: u32 = 5_000_000; -// 'Set content working group mint capacity' proposal limit -const CONTENT_WORKING_GROUP_MINT_CAPACITY_MAX_VALUE: u32 = 1_000_000; // Max allowed value for 'spending' proposal const MAX_SPENDING_PROPOSAL_VALUE: u32 = 2_000_000_u32; // Max validator count for the 'set validator count' proposal @@ -293,14 +288,6 @@ decl_storage! { /// Grace period for the 'text' proposal pub TextProposalGracePeriod get(fn text_proposal_grace_period) config(): T::BlockNumber; - /// Voting period for the 'set content working group mint capacity' proposal - pub SetContentWorkingGroupMintCapacityProposalVotingPeriod get(fn set_content_working_group_mint_capacity_proposal_voting_period) - config(): T::BlockNumber; - - /// Grace period for the 'set content working group mint capacity' proposal - pub SetContentWorkingGroupMintCapacityProposalGracePeriod get(fn set_content_working_group_mint_capacity_proposal_grace_period) - config(): T::BlockNumber; - /// Voting period for the 'spending' proposal pub SpendingProposalVotingPeriod get(fn spending_proposal_voting_period) config(): T::BlockNumber; @@ -468,37 +455,6 @@ decl_module! { Self::create_proposal(params)?; } - /// Create 'Set content working group mint capacity' proposal type. - /// This proposal uses `set_mint_capacity()` extrinsic from the `content-working-group` module. - #[weight = 10_000_000] // TODO: adjust weight - pub fn create_set_content_working_group_mint_capacity_proposal( - origin, - member_id: MemberId, - title: Vec, - description: Vec, - stake_balance: Option>, - mint_balance: BalanceOfMint, - ) { - ensure!( - mint_balance <= >::from(CONTENT_WORKING_GROUP_MINT_CAPACITY_MAX_VALUE), - Error::::InvalidContentWorkingGroupMintCapacity - ); - - let proposal_details = ProposalDetails::SetContentWorkingGroupMintCapacity(mint_balance); - let params = CreateProposalParameters{ - origin, - member_id, - title, - description, - stake_balance, - proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::set_content_working_group_mint_capacity_proposal::(), - proposal_code: T::ProposalEncoder::encode_proposal(proposal_details) - }; - - Self::create_proposal(params)?; - } - /// Create 'Spending' proposal type. /// This proposal uses `spend_from_council_mint()` extrinsic from the `governance::council` module. #[weight = 10_000_000] // TODO: adjust weight @@ -1021,12 +977,6 @@ impl Module { >::put(T::BlockNumber::from( p.set_election_parameters_proposal_grace_period, )); - >::put(T::BlockNumber::from( - p.set_content_working_group_mint_capacity_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.set_content_working_group_mint_capacity_proposal_grace_period, - )); >::put(T::BlockNumber::from( p.spending_proposal_voting_period, )); diff --git a/runtime-modules/proposals/codex/src/proposal_types/mod.rs b/runtime-modules/proposals/codex/src/proposal_types/mod.rs index cd8242adf5..1980963189 100644 --- a/runtime-modules/proposals/codex/src/proposal_types/mod.rs +++ b/runtime-modules/proposals/codex/src/proposal_types/mod.rs @@ -53,9 +53,6 @@ pub enum ProposalDetails< /// Balance and destination account for the `spending` proposal Spending(MintedBalance, AccountId), - /// Balance for the `set content working group mint capacity` proposal - SetContentWorkingGroupMintCapacity(MintedBalance), - /// ********** Deprecated during the Nicaea release. /// It is kept only for backward compatibility in the Pioneer. ********** /// AccountId for the `evict storage provider` proposal @@ -239,12 +236,6 @@ pub struct ProposalsConfigParameters { /// 'Set election parameters' proposal grace period pub set_election_parameters_proposal_grace_period: u32, - /// 'Set content working group mint capacity' proposal voting period - pub set_content_working_group_mint_capacity_proposal_voting_period: u32, - - /// 'Set content working group mint capacity' proposal grace period - pub set_content_working_group_mint_capacity_proposal_grace_period: u32, - /// 'Set lead' proposal voting period pub set_lead_proposal_voting_period: u32, @@ -317,8 +308,6 @@ impl Default for ProposalsConfigParameters { text_proposal_grace_period: 0u32, set_election_parameters_proposal_voting_period: 72000u32, set_election_parameters_proposal_grace_period: 201_601_u32, - set_content_working_group_mint_capacity_proposal_voting_period: 43200u32, - set_content_working_group_mint_capacity_proposal_grace_period: 0u32, set_lead_proposal_voting_period: 43200u32, set_lead_proposal_grace_period: 0u32, spending_proposal_voting_period: 72000u32, @@ -357,8 +346,6 @@ impl ProposalsConfigParameters { text_proposal_grace_period: 0, set_election_parameters_proposal_voting_period: voting_period, set_election_parameters_proposal_grace_period: grace_period, - set_content_working_group_mint_capacity_proposal_voting_period: voting_period, - set_content_working_group_mint_capacity_proposal_grace_period: 0, set_lead_proposal_voting_period: voting_period, set_lead_proposal_grace_period: 0, spending_proposal_voting_period: voting_period, diff --git a/runtime-modules/proposals/codex/src/proposal_types/parameters.rs b/runtime-modules/proposals/codex/src/proposal_types/parameters.rs index 7c3cedd514..89cea06e4d 100644 --- a/runtime-modules/proposals/codex/src/proposal_types/parameters.rs +++ b/runtime-modules/proposals/codex/src/proposal_types/parameters.rs @@ -55,21 +55,6 @@ pub(crate) fn set_election_parameters_proposal( } } -// Proposal parameters for the 'Set content working group mint capacity' proposal -pub(crate) fn set_content_working_group_mint_capacity_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::set_content_working_group_mint_capacity_proposal_voting_period( - ), - grace_period: >::set_content_working_group_mint_capacity_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 75, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(50000u32)), - } -} - // Proposal parameters for the 'Spending' proposal pub(crate) fn spending_proposal( ) -> ProposalParameters> { diff --git a/runtime-modules/proposals/codex/src/tests/mod.rs b/runtime-modules/proposals/codex/src/tests/mod.rs index e6d8d1999f..066a1ef463 100644 --- a/runtime-modules/proposals/codex/src/tests/mod.rs +++ b/runtime-modules/proposals/codex/src/tests/mod.rs @@ -490,59 +490,6 @@ fn create_content_working_group_mint_capacity_proposal_fails_with_invalid_parame }); } -#[test] -fn create_set_content_working_group_mint_capacity_proposal_common_checks_succeed() { - initial_test_ext().execute_with(|| { - increase_total_balance_issuance(500000); - - let proposal_fixture = ProposalTestFixture { - insufficient_rights_call: || { - ProposalCodex::create_set_content_working_group_mint_capacity_proposal( - RawOrigin::None.into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - None, - 0, - ) - }, - empty_stake_call: || { - ProposalCodex::create_set_content_working_group_mint_capacity_proposal( - RawOrigin::Signed(1).into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - None, - 0, - ) - }, - invalid_stake_call: || { - ProposalCodex::create_set_content_working_group_mint_capacity_proposal( - RawOrigin::Signed(1).into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - Some(>::from(5000u32)), - 0, - ) - }, - successful_call: || { - ProposalCodex::create_set_content_working_group_mint_capacity_proposal( - RawOrigin::Signed(1).into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - Some(>::from(50000u32)), - 10, - ) - }, - proposal_parameters: crate::proposal_types::parameters::set_content_working_group_mint_capacity_proposal::(), - proposal_details: ProposalDetails::SetContentWorkingGroupMintCapacity(10), - }; - proposal_fixture.check_all(); - }); -} - #[test] fn create_spending_proposal_common_checks_succeed() { initial_test_ext().execute_with(|| { @@ -759,14 +706,6 @@ fn set_default_proposal_parameters_succeeded() { >::get(), p.set_election_parameters_proposal_grace_period as u64 ); - assert_eq!( - >::get(), - p.set_content_working_group_mint_capacity_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.set_content_working_group_mint_capacity_proposal_grace_period as u64 - ); assert_eq!( >::get(), p.set_lead_proposal_voting_period as u64 diff --git a/runtime/src/integration/proposals/proposal_encoder.rs b/runtime/src/integration/proposals/proposal_encoder.rs index ff5f26508e..b0d8a4a6f8 100644 --- a/runtime/src/integration/proposals/proposal_encoder.rs +++ b/runtime/src/integration/proposals/proposal_encoder.rs @@ -35,11 +35,6 @@ impl ProposalEncoder for ExtrinsicProposalEncoder { ProposalDetails::SetElectionParameters(election_parameters) => Call::CouncilElection( governance::election::Call::set_election_parameters(election_parameters), ), - ProposalDetails::SetContentWorkingGroupMintCapacity(mint_balance) => { - Call::ContentWorkingGroup(content_working_group::Call::set_mint_capacity( - mint_balance, - )) - } ProposalDetails::Spending(balance, destination) => Call::Council( governance::council::Call::spend_from_council_mint(balance, destination), ), diff --git a/runtime/src/tests/proposals_integration/mod.rs b/runtime/src/tests/proposals_integration/mod.rs index 85ac733558..0cd3230b5e 100644 --- a/runtime/src/tests/proposals_integration/mod.rs +++ b/runtime/src/tests/proposals_integration/mod.rs @@ -600,36 +600,6 @@ fn spending_proposal_execution_succeeds() { }); } -#[test] -fn set_content_working_group_mint_capacity_execution_succeeds() { - initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; - let new_balance = >::from(55u32); - - let mint_id = - Mint::add_mint(0, None).expect("Failed to create a mint for the content working group"); - >::put(mint_id); - - assert_eq!(Mint::get_mint_capacity(mint_id), Ok(0)); - - let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { - ProposalCodex::create_set_content_working_group_mint_capacity_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, - b"title".to_vec(), - b"body".to_vec(), - Some(>::from(50000u32)), - new_balance, - ) - }); - - codex_extrinsic_test_fixture.call_extrinsic_and_assert(); - - assert_eq!(Mint::get_mint_capacity(mint_id), Ok(new_balance)); - }); -} - #[test] fn set_election_parameters_proposal_execution_succeeds() { initial_test_ext().execute_with(|| { From d63ea3576a39e5f79831dd28c59b8dc5d248a5ed Mon Sep 17 00:00:00 2001 From: iorveth Date: Tue, 15 Sep 2020 21:13:54 +0300 Subject: [PATCH 03/13] proposals_codex: Remove set_content_working_group_mint_capacity proposal type related logic --- .../proposals/codex/src/tests/mod.rs | 29 +------------------ .../src/tests/proposals_integration/mod.rs | 1 - 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/runtime-modules/proposals/codex/src/tests/mod.rs b/runtime-modules/proposals/codex/src/tests/mod.rs index 066a1ef463..d997ea4bba 100644 --- a/runtime-modules/proposals/codex/src/tests/mod.rs +++ b/runtime-modules/proposals/codex/src/tests/mod.rs @@ -40,7 +40,7 @@ where invalid_stake_call: InvalidStakeCall, successful_call: SuccessfulCall, proposal_parameters: ProposalParameters, - proposal_details: ProposalDetails, + proposal_details: ProposalDetails, } impl @@ -471,25 +471,6 @@ fn create_set_election_parameters_call_fails_with_incorrect_parameters() { }); } -#[test] -fn create_content_working_group_mint_capacity_proposal_fails_with_invalid_parameters() { - initial_test_ext().execute_with(|| { - increase_total_balance_issuance_using_account_id(1, 500000); - - assert_eq!( - ProposalCodex::create_set_content_working_group_mint_capacity_proposal( - RawOrigin::Signed(1).into(), - 1, - b"title".to_vec(), - b"body".to_vec(), - Some(>::from(50000u32)), - (crate::CONTENT_WORKING_GROUP_MINT_CAPACITY_MAX_VALUE + 1) as u64, - ), - Err(Error::::InvalidContentWorkingGroupMintCapacity.into()) - ); - }); -} - #[test] fn create_spending_proposal_common_checks_succeed() { initial_test_ext().execute_with(|| { @@ -706,14 +687,6 @@ fn set_default_proposal_parameters_succeeded() { >::get(), p.set_election_parameters_proposal_grace_period as u64 ); - assert_eq!( - >::get(), - p.set_lead_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.set_lead_proposal_grace_period as u64 - ); assert_eq!( >::get(), p.spending_proposal_voting_period as u64 diff --git a/runtime/src/tests/proposals_integration/mod.rs b/runtime/src/tests/proposals_integration/mod.rs index 0cd3230b5e..0419c69dae 100644 --- a/runtime/src/tests/proposals_integration/mod.rs +++ b/runtime/src/tests/proposals_integration/mod.rs @@ -31,7 +31,6 @@ pub type ProposalsEngine = proposals_engine::Module; pub type Council = governance::council::Module; pub type Election = governance::election::Module; pub type ProposalCodex = proposals_codex::Module; -pub type Mint = minting::Module; fn setup_members(count: u8) { let authority_account_id = ::AccountId::default(); From e7a6103ea3233462eef43e034f9393e3336a484c Mon Sep 17 00:00:00 2001 From: iorveth Date: Tue, 15 Sep 2020 21:32:32 +0300 Subject: [PATCH 04/13] Remove content-working-group from proposals_pallet --- Cargo.lock | 1 - runtime-modules/proposals/codex/Cargo.toml | 2 -- runtime-modules/proposals/codex/src/lib.rs | 2 +- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d2d94733da..56622fe827 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3501,7 +3501,6 @@ dependencies = [ "frame-system", "pallet-balances", "pallet-common", - "pallet-content-working-group", "pallet-governance", "pallet-hiring", "pallet-membership", diff --git a/runtime-modules/proposals/codex/Cargo.toml b/runtime-modules/proposals/codex/Cargo.toml index d921ac5136..56a2134e6a 100644 --- a/runtime-modules/proposals/codex/Cargo.toml +++ b/runtime-modules/proposals/codex/Cargo.toml @@ -21,7 +21,6 @@ governance = { package = 'pallet-governance', default-features = false, path = ' hiring = { package = 'pallet-hiring', default-features = false, path = '../../hiring'} minting = { package = 'pallet-token-mint', default-features = false, path = '../../token-minting'} working-group = { package = 'pallet-working-group', default-features = false, path = '../../working-group'} -content-working-group = { package = 'pallet-content-working-group', default-features = false, path = '../../content-working-group'} common = { package = 'pallet-common', default-features = false, path = '../../common'} proposals-engine = { package = 'pallet-proposals-engine', default-features = false, path = '../engine'} proposals-discussion = { package = 'pallet-proposals-discussion', default-features = false, path = '../discussion'} @@ -53,7 +52,6 @@ std = [ 'governance/std', 'hiring/std', 'minting/std', - 'content-working-group/std', 'working-group/std', 'common/std', 'proposals-engine/std', diff --git a/runtime-modules/proposals/codex/src/lib.rs b/runtime-modules/proposals/codex/src/lib.rs index 93e8dd6197..80b7988618 100644 --- a/runtime-modules/proposals/codex/src/lib.rs +++ b/runtime-modules/proposals/codex/src/lib.rs @@ -139,7 +139,7 @@ pub trait Trait: + proposals_discussion::Trait + membership::Trait + governance::election::Trait - + content_working_group::Trait + + hiring::Trait + staking::Trait { /// Defines max allowed text proposal length. From 95ddc4eb61dfa9bb9869bfc31f8b5507e54ef600 Mon Sep 17 00:00:00 2001 From: iorveth Date: Wed, 16 Sep 2020 11:35:17 +0300 Subject: [PATCH 05/13] proposals_codex: remove old dev dependencies --- Cargo.lock | 2 -- runtime-modules/proposals/codex/Cargo.toml | 2 -- runtime-modules/proposals/codex/src/tests/mock.rs | 14 -------------- 3 files changed, 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 56622fe827..251033c5cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3512,8 +3512,6 @@ dependencies = [ "pallet-staking-reward-curve", "pallet-timestamp", "pallet-token-mint", - "pallet-versioned-store", - "pallet-versioned-store-permissions", "pallet-working-group", "parity-scale-codec", "serde", diff --git a/runtime-modules/proposals/codex/Cargo.toml b/runtime-modules/proposals/codex/Cargo.toml index 56a2134e6a..3c676e5b7d 100644 --- a/runtime-modules/proposals/codex/Cargo.toml +++ b/runtime-modules/proposals/codex/Cargo.toml @@ -31,8 +31,6 @@ sp-core = { package = 'sp-core', default-features = false, git = 'https://github sp-staking = { package = 'sp-staking', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'} pallet-staking-reward-curve = { package = 'pallet-staking-reward-curve', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'} recurring-rewards = { package = 'pallet-recurring-reward', default-features = false, path = '../../recurring-reward'} -versioned-store = { package = 'pallet-versioned-store', default-features = false, path = '../../versioned-store'} -versioned-store-permissions = { package = 'pallet-versioned-store-permissions', default-features = false, path = '../../versioned-store-permissions'} [features] default = ['std'] diff --git a/runtime-modules/proposals/codex/src/tests/mock.rs b/runtime-modules/proposals/codex/src/tests/mock.rs index 071e58a4ba..7a30fea904 100644 --- a/runtime-modules/proposals/codex/src/tests/mock.rs +++ b/runtime-modules/proposals/codex/src/tests/mock.rs @@ -154,26 +154,12 @@ impl governance::election::Trait for Test { type CouncilElected = (); } -impl content_working_group::Trait for Test { - type Event = (); -} - impl recurring_rewards::Trait for Test { type PayoutStatusHandler = (); type RecipientId = u64; type RewardRelationshipId = u64; } -impl versioned_store_permissions::Trait for Test { - type Credential = u64; - type CredentialChecker = (); - type CreateClassPermissionsChecker = (); -} - -impl versioned_store::Trait for Test { - type Event = (); -} - impl hiring::Trait for Test { type OpeningId = u64; type ApplicationId = u64; From 5876f37ef942eda31d193578fb53bcbba333d58d Mon Sep 17 00:00:00 2001 From: iorveth Date: Wed, 16 Sep 2020 11:35:54 +0300 Subject: [PATCH 06/13] proposals_codex: implement working_group trait for mock runtime --- runtime-modules/proposals/codex/src/tests/mock.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/runtime-modules/proposals/codex/src/tests/mock.rs b/runtime-modules/proposals/codex/src/tests/mock.rs index 7a30fea904..ff02f2c8a4 100644 --- a/runtime-modules/proposals/codex/src/tests/mock.rs +++ b/runtime-modules/proposals/codex/src/tests/mock.rs @@ -154,6 +154,18 @@ impl governance::election::Trait for Test { type CouncilElected = (); } +// The working group instance alias. +pub type WorkingGroupInstance = working_group::Instance2; + +parameter_types! { + pub const MaxWorkerNumberLimit: u32 = 100; +} + +impl working_group::Trait for Test { + type Event = (); + type MaxWorkerNumberLimit = MaxWorkerNumberLimit; +} + impl recurring_rewards::Trait for Test { type PayoutStatusHandler = (); type RecipientId = u64; From 5abe2879d5392b5d91bdba1dd262a8c804c647b1 Mon Sep 17 00:00:00 2001 From: iorveth Date: Mon, 21 Sep 2020 15:30:01 +0300 Subject: [PATCH 07/13] Fix ensure_entities_creation_limits_are_valid function --- runtime-modules/content-directory/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime-modules/content-directory/src/lib.rs b/runtime-modules/content-directory/src/lib.rs index 2caa1f56c4..97b35d7bf5 100755 --- a/runtime-modules/content-directory/src/lib.rs +++ b/runtime-modules/content-directory/src/lib.rs @@ -2554,9 +2554,9 @@ impl Module { maximum_entities_count: T::EntityId, default_entity_creation_voucher_upper_bound: T::EntityId, ) -> Result<(), Error> { - // Ensure `per_controller_entities_creation_limit` does not exceed + // Ensure default_entity_creation_voucher_upper_bound does not exceed default_entity_creation_voucher_upper_bound ensure!( - default_entity_creation_voucher_upper_bound < maximum_entities_count, + default_entity_creation_voucher_upper_bound <= maximum_entities_count, Error::::PerControllerEntitiesCreationLimitExceedsOverallLimit ); From 8550b278f0d9bc0e8a1358795f3a449c703f528c Mon Sep 17 00:00:00 2001 From: iorveth Date: Mon, 21 Sep 2020 15:59:19 +0300 Subject: [PATCH 08/13] fix type name in proposal_codex_module --- runtime-modules/proposals/codex/src/tests/mock.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime-modules/proposals/codex/src/tests/mock.rs b/runtime-modules/proposals/codex/src/tests/mock.rs index ff02f2c8a4..cbee519f81 100644 --- a/runtime-modules/proposals/codex/src/tests/mock.rs +++ b/runtime-modules/proposals/codex/src/tests/mock.rs @@ -154,14 +154,14 @@ impl governance::election::Trait for Test { type CouncilElected = (); } -// The working group instance alias. -pub type WorkingGroupInstance = working_group::Instance2; +// The content directory working group instance alias. +pub type ContentDirectoryWorkingGroupInstance = working_group::Instance3; parameter_types! { pub const MaxWorkerNumberLimit: u32 = 100; } -impl working_group::Trait for Test { +impl working_group::Trait for Test { type Event = (); type MaxWorkerNumberLimit = MaxWorkerNumberLimit; } From 907dc0d30bab0878fb4a066c7bee1e3b0f8d6ace Mon Sep 17 00:00:00 2001 From: iorveth Date: Mon, 21 Sep 2020 19:41:41 +0300 Subject: [PATCH 09/13] Add WorkingGroup::Content enum variant, refactor integration tests --- runtime-modules/common/src/working_group.rs | 2 + .../proposals/codex/src/tests/mod.rs | 62 +++++++------- .../integration/proposals/proposal_encoder.rs | 3 + runtime/src/integration/working_group.rs | 8 +- .../working_group_proposals.rs | 82 +++++++++---------- 5 files changed, 81 insertions(+), 76 deletions(-) diff --git a/runtime-modules/common/src/working_group.rs b/runtime-modules/common/src/working_group.rs index 23c58632b7..d6abec2edb 100644 --- a/runtime-modules/common/src/working_group.rs +++ b/runtime-modules/common/src/working_group.rs @@ -12,4 +12,6 @@ pub enum WorkingGroup { */ /// Storage working group: working_group::Instance2. Storage, + /// Storage working group: working_group::Instance3. + Content, } diff --git a/runtime-modules/proposals/codex/src/tests/mod.rs b/runtime-modules/proposals/codex/src/tests/mod.rs index 38175f07f8..a9a77589e9 100644 --- a/runtime-modules/proposals/codex/src/tests/mod.rs +++ b/runtime-modules/proposals/codex/src/tests/mod.rs @@ -769,7 +769,7 @@ fn create_add_working_group_leader_opening_proposal_common_checks_succeed() { activate_at: ActivateOpeningAt::CurrentBlock, commitment: OpeningPolicyCommitment::default(), human_readable_text: b"some text".to_vec(), - working_group: WorkingGroup::Storage, + working_group: WorkingGroup::Content, }; increase_total_balance_issuance_using_account_id(1, 500000); @@ -840,7 +840,7 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_ b"body".to_vec(), None, opening_id, - WorkingGroup::Storage + WorkingGroup::Content ) }, empty_stake_call: || { @@ -851,7 +851,7 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_ b"body".to_vec(), None, opening_id, - WorkingGroup::Storage + WorkingGroup::Content ) }, invalid_stake_call: || { @@ -862,7 +862,7 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_ b"body".to_vec(), Some(>::from(5000u32)), opening_id, - WorkingGroup::Storage + WorkingGroup::Content ) }, successful_call: || { @@ -873,14 +873,14 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_ b"body".to_vec(), Some(>::from(25000u32)), opening_id, - WorkingGroup::Storage + WorkingGroup::Content ) }, proposal_parameters: crate::proposal_types::parameters::begin_review_working_group_leader_applications_proposal::< Test, >(), proposal_details: ProposalDetails::BeginReviewWorkingGroupLeaderApplications(opening_id, - WorkingGroup::Storage), + WorkingGroup::Content), }; proposal_fixture.check_all(); }); @@ -895,7 +895,7 @@ fn create_fill_working_group_leader_opening_proposal_common_checks_succeed() { opening_id, successful_application_id: 1, reward_policy: None, - working_group: WorkingGroup::Storage, + working_group: WorkingGroup::Content, }; increase_total_balance_issuance_using_account_id(1, 500000); @@ -963,7 +963,7 @@ fn create_working_group_mint_capacity_proposal_fails_with_invalid_parameters() { b"body".to_vec(), Some(>::from(50000u32)), (crate::WORKING_GROUP_MINT_CAPACITY_MAX_VALUE + 1) as u64, - WorkingGroup::Storage, + WorkingGroup::Content, ), Err(Error::::InvalidWorkingGroupMintCapacity.into()) ); @@ -984,7 +984,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { b"body".to_vec(), None, 0, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, empty_stake_call: || { @@ -995,7 +995,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { b"body".to_vec(), None, 0, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, invalid_stake_call: || { @@ -1006,7 +1006,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { b"body".to_vec(), Some(>::from(5000u32)), 0, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, successful_call: || { @@ -1017,7 +1017,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { b"body".to_vec(), Some(>::from(50000u32)), 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, proposal_parameters: @@ -1025,7 +1025,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { ), proposal_details: ProposalDetails::SetWorkingGroupMintCapacity( 10, - WorkingGroup::Storage, + WorkingGroup::Content, ), }; proposal_fixture.check_all(); @@ -1047,7 +1047,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, empty_stake_call: || { @@ -1059,7 +1059,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, invalid_stake_call: || { @@ -1071,7 +1071,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { Some(>::from(5000u32)), 0, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, successful_call: || { @@ -1083,7 +1083,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { Some(>::from(50000u32)), 10, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, proposal_parameters: @@ -1093,7 +1093,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { proposal_details: ProposalDetails::DecreaseWorkingGroupLeaderStake( 10, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ), }; proposal_fixture.check_all(); @@ -1115,7 +1115,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, empty_stake_call: || { @@ -1127,7 +1127,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, invalid_stake_call: || { @@ -1139,7 +1139,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { Some(>::from(5000u32)), 0, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, successful_call: || { @@ -1151,7 +1151,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { Some(>::from(50000u32)), 10, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, proposal_parameters: @@ -1161,7 +1161,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { proposal_details: ProposalDetails::SlashWorkingGroupLeaderStake( 10, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ), }; proposal_fixture.check_all(); @@ -1189,7 +1189,7 @@ fn slash_stake_with_zero_staking_balance_fails() { Some(>::from(50000u32)), 10, 0, - WorkingGroup::Storage, + WorkingGroup::Content, ), Err(Error::::SlashingStakeIsZero.into()) ); @@ -1217,7 +1217,7 @@ fn decrease_stake_with_zero_staking_balance_fails() { Some(>::from(50000u32)), 10, 0, - WorkingGroup::Storage, + WorkingGroup::Content, ), Err(Error::::DecreasingStakeIsZero.into()) ); @@ -1237,7 +1237,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, empty_stake_call: || { @@ -1249,7 +1249,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, invalid_stake_call: || { @@ -1261,7 +1261,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { Some(>::from(5000u32)), 0, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, successful_call: || { @@ -1273,7 +1273,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { Some(>::from(50000u32)), 10, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ) }, proposal_parameters: @@ -1282,7 +1282,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { proposal_details: ProposalDetails::SetWorkingGroupLeaderReward( 10, 10, - WorkingGroup::Storage, + WorkingGroup::Content, ), }; proposal_fixture.check_all(); @@ -1298,7 +1298,7 @@ fn create_terminate_working_group_leader_role_proposal_common_checks_succeed() { worker_id: 10, rationale: Vec::new(), slash: false, - working_group: WorkingGroup::Storage, + working_group: WorkingGroup::Content, }; let proposal_fixture = ProposalTestFixture { diff --git a/runtime/src/integration/proposals/proposal_encoder.rs b/runtime/src/integration/proposals/proposal_encoder.rs index b0d8a4a6f8..388e1343d2 100644 --- a/runtime/src/integration/proposals/proposal_encoder.rs +++ b/runtime/src/integration/proposals/proposal_encoder.rs @@ -18,6 +18,9 @@ use sp_std::vec::Vec; macro_rules! wrap_working_group_call { ($working_group:expr, $working_group_instance_call:expr) => {{ match $working_group { + WorkingGroup::Content => { + Call::ContentDirectoryWorkingGroup($working_group_instance_call) + } WorkingGroup::Storage => Call::StorageWorkingGroup($working_group_instance_call), } }}; diff --git a/runtime/src/integration/working_group.rs b/runtime/src/integration/working_group.rs index 8c11350845..3181eeb902 100644 --- a/runtime/src/integration/working_group.rs +++ b/runtime/src/integration/working_group.rs @@ -1,14 +1,14 @@ use frame_support::StorageMap; use sp_std::marker::PhantomData; -use crate::StorageWorkingGroupInstance; +use crate::ContentDirectoryWorkingGroupInstance; use stake::{BalanceOf, NegativeImbalance}; pub struct StakingEventsHandler { pub marker: PhantomData, } -impl> +impl> stake::StakingEventsHandler for StakingEventsHandler { /// Unstake remaining sum back to the source_account_id @@ -24,10 +24,10 @@ impl> let hiring_application_id = hiring::ApplicationIdByStakingId::::get(*stake_id); - if working_group::MemberIdByHiringApplicationId::::contains_key( + if working_group::MemberIdByHiringApplicationId::::contains_key( hiring_application_id, ) { - return >::refund_working_group_stake( + return >::refund_working_group_stake( *stake_id, remaining_imbalance, ); diff --git a/runtime/src/tests/proposals_integration/working_group_proposals.rs b/runtime/src/tests/proposals_integration/working_group_proposals.rs index b6c04ebe45..0a0e571b6d 100644 --- a/runtime/src/tests/proposals_integration/working_group_proposals.rs +++ b/runtime/src/tests/proposals_integration/working_group_proposals.rs @@ -7,11 +7,11 @@ use hiring::ActivateOpeningAt; use proposals_codex::AddOpeningParameters; use working_group::{OpeningPolicyCommitment, RewardPolicy}; -use crate::{Balance, BlockNumber, StorageWorkingGroupInstance}; +use crate::{ + Balance, BlockNumber, ContentDirectoryWorkingGroup, ContentDirectoryWorkingGroupInstance, +}; use sp_std::collections::btree_set::BTreeSet; -type StorageWorkingGroup = working_group::Module; - type Hiring = hiring::Module; fn add_opening( @@ -24,11 +24,11 @@ fn add_opening( let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; - let opening_id = StorageWorkingGroup::next_opening_id(); + let opening_id = ContentDirectoryWorkingGroup::next_opening_id(); assert!(!>::contains_key(opening_id)); let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { @@ -44,7 +44,7 @@ fn add_opening( .clone() .unwrap_or(OpeningPolicyCommitment::default()), human_readable_text: Vec::new(), - working_group: WorkingGroup::Storage, + working_group: WorkingGroup::Content, }, ) }) @@ -73,7 +73,7 @@ fn begin_review_applications( b"body".to_vec(), Some(>::from(25_000_u32)), opening_id, - WorkingGroup::Storage, + WorkingGroup::Content, ) }) .disable_setup_enviroment() @@ -105,7 +105,7 @@ fn fill_opening( opening_id, successful_application_id, reward_policy: reward_policy.clone(), - working_group: WorkingGroup::Storage, + working_group: WorkingGroup::Content, }, ) }) @@ -143,7 +143,7 @@ fn decrease_stake( Some(>::from(50_000_u32)), leader_worker_id, stake_amount, - WorkingGroup::Storage, + WorkingGroup::Content, ) }) .disable_setup_enviroment() @@ -172,7 +172,7 @@ fn slash_stake( Some(>::from(50_000_u32)), leader_worker_id, stake_amount, - WorkingGroup::Storage, + WorkingGroup::Content, ) }) .disable_setup_enviroment() @@ -201,7 +201,7 @@ fn set_reward( Some(>::from(50_000_u32)), leader_worker_id, reward_amount, - WorkingGroup::Storage, + WorkingGroup::Content, ) }) .disable_setup_enviroment() @@ -224,7 +224,7 @@ fn set_mint_capacity( let mint_id_result = >::add_mint(0, None); if let Ok(mint_id) = mint_id_result { - >::put(mint_id); + >::put(mint_id); } let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { @@ -235,7 +235,7 @@ fn set_mint_capacity( b"body".to_vec(), Some(>::from(50_000_u32)), mint_capacity, - WorkingGroup::Storage, + WorkingGroup::Content, ) }) .with_setup_enviroment(setup_environment) @@ -266,7 +266,7 @@ fn terminate_role( worker_id: leader_worker_id, rationale: Vec::new(), slash, - working_group: WorkingGroup::Storage, + working_group: WorkingGroup::Content, }, ) }) @@ -283,11 +283,11 @@ fn create_add_working_group_leader_opening_proposal_execution_succeeds() { let member_id = 1; let account_id: [u8; 32] = [member_id; 32]; - let next_opening_id = StorageWorkingGroup::next_opening_id(); + let next_opening_id = ContentDirectoryWorkingGroup::next_opening_id(); assert!(!>::contains_key(next_opening_id)); let opening_id = add_opening( @@ -304,7 +304,7 @@ fn create_add_working_group_leader_opening_proposal_execution_succeeds() { // Check for the new opening creation. assert!(>::contains_key(opening_id)); }); } @@ -323,7 +323,7 @@ fn create_begin_review_working_group_leader_applications_proposal_execution_succ 1, ); - let opening = StorageWorkingGroup::opening_by_id(opening_id); + let opening = ContentDirectoryWorkingGroup::opening_by_id(opening_id); let hiring_opening = Hiring::opening_by_id(opening.hiring_opening_id); assert_eq!( @@ -372,7 +372,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { 1, ); - let apply_result = StorageWorkingGroup::apply_on_opening( + let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( RawOrigin::Signed(account_id.clone().into()).into(), member_id as u64, opening_id, @@ -388,7 +388,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { begin_review_applications(member_id, account_id, opening_id, 2); - let lead = StorageWorkingGroup::current_lead(); + let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); fill_opening( @@ -400,7 +400,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { 3, ); - let lead = StorageWorkingGroup::current_lead(); + let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_some()); }); } @@ -430,7 +430,7 @@ fn create_decrease_group_leader_stake_proposal_execution_succeeds() { 1, ); - let apply_result = StorageWorkingGroup::apply_on_opening( + let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( RawOrigin::Signed(account_id.clone().into()).into(), member_id as u64, opening_id, @@ -446,7 +446,7 @@ fn create_decrease_group_leader_stake_proposal_execution_succeeds() { begin_review_applications(member_id, account_id, opening_id, 2); - let lead = StorageWorkingGroup::current_lead(); + let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); fill_opening( @@ -458,7 +458,7 @@ fn create_decrease_group_leader_stake_proposal_execution_succeeds() { 3, ); - let leader_worker_id = StorageWorkingGroup::current_lead().unwrap(); + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); let stake_id = 1; let old_balance = Balances::free_balance(&account_id.into()); @@ -511,7 +511,7 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() { 1, ); - let apply_result = StorageWorkingGroup::apply_on_opening( + let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( RawOrigin::Signed(account_id.clone().into()).into(), member_id as u64, opening_id, @@ -527,7 +527,7 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() { begin_review_applications(member_id, account_id, opening_id, 2); - let lead = StorageWorkingGroup::current_lead(); + let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); fill_opening( @@ -539,7 +539,7 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() { 3, ); - let leader_worker_id = StorageWorkingGroup::current_lead().unwrap(); + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); let stake_id = 1; let old_balance = Balances::free_balance(&account_id.into()); @@ -573,12 +573,12 @@ fn create_set_working_group_mint_capacity_proposal_execution_succeeds() { let member_id = 1; let account_id: [u8; 32] = [member_id; 32]; - assert_eq!(StorageWorkingGroup::mint(), 0); + assert_eq!(ContentDirectoryWorkingGroup::mint(), 0); let mint_capacity = 999999; set_mint_capacity(member_id, account_id, mint_capacity, 1, true); - let mint_id = StorageWorkingGroup::mint(); + let mint_id = ContentDirectoryWorkingGroup::mint(); let mint = >::mints(mint_id); assert_eq!(mint.capacity(), mint_capacity); @@ -610,7 +610,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() { 1, ); - let apply_result = StorageWorkingGroup::apply_on_opening( + let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( RawOrigin::Signed(account_id.clone().into()).into(), member_id as u64, opening_id, @@ -626,7 +626,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() { begin_review_applications(member_id, account_id, opening_id, 2); - let lead = StorageWorkingGroup::current_lead(); + let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); let old_reward_amount = 100; @@ -647,9 +647,9 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() { 4, ); - let leader_worker_id = StorageWorkingGroup::current_lead().unwrap(); + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); - let worker = StorageWorkingGroup::worker_by_id(leader_worker_id); + let worker = ContentDirectoryWorkingGroup::worker_by_id(leader_worker_id); let relationship_id = worker.reward_relationship.unwrap(); let relationship = recurring_rewards::RewardRelationships::::get(relationship_id); @@ -694,7 +694,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() { 1, ); - let apply_result = StorageWorkingGroup::apply_on_opening( + let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( RawOrigin::Signed(account_id.clone().into()).into(), member_id as u64, opening_id, @@ -710,7 +710,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() { begin_review_applications(member_id, account_id, opening_id, 2); - let lead = StorageWorkingGroup::current_lead(); + let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); let old_reward_amount = 100; @@ -731,7 +731,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() { 4, ); - let leader_worker_id = StorageWorkingGroup::current_lead().unwrap(); + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); let stake_id = 1; let old_balance = Balances::free_balance(&account_id.into()); @@ -741,7 +741,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() { terminate_role(member_id, account_id, leader_worker_id, false, 5); - assert!(StorageWorkingGroup::current_lead().is_none()); + assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); let new_balance = Balances::free_balance(&account_id.into()); let new_stake = >::stakes(stake_id); @@ -776,7 +776,7 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( 1, ); - let apply_result = StorageWorkingGroup::apply_on_opening( + let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( RawOrigin::Signed(account_id.clone().into()).into(), member_id as u64, opening_id, @@ -792,7 +792,7 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( begin_review_applications(member_id, account_id, opening_id, 2); - let lead = StorageWorkingGroup::current_lead(); + let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); let old_reward_amount = 100; @@ -813,7 +813,7 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( 4, ); - let leader_worker_id = StorageWorkingGroup::current_lead().unwrap(); + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); let stake_id = 1; let old_balance = Balances::free_balance(&account_id.into()); @@ -823,7 +823,7 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( terminate_role(member_id, account_id, leader_worker_id, true, 5); - assert!(StorageWorkingGroup::current_lead().is_none()); + assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); let new_balance = Balances::free_balance(&account_id.into()); let new_stake = >::stakes(stake_id); From 0212262aa210e852504ece73d3bdff143bf1eda0 Mon Sep 17 00:00:00 2001 From: iorveth Date: Tue, 22 Sep 2020 20:25:08 +0300 Subject: [PATCH 10/13] Split up working_group StakingEventsHandler into ContentDirectoryWGStakingEventsHandler & StorageWgStakingEventsHandler --- runtime/src/integration/working_group.rs | 50 ++++++++++++++++++++++-- runtime/src/lib.rs | 6 +-- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/runtime/src/integration/working_group.rs b/runtime/src/integration/working_group.rs index 3181eeb902..6c13de8ad0 100644 --- a/runtime/src/integration/working_group.rs +++ b/runtime/src/integration/working_group.rs @@ -1,15 +1,15 @@ use frame_support::StorageMap; use sp_std::marker::PhantomData; -use crate::ContentDirectoryWorkingGroupInstance; +use crate::{ContentDirectoryWorkingGroupInstance, StorageWorkingGroupInstance}; use stake::{BalanceOf, NegativeImbalance}; -pub struct StakingEventsHandler { +pub struct ContentDirectoryWGStakingEventsHandler { pub marker: PhantomData, } impl> - stake::StakingEventsHandler for StakingEventsHandler + stake::StakingEventsHandler for ContentDirectoryWGStakingEventsHandler { /// Unstake remaining sum back to the source_account_id fn unstaked( @@ -47,3 +47,47 @@ impl { + pub marker: PhantomData, +} + +impl> + stake::StakingEventsHandler for StorageWgStakingEventsHandler +{ + /// Unstake remaining sum back to the source_account_id + fn unstaked( + stake_id: &::StakeId, + _unstaked_amount: BalanceOf, + remaining_imbalance: NegativeImbalance, + ) -> NegativeImbalance { + // Stake not related to a staked role managed by the hiring module. + if !hiring::ApplicationIdByStakingId::::contains_key(*stake_id) { + return remaining_imbalance; + } + + let hiring_application_id = hiring::ApplicationIdByStakingId::::get(*stake_id); + + if working_group::MemberIdByHiringApplicationId::::contains_key( + hiring_application_id, + ) { + return >::refund_working_group_stake( + *stake_id, + remaining_imbalance, + ); + } + + remaining_imbalance + } + + /// Empty handler for the slashing. + fn slashed( + _: &::StakeId, + _: Option<::SlashId>, + _: BalanceOf, + _: BalanceOf, + remaining_imbalance: NegativeImbalance, + ) -> NegativeImbalance { + remaining_imbalance + } +} diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index b09fd16fc1..3ae9653315 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -453,10 +453,10 @@ impl stake::Trait for Runtime { type Currency = ::Currency; type StakePoolId = StakePoolId; type StakingEventsHandler = ( - crate::integration::content_working_group::ContentWorkingGroupStakingEventHandler, + crate::integration::proposals::StakingEventsHandler, ( - crate::integration::proposals::StakingEventsHandler, - crate::integration::working_group::StakingEventsHandler, + crate::integration::working_group::ContentDirectoryWGStakingEventsHandler, + crate::integration::working_group::StorageWgStakingEventsHandler, ), ); type StakeId = u64; From 5062696c2f1eea7e5f77846dbaa1ef47e4af06f0 Mon Sep 17 00:00:00 2001 From: iorveth Date: Thu, 24 Sep 2020 22:55:15 +0300 Subject: [PATCH 11/13] working_group proposals integration coverage initial work --- Cargo.lock | 26 +- runtime-modules/common/Cargo.toml | 4 + runtime-modules/common/src/working_group.rs | 4 +- runtime-modules/governance/src/mock.rs | 2 +- runtime-modules/hiring/src/lib.rs | 1 + runtime-modules/membership/src/lib.rs | 6 +- runtime-modules/membership/src/mock.rs | 2 +- runtime-modules/membership/src/tests.rs | 2 +- runtime-modules/proposals/codex/Cargo.toml | 1 + .../proposals/codex/src/tests/mock.rs | 8 + .../proposals/codex/src/tests/mod.rs | 168 +++++-- runtime/Cargo.toml | 2 +- runtime/src/integration/mod.rs | 1 + runtime/src/integration/proposals/mod.rs | 1 + .../integration/proposals/proposal_encoder.rs | 1 + runtime/src/lib.rs | 3 +- runtime/src/primitives.rs | 3 + runtime/src/tests/mod.rs | 1 + .../src/tests/proposals_integration/mod.rs | 1 + .../working_group_proposals.rs | 451 ++++++++++++------ 20 files changed, 489 insertions(+), 199 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 80eebc0d5d..f2d46b21b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2117,6 +2117,7 @@ dependencies = [ "sp-std", "sp-transaction-pool", "sp-version", + "strum 0.19.2", "substrate-wasm-builder-runner", ] @@ -3301,6 +3302,8 @@ dependencies = [ "parity-scale-codec", "serde", "sp-runtime", + "strum 0.19.2", + "strum_macros 0.19.2", ] [[package]] @@ -3549,6 +3552,7 @@ dependencies = [ "sp-runtime", "sp-staking", "sp-std", + "strum 0.19.2", ] [[package]] @@ -6456,7 +6460,7 @@ dependencies = [ "lazy_static", "sp-core", "sp-runtime", - "strum", + "strum 0.16.0", ] [[package]] @@ -6799,9 +6803,15 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22" dependencies = [ - "strum_macros", + "strum_macros 0.16.0", ] +[[package]] +name = "strum" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3924a58d165da3b7b2922c667ab0673c7b5fd52b5c19ea3442747bcb3cd15abe" + [[package]] name = "strum_macros" version = "0.16.0" @@ -6814,6 +6824,18 @@ dependencies = [ "syn 1.0.17", ] +[[package]] +name = "strum_macros" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2ab682ecdcae7f5f45ae85cd7c1e6c8e68ea42c8a612d47fedf831c037146a" +dependencies = [ + "heck", + "proc-macro2", + "quote 1.0.7", + "syn 1.0.17", +] + [[package]] name = "substrate-bip39" version = "0.4.1" diff --git a/runtime-modules/common/Cargo.toml b/runtime-modules/common/Cargo.toml index b4c98bd9a7..4bc8489248 100644 --- a/runtime-modules/common/Cargo.toml +++ b/runtime-modules/common/Cargo.toml @@ -6,6 +6,8 @@ edition = '2018' [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } +strum = {version = "0.19", optional = true} +strum_macros = {version = "0.19", optional = true} codec = { package = 'parity-scale-codec', version = '1.3.1', default-features = false, features = ['derive'] } sp-runtime = { package = 'sp-runtime', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'} frame-support = { package = 'frame-support', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'} @@ -16,6 +18,8 @@ pallet-timestamp = { package = 'pallet-timestamp', default-features = false, git default = ['std'] std = [ 'serde', + 'strum', + 'strum_macros', 'codec/std', 'sp-runtime/std', 'frame-support/std', diff --git a/runtime-modules/common/src/working_group.rs b/runtime-modules/common/src/working_group.rs index d6abec2edb..bb3b2a0935 100644 --- a/runtime-modules/common/src/working_group.rs +++ b/runtime-modules/common/src/working_group.rs @@ -1,9 +1,11 @@ use codec::{Decode, Encode}; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "std")] +use strum_macros::EnumIter; /// Defines well-known working groups. -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, EnumIter))] #[derive(Encode, Decode, Clone, PartialEq, Eq, Copy, Debug)] pub enum WorkingGroup { /* Reserved diff --git a/runtime-modules/governance/src/mock.rs b/runtime-modules/governance/src/mock.rs index 88076e52f7..4c2f6a5674 100644 --- a/runtime-modules/governance/src/mock.rs +++ b/runtime-modules/governance/src/mock.rs @@ -71,7 +71,7 @@ impl election::Trait for Test { } impl membership::Trait for Test { type Event = (); - type MemberId = u32; + type MemberId = u64; type SubscriptionId = u32; type PaidTermId = u32; type ActorId = u32; diff --git a/runtime-modules/hiring/src/lib.rs b/runtime-modules/hiring/src/lib.rs index 1ed4839d7c..48237c9693 100755 --- a/runtime-modules/hiring/src/lib.rs +++ b/runtime-modules/hiring/src/lib.rs @@ -57,6 +57,7 @@ pub trait Trait: system::Trait + stake::Trait + Sized { + Default + Copy + MaybeSerialize + + From + PartialEq; /// ApplicationId type diff --git a/runtime-modules/membership/src/lib.rs b/runtime-modules/membership/src/lib.rs index 9065368092..32de444bbd 100644 --- a/runtime-modules/membership/src/lib.rs +++ b/runtime-modules/membership/src/lib.rs @@ -35,7 +35,8 @@ pub trait Trait: system::Trait + GovernanceCurrency + pallet_timestamp::Trait { + Default + Copy + MaybeSerialize - + PartialEq; + + PartialEq + + From; type PaidTermId: Parameter + Member @@ -64,7 +65,8 @@ pub trait Trait: system::Trait + GovernanceCurrency + pallet_timestamp::Trait { + Copy + MaybeSerialize + PartialEq - + Ord; + + Ord + + Into; } const FIRST_PAID_TERMS_ID: u8 = 1; diff --git a/runtime-modules/membership/src/mock.rs b/runtime-modules/membership/src/mock.rs index d121d1797e..0a7a6c629d 100644 --- a/runtime-modules/membership/src/mock.rs +++ b/runtime-modules/membership/src/mock.rs @@ -80,7 +80,7 @@ impl GovernanceCurrency for Test { impl Trait for Test { type Event = (); - type MemberId = u32; + type MemberId = u64; type PaidTermId = u32; type SubscriptionId = u32; type ActorId = u32; diff --git a/runtime-modules/membership/src/tests.rs b/runtime-modules/membership/src/tests.rs index 650d40bdd0..9d4db399ab 100644 --- a/runtime-modules/membership/src/tests.rs +++ b/runtime-modules/membership/src/tests.rs @@ -5,7 +5,7 @@ use super::mock::*; use frame_support::*; -fn get_membership_by_id(member_id: u32) -> crate::Membership { +fn get_membership_by_id(member_id: u64) -> crate::Membership { if >::contains_key(member_id) { Members::membership(member_id) } else { diff --git a/runtime-modules/proposals/codex/Cargo.toml b/runtime-modules/proposals/codex/Cargo.toml index 3c676e5b7d..a873dd75bf 100644 --- a/runtime-modules/proposals/codex/Cargo.toml +++ b/runtime-modules/proposals/codex/Cargo.toml @@ -31,6 +31,7 @@ sp-core = { package = 'sp-core', default-features = false, git = 'https://github sp-staking = { package = 'sp-staking', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'} pallet-staking-reward-curve = { package = 'pallet-staking-reward-curve', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'} recurring-rewards = { package = 'pallet-recurring-reward', default-features = false, path = '../../recurring-reward'} +strum = {version = "0.19", default-features = false} [features] default = ['std'] diff --git a/runtime-modules/proposals/codex/src/tests/mock.rs b/runtime-modules/proposals/codex/src/tests/mock.rs index cbee519f81..70e799bf78 100644 --- a/runtime-modules/proposals/codex/src/tests/mock.rs +++ b/runtime-modules/proposals/codex/src/tests/mock.rs @@ -157,6 +157,9 @@ impl governance::election::Trait for Test { // The content directory working group instance alias. pub type ContentDirectoryWorkingGroupInstance = working_group::Instance3; +// The storage working group instance alias. +pub type StorageWorkingGroupInstance = working_group::Instance2; + parameter_types! { pub const MaxWorkerNumberLimit: u32 = 100; } @@ -166,6 +169,11 @@ impl working_group::Trait for Test { type MaxWorkerNumberLimit = MaxWorkerNumberLimit; } +impl working_group::Trait for Test { + type Event = (); + type MaxWorkerNumberLimit = MaxWorkerNumberLimit; +} + impl recurring_rewards::Trait for Test { type PayoutStatusHandler = (); type RecipientId = u64; diff --git a/runtime-modules/proposals/codex/src/tests/mod.rs b/runtime-modules/proposals/codex/src/tests/mod.rs index a9a77589e9..f8fecaedd9 100644 --- a/runtime-modules/proposals/codex/src/tests/mod.rs +++ b/runtime-modules/proposals/codex/src/tests/mod.rs @@ -16,6 +16,8 @@ use crate::*; use crate::{BalanceOf, Error, ProposalDetails}; pub use mock::*; +use strum::IntoEnumIterator; + pub(crate) fn increase_total_balance_issuance(balance: u64) { increase_total_balance_issuance_using_account_id(999, balance); } @@ -764,12 +766,21 @@ fn set_default_proposal_parameters_succeeded() { #[test] fn create_add_working_group_leader_opening_proposal_common_checks_succeed() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_add_working_group_leader_opening_proposal_common_checks_succeed(group); + } +} + +fn run_create_add_working_group_leader_opening_proposal_common_checks_succeed( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { let add_opening_parameters = AddOpeningParameters { activate_at: ActivateOpeningAt::CurrentBlock, commitment: OpeningPolicyCommitment::default(), human_readable_text: b"some text".to_vec(), - working_group: WorkingGroup::Content, + working_group, }; increase_total_balance_issuance_using_account_id(1, 500000); @@ -826,6 +837,17 @@ fn create_add_working_group_leader_opening_proposal_common_checks_succeed() { #[test] fn create_begin_review_working_group_leader_applications_proposal_common_checks_succeed() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_begin_review_working_group_leader_applications_proposal_common_checks_succeed( + group, + ); + } +} + +fn run_create_begin_review_working_group_leader_applications_proposal_common_checks_succeed( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { let opening_id = 1; // random opening id. @@ -840,7 +862,7 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_ b"body".to_vec(), None, opening_id, - WorkingGroup::Content + working_group ) }, empty_stake_call: || { @@ -851,7 +873,7 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_ b"body".to_vec(), None, opening_id, - WorkingGroup::Content + working_group ) }, invalid_stake_call: || { @@ -862,7 +884,7 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_ b"body".to_vec(), Some(>::from(5000u32)), opening_id, - WorkingGroup::Content + working_group ) }, successful_call: || { @@ -873,14 +895,14 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_ b"body".to_vec(), Some(>::from(25000u32)), opening_id, - WorkingGroup::Content + working_group ) }, proposal_parameters: crate::proposal_types::parameters::begin_review_working_group_leader_applications_proposal::< Test, >(), proposal_details: ProposalDetails::BeginReviewWorkingGroupLeaderApplications(opening_id, - WorkingGroup::Content), + working_group), }; proposal_fixture.check_all(); }); @@ -888,6 +910,15 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_ #[test] fn create_fill_working_group_leader_opening_proposal_common_checks_succeed() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_fill_working_group_leader_opening_proposal_common_checks_succeed(group); + } +} + +fn run_create_fill_working_group_leader_opening_proposal_common_checks_succeed( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { let opening_id = 1; // random opening id. @@ -895,7 +926,7 @@ fn create_fill_working_group_leader_opening_proposal_common_checks_succeed() { opening_id, successful_application_id: 1, reward_policy: None, - working_group: WorkingGroup::Content, + working_group, }; increase_total_balance_issuance_using_account_id(1, 500000); @@ -952,6 +983,15 @@ fn create_fill_working_group_leader_opening_proposal_common_checks_succeed() { #[test] fn create_working_group_mint_capacity_proposal_fails_with_invalid_parameters() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_working_group_mint_capacity_proposal_fails_with_invalid_parameters(group); + } +} + +fn run_create_working_group_mint_capacity_proposal_fails_with_invalid_parameters( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { increase_total_balance_issuance_using_account_id(1, 500000); @@ -963,7 +1003,7 @@ fn create_working_group_mint_capacity_proposal_fails_with_invalid_parameters() { b"body".to_vec(), Some(>::from(50000u32)), (crate::WORKING_GROUP_MINT_CAPACITY_MAX_VALUE + 1) as u64, - WorkingGroup::Content, + working_group, ), Err(Error::::InvalidWorkingGroupMintCapacity.into()) ); @@ -972,6 +1012,15 @@ fn create_working_group_mint_capacity_proposal_fails_with_invalid_parameters() { #[test] fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_set_working_group_mint_capacity_proposal_common_checks_succeed(group); + } +} + +fn run_create_set_working_group_mint_capacity_proposal_common_checks_succeed( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { increase_total_balance_issuance(500000); @@ -984,7 +1033,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { b"body".to_vec(), None, 0, - WorkingGroup::Content, + working_group, ) }, empty_stake_call: || { @@ -995,7 +1044,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { b"body".to_vec(), None, 0, - WorkingGroup::Content, + working_group, ) }, invalid_stake_call: || { @@ -1006,7 +1055,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { b"body".to_vec(), Some(>::from(5000u32)), 0, - WorkingGroup::Content, + working_group, ) }, successful_call: || { @@ -1017,16 +1066,13 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { b"body".to_vec(), Some(>::from(50000u32)), 10, - WorkingGroup::Content, + working_group, ) }, proposal_parameters: crate::proposal_types::parameters::set_working_group_mint_capacity_proposal::( ), - proposal_details: ProposalDetails::SetWorkingGroupMintCapacity( - 10, - WorkingGroup::Content, - ), + proposal_details: ProposalDetails::SetWorkingGroupMintCapacity(10, working_group), }; proposal_fixture.check_all(); }); @@ -1034,6 +1080,15 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() { #[test] fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_decrease_working_group_leader_stake_proposal_common_checks_succeed(group); + } +} + +fn run_create_decrease_working_group_leader_stake_proposal_common_checks_succeed( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { increase_total_balance_issuance(500000); @@ -1047,7 +1102,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Content, + working_group, ) }, empty_stake_call: || { @@ -1059,7 +1114,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Content, + working_group, ) }, invalid_stake_call: || { @@ -1071,7 +1126,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { Some(>::from(5000u32)), 0, 10, - WorkingGroup::Content, + working_group, ) }, successful_call: || { @@ -1083,7 +1138,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { Some(>::from(50000u32)), 10, 10, - WorkingGroup::Content, + working_group, ) }, proposal_parameters: @@ -1093,7 +1148,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { proposal_details: ProposalDetails::DecreaseWorkingGroupLeaderStake( 10, 10, - WorkingGroup::Content, + working_group, ), }; proposal_fixture.check_all(); @@ -1102,6 +1157,15 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() { #[test] fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_slash_working_group_leader_stake_proposal_common_checks_succeed(group); + } +} + +fn run_create_slash_working_group_leader_stake_proposal_common_checks_succeed( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { increase_total_balance_issuance(500000); @@ -1115,7 +1179,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Content, + working_group, ) }, empty_stake_call: || { @@ -1127,7 +1191,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Content, + working_group, ) }, invalid_stake_call: || { @@ -1139,7 +1203,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { Some(>::from(5000u32)), 0, 10, - WorkingGroup::Content, + working_group, ) }, successful_call: || { @@ -1151,7 +1215,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { Some(>::from(50000u32)), 10, 10, - WorkingGroup::Content, + working_group, ) }, proposal_parameters: @@ -1161,7 +1225,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { proposal_details: ProposalDetails::SlashWorkingGroupLeaderStake( 10, 10, - WorkingGroup::Content, + working_group, ), }; proposal_fixture.check_all(); @@ -1170,6 +1234,13 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() { #[test] fn slash_stake_with_zero_staking_balance_fails() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_slash_stake_with_zero_staking_balance_fails(group); + } +} + +fn run_slash_stake_with_zero_staking_balance_fails(working_group: WorkingGroup) { initial_test_ext().execute_with(|| { increase_total_balance_issuance_using_account_id(1, 500000); @@ -1189,7 +1260,7 @@ fn slash_stake_with_zero_staking_balance_fails() { Some(>::from(50000u32)), 10, 0, - WorkingGroup::Content, + working_group, ), Err(Error::::SlashingStakeIsZero.into()) ); @@ -1198,6 +1269,13 @@ fn slash_stake_with_zero_staking_balance_fails() { #[test] fn decrease_stake_with_zero_staking_balance_fails() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_decrease_stake_with_zero_staking_balance_fails(group); + } +} + +fn run_decrease_stake_with_zero_staking_balance_fails(working_group: WorkingGroup) { initial_test_ext().execute_with(|| { increase_total_balance_issuance_using_account_id(1, 500000); @@ -1217,7 +1295,7 @@ fn decrease_stake_with_zero_staking_balance_fails() { Some(>::from(50000u32)), 10, 0, - WorkingGroup::Content, + working_group, ), Err(Error::::DecreasingStakeIsZero.into()) ); @@ -1226,6 +1304,15 @@ fn decrease_stake_with_zero_staking_balance_fails() { #[test] fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_set_working_group_leader_reward_proposal_common_checks_succeed(group); + } +} + +fn run_create_set_working_group_leader_reward_proposal_common_checks_succeed( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { let proposal_fixture = ProposalTestFixture { insufficient_rights_call: || { @@ -1237,7 +1324,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Content, + working_group, ) }, empty_stake_call: || { @@ -1249,7 +1336,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { None, 0, 10, - WorkingGroup::Content, + working_group, ) }, invalid_stake_call: || { @@ -1261,7 +1348,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { Some(>::from(5000u32)), 0, 10, - WorkingGroup::Content, + working_group, ) }, successful_call: || { @@ -1273,17 +1360,13 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { Some(>::from(50000u32)), 10, 10, - WorkingGroup::Content, + working_group, ) }, proposal_parameters: crate::proposal_types::parameters::set_working_group_leader_reward_proposal::( ), - proposal_details: ProposalDetails::SetWorkingGroupLeaderReward( - 10, - 10, - WorkingGroup::Content, - ), + proposal_details: ProposalDetails::SetWorkingGroupLeaderReward(10, 10, working_group), }; proposal_fixture.check_all(); }); @@ -1291,6 +1374,15 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() { #[test] fn create_terminate_working_group_leader_role_proposal_common_checks_succeed() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_terminate_working_group_leader_role_proposal_common_checks_succeed(group); + } +} + +fn run_create_terminate_working_group_leader_role_proposal_common_checks_succeed( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { increase_total_balance_issuance(500000); @@ -1298,7 +1390,7 @@ fn create_terminate_working_group_leader_role_proposal_common_checks_succeed() { worker_id: 10, rationale: Vec::new(), slash: false, - working_group: WorkingGroup::Content, + working_group, }; let proposal_fixture = ProposalTestFixture { diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 565ba1ade0..e56e573b50 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -82,7 +82,7 @@ content-directory = { package = 'pallet-content-directory', default-features = f [dev-dependencies] sp-io = { package = 'sp-io', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'} - +strum = {version = "0.19", default-features = false} [build-dependencies] wasm-builder-runner = { package = "substrate-wasm-builder-runner", git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4' } diff --git a/runtime/src/integration/mod.rs b/runtime/src/integration/mod.rs index 3777efda4f..f4e5b29f46 100644 --- a/runtime/src/integration/mod.rs +++ b/runtime/src/integration/mod.rs @@ -1,6 +1,7 @@ pub mod content_directory; pub mod content_working_group; pub mod forum; +#[macro_use] pub mod proposals; pub mod storage; pub mod transactions; diff --git a/runtime/src/integration/proposals/mod.rs b/runtime/src/integration/proposals/mod.rs index 47627fa1fb..c7bfd77164 100644 --- a/runtime/src/integration/proposals/mod.rs +++ b/runtime/src/integration/proposals/mod.rs @@ -3,6 +3,7 @@ mod council_elected_handler; mod council_origin_validator; mod membership_origin_validator; +#[macro_use] mod proposal_encoder; mod staking_events_handler; diff --git a/runtime/src/integration/proposals/proposal_encoder.rs b/runtime/src/integration/proposals/proposal_encoder.rs index 388e1343d2..2f0bd2261d 100644 --- a/runtime/src/integration/proposals/proposal_encoder.rs +++ b/runtime/src/integration/proposals/proposal_encoder.rs @@ -15,6 +15,7 @@ use sp_std::vec::Vec; //Params: // - $working_group: expression returning the 'common::working_group::WorkingGroup' enum // - $working_group_instance_call: expression returning the exact working group instance extrinsic call +#[macro_use] macro_rules! wrap_working_group_call { ($working_group:expr, $working_group_instance_call:expr) => {{ match $working_group { diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 3ae9653315..e55fab310d 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -14,6 +14,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod constants; +#[macro_use] mod integration; pub mod primitives; mod runtime_api; @@ -509,8 +510,6 @@ impl storage::data_object_storage_registry::Trait for Runtime { type ContentIdExists = DataDirectory; } -pub type MemberId = u64; - impl membership::Trait for Runtime { type Event = Event; type MemberId = MemberId; diff --git a/runtime/src/primitives.rs b/runtime/src/primitives.rs index 99ea7258e3..912036ed7d 100644 --- a/runtime/src/primitives.rs +++ b/runtime/src/primitives.rs @@ -63,6 +63,9 @@ pub type PostId = u64; /// Represent an actor in membership group, which is the same in the working groups. pub type ActorId = u64; +/// Represent an member in membership group, which is the same in the working groups. +pub type MemberId = u64; + /// App-specific crypto used for reporting equivocation/misbehavior in BABE and /// GRANDPA. Any rewards for misbehavior reporting will be paid out to this /// account. diff --git a/runtime/src/tests/mod.rs b/runtime/src/tests/mod.rs index 96cb974568..c43408a688 100644 --- a/runtime/src/tests/mod.rs +++ b/runtime/src/tests/mod.rs @@ -1,6 +1,7 @@ //! The Joystream Substrate Node runtime integration tests. #![cfg(test)] +#[macro_use] mod proposals_integration; mod storage_integration; diff --git a/runtime/src/tests/proposals_integration/mod.rs b/runtime/src/tests/proposals_integration/mod.rs index 0419c69dae..8cbbf00181 100644 --- a/runtime/src/tests/proposals_integration/mod.rs +++ b/runtime/src/tests/proposals_integration/mod.rs @@ -1,6 +1,7 @@ //! Proposals integration tests - with stake, membership, governance modules. #![cfg(test)] +#[macro_use] mod working_group_proposals; diff --git a/runtime/src/tests/proposals_integration/working_group_proposals.rs b/runtime/src/tests/proposals_integration/working_group_proposals.rs index 0a0e571b6d..fe649b35d1 100644 --- a/runtime/src/tests/proposals_integration/working_group_proposals.rs +++ b/runtime/src/tests/proposals_integration/working_group_proposals.rs @@ -9,27 +9,46 @@ use working_group::{OpeningPolicyCommitment, RewardPolicy}; use crate::{ Balance, BlockNumber, ContentDirectoryWorkingGroup, ContentDirectoryWorkingGroupInstance, + StorageWorkingGroup, StorageWorkingGroupInstance, }; use sp_std::collections::btree_set::BTreeSet; +use strum::IntoEnumIterator; +use crate::primitives::{AccountId, ActorId, MemberId}; + +type WorkingGroupInstance = working_group::Module; + type Hiring = hiring::Module; fn add_opening( - member_id: u8, + member_id: MemberId, account_id: [u8; 32], activate_at: hiring::ActivateOpeningAt, opening_policy_commitment: Option>, sequence_number: u32, // action sequence number to align with other actions + working_group: WorkingGroup, ) -> u64 { let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; - let opening_id = ContentDirectoryWorkingGroup::next_opening_id(); - - assert!(!>::contains_key(opening_id)); + let opening_id = match working_group { + WorkingGroup::Content => { + let opening_id = ContentDirectoryWorkingGroup::next_opening_id(); + assert!(!>::contains_key(opening_id)); + opening_id + } + WorkingGroup::Storage => { + let opening_id = StorageWorkingGroup::next_opening_id(); + assert!(!>::contains_key(opening_id)); + opening_id + } + }; let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_add_working_group_leader_opening_proposal( @@ -44,7 +63,7 @@ fn add_opening( .clone() .unwrap_or(OpeningPolicyCommitment::default()), human_readable_text: Vec::new(), - working_group: WorkingGroup::Content, + working_group, }, ) }) @@ -57,10 +76,11 @@ fn add_opening( } fn begin_review_applications( - member_id: u8, + member_id: MemberId, account_id: [u8; 32], opening_id: u64, sequence_number: u32, // action sequence number to align with other actions + working_group: WorkingGroup, ) { let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; @@ -68,12 +88,12 @@ fn begin_review_applications( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_begin_review_working_group_leader_applications_proposal( RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, + member_id, b"title".to_vec(), b"body".to_vec(), Some(>::from(25_000_u32)), opening_id, - WorkingGroup::Content, + working_group, ) }) .disable_setup_enviroment() @@ -84,12 +104,13 @@ fn begin_review_applications( } fn fill_opening( - member_id: u8, + member_id: MemberId, account_id: [u8; 32], opening_id: u64, successful_application_id: u64, reward_policy: Option>, sequence_number: u32, // action sequence number to align with other actions + working_group: WorkingGroup, ) { let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; @@ -97,7 +118,7 @@ fn fill_opening( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_fill_working_group_leader_opening_proposal( RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, + member_id, b"title".to_vec(), b"body".to_vec(), Some(>::from(50_000_u32)), @@ -105,7 +126,7 @@ fn fill_opening( opening_id, successful_application_id, reward_policy: reward_policy.clone(), - working_group: WorkingGroup::Content, + working_group, }, ) }) @@ -130,6 +151,7 @@ fn decrease_stake( leader_worker_id: u64, stake_amount: Balance, sequence_number: u32, // action sequence number to align with other actions + working_group: WorkingGroup, ) { let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; @@ -143,7 +165,7 @@ fn decrease_stake( Some(>::from(50_000_u32)), leader_worker_id, stake_amount, - WorkingGroup::Content, + working_group, ) }) .disable_setup_enviroment() @@ -154,11 +176,12 @@ fn decrease_stake( } fn slash_stake( - member_id: u8, + member_id: u64, account_id: [u8; 32], - leader_worker_id: u64, + leader_worker_id: ActorId, stake_amount: Balance, sequence_number: u32, // action sequence number to align with other actions + working_group: WorkingGroup, ) { let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; @@ -166,13 +189,13 @@ fn slash_stake( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_slash_working_group_leader_stake_proposal( RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, + member_id, b"title".to_vec(), b"body".to_vec(), Some(>::from(50_000_u32)), leader_worker_id, stake_amount, - WorkingGroup::Content, + working_group, ) }) .disable_setup_enviroment() @@ -183,11 +206,12 @@ fn slash_stake( } fn set_reward( - member_id: u8, + member_id: MemberId, account_id: [u8; 32], leader_worker_id: u64, reward_amount: Balance, sequence_number: u32, // action sequence number to align with other actions + working_group: WorkingGroup, ) { let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; @@ -201,7 +225,7 @@ fn set_reward( Some(>::from(50_000_u32)), leader_worker_id, reward_amount, - WorkingGroup::Content, + working_group, ) }) .disable_setup_enviroment() @@ -212,11 +236,12 @@ fn set_reward( } fn set_mint_capacity( - member_id: u8, + member_id: MemberId, account_id: [u8; 32], mint_capacity: Balance, sequence_number: u32, // action sequence number to align with other actions setup_environment: bool, + working_group: WorkingGroup, ) { let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; @@ -235,7 +260,7 @@ fn set_mint_capacity( b"body".to_vec(), Some(>::from(50_000_u32)), mint_capacity, - WorkingGroup::Content, + working_group, ) }) .with_setup_enviroment(setup_environment) @@ -246,11 +271,12 @@ fn set_mint_capacity( } fn terminate_role( - member_id: u8, + member_id: MemberId, account_id: [u8; 32], leader_worker_id: u64, slash: bool, sequence_number: u32, // action sequence number to align with other actions + working_group: WorkingGroup, ) { let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; @@ -258,7 +284,7 @@ fn terminate_role( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_terminate_working_group_leader_role_proposal( RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, + member_id, b"title".to_vec(), b"body".to_vec(), Some(>::from(100_000_u32)), @@ -266,7 +292,7 @@ fn terminate_role( worker_id: leader_worker_id, rationale: Vec::new(), slash, - working_group: WorkingGroup::Content, + working_group, }, ) }) @@ -279,9 +305,18 @@ fn terminate_role( #[test] fn create_add_working_group_leader_opening_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_add_working_group_leader_opening_proposal_execution_succeeds(group); + } +} + +fn run_create_add_working_group_leader_opening_proposal_execution_succeeds( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; let next_opening_id = ContentDirectoryWorkingGroup::next_opening_id(); @@ -296,6 +331,7 @@ fn create_add_working_group_leader_opening_proposal_execution_succeeds() { ActivateOpeningAt::CurrentBlock, None, 1, + working_group, ); // Check for expected opening id. @@ -311,9 +347,20 @@ fn create_add_working_group_leader_opening_proposal_execution_succeeds() { #[test] fn create_begin_review_working_group_leader_applications_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_begin_review_working_group_leader_applications_proposal_execution_succeeds( + group, + ); + } +} + +fn run_create_begin_review_working_group_leader_applications_proposal_execution_succeeds( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; let opening_id = add_opening( member_id, @@ -321,6 +368,7 @@ fn create_begin_review_working_group_leader_applications_proposal_execution_succ ActivateOpeningAt::CurrentBlock, None, 1, + working_group, ); let opening = ContentDirectoryWorkingGroup::opening_by_id(opening_id); @@ -339,7 +387,7 @@ fn create_begin_review_working_group_leader_applications_proposal_execution_succ } ); - begin_review_applications(member_id, account_id, opening_id, 2); + begin_review_applications(member_id, account_id, opening_id, 2, working_group); let hiring_opening = Hiring::opening_by_id(opening.hiring_opening_id); assert_eq!( @@ -360,9 +408,18 @@ fn create_begin_review_working_group_leader_applications_proposal_execution_succ #[test] fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_fill_working_group_leader_opening_proposal_execution_succeeds(group); + } +} + +fn run_create_fill_working_group_leader_opening_proposal_execution_succeeds( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; let opening_id = add_opening( member_id, @@ -370,6 +427,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { ActivateOpeningAt::CurrentBlock, None, 1, + working_group, ); let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( @@ -386,7 +444,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { let expected_application_id = 0; - begin_review_applications(member_id, account_id, opening_id, 2); + begin_review_applications(member_id, account_id, opening_id, 2, working_group); let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); @@ -398,6 +456,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { expected_application_id, None, 3, + working_group, ); let lead = ContentDirectoryWorkingGroup::current_lead(); @@ -405,92 +464,127 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { }); } -#[test] -fn create_decrease_group_leader_stake_proposal_execution_succeeds() { - initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; - let stake_amount = 100; - - let opening_policy_commitment = OpeningPolicyCommitment { - role_staking_policy: Some(hiring::StakingPolicy { - amount: 100, - amount_mode: hiring::StakingAmountLimitMode::AtLeast, - crowded_out_unstaking_period_length: None, - review_period_expired_unstaking_period_length: None, - }), - ..OpeningPolicyCommitment::default() - }; - - let opening_id = add_opening( - member_id, - account_id.clone(), - ActivateOpeningAt::CurrentBlock, - Some(opening_policy_commitment), - 1, - ); - - let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, - opening_id, - account_id.clone().into(), - Some(stake_amount), - None, - Vec::new(), - ); - - assert_eq!(apply_result, Ok(())); - - let expected_application_id = 0; - - begin_review_applications(member_id, account_id, opening_id, 2); - - let lead = ContentDirectoryWorkingGroup::current_lead(); - assert!(lead.is_none()); - - fill_opening( - member_id, - account_id, - opening_id, - expected_application_id, - None, - 3, - ); - - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); - - let stake_id = 1; - let old_balance = Balances::free_balance(&account_id.into()); - let old_stake = >::stakes(stake_id); - - assert_eq!(get_stake_balance(old_stake), stake_amount); - - let decreasing_stake_amount = 30; - decrease_stake( - member_id, - account_id, - leader_worker_id, - decreasing_stake_amount, - 4, - ); - - let new_balance = Balances::free_balance(&account_id.into()); - let new_stake = >::stakes(stake_id); - - assert_eq!( - get_stake_balance(new_stake), - stake_amount - decreasing_stake_amount - ); - assert_eq!(new_balance, old_balance + decreasing_stake_amount); - }); -} +// #[test] +// fn create_decrease_group_leader_stake_proposal_execution_succeeds() { +// // This uses strum crate for enum iteration +// for group in WorkingGroup::iter() { +// run_create_decrease_group_leader_stake_proposal_execution_succeeds(group); +// } +// } + +// fn run_create_decrease_group_leader_stake_proposal_execution_succeeds(working_group: WorkingGroup) { +// initial_test_ext().execute_with(|| { +// let member_id: MemberId = 1; +// let account_id: AccountId = AccountId::default(); +// let stake_amount: Balance = 100; + +// let opening_policy_commitment = OpeningPolicyCommitment { +// role_staking_policy: Some(hiring::StakingPolicy { +// amount: 100, +// amount_mode: hiring::StakingAmountLimitMode::AtLeast, +// crowded_out_unstaking_period_length: None, +// review_period_expired_unstaking_period_length: None, +// }), +// ..OpeningPolicyCommitment::default() +// }; + +// let opening_id = add_opening( +// member_id, +// account_id.clone(), +// ActivateOpeningAt::CurrentBlock, +// Some(opening_policy_commitment), +// 1, +// working_group, +// ); + +// let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( +// RawOrigin::Signed(account_id.clone().into()).into(), +// member_id as u64, +// opening_id, +// account_id.clone().into(), +// Some(stake_amount), +// None, +// Vec::new(), +// ); + +// assert_eq!(apply_result, Ok(())); + +// let expected_application_id = 0; + +// begin_review_applications(member_id, account_id, opening_id, 2, working_group); + +// let lead = ContentDirectoryWorkingGroup::current_lead(); +// assert!(lead.is_none()); + +// fill_opening( +// member_id, +// account_id, +// opening_id, +// expected_application_id, +// None, +// 3, +// working_group, +// ); + +// let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + +// let stake_id = 1; +// let old_balance = Balances::free_balance(&account_id.into()); +// let old_stake = >::stakes(stake_id); + +// assert_eq!(get_stake_balance(old_stake), stake_amount); + +// let decreasing_stake_amount = 30; +// decrease_stake( +// member_id, +// account_id, +// leader_worker_id, +// decreasing_stake_amount, +// 4, +// working_group, +// ); + +// let new_balance = Balances::free_balance(&account_id.into()); +// let new_stake = >::stakes(stake_id); + +// assert_eq!( +// get_stake_balance(new_stake), +// stake_amount - decreasing_stake_amount +// ); +// assert_eq!(new_balance, old_balance + decreasing_stake_amount); +// }); +// } #[test] fn create_slash_group_leader_stake_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + match group { + WorkingGroup::Content => { + run_create_slash_group_leader_stake_proposal_execution_succeeds::< + Runtime, + ContentDirectoryWorkingGroupInstance, + >(group) + } + WorkingGroup::Storage => { + run_create_slash_group_leader_stake_proposal_execution_succeeds::< + Runtime, + StorageWorkingGroupInstance, + >(group) + } + } + } +} + +fn run_create_slash_group_leader_stake_proposal_execution_succeeds< + T: working_group::Trait + system::Trait + stake::Trait, + I: working_group::Instance, +>( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; let stake_amount = 100; let opening_policy_commitment = OpeningPolicyCommitment { @@ -509,14 +603,15 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() { ActivateOpeningAt::CurrentBlock, Some(opening_policy_commitment), 1, + working_group, ); - let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, - opening_id, - account_id.clone().into(), - Some(stake_amount), + let apply_result = WorkingGroupInstance::::apply_on_opening( + RawOrigin::Signed(T::AccountId::default()).into(), + member_id.into(), + opening_id.into(), + T::AccountId::default(), + Some(stake_amount.into()), None, Vec::new(), ); @@ -525,9 +620,10 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() { let expected_application_id = 0; - begin_review_applications(member_id, account_id, opening_id, 2); + begin_review_applications(member_id, account_id, opening_id, 2, working_group); + + let lead = WorkingGroupInstance::::current_lead(); - let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); fill_opening( @@ -537,23 +633,25 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() { expected_application_id, None, 3, + working_group, ); - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + let leader_worker_id = WorkingGroupInstance::::current_lead().unwrap(); let stake_id = 1; let old_balance = Balances::free_balance(&account_id.into()); let old_stake = >::stakes(stake_id); - assert_eq!(get_stake_balance(old_stake), stake_amount); + assert_eq!(get_stake_balance(old_stake), stake_amount as Balance); let slashing_stake_amount = 30; slash_stake( member_id, account_id, - leader_worker_id, + leader_worker_id.into(), slashing_stake_amount, 4, + working_group, ); let new_balance = Balances::free_balance(&account_id.into()); @@ -561,7 +659,7 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() { assert_eq!( get_stake_balance(new_stake), - stake_amount - slashing_stake_amount + stake_amount as u128 - slashing_stake_amount ); assert_eq!(new_balance, old_balance); }); @@ -569,14 +667,23 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() { #[test] fn create_set_working_group_mint_capacity_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_set_working_group_mint_capacity_proposal_execution_succeeds(group); + } +} + +fn run_create_set_working_group_mint_capacity_proposal_execution_succeeds( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; assert_eq!(ContentDirectoryWorkingGroup::mint(), 0); let mint_capacity = 999999; - set_mint_capacity(member_id, account_id, mint_capacity, 1, true); + set_mint_capacity(member_id, account_id, mint_capacity, 1, true, working_group); let mint_id = ContentDirectoryWorkingGroup::mint(); let mint = >::mints(mint_id); @@ -587,9 +694,16 @@ fn create_set_working_group_mint_capacity_proposal_execution_succeeds() { #[test] fn create_set_group_leader_reward_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_set_group_leader_reward_proposal_execution_succeeds(group); + } +} + +fn run_create_set_group_leader_reward_proposal_execution_succeeds(working_group: WorkingGroup) { initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; let stake_amount = 100; let opening_policy_commitment = OpeningPolicyCommitment { @@ -608,6 +722,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() { ActivateOpeningAt::CurrentBlock, Some(opening_policy_commitment), 1, + working_group, ); let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( @@ -624,7 +739,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() { let expected_application_id = 0; - begin_review_applications(member_id, account_id, opening_id, 2); + begin_review_applications(member_id, account_id, opening_id, 2, working_group); let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); @@ -636,7 +751,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() { payout_interval: None, }); - set_mint_capacity(member_id, account_id, 999999, 3, false); + set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); fill_opening( member_id, @@ -645,6 +760,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() { expected_application_id, reward_policy, 4, + working_group, ); let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); @@ -662,6 +778,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() { leader_worker_id, new_reward_amount, 5, + working_group, ); let relationship = recurring_rewards::RewardRelationships::::get(relationship_id); @@ -671,9 +788,16 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() { #[test] fn create_terminate_group_leader_role_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_terminate_group_leader_role_proposal_execution_succeeds(group); + } +} + +fn run_create_terminate_group_leader_role_proposal_execution_succeeds(working_group: WorkingGroup) { initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; let stake_amount = 100; let opening_policy_commitment = OpeningPolicyCommitment { @@ -692,6 +816,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() { ActivateOpeningAt::CurrentBlock, Some(opening_policy_commitment), 1, + working_group, ); let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( @@ -708,7 +833,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() { let expected_application_id = 0; - begin_review_applications(member_id, account_id, opening_id, 2); + begin_review_applications(member_id, account_id, opening_id, 2, working_group); let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); @@ -720,7 +845,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() { payout_interval: None, }); - set_mint_capacity(member_id, account_id, 999999, 3, false); + set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); fill_opening( member_id, @@ -729,17 +854,25 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() { expected_application_id, reward_policy, 4, + working_group, ); - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); - let stake_id = 1; let old_balance = Balances::free_balance(&account_id.into()); let old_stake = >::stakes(stake_id); assert_eq!(get_stake_balance(old_stake), stake_amount); - terminate_role(member_id, account_id, leader_worker_id, false, 5); + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + + terminate_role( + member_id, + account_id, + leader_worker_id, + false, + 5, + working_group, + ); assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); @@ -753,9 +886,18 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() { #[test] fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds(group); + } +} + +fn run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( + working_group: WorkingGroup, +) { initial_test_ext().execute_with(|| { - let member_id = 1; - let account_id: [u8; 32] = [member_id; 32]; + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; let stake_amount = 100; let opening_policy_commitment = OpeningPolicyCommitment { @@ -774,11 +916,12 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( ActivateOpeningAt::CurrentBlock, Some(opening_policy_commitment), 1, + working_group, ); let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, + member_id, opening_id, account_id.clone().into(), Some(stake_amount), @@ -790,7 +933,7 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( let expected_application_id = 0; - begin_review_applications(member_id, account_id, opening_id, 2); + begin_review_applications(member_id, account_id, opening_id, 2, working_group); let lead = ContentDirectoryWorkingGroup::current_lead(); assert!(lead.is_none()); @@ -802,7 +945,7 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( payout_interval: None, }); - set_mint_capacity(member_id, account_id, 999999, 3, false); + set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); fill_opening( member_id, @@ -811,17 +954,25 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( expected_application_id, reward_policy, 4, + working_group, ); - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); - let stake_id = 1; let old_balance = Balances::free_balance(&account_id.into()); let old_stake = >::stakes(stake_id); assert_eq!(get_stake_balance(old_stake), stake_amount); - terminate_role(member_id, account_id, leader_worker_id, true, 5); + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + + terminate_role( + member_id, + account_id, + leader_worker_id, + true, + 5, + working_group, + ); assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); From f16bb211ecf5f0ff7682a270197197600f4dfad4 Mon Sep 17 00:00:00 2001 From: iorveth Date: Fri, 25 Sep 2020 21:07:11 +0300 Subject: [PATCH 12/13] integration/working_group_proposals: Fix broken tests --- runtime-modules/hiring/src/lib.rs | 1 - runtime-modules/membership/src/lib.rs | 6 +- .../working_group_proposals.rs | 1197 +++++++++-------- 3 files changed, 660 insertions(+), 544 deletions(-) diff --git a/runtime-modules/hiring/src/lib.rs b/runtime-modules/hiring/src/lib.rs index 48237c9693..1ed4839d7c 100755 --- a/runtime-modules/hiring/src/lib.rs +++ b/runtime-modules/hiring/src/lib.rs @@ -57,7 +57,6 @@ pub trait Trait: system::Trait + stake::Trait + Sized { + Default + Copy + MaybeSerialize - + From + PartialEq; /// ApplicationId type diff --git a/runtime-modules/membership/src/lib.rs b/runtime-modules/membership/src/lib.rs index 32de444bbd..9065368092 100644 --- a/runtime-modules/membership/src/lib.rs +++ b/runtime-modules/membership/src/lib.rs @@ -35,8 +35,7 @@ pub trait Trait: system::Trait + GovernanceCurrency + pallet_timestamp::Trait { + Default + Copy + MaybeSerialize - + PartialEq - + From; + + PartialEq; type PaidTermId: Parameter + Member @@ -65,8 +64,7 @@ pub trait Trait: system::Trait + GovernanceCurrency + pallet_timestamp::Trait { + Copy + MaybeSerialize + PartialEq - + Ord - + Into; + + Ord; } const FIRST_PAID_TERMS_ID: u8 = 1; diff --git a/runtime/src/tests/proposals_integration/working_group_proposals.rs b/runtime/src/tests/proposals_integration/working_group_proposals.rs index fe649b35d1..784dd609ee 100644 --- a/runtime/src/tests/proposals_integration/working_group_proposals.rs +++ b/runtime/src/tests/proposals_integration/working_group_proposals.rs @@ -13,8 +13,9 @@ use crate::{ }; use sp_std::collections::btree_set::BTreeSet; -use strum::IntoEnumIterator; use crate::primitives::{AccountId, ActorId, MemberId}; +use frame_support::traits; +use strum::IntoEnumIterator; type WorkingGroupInstance = working_group::Module; @@ -146,7 +147,7 @@ fn get_stake_balance(stake: stake::Stake) -> Balance } fn decrease_stake( - member_id: u8, + member_id: u64, account_id: [u8; 32], leader_worker_id: u64, stake_amount: Balance, @@ -159,7 +160,7 @@ fn decrease_stake( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_decrease_working_group_leader_stake_proposal( RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, + member_id, b"title".to_vec(), b"body".to_vec(), Some(>::from(50_000_u32)), @@ -176,7 +177,7 @@ fn decrease_stake( } fn slash_stake( - member_id: u64, + member_id: MemberId, account_id: [u8; 32], leader_worker_id: ActorId, stake_amount: Balance, @@ -307,41 +308,58 @@ fn terminate_role( fn create_add_working_group_leader_opening_proposal_execution_succeeds() { // This uses strum crate for enum iteration for group in WorkingGroup::iter() { - run_create_add_working_group_leader_opening_proposal_execution_succeeds(group); + match group { + WorkingGroup::Content => { + run_create_add_working_group_leader_opening_proposal_execution_succeeds::< + Runtime, + ContentDirectoryWorkingGroupInstance, + >(group); + } + WorkingGroup::Storage => { + run_create_add_working_group_leader_opening_proposal_execution_succeeds::< + Runtime, + StorageWorkingGroupInstance, + >(group); + } + } } } -fn run_create_add_working_group_leader_opening_proposal_execution_succeeds( +fn run_create_add_working_group_leader_opening_proposal_execution_succeeds< + T: working_group::Trait + system::Trait + stake::Trait, + I: working_group::Instance, +>( working_group: WorkingGroup, -) { +) where + ::AccountId: From<[u8; 32]>, + ::MemberId: From, + ::OpeningId: From, +{ initial_test_ext().execute_with(|| { let member_id: MemberId = 1; - let account_id: [u8; 32] = [0; 32]; + let account_id: [u8; 32] = [member_id as u8; 32]; - let next_opening_id = ContentDirectoryWorkingGroup::next_opening_id(); + let next_opening_id = WorkingGroupInstance::::next_opening_id(); - assert!(!>::contains_key(next_opening_id)); + assert!(!>::contains_key( + next_opening_id + )); - let opening_id = add_opening( + let opening_id: ::OpeningId = add_opening( member_id, account_id, ActivateOpeningAt::CurrentBlock, None, 1, working_group, - ); + ) + .into(); // Check for expected opening id. assert_eq!(opening_id, next_opening_id); // Check for the new opening creation. - assert!(>::contains_key(opening_id)); + assert!(>::contains_key(opening_id)); }); } @@ -349,18 +367,34 @@ fn run_create_add_working_group_leader_opening_proposal_execution_succeeds( fn create_begin_review_working_group_leader_applications_proposal_execution_succeeds() { // This uses strum crate for enum iteration for group in WorkingGroup::iter() { - run_create_begin_review_working_group_leader_applications_proposal_execution_succeeds( - group, - ); + match group { + WorkingGroup::Content => { + run_create_begin_review_working_group_leader_applications_proposal_execution_succeeds::< + Runtime, + ContentDirectoryWorkingGroupInstance, + >(group); + } + WorkingGroup::Storage => { + run_create_begin_review_working_group_leader_applications_proposal_execution_succeeds::< + Runtime, + StorageWorkingGroupInstance, + >(group); + } + } } } -fn run_create_begin_review_working_group_leader_applications_proposal_execution_succeeds( +fn run_create_begin_review_working_group_leader_applications_proposal_execution_succeeds< + T: working_group::Trait + system::Trait + stake::Trait, + I: working_group::Instance, +>( working_group: WorkingGroup, -) { +) where + ::OpeningId: From + Into, +{ initial_test_ext().execute_with(|| { let member_id: MemberId = 1; - let account_id: [u8; 32] = [0; 32]; + let account_id: [u8; 32] = [member_id as u8; 32]; let opening_id = add_opening( member_id, @@ -371,9 +405,11 @@ fn run_create_begin_review_working_group_leader_applications_proposal_execution_ working_group, ); - let opening = ContentDirectoryWorkingGroup::opening_by_id(opening_id); + let opening = WorkingGroupInstance::::opening_by_id( + ::OpeningId::from(opening_id), + ); - let hiring_opening = Hiring::opening_by_id(opening.hiring_opening_id); + let hiring_opening = Hiring::opening_by_id(opening.hiring_opening_id.into()); assert_eq!( hiring_opening.stage, hiring::OpeningStage::Active { @@ -389,7 +425,7 @@ fn run_create_begin_review_working_group_leader_applications_proposal_execution_ begin_review_applications(member_id, account_id, opening_id, 2, working_group); - let hiring_opening = Hiring::opening_by_id(opening.hiring_opening_id); + let hiring_opening = Hiring::opening_by_id(opening.hiring_opening_id.into()); assert_eq!( hiring_opening.stage, hiring::OpeningStage::Active { @@ -408,578 +444,661 @@ fn run_create_begin_review_working_group_leader_applications_proposal_execution_ #[test] fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { - // This uses strum crate for enum iteration - for group in WorkingGroup::iter() { - run_create_fill_working_group_leader_opening_proposal_execution_succeeds(group); - } -} - -fn run_create_fill_working_group_leader_opening_proposal_execution_succeeds( - working_group: WorkingGroup, -) { - initial_test_ext().execute_with(|| { - let member_id: MemberId = 1; - let account_id: [u8; 32] = [0; 32]; - - let opening_id = add_opening( - member_id, - account_id.clone(), - ActivateOpeningAt::CurrentBlock, - None, - 1, - working_group, - ); - - let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, - opening_id, - account_id.clone().into(), - None, - None, - Vec::new(), - ); - - assert_eq!(apply_result, Ok(())); - - let expected_application_id = 0; - - begin_review_applications(member_id, account_id, opening_id, 2, working_group); - - let lead = ContentDirectoryWorkingGroup::current_lead(); - assert!(lead.is_none()); - - fill_opening( - member_id, - account_id, - opening_id, - expected_application_id, - None, - 3, - working_group, - ); - - let lead = ContentDirectoryWorkingGroup::current_lead(); - assert!(lead.is_some()); - }); -} - -// #[test] -// fn create_decrease_group_leader_stake_proposal_execution_succeeds() { -// // This uses strum crate for enum iteration -// for group in WorkingGroup::iter() { -// run_create_decrease_group_leader_stake_proposal_execution_succeeds(group); -// } -// } - -// fn run_create_decrease_group_leader_stake_proposal_execution_succeeds(working_group: WorkingGroup) { -// initial_test_ext().execute_with(|| { -// let member_id: MemberId = 1; -// let account_id: AccountId = AccountId::default(); -// let stake_amount: Balance = 100; - -// let opening_policy_commitment = OpeningPolicyCommitment { -// role_staking_policy: Some(hiring::StakingPolicy { -// amount: 100, -// amount_mode: hiring::StakingAmountLimitMode::AtLeast, -// crowded_out_unstaking_period_length: None, -// review_period_expired_unstaking_period_length: None, -// }), -// ..OpeningPolicyCommitment::default() -// }; - -// let opening_id = add_opening( -// member_id, -// account_id.clone(), -// ActivateOpeningAt::CurrentBlock, -// Some(opening_policy_commitment), -// 1, -// working_group, -// ); - -// let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( -// RawOrigin::Signed(account_id.clone().into()).into(), -// member_id as u64, -// opening_id, -// account_id.clone().into(), -// Some(stake_amount), -// None, -// Vec::new(), -// ); - -// assert_eq!(apply_result, Ok(())); - -// let expected_application_id = 0; - -// begin_review_applications(member_id, account_id, opening_id, 2, working_group); - -// let lead = ContentDirectoryWorkingGroup::current_lead(); -// assert!(lead.is_none()); - -// fill_opening( -// member_id, -// account_id, -// opening_id, -// expected_application_id, -// None, -// 3, -// working_group, -// ); - -// let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); - -// let stake_id = 1; -// let old_balance = Balances::free_balance(&account_id.into()); -// let old_stake = >::stakes(stake_id); - -// assert_eq!(get_stake_balance(old_stake), stake_amount); - -// let decreasing_stake_amount = 30; -// decrease_stake( -// member_id, -// account_id, -// leader_worker_id, -// decreasing_stake_amount, -// 4, -// working_group, -// ); - -// let new_balance = Balances::free_balance(&account_id.into()); -// let new_stake = >::stakes(stake_id); - -// assert_eq!( -// get_stake_balance(new_stake), -// stake_amount - decreasing_stake_amount -// ); -// assert_eq!(new_balance, old_balance + decreasing_stake_amount); -// }); -// } - -#[test] -fn create_slash_group_leader_stake_proposal_execution_succeeds() { // This uses strum crate for enum iteration for group in WorkingGroup::iter() { match group { WorkingGroup::Content => { - run_create_slash_group_leader_stake_proposal_execution_succeeds::< + run_create_fill_working_group_leader_opening_proposal_execution_succeeds::< Runtime, ContentDirectoryWorkingGroupInstance, - >(group) + >(group); } WorkingGroup::Storage => { - run_create_slash_group_leader_stake_proposal_execution_succeeds::< + run_create_fill_working_group_leader_opening_proposal_execution_succeeds::< Runtime, StorageWorkingGroupInstance, - >(group) + >(group); } } } -} - -fn run_create_slash_group_leader_stake_proposal_execution_succeeds< - T: working_group::Trait + system::Trait + stake::Trait, - I: working_group::Instance, ->( - working_group: WorkingGroup, -) { - initial_test_ext().execute_with(|| { - let member_id: MemberId = 1; - let account_id: [u8; 32] = [0; 32]; - let stake_amount = 100; - - let opening_policy_commitment = OpeningPolicyCommitment { - role_staking_policy: Some(hiring::StakingPolicy { - amount: 100, - amount_mode: hiring::StakingAmountLimitMode::AtLeast, - crowded_out_unstaking_period_length: None, - review_period_expired_unstaking_period_length: None, - }), - ..OpeningPolicyCommitment::default() - }; - - let opening_id = add_opening( - member_id, - account_id.clone(), - ActivateOpeningAt::CurrentBlock, - Some(opening_policy_commitment), - 1, - working_group, - ); - - let apply_result = WorkingGroupInstance::::apply_on_opening( - RawOrigin::Signed(T::AccountId::default()).into(), - member_id.into(), - opening_id.into(), - T::AccountId::default(), - Some(stake_amount.into()), - None, - Vec::new(), - ); - - assert_eq!(apply_result, Ok(())); - - let expected_application_id = 0; - - begin_review_applications(member_id, account_id, opening_id, 2, working_group); - - let lead = WorkingGroupInstance::::current_lead(); - assert!(lead.is_none()); + fn run_create_fill_working_group_leader_opening_proposal_execution_succeeds< + T: working_group::Trait + system::Trait + stake::Trait, + I: working_group::Instance, + >( + working_group: WorkingGroup, + ) where + ::AccountId: From<[u8; 32]>, + ::MemberId: From, + ::OpeningId: From, + { + initial_test_ext().execute_with(|| { + let member_id: MemberId = 1; + let account_id: [u8; 32] = [member_id as u8; 32]; + + let opening_id = add_opening( + member_id, + account_id.clone(), + ActivateOpeningAt::CurrentBlock, + None, + 1, + working_group, + ); - fill_opening( - member_id, - account_id, - opening_id, - expected_application_id, - None, - 3, - working_group, - ); + let apply_result = WorkingGroupInstance::::apply_on_opening( + RawOrigin::Signed(account_id.clone().into()).into(), + member_id.into(), + opening_id.into(), + account_id.clone().into(), + None, + None, + Vec::new(), + ); - let leader_worker_id = WorkingGroupInstance::::current_lead().unwrap(); + assert_eq!(apply_result, Ok(())); - let stake_id = 1; - let old_balance = Balances::free_balance(&account_id.into()); - let old_stake = >::stakes(stake_id); + let expected_application_id = 0; - assert_eq!(get_stake_balance(old_stake), stake_amount as Balance); + begin_review_applications(member_id, account_id, opening_id, 2, working_group); - let slashing_stake_amount = 30; - slash_stake( - member_id, - account_id, - leader_worker_id.into(), - slashing_stake_amount, - 4, - working_group, - ); + let lead = WorkingGroupInstance::::current_lead(); + assert!(lead.is_none()); - let new_balance = Balances::free_balance(&account_id.into()); - let new_stake = >::stakes(stake_id); + fill_opening( + member_id, + account_id, + opening_id, + expected_application_id, + None, + 3, + working_group, + ); - assert_eq!( - get_stake_balance(new_stake), - stake_amount as u128 - slashing_stake_amount - ); - assert_eq!(new_balance, old_balance); - }); -} + let lead = WorkingGroupInstance::::current_lead(); + assert!(lead.is_some()); + }); + } -#[test] -fn create_set_working_group_mint_capacity_proposal_execution_succeeds() { - // This uses strum crate for enum iteration - for group in WorkingGroup::iter() { - run_create_set_working_group_mint_capacity_proposal_execution_succeeds(group); + #[test] + fn create_decrease_group_leader_stake_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + match group { + WorkingGroup::Content => { + run_create_decrease_group_leader_stake_proposal_execution_succeeds::< + Runtime, + ContentDirectoryWorkingGroupInstance, + >(group); + } + WorkingGroup::Storage => { + run_create_decrease_group_leader_stake_proposal_execution_succeeds::< + Runtime, + StorageWorkingGroupInstance, + >(group); + } + } + } } -} -fn run_create_set_working_group_mint_capacity_proposal_execution_succeeds( +fn run_create_decrease_group_leader_stake_proposal_execution_succeeds< + T: working_group::Trait + system::Trait + stake::Trait, + I: working_group::Instance, +>( working_group: WorkingGroup, -) { - initial_test_ext().execute_with(|| { - let member_id: MemberId = 1; - let account_id: [u8; 32] = [0; 32]; - - assert_eq!(ContentDirectoryWorkingGroup::mint(), 0); +) where + ::AccountId: From<[u8; 32]>, + ::OpeningId: From, + ::MemberId: From, + ::ActorId: Into, + <::Currency as traits::Currency<::AccountId>>::Balance: + From, +{ + initial_test_ext().execute_with(|| { + let member_id: MemberId = 1; + let account_id: [u8; 32] = [member_id as u8; 32]; + let stake_amount: Balance = 100; + + let opening_policy_commitment = OpeningPolicyCommitment { + role_staking_policy: Some(hiring::StakingPolicy { + amount: 100, + amount_mode: hiring::StakingAmountLimitMode::AtLeast, + crowded_out_unstaking_period_length: None, + review_period_expired_unstaking_period_length: None, + }), + ..OpeningPolicyCommitment::default() + }; + + let opening_id = add_opening( + member_id, + account_id.clone(), + ActivateOpeningAt::CurrentBlock, + Some(opening_policy_commitment), + 1, + working_group, + ); - let mint_capacity = 999999; - set_mint_capacity(member_id, account_id, mint_capacity, 1, true, working_group); + let apply_result = WorkingGroupInstance::::apply_on_opening( + RawOrigin::Signed(account_id.clone().into()).into(), + member_id.into(), + opening_id.into(), + account_id.clone().into(), + Some(stake_amount.into()), + None, + Vec::new(), + ); - let mint_id = ContentDirectoryWorkingGroup::mint(); - let mint = >::mints(mint_id); + assert_eq!(apply_result, Ok(())); - assert_eq!(mint.capacity(), mint_capacity); - }); -} + let expected_application_id = 0; -#[test] -fn create_set_group_leader_reward_proposal_execution_succeeds() { - // This uses strum crate for enum iteration - for group in WorkingGroup::iter() { - run_create_set_group_leader_reward_proposal_execution_succeeds(group); - } -} + begin_review_applications(member_id, account_id, opening_id, 2, working_group); -fn run_create_set_group_leader_reward_proposal_execution_succeeds(working_group: WorkingGroup) { - initial_test_ext().execute_with(|| { - let member_id: MemberId = 1; - let account_id: [u8; 32] = [0; 32]; - let stake_amount = 100; - - let opening_policy_commitment = OpeningPolicyCommitment { - role_staking_policy: Some(hiring::StakingPolicy { - amount: 100, - amount_mode: hiring::StakingAmountLimitMode::AtLeast, - crowded_out_unstaking_period_length: None, - review_period_expired_unstaking_period_length: None, - }), - ..OpeningPolicyCommitment::default() - }; + let lead = WorkingGroupInstance::::current_lead(); + assert!(lead.is_none()); - let opening_id = add_opening( - member_id, - account_id.clone(), - ActivateOpeningAt::CurrentBlock, - Some(opening_policy_commitment), - 1, - working_group, - ); + fill_opening( + member_id, + account_id, + opening_id, + expected_application_id, + None, + 3, + working_group, + ); - let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, - opening_id, - account_id.clone().into(), - Some(stake_amount), - None, - Vec::new(), - ); + let leader_worker_id = WorkingGroupInstance::::current_lead().unwrap(); - assert_eq!(apply_result, Ok(())); + let stake_id = 1; + let old_balance = Balances::free_balance(&account_id.into()); + let old_stake = >::stakes(stake_id); - let expected_application_id = 0; + assert_eq!(get_stake_balance(old_stake), stake_amount); - begin_review_applications(member_id, account_id, opening_id, 2, working_group); + let decreasing_stake_amount = 30; + decrease_stake( + member_id, + account_id, + leader_worker_id.into(), + decreasing_stake_amount, + 4, + working_group, + ); - let lead = ContentDirectoryWorkingGroup::current_lead(); - assert!(lead.is_none()); + let new_balance = Balances::free_balance(&account_id.into()); + let new_stake = >::stakes(stake_id); - let old_reward_amount = 100; - let reward_policy = Some(RewardPolicy { - amount_per_payout: old_reward_amount, - next_payment_at_block: 9999, - payout_interval: None, + assert_eq!( + get_stake_balance(new_stake), + stake_amount - decreasing_stake_amount + ); + assert_eq!(new_balance, old_balance + decreasing_stake_amount); }); - - set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); - - fill_opening( - member_id, - account_id, - opening_id, - expected_application_id, - reward_policy, - 4, - working_group, - ); - - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); - - let worker = ContentDirectoryWorkingGroup::worker_by_id(leader_worker_id); - let relationship_id = worker.reward_relationship.unwrap(); - - let relationship = recurring_rewards::RewardRelationships::::get(relationship_id); - assert_eq!(relationship.amount_per_payout, old_reward_amount); - - let new_reward_amount = 999; - set_reward( - member_id, - account_id, - leader_worker_id, - new_reward_amount, - 5, - working_group, - ); - - let relationship = recurring_rewards::RewardRelationships::::get(relationship_id); - assert_eq!(relationship.amount_per_payout, new_reward_amount); - }); -} - -#[test] -fn create_terminate_group_leader_role_proposal_execution_succeeds() { - // This uses strum crate for enum iteration - for group in WorkingGroup::iter() { - run_create_terminate_group_leader_role_proposal_execution_succeeds(group); } -} - -fn run_create_terminate_group_leader_role_proposal_execution_succeeds(working_group: WorkingGroup) { - initial_test_ext().execute_with(|| { - let member_id: MemberId = 1; - let account_id: [u8; 32] = [0; 32]; - let stake_amount = 100; - - let opening_policy_commitment = OpeningPolicyCommitment { - role_staking_policy: Some(hiring::StakingPolicy { - amount: 100, - amount_mode: hiring::StakingAmountLimitMode::AtLeast, - crowded_out_unstaking_period_length: None, - review_period_expired_unstaking_period_length: None, - }), - ..OpeningPolicyCommitment::default() - }; - - let opening_id = add_opening( - member_id, - account_id.clone(), - ActivateOpeningAt::CurrentBlock, - Some(opening_policy_commitment), - 1, - working_group, - ); - - let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, - opening_id, - account_id.clone().into(), - Some(stake_amount), - None, - Vec::new(), - ); - - assert_eq!(apply_result, Ok(())); - let expected_application_id = 0; - - begin_review_applications(member_id, account_id, opening_id, 2, working_group); - - let lead = ContentDirectoryWorkingGroup::current_lead(); - assert!(lead.is_none()); - - let old_reward_amount = 100; - let reward_policy = Some(RewardPolicy { - amount_per_payout: old_reward_amount, - next_payment_at_block: 9999, - payout_interval: None, - }); - - set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); - - fill_opening( - member_id, - account_id, - opening_id, - expected_application_id, - reward_policy, - 4, - working_group, - ); - - let stake_id = 1; - let old_balance = Balances::free_balance(&account_id.into()); - let old_stake = >::stakes(stake_id); - - assert_eq!(get_stake_balance(old_stake), stake_amount); + #[test] + fn create_slash_group_leader_stake_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + match group { + WorkingGroup::Content => { + run_create_slash_group_leader_stake_proposal_execution_succeeds::< + Runtime, + ContentDirectoryWorkingGroupInstance, + >(group) + } + WorkingGroup::Storage => { + run_create_slash_group_leader_stake_proposal_execution_succeeds::< + Runtime, + StorageWorkingGroupInstance, + >(group) + } + } + } + } - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); +fn run_create_slash_group_leader_stake_proposal_execution_succeeds< + T: working_group::Trait + system::Trait + stake::Trait, + I: working_group::Instance, +>( + working_group: WorkingGroup, +) where + ::AccountId: From<[u8; 32]>, + ::OpeningId: From, + ::MemberId: From, + ::ActorId: Into, + <::Currency as traits::Currency<::AccountId>>::Balance: + From, +{ + initial_test_ext().execute_with(|| { + let member_id: MemberId = 1; + let account_id: [u8; 32] = [member_id as u8; 32]; + let stake_amount: Balance = 100; + + let opening_policy_commitment = OpeningPolicyCommitment { + role_staking_policy: Some(hiring::StakingPolicy { + amount: 100, + amount_mode: hiring::StakingAmountLimitMode::AtLeast, + crowded_out_unstaking_period_length: None, + review_period_expired_unstaking_period_length: None, + }), + ..OpeningPolicyCommitment::default() + }; + + let opening_id = add_opening( + member_id, + account_id.clone(), + ActivateOpeningAt::CurrentBlock, + Some(opening_policy_commitment), + 1, + working_group, + ); - terminate_role( - member_id, - account_id, - leader_worker_id, - false, - 5, - working_group, - ); + let apply_result = WorkingGroupInstance::::apply_on_opening( + RawOrigin::Signed(account_id.into()).into(), + member_id.into(), + opening_id.into(), + account_id.into(), + Some(stake_amount.into()), + None, + Vec::new(), + ); - assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); + assert_eq!(apply_result, Ok(())); - let new_balance = Balances::free_balance(&account_id.into()); - let new_stake = >::stakes(stake_id); + let expected_application_id = 0; - assert_eq!(new_stake.staking_status, stake::StakingStatus::NotStaked); - assert_eq!(new_balance, old_balance + stake_amount); - }); -} + begin_review_applications(member_id, account_id, opening_id, 2, working_group); -#[test] -fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds() { - // This uses strum crate for enum iteration - for group in WorkingGroup::iter() { - run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds(group); - } -} + let lead = WorkingGroupInstance::::current_lead(); -fn run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( - working_group: WorkingGroup, -) { - initial_test_ext().execute_with(|| { - let member_id: MemberId = 1; - let account_id: [u8; 32] = [0; 32]; - let stake_amount = 100; - - let opening_policy_commitment = OpeningPolicyCommitment { - role_staking_policy: Some(hiring::StakingPolicy { - amount: 100, - amount_mode: hiring::StakingAmountLimitMode::AtLeast, - crowded_out_unstaking_period_length: None, - review_period_expired_unstaking_period_length: None, - }), - ..OpeningPolicyCommitment::default() - }; + assert!(lead.is_none()); - let opening_id = add_opening( - member_id, - account_id.clone(), - ActivateOpeningAt::CurrentBlock, - Some(opening_policy_commitment), - 1, - working_group, - ); + fill_opening( + member_id, + account_id, + opening_id, + expected_application_id, + None, + 3, + working_group, + ); - let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id, - opening_id, - account_id.clone().into(), - Some(stake_amount), - None, - Vec::new(), - ); + let leader_worker_id = WorkingGroupInstance::::current_lead().unwrap(); - assert_eq!(apply_result, Ok(())); + let stake_id = 1; + let old_balance = Balances::free_balance(&account_id.into()); + let old_stake = >::stakes(stake_id); - let expected_application_id = 0; + assert_eq!(get_stake_balance(old_stake), stake_amount); - begin_review_applications(member_id, account_id, opening_id, 2, working_group); + let slashing_stake_amount = 30; + slash_stake( + member_id, + account_id, + leader_worker_id.into(), + slashing_stake_amount, + 4, + working_group, + ); - let lead = ContentDirectoryWorkingGroup::current_lead(); - assert!(lead.is_none()); + let new_balance = Balances::free_balance(&account_id.into()); + let new_stake = >::stakes(stake_id); - let old_reward_amount = 100; - let reward_policy = Some(RewardPolicy { - amount_per_payout: old_reward_amount, - next_payment_at_block: 9999, - payout_interval: None, + assert_eq!( + get_stake_balance(new_stake), + stake_amount as u128 - slashing_stake_amount + ); + assert_eq!(new_balance, old_balance); }); + } - set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); - - fill_opening( - member_id, - account_id, - opening_id, - expected_application_id, - reward_policy, - 4, - working_group, - ); + #[test] + fn create_set_working_group_mint_capacity_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + match group { + WorkingGroup::Content => { + run_create_set_working_group_mint_capacity_proposal_execution_succeeds::< + Runtime, + ContentDirectoryWorkingGroupInstance, + >(group); + } + WorkingGroup::Storage => { + run_create_set_working_group_mint_capacity_proposal_execution_succeeds::< + Runtime, + StorageWorkingGroupInstance, + >(group); + } + } + } - let stake_id = 1; - let old_balance = Balances::free_balance(&account_id.into()); - let old_stake = >::stakes(stake_id); + fn run_create_set_working_group_mint_capacity_proposal_execution_succeeds< + T: working_group::Trait + system::Trait + minting::Trait, + I: working_group::Instance, + >( + working_group: WorkingGroup, + ) where + ::AccountId: From<[u8; 32]>, + ::MemberId: From, + ::MintId: From, + <::Currency as traits::Currency< + ::AccountId, + >>::Balance: From, + { + initial_test_ext().execute_with(|| { + let member_id: MemberId = 1; + let account_id: [u8; 32] = [member_id as u8; 32]; + + assert_eq!(WorkingGroupInstance::::mint(), 0.into()); + + let mint_capacity = 999999; + set_mint_capacity(member_id, account_id, mint_capacity, 1, true, working_group); + + let mint_id = WorkingGroupInstance::::mint(); + let mint = >::mints(mint_id); + + assert_eq!(mint.capacity(), mint_capacity.into()); + }); + } - assert_eq!(get_stake_balance(old_stake), stake_amount); + #[test] + fn create_set_group_leader_reward_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_set_group_leader_reward_proposal_execution_succeeds(group); + } + } - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + fn run_create_set_group_leader_reward_proposal_execution_succeeds( + working_group: WorkingGroup, + ) { + initial_test_ext().execute_with(|| { + let member_id: MemberId = 1; + let account_id: [u8; 32] = [member_id as u8; 32]; + let stake_amount = 100; + + let opening_policy_commitment = OpeningPolicyCommitment { + role_staking_policy: Some(hiring::StakingPolicy { + amount: 100, + amount_mode: hiring::StakingAmountLimitMode::AtLeast, + crowded_out_unstaking_period_length: None, + review_period_expired_unstaking_period_length: None, + }), + ..OpeningPolicyCommitment::default() + }; + + let opening_id = add_opening( + member_id, + account_id.clone(), + ActivateOpeningAt::CurrentBlock, + Some(opening_policy_commitment), + 1, + working_group, + ); + + let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( + RawOrigin::Signed(account_id.clone().into()).into(), + member_id as u64, + opening_id, + account_id.clone().into(), + Some(stake_amount), + None, + Vec::new(), + ); + + assert_eq!(apply_result, Ok(())); + + let expected_application_id = 0; + + begin_review_applications(member_id, account_id, opening_id, 2, working_group); + + let lead = ContentDirectoryWorkingGroup::current_lead(); + assert!(lead.is_none()); + + let old_reward_amount = 100; + let reward_policy = Some(RewardPolicy { + amount_per_payout: old_reward_amount, + next_payment_at_block: 9999, + payout_interval: None, + }); + + set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); + + fill_opening( + member_id, + account_id, + opening_id, + expected_application_id, + reward_policy, + 4, + working_group, + ); + + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + + let worker = ContentDirectoryWorkingGroup::worker_by_id(leader_worker_id); + let relationship_id = worker.reward_relationship.unwrap(); + + let relationship = + recurring_rewards::RewardRelationships::::get(relationship_id); + assert_eq!(relationship.amount_per_payout, old_reward_amount); + + let new_reward_amount = 999; + set_reward( + member_id, + account_id, + leader_worker_id, + new_reward_amount, + 5, + working_group, + ); + + let relationship = + recurring_rewards::RewardRelationships::::get(relationship_id); + assert_eq!(relationship.amount_per_payout, new_reward_amount); + }); + } - terminate_role( - member_id, - account_id, - leader_worker_id, - true, - 5, - working_group, - ); + #[test] + fn create_terminate_group_leader_role_proposal_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_terminate_group_leader_role_proposal_execution_succeeds(group); + } + } - assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); + fn run_create_terminate_group_leader_role_proposal_execution_succeeds( + working_group: WorkingGroup, + ) { + initial_test_ext().execute_with(|| { + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; + let stake_amount = 100; + + let opening_policy_commitment = OpeningPolicyCommitment { + role_staking_policy: Some(hiring::StakingPolicy { + amount: 100, + amount_mode: hiring::StakingAmountLimitMode::AtLeast, + crowded_out_unstaking_period_length: None, + review_period_expired_unstaking_period_length: None, + }), + ..OpeningPolicyCommitment::default() + }; + + let opening_id = add_opening( + member_id, + account_id.clone(), + ActivateOpeningAt::CurrentBlock, + Some(opening_policy_commitment), + 1, + working_group, + ); + + let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( + RawOrigin::Signed(account_id.clone().into()).into(), + member_id as u64, + opening_id, + account_id.clone().into(), + Some(stake_amount), + None, + Vec::new(), + ); + + assert_eq!(apply_result, Ok(())); + + let expected_application_id = 0; + + begin_review_applications(member_id, account_id, opening_id, 2, working_group); + + let lead = ContentDirectoryWorkingGroup::current_lead(); + assert!(lead.is_none()); + + let old_reward_amount = 100; + let reward_policy = Some(RewardPolicy { + amount_per_payout: old_reward_amount, + next_payment_at_block: 9999, + payout_interval: None, + }); + + set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); + + fill_opening( + member_id, + account_id, + opening_id, + expected_application_id, + reward_policy, + 4, + working_group, + ); + + let stake_id = 1; + let old_balance = Balances::free_balance(&account_id.into()); + let old_stake = >::stakes(stake_id); + + assert_eq!(get_stake_balance(old_stake), stake_amount); + + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + + terminate_role( + member_id, + account_id, + leader_worker_id, + false, + 5, + working_group, + ); + + assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); + + let new_balance = Balances::free_balance(&account_id.into()); + let new_stake = >::stakes(stake_id); + + assert_eq!(new_stake.staking_status, stake::StakingStatus::NotStaked); + assert_eq!(new_balance, old_balance + stake_amount); + }); + } - let new_balance = Balances::free_balance(&account_id.into()); - let new_stake = >::stakes(stake_id); + #[test] + fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds() { + // This uses strum crate for enum iteration + for group in WorkingGroup::iter() { + run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( + group, + ); + } + } - assert_eq!(new_stake.staking_status, stake::StakingStatus::NotStaked); - assert_eq!(new_balance, old_balance); - }); + fn run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( + working_group: WorkingGroup, + ) { + initial_test_ext().execute_with(|| { + let member_id: MemberId = 1; + let account_id: [u8; 32] = [0; 32]; + let stake_amount = 100; + + let opening_policy_commitment = OpeningPolicyCommitment { + role_staking_policy: Some(hiring::StakingPolicy { + amount: 100, + amount_mode: hiring::StakingAmountLimitMode::AtLeast, + crowded_out_unstaking_period_length: None, + review_period_expired_unstaking_period_length: None, + }), + ..OpeningPolicyCommitment::default() + }; + + let opening_id = add_opening( + member_id, + account_id.clone(), + ActivateOpeningAt::CurrentBlock, + Some(opening_policy_commitment), + 1, + working_group, + ); + + let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( + RawOrigin::Signed(account_id.clone().into()).into(), + member_id, + opening_id, + account_id.clone().into(), + Some(stake_amount), + None, + Vec::new(), + ); + + assert_eq!(apply_result, Ok(())); + + let expected_application_id = 0; + + begin_review_applications(member_id, account_id, opening_id, 2, working_group); + + let lead = ContentDirectoryWorkingGroup::current_lead(); + assert!(lead.is_none()); + + let old_reward_amount = 100; + let reward_policy = Some(RewardPolicy { + amount_per_payout: old_reward_amount, + next_payment_at_block: 9999, + payout_interval: None, + }); + + set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); + + fill_opening( + member_id, + account_id, + opening_id, + expected_application_id, + reward_policy, + 4, + working_group, + ); + + let stake_id = 1; + let old_balance = Balances::free_balance(&account_id.into()); + let old_stake = >::stakes(stake_id); + + assert_eq!(get_stake_balance(old_stake), stake_amount); + + let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + + terminate_role( + member_id, + account_id, + leader_worker_id, + true, + 5, + working_group, + ); + + assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); + + let new_balance = Balances::free_balance(&account_id.into()); + let new_stake = >::stakes(stake_id); + + assert_eq!(new_stake.staking_status, stake::StakingStatus::NotStaked); + assert_eq!(new_balance, old_balance); + }); + } + } } From caf25903a6f5a248ab7587565450c57ff8f92832 Mon Sep 17 00:00:00 2001 From: iorveth Date: Mon, 28 Sep 2020 18:26:46 +0300 Subject: [PATCH 13/13] integration/working_group_proposal: Upgrade remaining tests to generic implementation --- .../src/integration/content_working_group.rs | 1 + runtime/src/integration/mod.rs | 1 - runtime/src/integration/proposals/mod.rs | 1 - .../integration/proposals/proposal_encoder.rs | 1 - runtime/src/lib.rs | 1 - .../src/tests/proposals_integration/mod.rs | 1 - .../working_group_proposals.rs | 249 ++++++++++++------ 7 files changed, 170 insertions(+), 85 deletions(-) diff --git a/runtime/src/integration/content_working_group.rs b/runtime/src/integration/content_working_group.rs index 653db28ca6..bd438c0af2 100644 --- a/runtime/src/integration/content_working_group.rs +++ b/runtime/src/integration/content_working_group.rs @@ -73,6 +73,7 @@ impl versioned_store_permissions::CredentialChecker for ContentWorkingG } } +#[allow(dead_code)] pub struct ContentWorkingGroupStakingEventHandler {} impl stake::StakingEventsHandler for ContentWorkingGroupStakingEventHandler { fn unstaked( diff --git a/runtime/src/integration/mod.rs b/runtime/src/integration/mod.rs index f4e5b29f46..3777efda4f 100644 --- a/runtime/src/integration/mod.rs +++ b/runtime/src/integration/mod.rs @@ -1,7 +1,6 @@ pub mod content_directory; pub mod content_working_group; pub mod forum; -#[macro_use] pub mod proposals; pub mod storage; pub mod transactions; diff --git a/runtime/src/integration/proposals/mod.rs b/runtime/src/integration/proposals/mod.rs index c7bfd77164..47627fa1fb 100644 --- a/runtime/src/integration/proposals/mod.rs +++ b/runtime/src/integration/proposals/mod.rs @@ -3,7 +3,6 @@ mod council_elected_handler; mod council_origin_validator; mod membership_origin_validator; -#[macro_use] mod proposal_encoder; mod staking_events_handler; diff --git a/runtime/src/integration/proposals/proposal_encoder.rs b/runtime/src/integration/proposals/proposal_encoder.rs index 2f0bd2261d..388e1343d2 100644 --- a/runtime/src/integration/proposals/proposal_encoder.rs +++ b/runtime/src/integration/proposals/proposal_encoder.rs @@ -15,7 +15,6 @@ use sp_std::vec::Vec; //Params: // - $working_group: expression returning the 'common::working_group::WorkingGroup' enum // - $working_group_instance_call: expression returning the exact working group instance extrinsic call -#[macro_use] macro_rules! wrap_working_group_call { ($working_group:expr, $working_group_instance_call:expr) => {{ match $working_group { diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index e55fab310d..dff8848097 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -14,7 +14,6 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod constants; -#[macro_use] mod integration; pub mod primitives; mod runtime_api; diff --git a/runtime/src/tests/proposals_integration/mod.rs b/runtime/src/tests/proposals_integration/mod.rs index 8cbbf00181..0419c69dae 100644 --- a/runtime/src/tests/proposals_integration/mod.rs +++ b/runtime/src/tests/proposals_integration/mod.rs @@ -1,7 +1,6 @@ //! Proposals integration tests - with stake, membership, governance modules. #![cfg(test)] -#[macro_use] mod working_group_proposals; diff --git a/runtime/src/tests/proposals_integration/working_group_proposals.rs b/runtime/src/tests/proposals_integration/working_group_proposals.rs index 784dd609ee..515e274973 100644 --- a/runtime/src/tests/proposals_integration/working_group_proposals.rs +++ b/runtime/src/tests/proposals_integration/working_group_proposals.rs @@ -1,3 +1,6 @@ +#![allow(unnameable_test_items)] +#![allow(dead_code)] + use super::*; use system::RawOrigin; @@ -13,7 +16,7 @@ use crate::{ }; use sp_std::collections::btree_set::BTreeSet; -use crate::primitives::{AccountId, ActorId, MemberId}; +use crate::primitives::{ActorId, MemberId}; use frame_support::traits; use strum::IntoEnumIterator; @@ -53,7 +56,7 @@ fn add_opening( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_add_working_group_leader_opening_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), + RawOrigin::Signed(account_id.into()).into(), member_id as u64, b"title".to_vec(), b"body".to_vec(), @@ -88,7 +91,7 @@ fn begin_review_applications( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_begin_review_working_group_leader_applications_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), + RawOrigin::Signed(account_id.into()).into(), member_id, b"title".to_vec(), b"body".to_vec(), @@ -118,7 +121,7 @@ fn fill_opening( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_fill_working_group_leader_opening_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), + RawOrigin::Signed(account_id.into()).into(), member_id, b"title".to_vec(), b"body".to_vec(), @@ -159,7 +162,7 @@ fn decrease_stake( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_decrease_working_group_leader_stake_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), + RawOrigin::Signed(account_id.into()).into(), member_id, b"title".to_vec(), b"body".to_vec(), @@ -189,7 +192,7 @@ fn slash_stake( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_slash_working_group_leader_stake_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), + RawOrigin::Signed(account_id.into()).into(), member_id, b"title".to_vec(), b"body".to_vec(), @@ -219,7 +222,7 @@ fn set_reward( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_set_working_group_leader_reward_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), + RawOrigin::Signed(account_id.into()).into(), member_id as u64, b"title".to_vec(), b"body".to_vec(), @@ -236,27 +239,33 @@ fn set_reward( codex_extrinsic_test_fixture.call_extrinsic_and_assert(); } -fn set_mint_capacity( +fn set_mint_capacity< + T: working_group::Trait + system::Trait + minting::Trait, + I: working_group::Instance, +>( member_id: MemberId, account_id: [u8; 32], mint_capacity: Balance, sequence_number: u32, // action sequence number to align with other actions setup_environment: bool, working_group: WorkingGroup, -) { +) where + ::MintId: From, +{ let expected_proposal_id = sequence_number; let run_to_block = sequence_number * 2; let mint_id_result = >::add_mint(0, None); if let Ok(mint_id) = mint_id_result { - >::put(mint_id); + let mint_id: ::MintId = mint_id.into(); + >::put(mint_id); } let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_set_working_group_mint_capacity_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, + RawOrigin::Signed(account_id.into()).into(), + member_id, b"title".to_vec(), b"body".to_vec(), Some(>::from(50_000_u32)), @@ -284,7 +293,7 @@ fn terminate_role( let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| { ProposalCodex::create_terminate_working_group_leader_role_proposal( - RawOrigin::Signed(account_id.clone().into()).into(), + RawOrigin::Signed(account_id.into()).into(), member_id, b"title".to_vec(), b"body".to_vec(), @@ -331,7 +340,6 @@ fn run_create_add_working_group_leader_opening_proposal_execution_succeeds< >( working_group: WorkingGroup, ) where - ::AccountId: From<[u8; 32]>, ::MemberId: From, ::OpeningId: From, { @@ -398,7 +406,7 @@ fn run_create_begin_review_working_group_leader_applications_proposal_execution_ let opening_id = add_opening( member_id, - account_id.clone(), + account_id, ActivateOpeningAt::CurrentBlock, None, 1, @@ -409,7 +417,8 @@ fn run_create_begin_review_working_group_leader_applications_proposal_execution_ ::OpeningId::from(opening_id), ); - let hiring_opening = Hiring::opening_by_id(opening.hiring_opening_id.into()); + let hiring_opening_id: u64 = opening.hiring_opening_id.into(); + let hiring_opening = Hiring::opening_by_id(hiring_opening_id); assert_eq!( hiring_opening.stage, hiring::OpeningStage::Active { @@ -425,7 +434,7 @@ fn run_create_begin_review_working_group_leader_applications_proposal_execution_ begin_review_applications(member_id, account_id, opening_id, 2, working_group); - let hiring_opening = Hiring::opening_by_id(opening.hiring_opening_id.into()); + let hiring_opening = Hiring::opening_by_id(hiring_opening_id); assert_eq!( hiring_opening.stage, hiring::OpeningStage::Active { @@ -478,7 +487,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { let opening_id = add_opening( member_id, - account_id.clone(), + account_id, ActivateOpeningAt::CurrentBlock, None, 1, @@ -486,10 +495,10 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { ); let apply_result = WorkingGroupInstance::::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), + RawOrigin::Signed(account_id.into()).into(), member_id.into(), opening_id.into(), - account_id.clone().into(), + account_id.into(), None, None, Vec::new(), @@ -570,7 +579,7 @@ fn run_create_decrease_group_leader_stake_proposal_execution_succeeds< let opening_id = add_opening( member_id, - account_id.clone(), + account_id, ActivateOpeningAt::CurrentBlock, Some(opening_policy_commitment), 1, @@ -578,10 +587,10 @@ fn run_create_decrease_group_leader_stake_proposal_execution_succeeds< ); let apply_result = WorkingGroupInstance::::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), + RawOrigin::Signed(account_id.into()).into(), member_id.into(), opening_id.into(), - account_id.clone().into(), + account_id.into(), Some(stake_amount.into()), None, Vec::new(), @@ -686,7 +695,7 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< let opening_id = add_opening( member_id, - account_id.clone(), + account_id, ActivateOpeningAt::CurrentBlock, Some(opening_policy_commitment), 1, @@ -792,7 +801,14 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< assert_eq!(WorkingGroupInstance::::mint(), 0.into()); let mint_capacity = 999999; - set_mint_capacity(member_id, account_id, mint_capacity, 1, true, working_group); + set_mint_capacity::( + member_id, + account_id, + mint_capacity, + 1, + true, + working_group, + ); let mint_id = WorkingGroupInstance::::mint(); let mint = >::mints(mint_id); @@ -805,13 +821,38 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< fn create_set_group_leader_reward_proposal_execution_succeeds() { // This uses strum crate for enum iteration for group in WorkingGroup::iter() { - run_create_set_group_leader_reward_proposal_execution_succeeds(group); + match group { + WorkingGroup::Content => { + run_create_set_working_group_mint_capacity_proposal_execution_succeeds::< + Runtime, + ContentDirectoryWorkingGroupInstance, + >(group); + } + WorkingGroup::Storage => { + run_create_set_working_group_mint_capacity_proposal_execution_succeeds::< + Runtime, + StorageWorkingGroupInstance, + >(group); + } + } } } - fn run_create_set_group_leader_reward_proposal_execution_succeeds( + fn run_create_set_group_leader_reward_proposal_execution_succeeds< + T: working_group::Trait + system::Trait + minting::Trait, + I: working_group::Instance, + >( working_group: WorkingGroup, - ) { + ) where + ::AccountId: From<[u8; 32]>, + ::MemberId: From, + ::ActorId: Into, + ::MintId: From, + ::OpeningId: From, + <::Currency as traits::Currency< + ::AccountId, + >>::Balance: From, + { initial_test_ext().execute_with(|| { let member_id: MemberId = 1; let account_id: [u8; 32] = [member_id as u8; 32]; @@ -829,19 +870,19 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< let opening_id = add_opening( member_id, - account_id.clone(), + account_id, ActivateOpeningAt::CurrentBlock, Some(opening_policy_commitment), 1, working_group, ); - let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, - opening_id, - account_id.clone().into(), - Some(stake_amount), + let apply_result = WorkingGroupInstance::::apply_on_opening( + RawOrigin::Signed(account_id.into()).into(), + member_id.into(), + opening_id.into(), + account_id.into(), + Some(stake_amount.into()), None, Vec::new(), ); @@ -852,7 +893,7 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< begin_review_applications(member_id, account_id, opening_id, 2, working_group); - let lead = ContentDirectoryWorkingGroup::current_lead(); + let lead = WorkingGroupInstance::::current_lead(); assert!(lead.is_none()); let old_reward_amount = 100; @@ -862,7 +903,7 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< payout_interval: None, }); - set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); + set_mint_capacity::(member_id, account_id, 999999, 3, false, working_group); fill_opening( member_id, @@ -874,28 +915,28 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< working_group, ); - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + let leader_worker_id = WorkingGroupInstance::::current_lead().unwrap(); - let worker = ContentDirectoryWorkingGroup::worker_by_id(leader_worker_id); + let worker = WorkingGroupInstance::::worker_by_id(leader_worker_id); let relationship_id = worker.reward_relationship.unwrap(); let relationship = - recurring_rewards::RewardRelationships::::get(relationship_id); - assert_eq!(relationship.amount_per_payout, old_reward_amount); + recurring_rewards::RewardRelationships::::get(relationship_id); + assert_eq!(relationship.amount_per_payout, old_reward_amount.into()); let new_reward_amount = 999; set_reward( member_id, account_id, - leader_worker_id, + leader_worker_id.into(), new_reward_amount, 5, working_group, ); let relationship = - recurring_rewards::RewardRelationships::::get(relationship_id); - assert_eq!(relationship.amount_per_payout, new_reward_amount); + recurring_rewards::RewardRelationships::::get(relationship_id); + assert_eq!(relationship.amount_per_payout, new_reward_amount.into()); }); } @@ -903,17 +944,42 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< fn create_terminate_group_leader_role_proposal_execution_succeeds() { // This uses strum crate for enum iteration for group in WorkingGroup::iter() { - run_create_terminate_group_leader_role_proposal_execution_succeeds(group); + match group { + WorkingGroup::Content => { + run_create_terminate_group_leader_role_proposal_execution_succeeds::< + Runtime, + ContentDirectoryWorkingGroupInstance, + >(group); + } + WorkingGroup::Storage => { + run_create_terminate_group_leader_role_proposal_execution_succeeds::< + Runtime, + StorageWorkingGroupInstance, + >(group); + } + } } } - fn run_create_terminate_group_leader_role_proposal_execution_succeeds( + fn run_create_terminate_group_leader_role_proposal_execution_succeeds< + T: working_group::Trait + system::Trait + minting::Trait, + I: working_group::Instance, + >( working_group: WorkingGroup, - ) { + ) where + ::AccountId: From<[u8; 32]>, + ::MemberId: From, + ::ActorId: Into, + ::MintId: From, + ::OpeningId: From, + <::Currency as traits::Currency< + ::AccountId, + >>::Balance: From, + { initial_test_ext().execute_with(|| { let member_id: MemberId = 1; let account_id: [u8; 32] = [0; 32]; - let stake_amount = 100; + let stake_amount = 100_u128; let opening_policy_commitment = OpeningPolicyCommitment { role_staking_policy: Some(hiring::StakingPolicy { @@ -926,20 +992,20 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< }; let opening_id = add_opening( - member_id, - account_id.clone(), + member_id.into(), + account_id, ActivateOpeningAt::CurrentBlock, Some(opening_policy_commitment), 1, working_group, ); - let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id as u64, - opening_id, - account_id.clone().into(), - Some(stake_amount), + let apply_result = WorkingGroupInstance::::apply_on_opening( + RawOrigin::Signed(account_id.into()).into(), + member_id.into(), + opening_id.into(), + account_id.into(), + Some(stake_amount.into()), None, Vec::new(), ); @@ -950,7 +1016,7 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< begin_review_applications(member_id, account_id, opening_id, 2, working_group); - let lead = ContentDirectoryWorkingGroup::current_lead(); + let lead = WorkingGroupInstance::::current_lead(); assert!(lead.is_none()); let old_reward_amount = 100; @@ -960,7 +1026,7 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< payout_interval: None, }); - set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); + set_mint_capacity::(member_id, account_id, 999999, 3, false, working_group); fill_opening( member_id, @@ -978,18 +1044,18 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< assert_eq!(get_stake_balance(old_stake), stake_amount); - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + let leader_worker_id = WorkingGroupInstance::::current_lead().unwrap(); terminate_role( member_id, account_id, - leader_worker_id, + leader_worker_id.into(), false, 5, working_group, ); - assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); + assert!(WorkingGroupInstance::::current_lead().is_none()); let new_balance = Balances::free_balance(&account_id.into()); let new_stake = >::stakes(stake_id); @@ -1003,19 +1069,36 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds() { // This uses strum crate for enum iteration for group in WorkingGroup::iter() { - run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( - group, - ); + match group { + WorkingGroup::Content => { + run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds::(group); + } + WorkingGroup::Storage => { + run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds::(group); + } + } } } - fn run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds( + fn run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds< + T: working_group::Trait + system::Trait + minting::Trait, + I: working_group::Instance, + >( working_group: WorkingGroup, - ) { + ) where + ::AccountId: From<[u8; 32]>, + ::MemberId: From, + ::ActorId: Into, + ::MintId: From, + ::OpeningId: From, + <::Currency as traits::Currency< + ::AccountId, + >>::Balance: From, + { initial_test_ext().execute_with(|| { let member_id: MemberId = 1; let account_id: [u8; 32] = [0; 32]; - let stake_amount = 100; + let stake_amount = 100_u128; let opening_policy_commitment = OpeningPolicyCommitment { role_staking_policy: Some(hiring::StakingPolicy { @@ -1029,19 +1112,19 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< let opening_id = add_opening( member_id, - account_id.clone(), + account_id, ActivateOpeningAt::CurrentBlock, Some(opening_policy_commitment), 1, working_group, ); - let apply_result = ContentDirectoryWorkingGroup::apply_on_opening( - RawOrigin::Signed(account_id.clone().into()).into(), - member_id, - opening_id, - account_id.clone().into(), - Some(stake_amount), + let apply_result = WorkingGroupInstance::::apply_on_opening( + RawOrigin::Signed(account_id.into()).into(), + member_id.into(), + opening_id.into(), + account_id.into(), + Some(stake_amount.into()), None, Vec::new(), ); @@ -1050,9 +1133,15 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< let expected_application_id = 0; - begin_review_applications(member_id, account_id, opening_id, 2, working_group); + begin_review_applications( + member_id, + account_id, + opening_id.into(), + 2, + working_group, + ); - let lead = ContentDirectoryWorkingGroup::current_lead(); + let lead = WorkingGroupInstance::::current_lead(); assert!(lead.is_none()); let old_reward_amount = 100; @@ -1062,7 +1151,7 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< payout_interval: None, }); - set_mint_capacity(member_id, account_id, 999999, 3, false, working_group); + set_mint_capacity::(member_id, account_id, 999999, 3, false, working_group); fill_opening( member_id, @@ -1080,18 +1169,18 @@ fn run_create_slash_group_leader_stake_proposal_execution_succeeds< assert_eq!(get_stake_balance(old_stake), stake_amount); - let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap(); + let leader_worker_id = WorkingGroupInstance::::current_lead().unwrap(); terminate_role( member_id, account_id, - leader_worker_id, + leader_worker_id.into(), true, 5, working_group, ); - assert!(ContentDirectoryWorkingGroup::current_lead().is_none()); + assert!(WorkingGroupInstance::::current_lead().is_none()); let new_balance = Balances::free_balance(&account_id.into()); let new_stake = >::stakes(stake_id);