diff --git a/Cargo.lock b/Cargo.lock index c9792e4b66..707d2b2858 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2068,6 +2068,8 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "hex-literal 0.3.1", + "lazy_static", + "lite-json", "pallet-authority-discovery", "pallet-authorship", "pallet-babe", @@ -2346,6 +2348,9 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] [[package]] name = "lazycell" @@ -2741,6 +2746,24 @@ dependencies = [ "statrs", ] +[[package]] +name = "lite-json" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0460d985423a026b4d9b828a7c6eed1bcf606f476322f3f9b507529686a61715" +dependencies = [ + "lite-parser", +] + +[[package]] +name = "lite-parser" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c50092e40e0ccd1bf2015a10333fde0502ff95b832b0895dc1ca0d7ac6c52f6" +dependencies = [ + "paste", +] + [[package]] name = "lock_api" version = "0.3.4" @@ -3548,7 +3571,7 @@ dependencies = [ [[package]] name = "pallet-proposals-codex" -version = "3.0.0" +version = "4.0.0" dependencies = [ "frame-support", "frame-system", @@ -3580,7 +3603,7 @@ dependencies = [ [[package]] name = "pallet-proposals-discussion" -version = "3.0.1" +version = "4.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -3599,7 +3622,7 @@ dependencies = [ [[package]] name = "pallet-proposals-engine" -version = "3.0.0" +version = "4.0.0" dependencies = [ "frame-support", "frame-system", @@ -7510,9 +7533,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" +checksum = "75cf45bb0bef80604d001caaec0d09da99611b3c0fd39d3080468875cdb65645" dependencies = [ "serde", ] diff --git a/node/src/chain_spec/mod.rs b/node/src/chain_spec/mod.rs index 3d4e528077..0ddb6746dc 100644 --- a/node/src/chain_spec/mod.rs +++ b/node/src/chain_spec/mod.rs @@ -33,9 +33,9 @@ use node_runtime::{ ContentDirectoryConfig, ContentDirectoryWorkingGroupConfig, ContentWorkingGroupConfig, CouncilConfig, CouncilElectionConfig, DataDirectoryConfig, DataObjectStorageRegistryConfig, DataObjectTypeRegistryConfig, ElectionParameters, ForumConfig, GrandpaConfig, ImOnlineConfig, - MembersConfig, Moment, ProposalsCodexConfig, SessionConfig, SessionKeys, Signature, - StakerStatus, StakingConfig, StorageWorkingGroupConfig, SudoConfig, SystemConfig, - VersionedStoreConfig, VersionedStorePermissionsConfig, DAYS, WASM_BINARY, + MembersConfig, Moment, SessionConfig, SessionKeys, Signature, StakerStatus, StakingConfig, + StorageWorkingGroupConfig, SudoConfig, SystemConfig, VersionedStoreConfig, + VersionedStorePermissionsConfig, DAYS, WASM_BINARY, }; // Exported to be used by chain-spec-builder @@ -45,7 +45,6 @@ pub mod content_config; pub mod forum_config; pub mod initial_balances; pub mod initial_members; -pub mod proposals_config; type AccountPublic = ::Signer; @@ -133,7 +132,6 @@ impl Alternative { get_account_id_from_seed::("Alice//stash"), get_account_id_from_seed::("Bob//stash"), ], - proposals_config::development(), initial_members::none(), forum_config::empty(get_account_id_from_seed::("Alice")), content_config::empty_versioned_store_config(), @@ -174,7 +172,6 @@ impl Alternative { get_account_id_from_seed::("Eve//stash"), get_account_id_from_seed::("Ferdie//stash"), ], - proposals_config::development(), initial_members::none(), forum_config::empty(get_account_id_from_seed::("Alice")), content_config::empty_versioned_store_config(), @@ -220,7 +217,6 @@ pub fn testnet_genesis( )>, root_key: AccountId, endowed_accounts: Vec, - cpcp: node_runtime::ProposalsConfigParameters, members: Vec>, forum_config: ForumConfig, versioned_store_config: VersionedStoreConfig, @@ -339,53 +335,6 @@ pub fn testnet_genesis( versioned_store: Some(versioned_store_config), versioned_store_permissions: Some(versioned_store_permissions_config), content_wg: Some(content_working_group_config), - proposals_codex: Some(ProposalsCodexConfig { - set_validator_count_proposal_voting_period: cpcp - .set_validator_count_proposal_voting_period, - set_validator_count_proposal_grace_period: cpcp - .set_validator_count_proposal_grace_period, - runtime_upgrade_proposal_voting_period: cpcp.runtime_upgrade_proposal_voting_period, - runtime_upgrade_proposal_grace_period: cpcp.runtime_upgrade_proposal_grace_period, - text_proposal_voting_period: cpcp.text_proposal_voting_period, - text_proposal_grace_period: cpcp.text_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 - .add_working_group_opening_proposal_voting_period, - add_working_group_opening_proposal_grace_period: cpcp - .add_working_group_opening_proposal_grace_period, - begin_review_working_group_leader_applications_proposal_voting_period: cpcp - .begin_review_working_group_leader_applications_proposal_voting_period, - begin_review_working_group_leader_applications_proposal_grace_period: cpcp - .begin_review_working_group_leader_applications_proposal_grace_period, - fill_working_group_leader_opening_proposal_voting_period: cpcp - .fill_working_group_leader_opening_proposal_voting_period, - 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_working_group_mint_capacity_proposal_voting_period, - set_working_group_mint_capacity_proposal_grace_period: cpcp - .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 - .decrease_working_group_leader_stake_proposal_grace_period, - slash_working_group_leader_stake_proposal_voting_period: cpcp - .slash_working_group_leader_stake_proposal_voting_period, - slash_working_group_leader_stake_proposal_grace_period: cpcp - .slash_working_group_leader_stake_proposal_grace_period, - set_working_group_leader_reward_proposal_voting_period: cpcp - .set_working_group_leader_reward_proposal_voting_period, - set_working_group_leader_reward_proposal_grace_period: cpcp - .set_working_group_leader_reward_proposal_grace_period, - terminate_working_group_leader_role_proposal_voting_period: cpcp - .terminate_working_group_leader_role_proposal_voting_period, - terminate_working_group_leader_role_proposal_grace_period: cpcp - .terminate_working_group_leader_role_proposal_grace_period, - amend_constitution_proposal_voting_period: cpcp - .amend_constitution_proposal_voting_period, - amend_constitution_proposal_grace_period: cpcp.amend_constitution_proposal_grace_period, - }), } } @@ -400,7 +349,6 @@ pub(crate) mod tests { vec![get_authority_keys_from_seed("Alice")], get_account_id_from_seed::("Alice"), vec![get_authority_keys_from_seed("Alice").0], - proposals_config::development(), initial_members::none(), forum_config::empty(get_account_id_from_seed::("Alice")), content_config::empty_versioned_store_config(), @@ -437,7 +385,6 @@ pub(crate) mod tests { get_authority_keys_from_seed("Alice").0, get_authority_keys_from_seed("Bob").0, ], - proposals_config::development(), initial_members::none(), forum_config::empty(get_account_id_from_seed::("Alice")), content_config::empty_versioned_store_config(), diff --git a/node/src/chain_spec/proposals_config.rs b/node/src/chain_spec/proposals_config.rs deleted file mode 100644 index eb53945e8f..0000000000 --- a/node/src/chain_spec/proposals_config.rs +++ /dev/null @@ -1,17 +0,0 @@ -use node_runtime::ProposalsConfigParameters; - -/// Development chain config. 0 grace period for all proposals, ie. -/// proposals executed immediatly. Short voting period. -pub fn development() -> ProposalsConfigParameters { - ProposalsConfigParameters::with_grace_and_voting_periods(0, 200) -} - -/// Staging chain config. Shorter grace periods and voting periods than default. -pub fn staging() -> ProposalsConfigParameters { - ProposalsConfigParameters::with_grace_and_voting_periods(20, 30) -} - -/// The default configuration as defined in the runtime module -pub fn production() -> ProposalsConfigParameters { - ProposalsConfigParameters::default() -} diff --git a/node/src/service.rs b/node/src/service.rs index a1ebae62c5..6326510314 100644 --- a/node/src/service.rs +++ b/node/src/service.rs @@ -15,7 +15,6 @@ // along with Joystream node. If not, see . #![warn(unused_extern_crates)] - // Substrate implementation issue. #![allow(clippy::redundant_closure_call)] diff --git a/runtime-modules/proposals/codex/Cargo.toml b/runtime-modules/proposals/codex/Cargo.toml index 5eb53a0537..472aba8068 100644 --- a/runtime-modules/proposals/codex/Cargo.toml +++ b/runtime-modules/proposals/codex/Cargo.toml @@ -1,6 +1,6 @@ [package] name = 'pallet-proposals-codex' -version = '3.0.0' +version = '4.0.0' authors = ['Joystream contributors'] edition = '2018' diff --git a/runtime-modules/proposals/codex/src/lib.rs b/runtime-modules/proposals/codex/src/lib.rs index 8413176d71..5b6eaccc61 100644 --- a/runtime-modules/proposals/codex/src/lib.rs +++ b/runtime-modules/proposals/codex/src/lib.rs @@ -63,7 +63,7 @@ mod tests; use frame_support::dispatch::DispatchResult; use frame_support::traits::{Currency, Get}; -use frame_support::{decl_error, decl_module, decl_storage, ensure, print, StorageValue}; +use frame_support::{decl_error, decl_module, decl_storage, ensure, print}; use sp_arithmetic::traits::Zero; use sp_std::clone::Clone; use sp_std::str::from_utf8; @@ -79,7 +79,7 @@ use proposals_engine::{ }; pub use crate::proposal_types::{ - AddOpeningParameters, FillOpeningParameters, ProposalsConfigParameters, TerminateRoleParameters, + AddOpeningParameters, FillOpeningParameters, TerminateRoleParameters, }; pub use proposal_types::{ProposalDetails, ProposalDetailsOf, ProposalEncoder}; @@ -120,15 +120,76 @@ pub trait Trait: /// Defines max wasm code length of the runtime upgrade proposal. type RuntimeUpgradeWasmProposalMaxLength: Get; - /// Validates member id and origin combination + /// Validates member id and origin combination. type MembershipOriginValidator: ActorOriginValidator< Self::Origin, MemberId, Self::AccountId, >; - /// Encodes the proposal usint its details + /// Encodes the proposal usint its details. type ProposalEncoder: ProposalEncoder; + + /// 'Set validator count' proposal parameters. + type SetValidatorCountProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Runtime upgrade' proposal parameters. + type RuntimeUpgradeProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Text' proposal parameters. + type TextProposalParameters: Get>>; + + /// 'Spending' proposal parameters. + type SpendingProposalParameters: Get>>; + + /// 'Add working group opening' proposal parameters. + type AddWorkingGroupOpeningProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Begin review working group applications' proposal parameters. + type BeginReviewWorkingGroupApplicationsProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Fill working group opening' proposal parameters. + type FillWorkingGroupOpeningProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Set working group mint capacity' proposal parameters. + type SetWorkingGroupMintCapacityProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Decrease working group leader stake' proposal parameters. + type DecreaseWorkingGroupLeaderStakeProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Slash working group leader stake' proposal parameters. + type SlashWorkingGroupLeaderStakeProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Set working group leader reward' proposal parameters. + type SetWorkingGroupLeaderRewardProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Terminate working group leader role' proposal parameters. + type TerminateWorkingGroupLeaderRoleProposalParameters: Get< + ProposalParameters>, + >; + + /// 'Amend constitution' proposal parameters. + type AmendConstitutionProposalParameters: Get< + ProposalParameters>, + >; } /// Balance alias for GovernanceCurrency from `common` module. TODO: replace with BalanceOf @@ -218,108 +279,66 @@ decl_storage! { /// Map proposal id to proposal details pub ProposalDetailsByProposalId get(fn proposal_details_by_proposal_id): map hasher(blake2_128_concat) T::ProposalId => ProposalDetailsOf; + } +} - /// Voting period for the 'set validator count' proposal - pub SetValidatorCountProposalVotingPeriod get(fn set_validator_count_proposal_voting_period) - config(): T::BlockNumber; - - /// Grace period for the 'set validator count' proposal - pub SetValidatorCountProposalGracePeriod get(fn set_validator_count_proposal_grace_period) - config(): T::BlockNumber; - - /// Voting period for the 'runtime upgrade' proposal - pub RuntimeUpgradeProposalVotingPeriod get(fn runtime_upgrade_proposal_voting_period) - config(): T::BlockNumber; - - /// Grace period for the 'runtime upgrade' proposal - pub RuntimeUpgradeProposalGracePeriod get(fn runtime_upgrade_proposal_grace_period) - config(): T::BlockNumber; - - /// Voting period for the 'text' proposal - pub TextProposalVotingPeriod get(fn text_proposal_voting_period) config(): T::BlockNumber; - - /// Grace period for the 'text' proposal - pub TextProposalGracePeriod get(fn text_proposal_grace_period) config(): T::BlockNumber; - - /// Voting period for the 'spending' proposal - pub SpendingProposalVotingPeriod get(fn spending_proposal_voting_period) config(): T::BlockNumber; - - /// Grace period for the 'spending' proposal - pub SpendingProposalGracePeriod get(fn spending_proposal_grace_period) config(): T::BlockNumber; - - /// Voting period for the 'add working group opening' proposal - pub AddWorkingGroupOpeningProposalVotingPeriod get(fn add_working_group_opening_proposal_voting_period) config(): T::BlockNumber; - - /// Grace period for the 'add working group opening' proposal - pub AddWorkingGroupOpeningProposalGracePeriod get(fn add_working_group_opening_proposal_grace_period) config(): T::BlockNumber; - - /// Voting period for the 'begin review working group leader applications' proposal - pub BeginReviewWorkingGroupLeaderApplicationsProposalVotingPeriod get(fn begin_review_working_group_leader_applications_proposal_voting_period) config(): T::BlockNumber; - - /// Grace period for the 'begin review working group leader applications' proposal - pub BeginReviewWorkingGroupLeaderApplicationsProposalGracePeriod get(fn begin_review_working_group_leader_applications_proposal_grace_period) config(): T::BlockNumber; - - /// Voting period for the 'fill working group leader opening' proposal - pub FillWorkingGroupLeaderOpeningProposalVotingPeriod get(fn fill_working_group_leader_opening_proposal_voting_period) config(): T::BlockNumber; - - /// Grace period for the 'fill working group leader opening' proposal - pub FillWorkingGroupLeaderOpeningProposalGracePeriod get(fn fill_working_group_leader_opening_proposal_grace_period) config(): T::BlockNumber; +decl_module! { + /// Proposal codex substrate module Call + pub struct Module for enum Call where origin: T::Origin { + /// Predefined errors + type Error = Error; - /// Voting period for the 'set working group mint capacity' proposal - pub SetWorkingGroupMintCapacityProposalVotingPeriod get(fn set_working_group_mint_capacity_proposal_voting_period) - config(): T::BlockNumber; + /// Exports 'Set validator count' proposal parameters. + const SetValidatorCountProposalParameters: ProposalParameters> + = T::SetValidatorCountProposalParameters::get(); - /// Grace period for the 'set working group mint capacity' proposal - pub SetWorkingGroupMintCapacityProposalGracePeriod get(fn set_working_group_mint_capacity_proposal_grace_period) - config(): T::BlockNumber; + /// Exports 'Runtime upgrade' proposal parameters. + const RuntimeUpgradeProposalParameters: ProposalParameters> + = T::RuntimeUpgradeProposalParameters::get(); - /// Voting period for the 'decrease working group leader stake' proposal - pub DecreaseWorkingGroupLeaderStakeProposalVotingPeriod get(fn decrease_working_group_leader_stake_proposal_voting_period) - config(): T::BlockNumber; + /// Exports 'Text' proposal parameters. + const TextProposalParameters: ProposalParameters> + = T::TextProposalParameters::get(); - /// Grace period for the 'decrease working group leader stake' proposal - pub DecreaseWorkingGroupLeaderStakeProposalGracePeriod get(fn decrease_working_group_leader_stake_proposal_grace_period) - config(): T::BlockNumber; + /// Exports 'Spending' proposal parameters. + const SpendingProposalParameters: ProposalParameters> + = T::SpendingProposalParameters::get(); - /// Voting period for the 'slash working group leader stake' proposal - pub SlashWorkingGroupLeaderStakeProposalVotingPeriod get(fn slash_working_group_leader_stake_proposal_voting_period) - config(): T::BlockNumber; + /// Exports 'Add working group opening' proposal parameters. + const AddWorkingGroupOpeningProposalParameters: ProposalParameters> + = T::AddWorkingGroupOpeningProposalParameters::get(); - /// Grace period for the 'slash working group leader stake' proposal - pub SlashWorkingGroupLeaderStakeProposalGracePeriod get(fn slash_working_group_leader_stake_proposal_grace_period) - config(): T::BlockNumber; + /// Exports 'Begin review working group applications' proposal parameters. + const BeginReviewWorkingGroupApplicationsProposalParameters: ProposalParameters> + = T::BeginReviewWorkingGroupApplicationsProposalParameters::get(); - /// Voting period for the 'set working group leader reward' proposal - pub SetWorkingGroupLeaderRewardProposalVotingPeriod get(fn set_working_group_leader_reward_proposal_voting_period) - config(): T::BlockNumber; + /// Exports 'Fill working group opening' proposal parameters. + const FillWorkingGroupOpeningProposalParameters: ProposalParameters> + = T::FillWorkingGroupOpeningProposalParameters::get(); - /// Grace period for the 'set working group leader reward' proposal - pub SetWorkingGroupLeaderRewardProposalGracePeriod get(fn set_working_group_leader_reward_proposal_grace_period) - config(): T::BlockNumber; + /// Exports 'Set working group mint capacity' proposal parameters. + const SetWorkingGroupMintCapacityProposalParameters: ProposalParameters> + = T::SetWorkingGroupMintCapacityProposalParameters::get(); - /// Voting period for the 'terminate working group leader role' proposal - pub TerminateWorkingGroupLeaderRoleProposalVotingPeriod get(fn terminate_working_group_leader_role_proposal_voting_period) - config(): T::BlockNumber; + /// Exports 'Decrease working group leader stake' proposal parameters. + const DecreaseWorkingGroupLeaderStakeProposalParameters: ProposalParameters> + = T::DecreaseWorkingGroupLeaderStakeProposalParameters::get(); - /// Grace period for the 'terminate working group leader role' proposal - pub TerminateWorkingGroupLeaderRoleProposalGracePeriod get(fn terminate_working_group_leader_role_proposal_grace_period) - config(): T::BlockNumber; + /// Exports 'Slash working group leader stake' proposal parameters. + const SlashWorkingGroupLeaderStakeProposalParameters: ProposalParameters> + = T::SlashWorkingGroupLeaderStakeProposalParameters::get(); - /// Voting period for the 'amend constitution' proposal - pub AmendConstitutionProposalVotingPeriod get(fn amend_constitution_proposal_voting_period) - config(): T::BlockNumber; + /// Exports 'Set working group leader reward' proposal parameters. + const SetWorkingGroupLeaderRewardProposalParameters: ProposalParameters> + = T::SetWorkingGroupLeaderRewardProposalParameters::get(); - /// Grace period for the 'amend constitution' proposal - pub AmendConstitutionProposalGracePeriod get(fn amend_constitution_proposal_grace_period) - config(): T::BlockNumber; - } -} + /// Exports 'Terminate working group leader role' proposal parameters. + const TerminateWorkingGroupLeaderRoleProposalParameters: ProposalParameters> + = T::TerminateWorkingGroupLeaderRoleProposalParameters::get(); -decl_module! { - /// Proposal codex substrate module Call - pub struct Module for enum Call where origin: T::Origin { - /// Predefined errors - type Error = Error; + /// Exports 'Amend constitution' proposal parameters. + const AmendConstitutionProposalParameters: ProposalParameters> + = T::AmendConstitutionProposalParameters::get(); /// Exports max allowed text proposal length const. const TextProposalMaxLength: u32 = T::TextProposalMaxLength::get(); @@ -327,15 +346,6 @@ decl_module! { /// Exports max wasm code length of the runtime upgrade proposal const. const RuntimeUpgradeWasmProposalMaxLength: u32 = T::RuntimeUpgradeWasmProposalMaxLength::get(); - // Runtime upgrade summary: - // - add values for the new 'amend constitution' proposal. - fn on_runtime_upgrade() -> frame_support::weights::Weight { - >::put::(72_000u32.into()); - >::put::(0u32.into()); - - 10_000_000u64 // TODO: adjust weight - } - /// Create 'Text (signal)' proposal type. #[weight = 10_000_000] // TODO: adjust weight pub fn create_text_proposal( @@ -359,7 +369,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::text_proposal::(), + proposal_parameters: T::TextProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block }; @@ -391,7 +401,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::runtime_upgrade_proposal::(), + proposal_parameters: T::RuntimeUpgradeProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -426,7 +436,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::spending_proposal::(), + proposal_parameters: T::SpendingProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -464,7 +474,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::set_validator_count_proposal::(), + proposal_parameters: T::SetValidatorCountProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -492,7 +502,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::add_working_group_leader_opening_proposal::(), + proposal_parameters: T::AddWorkingGroupOpeningProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -521,7 +531,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::begin_review_working_group_leader_applications_proposal::(), + proposal_parameters: T::BeginReviewWorkingGroupApplicationsProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -554,7 +564,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::fill_working_group_leader_opening_proposal::(), + proposal_parameters: T::FillWorkingGroupOpeningProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -588,7 +598,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::set_working_group_mint_capacity_proposal::(), + proposal_parameters: T::SetWorkingGroupMintCapacityProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -625,7 +635,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::decrease_working_group_leader_stake_proposal::(), + proposal_parameters: T::DecreaseWorkingGroupLeaderStakeProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -662,7 +672,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::slash_working_group_leader_stake_proposal::(), + proposal_parameters: T::SlashWorkingGroupLeaderStakeProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -697,7 +707,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::set_working_group_leader_reward_proposal::(), + proposal_parameters: T::SetWorkingGroupLeaderRewardProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -726,7 +736,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::terminate_working_group_leader_role_proposal::(), + proposal_parameters: T::TerminateWorkingGroupLeaderRoleProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -755,7 +765,7 @@ decl_module! { description, staking_account_id, proposal_details: proposal_details.clone(), - proposal_parameters: proposal_types::parameters::amend_constitution_proposal::(), + proposal_parameters: T::AmendConstitutionProposalParameters::get(), proposal_code: T::ProposalEncoder::encode_proposal(proposal_details), exact_execution_block, }; @@ -838,89 +848,6 @@ impl Module { Ok(()) } - - /// Sets config values for the proposals. - /// Should be called on the migration to the new runtime version. - pub fn set_config_values(p: ProposalsConfigParameters) { - >::put(T::BlockNumber::from( - p.set_validator_count_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.set_validator_count_proposal_grace_period, - )); - >::put(T::BlockNumber::from( - p.runtime_upgrade_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.runtime_upgrade_proposal_grace_period, - )); - >::put(T::BlockNumber::from(p.text_proposal_voting_period)); - >::put(T::BlockNumber::from(p.text_proposal_grace_period)); - >::put(T::BlockNumber::from( - p.spending_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.spending_proposal_grace_period, - )); - >::put(T::BlockNumber::from( - p.add_working_group_opening_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.add_working_group_opening_proposal_grace_period, - )); - >::put( - T::BlockNumber::from( - p.begin_review_working_group_leader_applications_proposal_voting_period, - ), - ); - >::put( - T::BlockNumber::from( - p.begin_review_working_group_leader_applications_proposal_grace_period, - ), - ); - >::put(T::BlockNumber::from( - p.fill_working_group_leader_opening_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.fill_working_group_leader_opening_proposal_grace_period, - )); - >::put(T::BlockNumber::from( - p.set_working_group_mint_capacity_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.set_working_group_mint_capacity_proposal_grace_period, - )); - >::put(T::BlockNumber::from( - p.decrease_working_group_leader_stake_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.decrease_working_group_leader_stake_proposal_grace_period, - )); - >::put(T::BlockNumber::from( - p.slash_working_group_leader_stake_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.slash_working_group_leader_stake_proposal_grace_period, - )); - >::put(T::BlockNumber::from( - p.set_working_group_leader_reward_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.set_working_group_leader_reward_proposal_grace_period, - )); - >::put(T::BlockNumber::from( - p.terminate_working_group_leader_role_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.terminate_working_group_leader_role_proposal_grace_period, - )); - >::put(T::BlockNumber::from( - p.amend_constitution_proposal_voting_period, - )); - >::put(T::BlockNumber::from( - p.amend_constitution_proposal_grace_period, - )); - } } impl ProposalObserver for Module { diff --git a/runtime-modules/proposals/codex/src/proposal_types/mod.rs b/runtime-modules/proposals/codex/src/proposal_types/mod.rs index c429083af8..e317743d12 100644 --- a/runtime-modules/proposals/codex/src/proposal_types/mod.rs +++ b/runtime-modules/proposals/codex/src/proposal_types/mod.rs @@ -1,7 +1,5 @@ #![warn(missing_docs)] -pub(crate) mod parameters; - use codec::{Decode, Encode}; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; @@ -213,174 +211,3 @@ pub struct RoleParameters { /// Small fee burned to make a request to enter role. pub entry_request_fee: Balance, } - -/// Contains proposal config parameters. Default values are used by migration and genesis config. -#[derive(Copy, Clone)] -pub struct ProposalsConfigParameters { - /// 'Set validator count' proposal voting period - pub set_validator_count_proposal_voting_period: u32, - - /// 'Set validator count' proposal grace period - pub set_validator_count_proposal_grace_period: u32, - - /// 'Runtime upgrade' proposal voting period - pub runtime_upgrade_proposal_voting_period: u32, - - /// 'Runtime upgrade' proposal grace period - pub runtime_upgrade_proposal_grace_period: u32, - - /// 'Text' proposal voting period - pub text_proposal_voting_period: u32, - - /// 'Text' proposal grace period - pub text_proposal_grace_period: u32, - - /// 'Set election parameters' proposal voting period - pub set_election_parameters_proposal_voting_period: u32, - - /// 'Set election parameters' proposal grace period - pub set_election_parameters_proposal_grace_period: u32, - - /// 'Set lead' proposal voting period - pub set_lead_proposal_voting_period: u32, - - /// 'Set lead' proposal grace period - pub set_lead_proposal_grace_period: u32, - - /// 'Spending' proposal voting period - pub spending_proposal_voting_period: u32, - - /// 'Spending' proposal grace period - pub spending_proposal_grace_period: u32, - - /// 'Add working group opening' proposal voting period - pub add_working_group_opening_proposal_voting_period: u32, - - /// 'Add working group opening' proposal grace period - pub add_working_group_opening_proposal_grace_period: u32, - - /// 'Begin review working group leader applications' proposal voting period - pub begin_review_working_group_leader_applications_proposal_voting_period: u32, - - /// 'Begin review working group leader applications' proposal grace period - pub begin_review_working_group_leader_applications_proposal_grace_period: u32, - - /// 'Fill working group leader opening' proposal voting period - pub fill_working_group_leader_opening_proposal_voting_period: u32, - - /// 'Fill working group leader opening' proposal grace period - pub fill_working_group_leader_opening_proposal_grace_period: u32, - - /// 'Set working group mint capacity' proposal voting period - pub set_working_group_mint_capacity_proposal_voting_period: u32, - - /// 'Set working group mint capacity' proposal grace period - pub set_working_group_mint_capacity_proposal_grace_period: u32, - - /// 'Decrease working group leader stake' proposal voting period - pub decrease_working_group_leader_stake_proposal_voting_period: u32, - - /// 'Decrease working group leader stake' proposal grace period - pub decrease_working_group_leader_stake_proposal_grace_period: u32, - - /// 'Slash working group leader stake' proposal voting period - pub slash_working_group_leader_stake_proposal_voting_period: u32, - - /// 'Slash working group leader stake' proposal grace period - pub slash_working_group_leader_stake_proposal_grace_period: u32, - - /// 'Set working group leader reward' proposal voting period - pub set_working_group_leader_reward_proposal_voting_period: u32, - - /// 'Set working group leader reward' proposal grace period - pub set_working_group_leader_reward_proposal_grace_period: u32, - - /// 'Terminate working group leader role' proposal voting period - pub terminate_working_group_leader_role_proposal_voting_period: u32, - - /// 'Terminate working group leader role' proposal grace period - pub terminate_working_group_leader_role_proposal_grace_period: u32, - - /// 'Amend constitution' proposal voting period - pub amend_constitution_proposal_voting_period: u32, - - /// 'Amend constitution' proposal grace period - pub amend_constitution_proposal_grace_period: u32, -} - -impl Default for ProposalsConfigParameters { - fn default() -> Self { - ProposalsConfigParameters { - set_validator_count_proposal_voting_period: 43200u32, - set_validator_count_proposal_grace_period: 0u32, - runtime_upgrade_proposal_voting_period: 72000u32, - runtime_upgrade_proposal_grace_period: 72000u32, - text_proposal_voting_period: 72000u32, - text_proposal_grace_period: 0u32, - set_election_parameters_proposal_voting_period: 72000u32, - set_election_parameters_proposal_grace_period: 201_601_u32, - set_lead_proposal_voting_period: 43200u32, - set_lead_proposal_grace_period: 0u32, - spending_proposal_voting_period: 72000u32, - spending_proposal_grace_period: 14400u32, - add_working_group_opening_proposal_voting_period: 72000u32, - add_working_group_opening_proposal_grace_period: 0u32, - begin_review_working_group_leader_applications_proposal_voting_period: 43200u32, - begin_review_working_group_leader_applications_proposal_grace_period: 14400u32, - fill_working_group_leader_opening_proposal_voting_period: 43200u32, - fill_working_group_leader_opening_proposal_grace_period: 0u32, - set_working_group_mint_capacity_proposal_voting_period: 43200u32, - set_working_group_mint_capacity_proposal_grace_period: 0u32, - decrease_working_group_leader_stake_proposal_voting_period: 43200u32, - decrease_working_group_leader_stake_proposal_grace_period: 0u32, - slash_working_group_leader_stake_proposal_voting_period: 43200u32, - slash_working_group_leader_stake_proposal_grace_period: 0u32, - set_working_group_leader_reward_proposal_voting_period: 43200u32, - set_working_group_leader_reward_proposal_grace_period: 0u32, - terminate_working_group_leader_role_proposal_voting_period: 72200u32, - terminate_working_group_leader_role_proposal_grace_period: 0u32, - amend_constitution_proposal_voting_period: 72200u32, - amend_constitution_proposal_grace_period: 72200u32, - } - } -} - -impl ProposalsConfigParameters { - /// Set same voting_period for all proposals. For proposals - /// that by default have 0 grace period remain with 0 grace period. - /// All remaining proposals get assigned grace_period. - pub fn with_grace_and_voting_periods(grace_period: u32, voting_period: u32) -> Self { - ProposalsConfigParameters { - set_validator_count_proposal_voting_period: voting_period, - set_validator_count_proposal_grace_period: 0, - runtime_upgrade_proposal_voting_period: voting_period, - runtime_upgrade_proposal_grace_period: grace_period, - text_proposal_voting_period: voting_period, - text_proposal_grace_period: 0, - set_election_parameters_proposal_voting_period: voting_period, - set_election_parameters_proposal_grace_period: grace_period, - set_lead_proposal_voting_period: voting_period, - set_lead_proposal_grace_period: 0, - spending_proposal_voting_period: voting_period, - spending_proposal_grace_period: grace_period, - add_working_group_opening_proposal_voting_period: voting_period, - add_working_group_opening_proposal_grace_period: 0, - begin_review_working_group_leader_applications_proposal_voting_period: voting_period, - begin_review_working_group_leader_applications_proposal_grace_period: grace_period, - fill_working_group_leader_opening_proposal_voting_period: voting_period, - fill_working_group_leader_opening_proposal_grace_period: 0, - set_working_group_mint_capacity_proposal_voting_period: voting_period, - set_working_group_mint_capacity_proposal_grace_period: 0, - decrease_working_group_leader_stake_proposal_voting_period: voting_period, - decrease_working_group_leader_stake_proposal_grace_period: 0, - slash_working_group_leader_stake_proposal_voting_period: voting_period, - slash_working_group_leader_stake_proposal_grace_period: 0, - set_working_group_leader_reward_proposal_voting_period: voting_period, - set_working_group_leader_reward_proposal_grace_period: 0, - terminate_working_group_leader_role_proposal_voting_period: voting_period, - terminate_working_group_leader_role_proposal_grace_period: 0, - amend_constitution_proposal_voting_period: voting_period, - amend_constitution_proposal_grace_period: 0, - } - } -} diff --git a/runtime-modules/proposals/codex/src/proposal_types/parameters.rs b/runtime-modules/proposals/codex/src/proposal_types/parameters.rs deleted file mode 100644 index 739b477ff4..0000000000 --- a/runtime-modules/proposals/codex/src/proposal_types/parameters.rs +++ /dev/null @@ -1,197 +0,0 @@ -use crate::{BalanceOf, Module, ProposalParameters}; - -// Proposal parameters for the 'Set validator count' proposal -pub(crate) fn set_validator_count_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::set_validator_count_proposal_voting_period(), - grace_period: >::set_validator_count_proposal_grace_period(), - approval_quorum_percentage: 66, - approval_threshold_percentage: 80, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(100_000_u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the upgrade runtime proposal -pub(crate) fn runtime_upgrade_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::runtime_upgrade_proposal_voting_period(), - grace_period: >::runtime_upgrade_proposal_grace_period(), - approval_quorum_percentage: 80, - approval_threshold_percentage: 100, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(1_000_000_u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the text proposal -pub(crate) fn text_proposal() -> ProposalParameters> { - ProposalParameters { - voting_period: >::text_proposal_voting_period(), - grace_period: >::text_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 80, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(25000u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Spending' proposal -pub(crate) fn spending_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::spending_proposal_voting_period(), - grace_period: >::spending_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 80, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(25000u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Add working group leader' proposal -pub(crate) fn add_working_group_leader_opening_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::add_working_group_opening_proposal_voting_period(), - grace_period: >::add_working_group_opening_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 80, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(100_000_u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Begin review working group leader applications' proposal -pub(crate) fn begin_review_working_group_leader_applications_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: - >::begin_review_working_group_leader_applications_proposal_voting_period(), - grace_period: - >::begin_review_working_group_leader_applications_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 75, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(25000u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Fill working group leader opening' proposal -pub(crate) fn fill_working_group_leader_opening_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::fill_working_group_leader_opening_proposal_voting_period(), - grace_period: >::fill_working_group_leader_opening_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 75, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(50000u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Set working group mint capacity' proposal -pub(crate) fn set_working_group_mint_capacity_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::set_working_group_mint_capacity_proposal_voting_period(), - grace_period: >::set_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)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Decrease working group leader stake' proposal -pub(crate) fn decrease_working_group_leader_stake_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::decrease_working_group_leader_stake_proposal_voting_period(), - grace_period: >::decrease_working_group_leader_stake_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 75, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(50000u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Slash working group leader stake' proposal -pub(crate) fn slash_working_group_leader_stake_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::slash_working_group_leader_stake_proposal_voting_period(), - grace_period: >::slash_working_group_leader_stake_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 75, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(50000u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Set working group leader reward' proposal -pub(crate) fn set_working_group_leader_reward_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::set_working_group_leader_reward_proposal_voting_period(), - grace_period: >::set_working_group_leader_reward_proposal_grace_period(), - approval_quorum_percentage: 60, - approval_threshold_percentage: 75, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(50000u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Terminate working group leader role' proposal -pub(crate) fn terminate_working_group_leader_role_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::terminate_working_group_leader_role_proposal_voting_period(), - grace_period: >::terminate_working_group_leader_role_proposal_grace_period(), - approval_quorum_percentage: 66, - approval_threshold_percentage: 80, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(100_000_u32)), - constitutionality: 1, - } -} - -// Proposal parameters for the 'Amend constitution' proposal -pub(crate) fn amend_constitution_proposal( -) -> ProposalParameters> { - ProposalParameters { - voting_period: >::amend_constitution_proposal_voting_period(), - grace_period: >::amend_constitution_proposal_grace_period(), - approval_quorum_percentage: 80, - approval_threshold_percentage: 100, - slashing_quorum_percentage: 60, - slashing_threshold_percentage: 80, - required_stake: Some(>::from(1_000_000_u32)), - constitutionality: 1, - } -} diff --git a/runtime-modules/proposals/codex/src/tests/mock.rs b/runtime-modules/proposals/codex/src/tests/mock.rs index 989f803144..72dd754a97 100644 --- a/runtime-modules/proposals/codex/src/tests/mock.rs +++ b/runtime-modules/proposals/codex/src/tests/mock.rs @@ -12,7 +12,7 @@ use sp_runtime::{ use sp_staking::SessionIndex; pub use system; -use crate::{ProposalDetailsOf, ProposalEncoder}; +use crate::{ProposalDetailsOf, ProposalEncoder, ProposalParameters}; use proposals_engine::VotersParameters; use sp_runtime::testing::TestXt; @@ -250,11 +250,41 @@ impl staking::SessionInterface for Test { } } +parameter_types! { + pub DefaultProposalParameters: ProposalParameters = default_proposal_parameters(); +} + +pub(crate) fn default_proposal_parameters() -> ProposalParameters { + ProposalParameters { + voting_period: 43200, + grace_period: 0, + approval_quorum_percentage: 66, + approval_threshold_percentage: 80, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(100_000), + constitutionality: 1, + } +} + impl crate::Trait for Test { type TextProposalMaxLength = TextProposalMaxLength; type RuntimeUpgradeWasmProposalMaxLength = RuntimeUpgradeWasmProposalMaxLength; type MembershipOriginValidator = (); type ProposalEncoder = (); + type SetValidatorCountProposalParameters = DefaultProposalParameters; + type RuntimeUpgradeProposalParameters = DefaultProposalParameters; + type TextProposalParameters = DefaultProposalParameters; + type SpendingProposalParameters = DefaultProposalParameters; + type AddWorkingGroupOpeningProposalParameters = DefaultProposalParameters; + type BeginReviewWorkingGroupApplicationsProposalParameters = DefaultProposalParameters; + type FillWorkingGroupOpeningProposalParameters = DefaultProposalParameters; + type SetWorkingGroupMintCapacityProposalParameters = DefaultProposalParameters; + type DecreaseWorkingGroupLeaderStakeProposalParameters = DefaultProposalParameters; + type SlashWorkingGroupLeaderStakeProposalParameters = DefaultProposalParameters; + type SetWorkingGroupLeaderRewardProposalParameters = DefaultProposalParameters; + type TerminateWorkingGroupLeaderRoleProposalParameters = DefaultProposalParameters; + type AmendConstitutionProposalParameters = DefaultProposalParameters; } impl ProposalEncoder for () { diff --git a/runtime-modules/proposals/codex/src/tests/mod.rs b/runtime-modules/proposals/codex/src/tests/mod.rs index 6c3ac5f70a..b179d8c026 100644 --- a/runtime-modules/proposals/codex/src/tests/mod.rs +++ b/runtime-modules/proposals/codex/src/tests/mod.rs @@ -10,7 +10,6 @@ use hiring::ActivateOpeningAt; use proposals_engine::ProposalParameters; use working_group::OpeningPolicyCommitment; -use crate::proposal_types::ProposalsConfigParameters; use crate::*; use crate::{Error, ProposalDetails}; pub use mock::*; @@ -129,7 +128,7 @@ fn create_text_proposal_common_checks_succeed() { None, ) }, - proposal_parameters: crate::proposal_types::parameters::text_proposal::(), + proposal_parameters: ::TextProposalParameters::get(), proposal_details: ProposalDetails::Text(b"text".to_vec()), }; proposal_fixture.check_all(); @@ -209,7 +208,7 @@ fn create_runtime_upgrade_common_checks_succeed() { None, ) }, - proposal_parameters: crate::proposal_types::parameters::runtime_upgrade_proposal::(), + proposal_parameters: ::RuntimeUpgradeProposalParameters::get(), proposal_details: ProposalDetails::RuntimeUpgrade(b"wasm".to_vec()), }; proposal_fixture.check_all(); @@ -292,7 +291,7 @@ fn create_spending_proposal_common_checks_succeed() { None, ) }, - proposal_parameters: crate::proposal_types::parameters::spending_proposal::(), + proposal_parameters: ::SpendingProposalParameters::get(), proposal_details: ProposalDetails::Spending(100, 2), }; proposal_fixture.check_all(); @@ -373,9 +372,7 @@ fn create_set_validator_count_proposal_common_checks_succeed() { None, ) }, - proposal_parameters: crate::proposal_types::parameters::set_validator_count_proposal::< - Test, - >(), + proposal_parameters: ::SetValidatorCountProposalParameters::get(), proposal_details: ProposalDetails::SetValidatorCount(4), }; proposal_fixture.check_all(); @@ -413,115 +410,6 @@ fn create_set_validator_count_proposal_failed_with_invalid_validator_count() { }); } -#[test] -fn set_default_proposal_parameters_succeeded() { - initial_test_ext().execute_with(|| { - let p = ProposalsConfigParameters::default(); - - // nothing is set - assert_eq!(>::get(), 0); - - ProposalCodex::set_config_values(p); - - assert_eq!( - >::get(), - p.set_validator_count_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.set_validator_count_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.runtime_upgrade_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.runtime_upgrade_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.text_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.text_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.spending_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.spending_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.add_working_group_opening_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.add_working_group_opening_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.begin_review_working_group_leader_applications_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.begin_review_working_group_leader_applications_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.fill_working_group_leader_opening_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.fill_working_group_leader_opening_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.set_working_group_mint_capacity_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.set_working_group_mint_capacity_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.decrease_working_group_leader_stake_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.decrease_working_group_leader_stake_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.slash_working_group_leader_stake_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.slash_working_group_leader_stake_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.set_working_group_leader_reward_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.set_working_group_leader_reward_proposal_grace_period as u64 - ); - assert_eq!( - >::get(), - p.terminate_working_group_leader_role_proposal_voting_period as u64 - ); - assert_eq!( - >::get(), - p.terminate_working_group_leader_role_proposal_grace_period as u64 - ); - }); -} - #[test] fn create_add_working_group_leader_opening_proposal_common_checks_succeed() { // This uses strum crate for enum iteration @@ -577,10 +465,11 @@ fn run_create_add_working_group_leader_opening_proposal_common_checks_succeed( None, ) }, - proposal_parameters: crate::proposal_types::parameters::add_working_group_leader_opening_proposal::< - Test, - >(), - proposal_details: ProposalDetails::AddWorkingGroupLeaderOpening(add_opening_parameters.clone()), + proposal_parameters: + ::AddWorkingGroupOpeningProposalParameters::get(), + proposal_details: ProposalDetails::AddWorkingGroupLeaderOpening( + add_opening_parameters.clone(), + ), }; proposal_fixture.check_all(); }); @@ -641,9 +530,7 @@ fn run_create_begin_review_working_group_leader_applications_proposal_common_che None, ) }, - proposal_parameters: crate::proposal_types::parameters::begin_review_working_group_leader_applications_proposal::< - Test, - >(), + proposal_parameters: ::BeginReviewWorkingGroupApplicationsProposalParameters::get(), proposal_details: ProposalDetails::BeginReviewWorkingGroupLeaderApplications(opening_id, working_group), }; @@ -708,10 +595,11 @@ fn run_create_fill_working_group_leader_opening_proposal_common_checks_succeed( None, ) }, - proposal_parameters: crate::proposal_types::parameters::fill_working_group_leader_opening_proposal::< - Test, - >(), - proposal_details: ProposalDetails::FillWorkingGroupLeaderOpening(fill_opening_parameters.clone()), + proposal_parameters: + ::FillWorkingGroupOpeningProposalParameters::get(), + proposal_details: ProposalDetails::FillWorkingGroupLeaderOpening( + fill_opening_parameters.clone(), + ), }; proposal_fixture.check_all(); }); @@ -799,8 +687,7 @@ fn run_create_set_working_group_mint_capacity_proposal_common_checks_succeed( ) }, proposal_parameters: - crate::proposal_types::parameters::set_working_group_mint_capacity_proposal::( - ), + ::SetWorkingGroupMintCapacityProposalParameters::get(), proposal_details: ProposalDetails::SetWorkingGroupMintCapacity(10, working_group), }; proposal_fixture.check_all(); @@ -862,9 +749,7 @@ fn run_create_decrease_working_group_leader_stake_proposal_common_checks_succeed ) }, proposal_parameters: - crate::proposal_types::parameters::decrease_working_group_leader_stake_proposal::< - Test, - >(), + ::DecreaseWorkingGroupLeaderStakeProposalParameters::get(), proposal_details: ProposalDetails::DecreaseWorkingGroupLeaderStake( 10, 10, @@ -900,7 +785,7 @@ fn run_create_slash_working_group_leader_stake_proposal_common_checks_succeed( 0, 10, working_group, - None, + None, ) }, empty_stake_call: || { @@ -913,7 +798,7 @@ fn run_create_slash_working_group_leader_stake_proposal_common_checks_succeed( 0, 10, working_group, - None, + None, ) }, successful_call: || { @@ -926,18 +811,12 @@ fn run_create_slash_working_group_leader_stake_proposal_common_checks_succeed( 10, 10, working_group, - None, + None, ) }, proposal_parameters: - crate::proposal_types::parameters::slash_working_group_leader_stake_proposal::< - Test, - >(), - proposal_details: ProposalDetails::SlashWorkingGroupLeaderStake( - 10, - 10, - working_group, - ), + ::SlashWorkingGroupLeaderStakeProposalParameters::get(), + proposal_details: ProposalDetails::SlashWorkingGroupLeaderStake(10, 10, working_group), }; proposal_fixture.check_all(); }); @@ -1068,8 +947,7 @@ fn run_create_set_working_group_leader_reward_proposal_common_checks_succeed( ) }, proposal_parameters: - crate::proposal_types::parameters::set_working_group_leader_reward_proposal::( - ), + ::SlashWorkingGroupLeaderStakeProposalParameters::get(), proposal_details: ProposalDetails::SetWorkingGroupLeaderReward(10, 10, working_group), }; proposal_fixture.check_all(); @@ -1132,9 +1010,7 @@ fn run_create_terminate_working_group_leader_role_proposal_common_checks_succeed ) }, proposal_parameters: - crate::proposal_types::parameters::terminate_working_group_leader_role_proposal::< - Test, - >(), + ::TerminateWorkingGroupLeaderRoleProposalParameters::get(), proposal_details: ProposalDetails::TerminateWorkingGroupLeaderRole( terminate_role_parameters.clone(), ), @@ -1182,9 +1058,7 @@ fn create_amend_constitution_proposal_common_checks_succeed() { None, ) }, - proposal_parameters: crate::proposal_types::parameters::amend_constitution_proposal::< - Test, - >(), + proposal_parameters: ::AmendConstitutionProposalParameters::get(), proposal_details: ProposalDetails::AmendConstitution(b"constitution text".to_vec()), }; proposal_fixture.check_all(); diff --git a/runtime-modules/proposals/discussion/Cargo.toml b/runtime-modules/proposals/discussion/Cargo.toml index 714b15ea86..7c578eae1b 100644 --- a/runtime-modules/proposals/discussion/Cargo.toml +++ b/runtime-modules/proposals/discussion/Cargo.toml @@ -1,6 +1,6 @@ [package] name = 'pallet-proposals-discussion' -version = '3.0.1' +version = '4.0.0' authors = ['Joystream contributors'] edition = '2018' @@ -32,4 +32,4 @@ std = [ 'system/std', 'membership/std', 'common/std', -] +] \ No newline at end of file diff --git a/runtime-modules/proposals/engine/Cargo.toml b/runtime-modules/proposals/engine/Cargo.toml index a2b2455331..0a54997422 100644 --- a/runtime-modules/proposals/engine/Cargo.toml +++ b/runtime-modules/proposals/engine/Cargo.toml @@ -1,6 +1,6 @@ [package] name = 'pallet-proposals-engine' -version = '3.0.0' +version = '4.0.0' authors = ['Joystream contributors'] edition = '2018' diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index a5f6a46051..080581f79e 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -9,6 +9,8 @@ version = '7.6.0' [dependencies] # Third-party dependencies serde = { version = "1.0.101", optional = true, features = ["derive"] } +lazy_static = {version = "1.4.0", features = ["spin_no_std"] } +lite-json = { version = '0.1.3', default-features = false} codec = { package = 'parity-scale-codec', version = '1.3.1', default-features = false, features = ['derive'] } hex-literal = { optional = true, version = '0.3.1' } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 78edab0096..de0bfa5d94 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -16,10 +16,14 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod constants; mod integration; pub mod primitives; +mod proposals_configuration; mod runtime_api; #[cfg(test)] mod tests; // Runtime integration tests +#[macro_use] +extern crate lazy_static; // for proposals_configuration module + use frame_support::traits::{KeyOwnerProofSystem, LockIdentifier}; use frame_support::weights::{ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}, @@ -43,6 +47,7 @@ use system::EnsureRoot; pub use constants::*; pub use primitives::*; +pub use proposals_configuration::*; pub use runtime_api::*; use integration::proposals::{CouncilManager, ExtrinsicProposalEncoder, MembershipOriginValidator}; @@ -52,6 +57,10 @@ use storage::data_object_storage_registry; // Node dependencies pub use common; +pub use content_directory; +pub use content_directory::{ + HashedTextMaxLength, InputValidationLengthConstraint, MaxNumber, TextMaxLength, VecMaxLength, +}; pub use content_working_group as content_wg; pub use forum; pub use governance::election_params::ElectionParameters; @@ -59,17 +68,12 @@ pub use membership; #[cfg(any(feature = "std", test))] pub use pallet_balances::Call as BalancesCall; pub use pallet_staking::StakerStatus; -pub use proposals_codex::ProposalsConfigParameters; +pub use proposals_engine::ProposalParameters; pub use storage::{data_directory, data_object_type_registry}; pub use versioned_store; pub use versioned_store_permissions; pub use working_group; -pub use content_directory; -pub use content_directory::{ - HashedTextMaxLength, InputValidationLengthConstraint, MaxNumber, TextMaxLength, VecMaxLength, -}; - /// This runtime version. pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("joystream-node"), @@ -595,10 +599,29 @@ parameter_types! { } impl proposals_codex::Trait for Runtime { - type MembershipOriginValidator = MembershipOriginValidator; type TextProposalMaxLength = TextProposalMaxLength; type RuntimeUpgradeWasmProposalMaxLength = RuntimeUpgradeWasmProposalMaxLength; + type MembershipOriginValidator = MembershipOriginValidator; type ProposalEncoder = ExtrinsicProposalEncoder; + type SetValidatorCountProposalParameters = SetValidatorCountProposalParameters; + type RuntimeUpgradeProposalParameters = RuntimeUpgradeProposalParameters; + type TextProposalParameters = TextProposalParameters; + type SpendingProposalParameters = SpendingProposalParameters; + type AddWorkingGroupOpeningProposalParameters = AddWorkingGroupOpeningProposalParameters; + type BeginReviewWorkingGroupApplicationsProposalParameters = + BeginReviewWorkingGroupApplicationsProposalParameters; + type FillWorkingGroupOpeningProposalParameters = FillWorkingGroupOpeningProposalParameters; + type SetWorkingGroupMintCapacityProposalParameters = + SetWorkingGroupMintCapacityProposalParameters; + type DecreaseWorkingGroupLeaderStakeProposalParameters = + DecreaseWorkingGroupLeaderStakeProposalParameters; + type SlashWorkingGroupLeaderStakeProposalParameters = + SlashWorkingGroupLeaderStakeProposalParameters; + type SetWorkingGroupLeaderRewardProposalParameters = + SetWorkingGroupLeaderRewardProposalParameters; + type TerminateWorkingGroupLeaderRoleProposalParameters = + TerminateWorkingGroupLeaderRoleProposalParameters; + type AmendConstitutionProposalParameters = AmendConstitutionProposalParameters; } impl constitution::Trait for Runtime { @@ -676,7 +699,7 @@ construct_runtime!( // --- Proposals ProposalsEngine: proposals_engine::{Module, Call, Storage, Event}, ProposalsDiscussion: proposals_discussion::{Module, Call, Storage, Event}, - ProposalsCodex: proposals_codex::{Module, Call, Storage, Config}, + ProposalsCodex: proposals_codex::{Module, Call, Storage}, // --- Working groups // reserved for the future use: ForumWorkingGroup: working_group::::{Module, Call, Storage, Event}, StorageWorkingGroup: working_group::::{Module, Call, Storage, Config, Event}, diff --git a/runtime/src/primitives.rs b/runtime/src/primitives.rs index 912036ed7d..40aa41a168 100644 --- a/runtime/src/primitives.rs +++ b/runtime/src/primitives.rs @@ -1,7 +1,6 @@ //! Low-level types used throughout the Substrate code. #![warn(missing_docs)] - #![cfg_attr(not(feature = "std"), no_std)] use sp_runtime::{ diff --git a/runtime/src/proposals_configuration/defaults.rs b/runtime/src/proposals_configuration/defaults.rs new file mode 100644 index 0000000000..9e419e8c9a --- /dev/null +++ b/runtime/src/proposals_configuration/defaults.rs @@ -0,0 +1,189 @@ +//! This module contains default parameters for the runtime codex proposals. + +use crate::{Balance, BlockNumber, ProposalParameters}; + +// Proposal parameters for the 'Set validator count' proposal +pub(crate) fn set_validator_count_proposal() -> ProposalParameters { + ProposalParameters { + voting_period: 43200, + grace_period: 0, + approval_quorum_percentage: 66, + approval_threshold_percentage: 80, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(100_000), + constitutionality: 1, + } +} + +// Proposal parameters for the upgrade runtime proposal +pub(crate) fn runtime_upgrade_proposal() -> ProposalParameters { + ProposalParameters { + voting_period: 72000, + grace_period: 72000, + approval_quorum_percentage: 80, + approval_threshold_percentage: 100, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(1_000_000), + constitutionality: 1, + } +} + +// Proposal parameters for the text proposal +pub(crate) fn text_proposal() -> ProposalParameters { + ProposalParameters { + voting_period: 72000, + grace_period: 0, + approval_quorum_percentage: 60, + approval_threshold_percentage: 80, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(25000), + constitutionality: 1, + } +} + +// Proposal parameters for the 'Spending' proposal +pub(crate) fn spending_proposal() -> ProposalParameters { + ProposalParameters { + voting_period: 72000, + grace_period: 14400, + approval_quorum_percentage: 60, + approval_threshold_percentage: 80, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(25000), + constitutionality: 1, + } +} +// Proposal parameters for the 'Add working group opening' proposal +pub(crate) fn add_working_group_opening_proposal() -> ProposalParameters { + ProposalParameters { + voting_period: 72000, + grace_period: 0, + approval_quorum_percentage: 60, + approval_threshold_percentage: 80, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(100_000), + constitutionality: 1, + } +} + +// Proposal parameters for the 'Begin review working group applications' proposal +pub(crate) fn begin_review_working_group_applications_proposal( +) -> ProposalParameters { + ProposalParameters { + voting_period: 43200, + grace_period: 14400, + approval_quorum_percentage: 60, + approval_threshold_percentage: 75, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(25000), + constitutionality: 1, + } +} + +// Proposal parameters for the 'Fill working group opening' proposal +pub(crate) fn fill_working_group_opening_proposal() -> ProposalParameters { + ProposalParameters { + voting_period: 43200, + grace_period: 0, + approval_quorum_percentage: 60, + approval_threshold_percentage: 75, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(50000), + constitutionality: 1, + } +} + +// Proposal parameters for the 'Set working group mint capacity' proposal +pub(crate) fn set_working_group_mint_capacity_proposal() -> ProposalParameters +{ + ProposalParameters { + voting_period: 43200, + grace_period: 0, + approval_quorum_percentage: 60, + approval_threshold_percentage: 75, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(50000), + constitutionality: 1, + } +} + +// Proposal parameters for the 'Decrease working group leader stake' proposal +pub(crate) fn decrease_working_group_leader_stake_proposal( +) -> ProposalParameters { + ProposalParameters { + voting_period: 43200, + grace_period: 0, + approval_quorum_percentage: 60, + approval_threshold_percentage: 75, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(50000), + constitutionality: 1, + } +} + +// Proposal parameters for the 'Slash working group leader stake' proposal +pub fn slash_working_group_leader_stake_proposal() -> ProposalParameters { + ProposalParameters { + voting_period: 43200, + grace_period: 0, + approval_quorum_percentage: 60, + approval_threshold_percentage: 75, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(50000), + constitutionality: 1, + } +} + +// Proposal parameters for the 'Set working group leader reward' proposal +pub(crate) fn set_working_group_leader_reward_proposal() -> ProposalParameters +{ + ProposalParameters { + voting_period: 43200, + grace_period: 0, + approval_quorum_percentage: 60, + approval_threshold_percentage: 75, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(50000), + constitutionality: 1, + } +} + +// Proposal parameters for the 'Terminate working group leader role' proposal +pub(crate) fn terminate_working_group_leader_role_proposal( +) -> ProposalParameters { + ProposalParameters { + voting_period: 72200, + grace_period: 0, + approval_quorum_percentage: 66, + approval_threshold_percentage: 80, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(100_000), + constitutionality: 1, + } +} + +// Proposal parameters for the 'Amend constitution' proposal +pub(crate) fn amend_constitution_proposal() -> ProposalParameters { + ProposalParameters { + voting_period: 72200, + grace_period: 72200, + approval_quorum_percentage: 80, + approval_threshold_percentage: 100, + slashing_quorum_percentage: 60, + slashing_threshold_percentage: 80, + required_stake: Some(1_000_000), + constitutionality: 1, + } +} diff --git a/runtime/src/proposals_configuration/mod.rs b/runtime/src/proposals_configuration/mod.rs new file mode 100644 index 0000000000..58218e14ff --- /dev/null +++ b/runtime/src/proposals_configuration/mod.rs @@ -0,0 +1,269 @@ +//! This module defines a set of the parameters for each proposal in the runtime like +//! _SetValidatorCountProposalParameters_. It is separated because we need to be able to configure +//! these parameters during the compilation time. Main consumer of the conditional compilation planned +//! to be the integration tests. +//! +//! The whole parameter set is initialized only once by deserializing JSON from the environment variable +//! "ALL_PROPOSALS_PARAMETERS_JSON". If it doesn't exists or contains invalid or empty JSON then +//! the default parameters are returned. If some proposal section of the JSON file contains only +//! partial object definition - default values are returned as missing fields. +//! + +use crate::{Balance, BlockNumber, ProposalParameters}; +use frame_support::dispatch::Vec; +use frame_support::parameter_types; +use frame_support::sp_runtime::SaturatedConversion; +use lite_json::{JsonObject, JsonValue}; + +mod defaults; +#[cfg(test)] +mod tests; + +/////////// Proposal parameters definition + +parameter_types! { + pub SetValidatorCountProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.set_validator_count_proposal; + pub RuntimeUpgradeProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.runtime_upgrade_proposal; + pub TextProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.text_proposal; + pub SpendingProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.spending_proposal; + pub AddWorkingGroupOpeningProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.add_working_group_opening_proposal; + pub BeginReviewWorkingGroupApplicationsProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.begin_review_working_group_applications_proposal; + pub FillWorkingGroupOpeningProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.fill_working_group_opening_proposal; + pub SetWorkingGroupMintCapacityProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.set_working_group_mint_capacity_proposal; + pub DecreaseWorkingGroupLeaderStakeProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.decrease_working_group_leader_stake_proposal; + pub SlashWorkingGroupLeaderStakeProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.slash_working_group_leader_stake_proposal; + pub SetWorkingGroupLeaderRewardProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.set_working_group_leader_reward_proposal; + pub TerminateWorkingGroupLeaderRoleProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.terminate_working_group_leader_role_proposal; + pub AmendConstitutionProposalParameters: ProposalParameters = ALL_PROPOSALS_PARAMETERS.amend_constitution_proposal; +} + +/////////// + +struct AllProposalsParameters { + pub set_validator_count_proposal: ProposalParameters, + pub runtime_upgrade_proposal: ProposalParameters, + pub text_proposal: ProposalParameters, + pub spending_proposal: ProposalParameters, + pub add_working_group_opening_proposal: ProposalParameters, + pub begin_review_working_group_applications_proposal: ProposalParameters, + pub fill_working_group_opening_proposal: ProposalParameters, + pub set_working_group_mint_capacity_proposal: ProposalParameters, + pub decrease_working_group_leader_stake_proposal: ProposalParameters, + pub slash_working_group_leader_stake_proposal: ProposalParameters, + pub set_working_group_leader_reward_proposal: ProposalParameters, + pub terminate_working_group_leader_role_proposal: ProposalParameters, + pub amend_constitution_proposal: ProposalParameters, +} + +// to initialize parameters only once. +lazy_static! { + static ref ALL_PROPOSALS_PARAMETERS: AllProposalsParameters = + get_all_proposals_parameters_objects(); +} + +// We need to fail fast. +#[allow(clippy::match_wild_err_arm)] +// Composes AllProposalsParameters object from the JSON string. +// It gets the JSON string from the environment variable and tries to parse it. +// On error and any missing values it gets default values. +fn get_all_proposals_parameters_objects() -> AllProposalsParameters { + let json_str: Option<&'static str> = option_env!("ALL_PROPOSALS_PARAMETERS_JSON"); + + json_str + .map(lite_json::parse_json) + .map(|res| match res { + Ok(json) => Some(json), + Err(_) => { + panic!("Invalid JSON with proposals parameters provided."); + } + }) + .flatten() + .map(convert_json_object_to_proposal_parameters) + .unwrap_or_else(default_parameters) +} + +// Helper macro for initializing single ProposalParameters object for a specified field of the +// AllProposalsParameters object. It helps to reduce duplication of the field names for +// AllProposalsParameters field, JSON object field name and default value function. +// Consider this as duplication example: +// parameters.set_validator_count_proposal = create_proposal_parameters_object( +// json_object, +// "set_validator_count_proposal", +// defaults::set_validator_count_proposal(), +// ); +macro_rules! init_proposal_parameter_object { + ($parameters_object:ident, $jsonObj:expr, $name:ident) => { + $parameters_object.$name = + create_proposal_parameters_object($jsonObj, stringify!($name), defaults::$name()); + }; +} + +// Tries to extract all proposal parameters from the parsed JSON object. +fn convert_json_object_to_proposal_parameters( + json: lite_json::JsonValue, +) -> AllProposalsParameters { + let mut params = default_parameters(); + + if let lite_json::JsonValue::Object(jo) = json { + init_proposal_parameter_object!(params, jo.clone(), set_validator_count_proposal); + init_proposal_parameter_object!(params, jo.clone(), runtime_upgrade_proposal); + init_proposal_parameter_object!(params, jo.clone(), text_proposal); + init_proposal_parameter_object!(params, jo.clone(), spending_proposal); + init_proposal_parameter_object!(params, jo.clone(), add_working_group_opening_proposal); + init_proposal_parameter_object!( + params, + jo.clone(), + begin_review_working_group_applications_proposal + ); + init_proposal_parameter_object!(params, jo.clone(), fill_working_group_opening_proposal); + init_proposal_parameter_object!( + params, + jo.clone(), + set_working_group_mint_capacity_proposal + ); + init_proposal_parameter_object!( + params, + jo.clone(), + decrease_working_group_leader_stake_proposal + ); + init_proposal_parameter_object!( + params, + jo.clone(), + slash_working_group_leader_stake_proposal + ); + init_proposal_parameter_object!( + params, + jo.clone(), + set_working_group_leader_reward_proposal + ); + init_proposal_parameter_object!( + params, + jo.clone(), + terminate_working_group_leader_role_proposal + ); + init_proposal_parameter_object!(params, jo, amend_constitution_proposal); + } + + params +} + +// Tries to create specific ProposalParameters object from the parsed JSON object. +// Returns default parameters on missing values. +fn create_proposal_parameters_object( + json_object: JsonObject, + proposal_name: &'static str, + defaults: ProposalParameters, +) -> ProposalParameters { + json_object + .iter() + .find(|(name_vec, _)| name_vec.eq(&proposal_name.chars().collect::>())) + .map(|(_, params)| extract_proposal_parameters(params, defaults)) + .unwrap_or(defaults) +} + +// Helper macro for initializing single field of the ProposalParameters object. +// It helps to reduce duplication of the field names for ProposalParameters +// field name, JSON object field name and default value field name. +// Consider this as duplication example: +// ProposalParameters:: { +// voting_period: extract_numeric_parameter( +// json_object, +// "voting_period", +// defaults.voting_period.saturated_into(), +// ) +// .saturated_into(), +// .... +// } +macro_rules! init_proposal_parameter_field { + ($parameters_object:ident, $jsonObj:expr, $default_object:ident, $name:ident) => { + $parameters_object.$name = extract_numeric_parameter( + $jsonObj, + stringify!($name), + $default_object.$name.saturated_into(), + ) + .saturated_into(); + }; +} + +// Helper macro similar to init_proposal_parameter_field but for optional parameters. +// Zero value is wrapped as None. +macro_rules! init_proposal_parameter_optional_field { + ($parameters_object:ident, $jsonObj:expr, $default_object:ident, $name:ident) => { + let param_value = extract_numeric_parameter( + $jsonObj, + stringify!($name), + $default_object.$name.unwrap_or_default().saturated_into(), + ) + .saturated_into(); + let opt_value = if param_value == 0 { + None + } else { + Some(param_value) + }; + + $parameters_object.$name = opt_value; + }; +} + +// Extracts proposal parameters from the parsed JSON object. +fn extract_proposal_parameters( + json_object: &JsonValue, + defaults: ProposalParameters, +) -> ProposalParameters { + let mut params = ProposalParameters::default(); + + init_proposal_parameter_field!(params, json_object, defaults, voting_period); + init_proposal_parameter_field!(params, json_object, defaults, grace_period); + init_proposal_parameter_field!(params, json_object, defaults, approval_quorum_percentage); + init_proposal_parameter_field!(params, json_object, defaults, approval_threshold_percentage); + init_proposal_parameter_field!(params, json_object, defaults, slashing_quorum_percentage); + init_proposal_parameter_field!(params, json_object, defaults, slashing_threshold_percentage); + init_proposal_parameter_optional_field!(params, json_object, defaults, required_stake); + init_proposal_parameter_field!(params, json_object, defaults, constitutionality); + + params +} + +// Extracts a specific numeric parameter from the parsed JSON object. +fn extract_numeric_parameter( + json_object: &JsonValue, + parameter_name: &'static str, + default: u128, +) -> u128 { + match json_object { + JsonValue::Object(json_object) => json_object + .iter() + .find(|(name_vec, _)| name_vec.eq(¶meter_name.chars().collect::>())) + .map(|(_, value)| match value { + JsonValue::Number(number) => number.integer.saturated_into(), + _ => panic!("Incorrect JSON: not a number."), + }) + .unwrap_or(default), + _ => default, + } +} + +// Returns all default proposal parameters. +fn default_parameters() -> AllProposalsParameters { + AllProposalsParameters { + set_validator_count_proposal: defaults::set_validator_count_proposal(), + runtime_upgrade_proposal: defaults::runtime_upgrade_proposal(), + text_proposal: defaults::text_proposal(), + spending_proposal: defaults::spending_proposal(), + add_working_group_opening_proposal: defaults::add_working_group_opening_proposal(), + begin_review_working_group_applications_proposal: + defaults::begin_review_working_group_applications_proposal(), + fill_working_group_opening_proposal: defaults::fill_working_group_opening_proposal(), + set_working_group_mint_capacity_proposal: + defaults::set_working_group_mint_capacity_proposal(), + decrease_working_group_leader_stake_proposal: + defaults::decrease_working_group_leader_stake_proposal(), + slash_working_group_leader_stake_proposal: + defaults::slash_working_group_leader_stake_proposal(), + set_working_group_leader_reward_proposal: + defaults::set_working_group_leader_reward_proposal(), + terminate_working_group_leader_role_proposal: + defaults::terminate_working_group_leader_role_proposal(), + amend_constitution_proposal: defaults::amend_constitution_proposal(), + } +} diff --git a/runtime/src/proposals_configuration/sample_proposal_parameters.json b/runtime/src/proposals_configuration/sample_proposal_parameters.json new file mode 100644 index 0000000000..d49e2d162b --- /dev/null +++ b/runtime/src/proposals_configuration/sample_proposal_parameters.json @@ -0,0 +1,25 @@ +{ + "_comment": "This is a sample 'Proposal parameters' JSON file to enable conditional runtime compilation.", + "set_validator_count_proposal": { + "voting_period": 1, + "grace_period": 2, + "approval_quorum_percentage": 3, + "approval_threshold_percentage": 4, + "slashing_quorum_percentage": 5, + "slashing_threshold_percentage": 6, + "required_stake": 7, + "constitutionality": 8 + }, + "runtime_upgrade_proposal" : {}, + "text_proposal": {}, + "spending_proposal": {}, + "add_working_group_opening_proposal": {}, + "begin_review_working_group_applications_proposal": {}, + "fill_working_group_opening_proposal": {}, + "set_working_group_mint_capacity_proposal": {}, + "decrease_working_group_leader_stake_proposal": {}, + "slash_working_group_leader_stake_proposal": {}, + "set_working_group_leader_reward_proposal": {}, + "terminate_working_group_leader_role_proposal": {}, + "amend_constitution_proposal": {} +} \ No newline at end of file diff --git a/runtime/src/proposals_configuration/tests.rs b/runtime/src/proposals_configuration/tests.rs new file mode 100644 index 0000000000..0f3e1e6e73 --- /dev/null +++ b/runtime/src/proposals_configuration/tests.rs @@ -0,0 +1,20 @@ +use crate::ProposalParameters; + +// Enable during the conditional compilation tests. +#[ignore] +#[test] +fn proposal_parameters_are_initialized() { + let actual_params = super::SetValidatorCountProposalParameters::get(); + let expected_params = ProposalParameters { + voting_period: 1, + grace_period: 2, + approval_quorum_percentage: 3, + approval_threshold_percentage: 4, + slashing_quorum_percentage: 5, + slashing_threshold_percentage: 6, + required_stake: Some(7), + constitutionality: 8, + }; + + assert_eq!(expected_params, actual_params); +} diff --git a/runtime/src/tests/proposals_integration/mod.rs b/runtime/src/tests/proposals_integration/mod.rs index 94e5d0a6d2..a5b123bbdd 100644 --- a/runtime/src/tests/proposals_integration/mod.rs +++ b/runtime/src/tests/proposals_integration/mod.rs @@ -577,6 +577,8 @@ fn spending_proposal_execution_succeeds() { codex_extrinsic_test_fixture.call_extrinsic_and_assert(); + run_to_block(14410); + assert_eq!(Balances::free_balance(converted_account_id), new_balance); }); } @@ -603,6 +605,8 @@ fn set_validator_count_proposal_execution_succeeds() { }); codex_extrinsic_test_fixture.call_extrinsic_and_assert(); + run_to_block(14410); + assert_eq!(::get(), new_validator_count); }); } diff --git a/runtime/src/tests/proposals_integration/working_group_proposals.rs b/runtime/src/tests/proposals_integration/working_group_proposals.rs index b6c430504b..ec40f80ba5 100644 --- a/runtime/src/tests/proposals_integration/working_group_proposals.rs +++ b/runtime/src/tests/proposals_integration/working_group_proposals.rs @@ -441,6 +441,8 @@ fn run_create_begin_review_working_group_leader_applications_proposal_execution_ ); begin_review_applications(member_id, account_id, opening_id, 2, working_group); + let grace_period = 14400; + run_to_block(grace_period + 10); let hiring_opening = Hiring::opening_by_id(hiring_opening_id); assert_eq!( @@ -448,7 +450,7 @@ fn run_create_begin_review_working_group_leader_applications_proposal_execution_ hiring::OpeningStage::Active { stage: hiring::ActiveOpeningStage::ReviewPeriod { started_accepting_applicants_at_block: 0, - started_review_period_at_block: 2, + started_review_period_at_block: grace_period + 2, }, applications_added: BTreeSet::new(), active_application_count: 0, @@ -521,6 +523,9 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { let lead = WorkingGroupInstance::::current_lead(); assert!(lead.is_none()); + let grace_period_for_begin_application_proposal = 14400; + run_to_block(grace_period_for_begin_application_proposal + 20); + fill_opening( member_id, account_id, @@ -531,6 +536,8 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() { working_group, ); + run_to_block(grace_period_for_begin_application_proposal + 30); + let lead = WorkingGroupInstance::::current_lead(); assert!(lead.is_some()); }); diff --git a/utils/chain-spec-builder/src/main.rs b/utils/chain-spec-builder/src/main.rs index c06899d670..90245285ef 100644 --- a/utils/chain-spec-builder/src/main.rs +++ b/utils/chain-spec-builder/src/main.rs @@ -25,7 +25,7 @@ use structopt::StructOpt; use joystream_node::chain_spec::{ self, chain_spec_properties, content_config, forum_config, initial_balances, initial_members, - proposals_config, AccountId, + AccountId, }; use sc_chain_spec::ChainType; @@ -216,7 +216,7 @@ impl ChainSpecBuilder { // as more args will likely be needed #[allow(clippy::too_many_arguments)] fn genesis_constructor( - deployment: &ChainDeployment, + _deployment: &ChainDeployment, authority_seeds: &[String], endowed_accounts: &[AccountId], sudo_account: &AccountId, @@ -269,17 +269,10 @@ fn genesis_constructor( .map(|path| initial_balances::from_json(path.as_path())) .unwrap_or_else(Vec::new); - let proposals_cfg = match deployment { - ChainDeployment::live => proposals_config::production(), - ChainDeployment::staging => proposals_config::staging(), - _ => proposals_config::development(), - }; - chain_spec::testnet_genesis( authorities, sudo_account.clone(), endowed_accounts.to_vec(), - proposals_cfg, members, forum_cfg, versioned_store_cfg,