Skip to content

Commit

Permalink
OpenGov: Abstentions (paritytech#12842)
Browse files Browse the repository at this point in the history
* OpenGov: Abstentions

* Tests
  • Loading branch information
gavofyork authored and ltfschoen committed Feb 22, 2023
1 parent 93b597f commit b1a9e9d
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
51 changes: 51 additions & 0 deletions frame/conviction-voting/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,14 @@ fn nay(amount: u64, conviction: u8) -> AccountVote<u64> {
AccountVote::Standard { vote, balance: amount }
}

fn split(aye: u64, nay: u64) -> AccountVote<u64> {
AccountVote::Split { aye, nay }
}

fn split_abstain(aye: u64, nay: u64, abstain: u64) -> AccountVote<u64> {
AccountVote::SplitAbstain { aye, nay, abstain }
}

fn tally(index: u8) -> TallyOf<Test> {
<TestPolls as Polling<TallyOf<Test>>>::as_ongoing(index).expect("No poll").0
}
Expand Down Expand Up @@ -295,6 +303,49 @@ fn basic_voting_works() {
});
}

#[test]
fn split_voting_works() {
new_test_ext().execute_with(|| {
assert_ok!(Voting::vote(RuntimeOrigin::signed(1), 3, split(10, 0)));
assert_eq!(tally(3), Tally::from_parts(1, 0, 10));
assert_ok!(Voting::vote(RuntimeOrigin::signed(1), 3, split(5, 5)));
assert_eq!(tally(3), Tally::from_parts(0, 0, 5));
assert_eq!(Balances::usable_balance(1), 0);

assert_ok!(Voting::remove_vote(RuntimeOrigin::signed(1), None, 3));
assert_eq!(tally(3), Tally::from_parts(0, 0, 0));

assert_ok!(Voting::unlock(RuntimeOrigin::signed(1), class(3), 1));
assert_eq!(Balances::usable_balance(1), 10);
});
}

#[test]
fn abstain_voting_works() {
new_test_ext().execute_with(|| {
assert_ok!(Voting::vote(RuntimeOrigin::signed(1), 3, split_abstain(0, 0, 10)));
assert_eq!(tally(3), Tally::from_parts(0, 0, 10));
assert_ok!(Voting::vote(RuntimeOrigin::signed(2), 3, split_abstain(0, 0, 20)));
assert_eq!(tally(3), Tally::from_parts(0, 0, 30));
assert_ok!(Voting::vote(RuntimeOrigin::signed(2), 3, split_abstain(10, 0, 10)));
assert_eq!(tally(3), Tally::from_parts(1, 0, 30));
assert_eq!(Balances::usable_balance(1), 0);
assert_eq!(Balances::usable_balance(2), 0);

assert_ok!(Voting::remove_vote(RuntimeOrigin::signed(1), None, 3));
assert_eq!(tally(3), Tally::from_parts(1, 0, 20));

assert_ok!(Voting::remove_vote(RuntimeOrigin::signed(2), None, 3));
assert_eq!(tally(3), Tally::from_parts(0, 0, 0));

assert_ok!(Voting::unlock(RuntimeOrigin::signed(1), class(3), 1));
assert_eq!(Balances::usable_balance(1), 10);

assert_ok!(Voting::unlock(RuntimeOrigin::signed(2), class(3), 2));
assert_eq!(Balances::usable_balance(2), 20);
});
}

#[test]
fn voting_balance_gets_locked() {
new_test_ext().execute_with(|| {
Expand Down
18 changes: 18 additions & 0 deletions frame/conviction-voting/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,15 @@ impl<
self.ayes = self.ayes.checked_add(&aye.votes)?;
self.nays = self.nays.checked_add(&nay.votes)?;
},
AccountVote::SplitAbstain { aye, nay, abstain } => {
let aye = Conviction::None.votes(aye);
let nay = Conviction::None.votes(nay);
let abstain = Conviction::None.votes(abstain);
self.support =
self.support.checked_add(&aye.capital)?.checked_add(&abstain.capital)?;
self.ayes = self.ayes.checked_add(&aye.votes)?;
self.nays = self.nays.checked_add(&nay.votes)?;
},
}
Some(())
}
Expand All @@ -171,6 +180,15 @@ impl<
self.ayes = self.ayes.checked_sub(&aye.votes)?;
self.nays = self.nays.checked_sub(&nay.votes)?;
},
AccountVote::SplitAbstain { aye, nay, abstain } => {
let aye = Conviction::None.votes(aye);
let nay = Conviction::None.votes(nay);
let abstain = Conviction::None.votes(abstain);
self.support =
self.support.checked_sub(&aye.capital)?.checked_sub(&abstain.capital)?;
self.ayes = self.ayes.checked_sub(&aye.votes)?;
self.nays = self.nays.checked_sub(&nay.votes)?;
},
}
Some(())
}
Expand Down
6 changes: 6 additions & 0 deletions frame/conviction-voting/src/vote.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ pub enum AccountVote<Balance> {
/// A split vote with balances given for both ways, and with no conviction, useful for
/// parachains when voting.
Split { aye: Balance, nay: Balance },
/// A split vote with balances given for both ways as well as abstentions, and with no
/// conviction, useful for parachains when voting, other off-chain aggregate accounts and
/// individuals who wish to abstain.
SplitAbstain { aye: Balance, nay: Balance, abstain: Balance },
}

impl<Balance: Saturating> AccountVote<Balance> {
Expand All @@ -94,6 +98,8 @@ impl<Balance: Saturating> AccountVote<Balance> {
match self {
AccountVote::Standard { balance, .. } => balance,
AccountVote::Split { aye, nay } => aye.saturating_add(nay),
AccountVote::SplitAbstain { aye, nay, abstain } =>
aye.saturating_add(nay).saturating_add(abstain),
}
}

Expand Down

0 comments on commit b1a9e9d

Please sign in to comment.