diff --git a/CHANGELOG.md b/CHANGELOG.md index 01cc7713b6..f05a6deee3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Allow signed origins to send arbitrary XCMs from some system chains ([polkadot-fellows/runtimes#407](https://github.com/polkadot-fellows/runtimes/pull/407)) - Include the Core and Salary pallets into the Fellowship proxy ([polkadot-fellows/runtimes#454](https://github.com/polkadot-fellows/runtimes/pull/454)) +- Add new community democracy and treasuries pallets to Encointer ([polkadot-fellows/runtimes#456](https://github.com/polkadot-fellows/runtimes/pull/456)) ### Fixed diff --git a/Cargo.lock b/Cargo.lock index a34e028c5d..b11a306305 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3918,9 +3918,12 @@ dependencies = [ "pallet-encointer-ceremonies-rpc-runtime-api", "pallet-encointer-communities", "pallet-encointer-communities-rpc-runtime-api", + "pallet-encointer-democracy", "pallet-encointer-faucet", "pallet-encointer-reputation-commitments", "pallet-encointer-scheduler", + "pallet-encointer-treasuries", + "pallet-encointer-treasuries-rpc-runtime-api", "pallet-insecure-randomness-collective-flip", "pallet-membership", "pallet-message-queue", @@ -3979,9 +3982,9 @@ dependencies = [ [[package]] name = "encointer-primitives" -version = "13.2.0" +version = "13.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29aaceec9b0e69c648b760ffdf6b52e21e7a95dc3a3dbae2a0de0745ad43ea00" +checksum = "66f3cfb30d32e288aee27656132ebac5cc30b82ffb7e82eba92e568cdd0b1f25" dependencies = [ "bs58 0.5.0", "crc", @@ -8268,6 +8271,32 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-encointer-democracy" +version = "13.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a85ffc73a3a0f927873ff96116cb994bc68f9fac509a556eb0b053265232724" +dependencies = [ + "encointer-primitives", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-encointer-ceremonies", + "pallet-encointer-communities", + "pallet-encointer-reputation-commitments", + "pallet-encointer-scheduler", + "pallet-encointer-treasuries", + "pallet-timestamp", + "parity-scale-codec", + "scale-info", + "sp-application-crypto 37.0.0", + "sp-core 34.0.0", + "sp-io 37.0.0", + "sp-runtime 38.0.0", + "sp-std", +] + [[package]] name = "pallet-encointer-faucet" version = "13.2.0" @@ -8331,6 +8360,41 @@ dependencies = [ "sp-std", ] +[[package]] +name = "pallet-encointer-treasuries" +version = "13.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65f42991fce5d96f04106e5d27d4c12c77250d70da9ac95497e8fb17a3ebe99f" +dependencies = [ + "approx", + "encointer-primitives", + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-encointer-communities", + "pallet-encointer-reputation-commitments", + "parity-scale-codec", + "scale-info", + "sp-core 34.0.0", + "sp-runtime 38.0.0", + "sp-std", +] + +[[package]] +name = "pallet-encointer-treasuries-rpc-runtime-api" +version = "13.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8bcfc738dde3b75aba337d33ffb9cc109ac5c9f3fed24ce32f1f8c0ee39ab0" +dependencies = [ + "encointer-primitives", + "frame-support", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-std", +] + [[package]] name = "pallet-fast-unstake" version = "35.0.0" diff --git a/Cargo.toml b/Cargo.toml index 4170bed995..3c70df0ac5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,7 +60,7 @@ emulated-integration-tests-common = { version = "11.0.0" } encointer-balances-tx-payment = { version = "~13.1.0", default-features = false } encointer-balances-tx-payment-rpc-runtime-api = { version = "~13.1.0", default-features = false } encointer-kusama-runtime = { path = "system-parachains/encointer" } -encointer-primitives = { version = "~13.2.0", default-features = false } +encointer-primitives = { version = "~13.3.0", default-features = false } enumflags2 = { version = "0.7.7" } frame-benchmarking = { version = "36.0.0", default-features = false } frame-election-provider-support = { version = "36.0.0", default-features = false } @@ -114,9 +114,12 @@ pallet-encointer-ceremonies = { version = "~13.1.0", default-features = false } pallet-encointer-ceremonies-rpc-runtime-api = { version = "~13.1.0", default-features = false } pallet-encointer-communities = { version = "~13.1.0", default-features = false } pallet-encointer-communities-rpc-runtime-api = { version = "~13.1.0", default-features = false } +pallet-encointer-democracy = { version = "~13.3.2", default-features = false } pallet-encointer-faucet = { version = "~13.2.0", default-features = false } pallet-encointer-reputation-commitments = { version = "~13.1.0", default-features = false } pallet-encointer-scheduler = { version = "~13.1.0", default-features = false } +pallet-encointer-treasuries = { version = "~13.3.0", default-features = false } +pallet-encointer-treasuries-rpc-runtime-api = { version = "~13.3.0", default-features = false } pallet-fast-unstake = { version = "35.0.0", default-features = false } pallet-glutton = { version = "22.0.0", default-features = false } pallet-grandpa = { version = "36.0.0", default-features = false } diff --git a/system-parachains/encointer/Cargo.toml b/system-parachains/encointer/Cargo.toml index 4deb4218eb..a6888efe7a 100644 --- a/system-parachains/encointer/Cargo.toml +++ b/system-parachains/encointer/Cargo.toml @@ -36,9 +36,12 @@ pallet-encointer-ceremonies = { workspace = true } pallet-encointer-ceremonies-rpc-runtime-api = { workspace = true } pallet-encointer-communities = { workspace = true } pallet-encointer-communities-rpc-runtime-api = { workspace = true } +pallet-encointer-democracy = { workspace = true } pallet-encointer-faucet = { workspace = true } pallet-encointer-reputation-commitments = { workspace = true } pallet-encointer-scheduler = { workspace = true } +pallet-encointer-treasuries = { workspace = true } +pallet-encointer-treasuries-rpc-runtime-api = { workspace = true } # Substrate @@ -132,9 +135,11 @@ runtime-benchmarks = [ "pallet-encointer-bazaar/runtime-benchmarks", "pallet-encointer-ceremonies/runtime-benchmarks", "pallet-encointer-communities/runtime-benchmarks", + "pallet-encointer-democracy/runtime-benchmarks", "pallet-encointer-faucet/runtime-benchmarks", "pallet-encointer-reputation-commitments/runtime-benchmarks", "pallet-encointer-scheduler/runtime-benchmarks", + "pallet-encointer-treasuries/runtime-benchmarks", "pallet-membership/runtime-benchmarks", "pallet-message-queue/runtime-benchmarks", "pallet-proxy/runtime-benchmarks", @@ -188,9 +193,12 @@ std = [ "pallet-encointer-ceremonies/std", "pallet-encointer-communities-rpc-runtime-api/std", "pallet-encointer-communities/std", + "pallet-encointer-democracy/std", "pallet-encointer-faucet/std", "pallet-encointer-reputation-commitments/std", "pallet-encointer-scheduler/std", + "pallet-encointer-treasuries-rpc-runtime-api/std", + "pallet-encointer-treasuries/std", "pallet-insecure-randomness-collective-flip/std", "pallet-membership/std", "pallet-message-queue/std", @@ -253,9 +261,11 @@ try-runtime = [ "pallet-encointer-bazaar/try-runtime", "pallet-encointer-ceremonies/try-runtime", "pallet-encointer-communities/try-runtime", + "pallet-encointer-democracy/try-runtime", "pallet-encointer-faucet/try-runtime", "pallet-encointer-reputation-commitments/try-runtime", "pallet-encointer-scheduler/try-runtime", + "pallet-encointer-treasuries/try-runtime", "pallet-insecure-randomness-collective-flip/try-runtime", "pallet-membership/try-runtime", "pallet-message-queue/try-runtime", diff --git a/system-parachains/encointer/src/genesis_config_presets.rs b/system-parachains/encointer/src/genesis_config_presets.rs index 8f25c9ae86..79d0dedaf9 100644 --- a/system-parachains/encointer/src/genesis_config_presets.rs +++ b/system-parachains/encointer/src/genesis_config_presets.rs @@ -60,6 +60,36 @@ fn encointer_kusama_genesis( "polkadotXcm": { "safeXcmVersion": Some(SAFE_XCM_VERSION), }, + "encointerScheduler": { + "currentPhase": CeremonyPhaseType::Registering, + "currentCeremonyIndex": 1, + "phaseDurations": vec![ + (CeremonyPhaseType::Registering, 604800000u64), // 7d + (CeremonyPhaseType::Assigning, 86400000u64), // 1d + (CeremonyPhaseType::Attesting, 172800000u64), // 2d + ], + }, + "encointerCeremonies": { + "ceremonyReward": BalanceType::from_num(1), + "timeTolerance": 600_000u64, // +-10min + "locationTolerance": 1_000, // [m] + "endorsementTicketsPerBootstrapper": 10, + "endorsementTicketsPerReputable": 5, + "reputationLifetime": 5, + "inactivityTimeout": 5, // idle ceremonies before purging community + "meetupTimeOffset": 0, + }, + "encointerCommunities": { + "minSolarTripTimeS": 1, // [s] + "maxSpeedMps": 1, // [m/s] suggested would be 83m/s for security, + }, + "encointerBalances": { + // for relative adjustment. + "feeConversionFactor": 7_143u32, + }, + "encointerFaucet": { + "reserveAmount": 10_000_000_000_000u128, + }, // no need to pass anything to aura, in fact it will panic if we do. Session will take care // of this. `aura: Default::default()` }) diff --git a/system-parachains/encointer/src/lib.rs b/system-parachains/encointer/src/lib.rs index d2f1a50110..bf7308ed37 100644 --- a/system-parachains/encointer/src/lib.rs +++ b/system-parachains/encointer/src/lib.rs @@ -59,8 +59,8 @@ use frame_support::{ traits::{ fungibles::{Balanced, Credit}, tokens::{imbalance::ResolveTo, ConversionToAssetBalance}, - ConstBool, ConstU64, Contains, EitherOfDiverse, EqualPrivilegeOnly, InstanceFilter, - TransformOrigin, + ConstBool, ConstU128, ConstU64, Contains, EitherOfDiverse, EqualPrivilegeOnly, + InstanceFilter, TransformOrigin, }, weights::{ConstantMultiplier, Weight, WeightToFee as _}, PalletId, @@ -545,6 +545,29 @@ impl pallet_encointer_faucet::Config for Runtime { type WeightInfo = weights::pallet_encointer_faucet::WeightInfo; } +parameter_types! { + pub const ConfirmationPeriod: Moment = 2 * 24 * 3600 * 1000; // [ms] + pub const ProposalLifetime: Moment = 9 * 24 * 3600 * 1000; // [ms] +} + +impl pallet_encointer_democracy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type MaxReputationCount = ConstU32<64>; + type ConfirmationPeriod = ConfirmationPeriod; + type ProposalLifetime = ProposalLifetime; + type MinTurnout = ConstU128<50>; // perthousand of electorate: 1 = 0.1%, 50 = 5.0% + type WeightInfo = weights::pallet_encointer_democracy::WeightInfo; +} + +parameter_types! { + pub const TreasuriesPalletId: PalletId = PalletId(*b"trsrysId"); +} +impl pallet_encointer_treasuries::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = pallet_balances::Pallet; + type PalletId = TreasuriesPalletId; +} + impl pallet_aura::Config for Runtime { type AuthorityId = AuraId; type DisabledValidators = (); @@ -724,6 +747,8 @@ construct_runtime! { EncointerBazaar: pallet_encointer_bazaar = 64, EncointerReputationCommitments: pallet_encointer_reputation_commitments = 65, EncointerFaucet: pallet_encointer_faucet = 66, + EncointerDemocracy: pallet_encointer_democracy = 67, + EncointerTreasuries: pallet_encointer_treasuries = 68, } } @@ -788,6 +813,7 @@ mod benches { [pallet_encointer_bazaar, EncointerBazaar] [pallet_encointer_ceremonies, EncointerCeremonies] [pallet_encointer_communities, EncointerCommunities] + [pallet_encointer_democracy, EncointerDemocracy] [pallet_encointer_faucet, EncointerFaucet] [pallet_encointer_reputation_commitments, EncointerReputationCommitments] [pallet_encointer_scheduler, EncointerScheduler] @@ -1031,6 +1057,13 @@ impl_runtime_apis! { } } + impl pallet_encointer_treasuries_rpc_runtime_api::TreasuriesApi for Runtime { + + fn get_community_treasury_account_unchecked(maybecid: &Option) -> AccountId { + EncointerTreasuries::get_community_treasury_account_unchecked(*maybecid) + } + } + impl sp_genesis_builder::GenesisBuilder for Runtime { fn build_state(config: Vec) -> sp_genesis_builder::Result { build_state::(config) diff --git a/system-parachains/encointer/src/weights/mod.rs b/system-parachains/encointer/src/weights/mod.rs index eb68c7a362..7b43f4a7a2 100644 --- a/system-parachains/encointer/src/weights/mod.rs +++ b/system-parachains/encointer/src/weights/mod.rs @@ -31,6 +31,7 @@ pub mod pallet_encointer_balances; pub mod pallet_encointer_bazaar; pub mod pallet_encointer_ceremonies; pub mod pallet_encointer_communities; +pub mod pallet_encointer_democracy; pub mod pallet_encointer_faucet; pub mod pallet_encointer_reputation_commitments; pub mod pallet_encointer_scheduler; diff --git a/system-parachains/encointer/src/weights/pallet_encointer_democracy.rs b/system-parachains/encointer/src/weights/pallet_encointer_democracy.rs new file mode 100644 index 0000000000..29f1bea460 --- /dev/null +++ b/system-parachains/encointer/src/weights/pallet_encointer_democracy.rs @@ -0,0 +1,102 @@ + +//! Autogenerated weights for `pallet_encointer_democracy` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-09-13, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `Pieros-MacBook-Pro.local`, CPU: `` +//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/encointer-node-notee +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_encointer_democracy +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=runtime/src/weights/pallet_encointer_democracy.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_encointer_democracy`. +pub struct WeightInfo(PhantomData); +impl pallet_encointer_democracy::WeightInfo for WeightInfo { + /// Storage: `EncointerDemocracy::EnactmentQueue` (r:1 w:0) + /// Proof: `EncointerDemocracy::EnactmentQueue` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `EncointerScheduler::CurrentCeremonyIndex` (r:1 w:0) + /// Proof: `EncointerScheduler::CurrentCeremonyIndex` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `EncointerDemocracy::ProposalCount` (r:1 w:1) + /// Proof: `EncointerDemocracy::ProposalCount` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `EncointerDemocracy::Proposals` (r:0 w:1) + /// Proof: `EncointerDemocracy::Proposals` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) + /// Storage: `EncointerDemocracy::Tallies` (r:0 w:1) + /// Proof: `EncointerDemocracy::Tallies` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) + fn submit_proposal() -> Weight { + // Proof Size summary in bytes: + // Measured: `169` + // Estimated: `3507` + // Minimum execution time: 37_000_000 picoseconds. + Weight::from_parts(38_000_000, 0) + .saturating_add(Weight::from_parts(0, 3507)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `EncointerDemocracy::Tallies` (r:1 w:1) + /// Proof: `EncointerDemocracy::Tallies` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) + /// Storage: `EncointerDemocracy::Proposals` (r:1 w:1) + /// Proof: `EncointerDemocracy::Proposals` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) + /// Storage: `EncointerCeremonies::ReputationLifetime` (r:1 w:0) + /// Proof: `EncointerCeremonies::ReputationLifetime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `EncointerDemocracy::VoteEntries` (r:3 w:3) + /// Proof: `EncointerDemocracy::VoteEntries` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`) + /// Storage: `EncointerScheduler::CurrentCeremonyIndex` (r:1 w:0) + /// Proof: `EncointerScheduler::CurrentCeremonyIndex` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `EncointerCeremonies::ParticipantReputation` (r:3 w:0) + /// Proof: `EncointerCeremonies::ParticipantReputation` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `EncointerDemocracy::CancelledAtBlock` (r:1 w:0) + /// Proof: `EncointerDemocracy::CancelledAtBlock` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// Storage: `EncointerCeremonies::GlobalReputationCount` (r:5 w:0) + /// Proof: `EncointerCeremonies::GlobalReputationCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn vote() -> Weight { + // Proof Size summary in bytes: + // Measured: `805` + // Estimated: `14170` + // Minimum execution time: 143_000_000 picoseconds. + Weight::from_parts(145_000_000, 0) + .saturating_add(Weight::from_parts(0, 14170)) + .saturating_add(T::DbWeight::get().reads(16)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: `EncointerDemocracy::Proposals` (r:1 w:1) + /// Proof: `EncointerDemocracy::Proposals` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) + /// Storage: `EncointerDemocracy::CancelledAtBlock` (r:1 w:1) + /// Proof: `EncointerDemocracy::CancelledAtBlock` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// Storage: `EncointerDemocracy::Tallies` (r:1 w:0) + /// Proof: `EncointerDemocracy::Tallies` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) + /// Storage: `EncointerCeremonies::ReputationLifetime` (r:1 w:0) + /// Proof: `EncointerCeremonies::ReputationLifetime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `EncointerCeremonies::GlobalReputationCount` (r:5 w:0) + /// Proof: `EncointerCeremonies::GlobalReputationCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `EncointerDemocracy::EnactmentQueue` (r:0 w:1) + /// Proof: `EncointerDemocracy::EnactmentQueue` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + fn update_proposal_state() -> Weight { + // Proof Size summary in bytes: + // Measured: `503` + // Estimated: `13868` + // Minimum execution time: 112_000_000 picoseconds. + Weight::from_parts(113_000_000, 0) + .saturating_add(Weight::from_parts(0, 13868)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(3)) + } +}