// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Substrate is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . //! Staking pallet benchmarking. use super::*; use frame_system::RawOrigin as SystemOrigin; use frame_benchmarking::{benchmarks_instance, account}; use frame_system::Module as System; use crate::Module as Collective; const SEED: u32 = 0; benchmarks_instance! { _{ // User account seed. let u in 1 .. 1000 => (); // Old members. let n in 1 .. 1000 => (); // New members. let m in 1 .. 1000 => (); // Existing proposals. let p in 1 .. 100 => (); } set_members { let m in ...; let n in ...; // Construct `new_members`. // It should influence timing since it will sort this vector. let mut new_members = vec![]; for i in 0 .. m { let member = account("member", i, SEED); new_members.push(member); } // Set old members. // We compute the difference of old and new members, so it should influence timing. let mut old_members = vec![]; for i in 0 .. n { let old_member = account("old member", i, SEED); old_members.push(old_member); } let prime = Some(account("prime", 0, SEED)); Collective::::set_members(SystemOrigin::Root.into(), old_members, prime.clone())?; }: _(SystemOrigin::Root, new_members, prime) execute { let u in ...; let caller: T::AccountId = account("caller", u, SEED); let proposal: T::Proposal = Call::::close(Default::default(), Default::default()).into(); Collective::::set_members(SystemOrigin::Root.into(), vec![caller.clone()], None)?; }: _(SystemOrigin::Signed(caller), Box::new(proposal)) propose { let u in ...; let caller: T::AccountId = account("caller", u, SEED); let proposal: T::Proposal = Call::::close(Default::default(), Default::default()).into(); Collective::::set_members(SystemOrigin::Root.into(), vec![caller.clone()], None)?; let member_count = 0; }: _(SystemOrigin::Signed(caller), member_count, Box::new(proposal.into())) propose_else_branch { let u in ...; let p in ...; let caller: T::AccountId = account("caller", u, SEED); let proposal: T::Proposal = Call::::close(Default::default(), Default::default()).into(); Collective::::set_members(SystemOrigin::Root.into(), vec![caller.clone()], None)?; let member_count = 3; // Add previous proposals. for i in 0 .. p { let proposal: T::Proposal = Call::::close(Default::default(), (i + 1).into()).into(); Collective::::propose(SystemOrigin::Signed(caller.clone()).into(), member_count.clone(), Box::new(proposal.into()))?; } }: propose(SystemOrigin::Signed(caller), member_count, Box::new(proposal.into())) vote { let u in ...; let caller1: T::AccountId = account("caller1", u, SEED); let caller2: T::AccountId = account("caller2", u, SEED); let proposal: Box = Box::new(Call::::close(Default::default(), Default::default()).into()); let proposal_hash = T::Hashing::hash_of(&proposal); Collective::::set_members(SystemOrigin::Root.into(), vec![caller1.clone(), caller2.clone()], None)?; let member_count = 3; Collective::::propose(SystemOrigin::Signed(caller1.clone()).into(), member_count, proposal)?; let index = 0; let approve = true; }: _(SystemOrigin::Signed(caller2), proposal_hash, index, approve) vote_not_approve { let u in ...; let caller1: T::AccountId = account("caller1", u, SEED); let caller2: T::AccountId = account("caller2", u, SEED); let proposal: Box = Box::new(Call::::close(Default::default(), Default::default()).into()); let proposal_hash = T::Hashing::hash_of(&proposal); Collective::::set_members(SystemOrigin::Root.into(), vec![caller1.clone(), caller2.clone()], None)?; let member_count = 3; Collective::::propose(SystemOrigin::Signed(caller1.clone()).into(), member_count, proposal)?; let index = 0; let approve = false; }: vote(SystemOrigin::Signed(caller2), proposal_hash, index, approve) vote_approved { let u in ...; let caller1: T::AccountId = account("caller1", u, SEED); let caller2: T::AccountId = account("caller2", u, SEED); let proposal: Box = Box::new(Call::::close(Default::default(), Default::default()).into()); let proposal_hash = T::Hashing::hash_of(&proposal); Collective::::set_members(SystemOrigin::Root.into(), vec![caller1.clone(), caller2.clone()], None)?; let member_count = 2; Collective::::propose(SystemOrigin::Signed(caller1.clone()).into(), member_count, proposal)?; let index = 0; let approve = true; }: vote(SystemOrigin::Signed(caller2), proposal_hash, index, approve) close { let u in ...; let caller1: T::AccountId = account("caller1", u, SEED); let caller2: T::AccountId = account("caller2", u, SEED); let proposal: Box = Box::new(Call::::close(Default::default(), Default::default()).into()); let proposal_hash = T::Hashing::hash_of(&proposal); Collective::::set_members(SystemOrigin::Root.into(), vec![caller1.clone(), caller2.clone()], None)?; let member_count = 2; Collective::::propose(SystemOrigin::Signed(caller1.clone()).into(), member_count, proposal)?; let index = 0; let approve = true; let vote_end = T::MotionDuration::get() + 1u32.into(); System::::set_block_number(vote_end); }: _(SystemOrigin::Signed(caller2), proposal_hash, index) }