Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Referendum proposal's metadata #12568

Merged
merged 34 commits into from
Feb 8, 2023
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
f8d2e88
referenda metadata
muharem Oct 26, 2022
cba7282
todo comment
muharem Oct 26, 2022
40d4bc3
remove TODO, update rustdocs
muharem Oct 27, 2022
9a86866
referenda clear_metadata origin signed or root
muharem Oct 27, 2022
05d7b4d
referenda metadata unit tests
muharem Oct 27, 2022
746afcf
drop schema type for referenda metadata
muharem Oct 28, 2022
564f483
remove metadata type
muharem Oct 28, 2022
bd9a868
referenda metadata benches
muharem Oct 28, 2022
9025ace
note different preimages
muharem Oct 28, 2022
d1cff03
metadata for democracy pallet
muharem Oct 28, 2022
afa1b24
metadata democracy pallet tests and benches
muharem Oct 30, 2022
7ffe4c8
fix cargo clippy
muharem Oct 30, 2022
418262d
update docs
muharem Oct 31, 2022
5efc3fd
Merge branch 'master' of https://github.com/paritytech/substrate into…
Oct 31, 2022
ef4e0cb
".git/.scripts/bench-bot.sh" pallet dev pallet_democracy
Oct 31, 2022
4211b34
".git/.scripts/bench-bot.sh" pallet dev pallet_referenda
Oct 31, 2022
83ee3f4
Update the doc frame/democracy/src/lib.rs
muharem Nov 14, 2022
32ec398
Update the doc frame/democracy/src/lib.rs
muharem Nov 14, 2022
49c9453
reference instead clone for take
muharem Nov 14, 2022
0abe070
error rename BadMetadata to PreimageNotExist
muharem Nov 14, 2022
0efce50
clear metadata within internal_cancel_referendum fn
muharem Nov 14, 2022
7f89c1a
remove redundant clone
muharem Nov 14, 2022
c22876f
collapse metadata api into one set_metadata method
muharem Nov 17, 2022
fe9636c
fmt
muharem Nov 17, 2022
2c5c46e
Merge remote-tracking branch 'origin/master' into muharem-referenda-m…
muharem Jan 23, 2023
e6a1edb
review fixes
muharem Jan 23, 2023
48ebf6d
not request preimage on set_metadata
muharem Jan 23, 2023
850a931
rename events and update docs
muharem Jan 27, 2023
744ed11
Merge remote-tracking branch 'origin/master' into muharem-referenda-m…
muharem Jan 27, 2023
04dede2
".git/.scripts/commands/bench/bench.sh" pallet dev pallet_democracy
Jan 27, 2023
d338071
".git/.scripts/commands/bench/bench.sh" pallet dev pallet_referenda
Jan 27, 2023
5f26d5b
rename reset_metadata to transfer_metadata
muharem Feb 1, 2023
c886c5b
Merge remote-tracking branch 'origin/master' into muharem-referenda-m…
muharem Feb 7, 2023
fe56de2
Merge remote-tracking branch 'origin/master' into muharem-referenda-m…
Feb 8, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 153 additions & 17 deletions frame/democracy/src/benchmarking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,19 +54,20 @@ fn add_proposal<T: Config>(n: u32) -> Result<H256, &'static str> {
Ok(proposal.hash())
}

fn add_referendum<T: Config>(n: u32) -> (ReferendumIndex, H256) {
// add a referendum with a metadata.
fn add_referendum<T: Config>(n: u32) -> (ReferendumIndex, H256, PreimageHash) {
let vote_threshold = VoteThreshold::SimpleMajority;
let proposal = make_proposal::<T>(n);
let hash = proposal.hash();
(
Democracy::<T>::inject_referendum(
T::LaunchPeriod::get(),
proposal,
vote_threshold,
0u32.into(),
),
hash,
)
let index = Democracy::<T>::inject_referendum(
T::LaunchPeriod::get(),
proposal,
vote_threshold,
0u32.into(),
);
let preimage_hash = note_preimage::<T>();
MetadataOf::<T>::insert(crate::MetadataOwner::Referendum(index), preimage_hash.clone());
(index, hash, preimage_hash)
}

fn account_vote<T: Config>(b: BalanceOf<T>) -> AccountVote<BalanceOf<T>> {
Expand All @@ -75,6 +76,25 @@ fn account_vote<T: Config>(b: BalanceOf<T>) -> AccountVote<BalanceOf<T>> {
AccountVote::Standard { vote: v, balance: b }
}

fn assert_last_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) {
frame_system::Pallet::<T>::assert_last_event(generic_event.into());
}

fn assert_has_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) {
frame_system::Pallet::<T>::assert_has_event(generic_event.into());
}

// note a new preimage.
fn note_preimage<T: Config>() -> PreimageHash {
use core::sync::atomic::{AtomicU8, Ordering};
use sp_std::borrow::Cow;
// note a new preimage on every function invoke.
static COUNTER: AtomicU8 = AtomicU8::new(0);
let data = Cow::from(vec![COUNTER.fetch_add(1, Ordering::Relaxed)]);
let hash = <T as Config>::Preimages::note(data).unwrap();
hash
}

benchmarks! {
propose {
let p = T::MaxProposals::get();
Expand Down Expand Up @@ -178,7 +198,7 @@ benchmarks! {

emergency_cancel {
let origin = T::CancellationOrigin::successful_origin();
let ref_index = add_referendum::<T>(0).0;
let (ref_index, _, preimage_hash) = add_referendum::<T>(0);
assert_ok!(Democracy::<T>::referendum_status(ref_index));
}: _<T::RuntimeOrigin>(origin, ref_index)
verify {
Expand All @@ -187,6 +207,10 @@ benchmarks! {
Democracy::<T>::referendum_status(ref_index),
Error::<T>::ReferendumInvalid,
);
assert_last_event::<T>(crate::Event::MetadataCleared {
owner: MetadataOwner::Referendum(ref_index),
hash: preimage_hash,
}.into());
}

blacklist {
Expand All @@ -197,7 +221,7 @@ benchmarks! {
// We should really add a lot of seconds here, but we're not doing it elsewhere.

// Add a referendum of our proposal.
let (ref_index, hash) = add_referendum::<T>(0);
let (ref_index, hash, preimage_hash) = add_referendum::<T>(0);
assert_ok!(Democracy::<T>::referendum_status(ref_index));
// Place our proposal in the external queue, too.
assert_ok!(
Expand All @@ -211,6 +235,10 @@ benchmarks! {
Democracy::<T>::referendum_status(ref_index),
Error::<T>::ReferendumInvalid
);
assert_has_event::<T>(crate::Event::MetadataCleared {
owner: MetadataOwner::Referendum(ref_index),
hash: preimage_hash,
}.into());
}

// Worst case scenario, we external propose a previously blacklisted proposal
Expand Down Expand Up @@ -254,23 +282,38 @@ benchmarks! {
let origin_propose = T::ExternalDefaultOrigin::successful_origin();
let proposal = make_proposal::<T>(0);
let proposal_hash = proposal.hash();
Democracy::<T>::external_propose_default(origin_propose, proposal)?;

Democracy::<T>::external_propose_default(origin_propose.clone(), proposal)?;
// Set metadata to the external proposal.
let preimage_hash = note_preimage::<T>();
assert_ok!(Democracy::<T>::set_external_metadata(
origin_propose,
preimage_hash.clone()));
// NOTE: Instant origin may invoke a little bit more logic, but may not always succeed.
let origin_fast_track = T::FastTrackOrigin::successful_origin();
let voting_period = T::FastTrackVotingPeriod::get();
let delay = 0u32;
}: _<T::RuntimeOrigin>(origin_fast_track, proposal_hash, voting_period, delay.into())
verify {
assert_eq!(Democracy::<T>::referendum_count(), 1, "referendum not created")
assert_eq!(Democracy::<T>::referendum_count(), 1, "referendum not created");
assert_last_event::<T>(crate::Event::MetadataReset {
prev_owner: MetadataOwner::External,
owner: MetadataOwner::Referendum(0),
hash: preimage_hash,
}.into());
}

veto_external {
let proposal = make_proposal::<T>(0);
let proposal_hash = proposal.hash();

let origin_propose = T::ExternalDefaultOrigin::successful_origin();
Democracy::<T>::external_propose_default(origin_propose, proposal)?;
Democracy::<T>::external_propose_default(origin_propose.clone(), proposal)?;

let preimage_hash = note_preimage::<T>();
assert_ok!(Democracy::<T>::set_external_metadata(
origin_propose,
preimage_hash.clone())
);

let mut vetoers: BoundedVec<T::AccountId, _> = Default::default();
for i in 0 .. (T::MaxBlacklisted::get() - 1) {
Expand All @@ -293,12 +336,31 @@ benchmarks! {
for i in 0 .. T::MaxProposals::get() {
add_proposal::<T>(i)?;
}
// Add metadata to the first proposal.
let proposer = funded_account::<T>("proposer", 0);
let preimage_hash = note_preimage::<T>();
assert_ok!(Democracy::<T>::set_proposal_metadata(
RawOrigin::Signed(proposer).into(),
0,
preimage_hash.clone()));
let cancel_origin = T::CancelProposalOrigin::successful_origin();
}: _<T::RuntimeOrigin>(cancel_origin, 0)
verify {
assert_last_event::<T>(crate::Event::MetadataCleared {
owner: MetadataOwner::Proposal(0),
hash: preimage_hash,
}.into());
}

cancel_referendum {
let ref_index = add_referendum::<T>(0).0;
let (ref_index, _, preimage_hash) = add_referendum::<T>(0);
}: _(RawOrigin::Root, ref_index)
verify {
assert_last_event::<T>(crate::Event::MetadataCleared {
owner: MetadataOwner::Referendum(0),
hash: preimage_hash,
}.into());
}

#[extra]
on_initialize_external {
Expand Down Expand Up @@ -666,6 +728,80 @@ benchmarks! {
assert_eq!(votes.len(), (r - 1) as usize, "Vote was not removed");
}

set_external_metadata {
let origin = T::ExternalOrigin::successful_origin();
assert_ok!(
Democracy::<T>::external_propose(origin.clone(), make_proposal::<T>(0))
);
let preimage_hash = note_preimage::<T>();
}: _<T::RuntimeOrigin>(origin, preimage_hash)
verify {
assert_last_event::<T>(crate::Event::MetadataSet {
owner: MetadataOwner::External,
hash: preimage_hash,
}.into());
}

clear_external_metadata {
let origin = T::ExternalOrigin::successful_origin();
assert_ok!(
Democracy::<T>::external_propose(origin.clone(), make_proposal::<T>(0))
);
let proposer = funded_account::<T>("proposer", 0);
let preimage_hash = note_preimage::<T>();
assert_ok!(Democracy::<T>::set_external_metadata(origin.clone(), preimage_hash.clone()));
}: _<T::RuntimeOrigin>(origin)
verify {
assert_last_event::<T>(crate::Event::MetadataCleared {
owner: MetadataOwner::External,
hash: preimage_hash,
}.into());
}

set_proposal_metadata {
// Place our proposal at the end to make sure it's worst case.
for i in 0 .. T::MaxProposals::get() {
add_proposal::<T>(i)?;
}
let proposer = funded_account::<T>("proposer", 0);
let preimage_hash = note_preimage::<T>();
}: _<T::RuntimeOrigin>(RawOrigin::Signed(proposer).into(), 0, preimage_hash)
verify {
assert_last_event::<T>(crate::Event::MetadataSet {
owner: MetadataOwner::Proposal(0),
hash: preimage_hash,
}.into());
}

clear_proposal_metadata {
// Place our proposal at the end to make sure it's worst case.
for i in 0 .. T::MaxProposals::get() {
add_proposal::<T>(i)?;
}
let proposer = funded_account::<T>("proposer", 0);
let preimage_hash = note_preimage::<T>();
assert_ok!(Democracy::<T>::set_proposal_metadata(
RawOrigin::Signed(proposer.clone()).into(),
0,
preimage_hash.clone()));
}: _<T::RuntimeOrigin>(RawOrigin::Signed(proposer).into(), 0)
verify {
assert_last_event::<T>(crate::Event::MetadataCleared {
owner: MetadataOwner::Proposal(0),
hash: preimage_hash,
}.into());
}

clear_referendum_metadata {
let (ref_index, _, preimage_hash) = add_referendum::<T>(0);
}: _(RawOrigin::Root, ref_index)
verify {
assert_last_event::<T>(crate::Event::MetadataCleared {
owner: MetadataOwner::Referendum(ref_index),
hash: preimage_hash,
}.into());
}

impl_benchmark_test_suite!(
Democracy,
crate::tests::new_test_ext(),
Expand Down
Loading