Skip to content
Snippets Groups Projects
Commit 62f3bee9 authored by Gav's avatar Gav
Browse files

Public function dispatching.

parent aadf3e24
No related merge requests found
......@@ -18,6 +18,7 @@
use rstd::vec::Vec;
use codec::{Input, Slicable};
use {AccountId, SessionKey};
#[cfg(feature = "std")]
use std::fmt;
......@@ -153,16 +154,27 @@ impl Slicable for Proposal {
#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
#[repr(u8)]
enum FunctionId {
/// Set the timestamp.
TimestampSet = 0x00,
/// Set temporary session key as a validator.
SessionSetKey = 0x10,
/// Staking subsystem: begin staking.
StakingStake = 0x20,
/// Staking subsystem: stop staking.
StakingUnstake = 0x21,
/// Staking subsystem: transfer stake.
StakingTransfer = 0x22,
CouncilVotePropose = 0x30,
CouncilVoteVote = 0x31,
CouncilVoteVeto = 0x32,
CouncilSetApprovals = 0x40,
CouncilReapInactiveVoter = 0x41,
CouncilRetractVoter = 0x42,
CouncilSubmitCandidacy = 0x43,
CouncilPresentWinner = 0x44,
DemocracyPropose = 0x50,
DemocracySecond = 0x51,
DemocracyVote = 0x52,
}
impl FunctionId {
......@@ -179,17 +191,29 @@ impl FunctionId {
/// Functions on the runtime.
#[derive(Clone, PartialEq, Eq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
#[allow(missing_docs)]
pub enum Function {
/// Set the timestamp.
TimestampSet(u64),
/// Set temporary session key as a validator.
SessionSetKey(::SessionKey),
/// Staking subsystem: begin staking.
SessionSetKey(SessionKey),
StakingStake,
/// Staking subsystem: stop staking.
StakingUnstake,
/// Staking subsystem: transfer stake.
StakingTransfer(::AccountId, u64),
StakingTransfer(AccountId, u64),
CouncilVotePropose(Proposal),
CouncilVoteVote([u8; 32], bool),
CouncilVoteVeto([u8; 32]),
CouncilSetApprovals(Vec<bool>, u32),
CouncilReapInactiveVoter(u32, AccountId, u32, u32),
CouncilRetractVoter(u32),
CouncilSubmitCandidacy(u32),
CouncilPresentWinner(AccountId, u64, u32),
DemocracyPropose(Proposal, u64),
DemocracySecond(u32),
DemocracyVote(u32, bool),
}
impl Slicable for Function {
......@@ -197,17 +221,54 @@ impl Slicable for Function {
let id = try_opt!(u8::decode(input).and_then(FunctionId::from_u8));
Some(match id {
FunctionId::TimestampSet =>
Function::TimestampSet(try_opt!(Slicable::decode(input))),
Function::TimestampSet(Slicable::decode(input)?),
FunctionId::SessionSetKey =>
Function::SessionSetKey(try_opt!(Slicable::decode(input))),
Function::SessionSetKey(Slicable::decode(input)?),
FunctionId::StakingStake => Function::StakingStake,
FunctionId::StakingUnstake => Function::StakingUnstake,
FunctionId::StakingTransfer => {
let to = try_opt!(Slicable::decode(input));
let amount = try_opt!(Slicable::decode(input));
let to = Slicable::decode(input)?;
let amount = Slicable::decode(input)?;
Function::StakingTransfer(to, amount)
}
FunctionId::CouncilVotePropose => Function::CouncilVotePropose(Slicable::decode(input)?),
FunctionId::CouncilVoteVote => {
let a = Slicable::decode(input)?;
let b = Slicable::decode(input)?;
Function::CouncilVoteVote(a, b)
}
FunctionId::CouncilVoteVeto => Function::CouncilVoteVeto(Slicable::decode(input)?),
FunctionId::CouncilSetApprovals => {
let a = Slicable::decode(input)?;
let b = Slicable::decode(input)?;
Function::CouncilSetApprovals(a, b)
}
FunctionId::CouncilReapInactiveVoter => {
let a = Slicable::decode(input)?;
let b = Slicable::decode(input)?;
let c = Slicable::decode(input)?;
let d = Slicable::decode(input)?;
Function::CouncilReapInactiveVoter(a, b, c, d)
}
FunctionId::CouncilRetractVoter => Function::CouncilRetractVoter(Slicable::decode(input)?),
FunctionId::CouncilSubmitCandidacy => Function::CouncilSubmitCandidacy(Slicable::decode(input)?),
FunctionId::CouncilPresentWinner => {
let a = Slicable::decode(input)?;
let b = Slicable::decode(input)?;
let c = Slicable::decode(input)?;
Function::CouncilPresentWinner(a, b, c)
}
FunctionId::DemocracyPropose => {
let a = Slicable::decode(input)?;
let b = Slicable::decode(input)?;
Function::DemocracyPropose(a, b)
}
FunctionId::DemocracySecond => Function::DemocracySecond(Slicable::decode(input)?),
FunctionId::DemocracyVote => {
let a = Slicable::decode(input)?;
let b = Slicable::decode(input)?;
Function::DemocracyVote(a, b)
}
})
}
......@@ -233,6 +294,7 @@ impl Slicable for Function {
to.using_encoded(|s| v.extend(s));
amount.using_encoded(|s| v.extend(s));
}
_ => {}
}
v
......
......@@ -258,6 +258,11 @@ pub fn leaderboard() -> Option<Vec<(Balance, AccountId)>> {
pub mod public {
use super::*;
// CouncilVotePropose(AccountId, Proposal)
// CouncilVoteVote(AccountId, [u8; 32], bool)
// CouncilVoteVeto(AccountId, [u8; 32])
// CouncilSetApprovals(AccountId, Vec<bool>, u32)
// CouncilReapInactiveVoter(AccountId, u32, AccountId, u32, u32)
/// Set candidate approvals. Approval slots stay valid as long as candidates in those slots
/// are registered.
pub fn set_approvals(signed: &AccountId, votes: &Vec<bool>, index: VoteIndex) {
......@@ -354,10 +359,14 @@ pub mod public {
storage::put(&signed.to_keyed_vec(REGISTER_INFO_OF), &(vote_index(), slot));
}
// CouncilRetractVoter(AccountId, u32)
// CouncilSubmitCandidacy(AccountId, u32)
// CouncilPresent(AccountId, u32)
/// Claim that `signed` is one of the top carry_count() + current_vote().1 candidates.
/// Only works if the block number >= current_vote().0 and < current_vote().0 + presentation_duration()
/// `signed` should have at least
pub fn present(signed: &AccountId, candidate: &AccountId, total: Balance, index: VoteIndex) {
pub fn present_winner(signed: &AccountId, candidate: &AccountId, total: Balance, index: VoteIndex) {
assert_eq!(index, vote_index(), "index not current");
let (_, _, expiring): (BlockNumber, u32, Vec<AccountId>) = storage::get(NEXT_FINALISE)
.expect("cannot present outside of presentation period");
......@@ -881,8 +890,8 @@ mod tests {
with_env(|e| e.block_number = 6);
assert!(presentation_active());
public::present(&Dave, &Bob, 11, 0);
public::present(&Dave, &Eve, 41, 0);
public::present_winner(&Dave, &Bob, 11, 0);
public::present_winner(&Dave, &Eve, 41, 0);
assert_eq!(leaderboard(), Some(vec![(0, AccountId::default()), (0, AccountId::default()), (11, Bob.into()), (41, Eve.into())]));
internal::end_block();
......@@ -911,9 +920,9 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 11, 0);
public::present(&Dave, &Eve, 41, 0);
public::present(&Dave, &Eve, 41, 0);
public::present_winner(&Dave, &Bob, 11, 0);
public::present_winner(&Dave, &Eve, 41, 0);
public::present_winner(&Dave, &Eve, 41, 0);
internal::end_block();
assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (Bob.into(), 11)]);
......@@ -930,7 +939,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 11, 0);
public::present_winner(&Dave, &Bob, 11, 0);
internal::end_block();
with_env(|e| e.block_number = 8);
......@@ -939,7 +948,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 10);
public::present(&Dave, &Eve, 41, 1);
public::present_winner(&Dave, &Eve, 41, 1);
internal::end_block();
public::reap_inactive_voter(
......@@ -965,7 +974,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 11, 0);
public::present_winner(&Dave, &Bob, 11, 0);
internal::end_block();
with_env(|e| e.block_number = 8);
......@@ -974,7 +983,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 10);
public::present(&Dave, &Bob, 11, 1);
public::present_winner(&Dave, &Bob, 11, 1);
});
}
......@@ -987,7 +996,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 11, 0);
public::present_winner(&Dave, &Bob, 11, 0);
internal::end_block();
with_env(|e| e.block_number = 8);
......@@ -996,7 +1005,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 10);
public::present(&Dave, &Eve, 41, 1);
public::present_winner(&Dave, &Eve, 41, 1);
internal::end_block();
with_env(|e| e.block_number = 11);
......@@ -1025,7 +1034,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 8, 0);
public::present_winner(&Dave, &Bob, 8, 0);
internal::end_block();
with_env(|e| e.block_number = 8);
......@@ -1034,7 +1043,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 10);
public::present(&Dave, &Eve, 38, 1);
public::present_winner(&Dave, &Eve, 38, 1);
internal::end_block();
public::reap_inactive_voter(
......@@ -1055,7 +1064,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 8, 0);
public::present_winner(&Dave, &Bob, 8, 0);
internal::end_block();
with_env(|e| e.block_number = 8);
......@@ -1064,7 +1073,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 10);
public::present(&Dave, &Eve, 38, 1);
public::present_winner(&Dave, &Eve, 38, 1);
internal::end_block();
public::reap_inactive_voter(
......@@ -1090,10 +1099,10 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 11, 0);
public::present(&Dave, &Charlie, 21, 0);
public::present(&Dave, &Dave, 31, 0);
public::present(&Dave, &Eve, 41, 0);
public::present_winner(&Dave, &Bob, 11, 0);
public::present_winner(&Dave, &Charlie, 21, 0);
public::present_winner(&Dave, &Dave, 31, 0);
public::present_winner(&Dave, &Eve, 41, 0);
internal::end_block();
with_env(|e| e.block_number = 8);
......@@ -1101,8 +1110,8 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 10);
public::present(&Dave, &Bob, 11, 1);
public::present(&Dave, &Charlie, 21, 1);
public::present_winner(&Dave, &Bob, 11, 1);
public::present_winner(&Dave, &Charlie, 21, 1);
internal::end_block();
public::reap_inactive_voter(
......@@ -1127,7 +1136,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 11, 0);
public::present_winner(&Dave, &Bob, 11, 0);
internal::end_block();
with_env(|e| e.block_number = 8);
......@@ -1136,7 +1145,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 10);
public::present(&Dave, &Eve, 41, 1);
public::present_winner(&Dave, &Eve, 41, 1);
internal::end_block();
public::reap_inactive_voter(
......@@ -1165,11 +1174,11 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Alice, 60, 0);
public::present(&Dave, &Charlie, 21, 0);
public::present(&Dave, &Dave, 31, 0);
public::present(&Dave, &Eve, 41, 0);
public::present(&Dave, &Bob, 11, 0);
public::present_winner(&Dave, &Alice, 60, 0);
public::present_winner(&Dave, &Charlie, 21, 0);
public::present_winner(&Dave, &Dave, 31, 0);
public::present_winner(&Dave, &Eve, 41, 0);
public::present_winner(&Dave, &Bob, 11, 0);
});
}
......@@ -1190,11 +1199,11 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 11, 0);
public::present(&Dave, &Alice, 60, 0);
public::present(&Dave, &Charlie, 21, 0);
public::present(&Dave, &Dave, 31, 0);
public::present(&Dave, &Eve, 41, 0);
public::present_winner(&Dave, &Bob, 11, 0);
public::present_winner(&Dave, &Alice, 60, 0);
public::present_winner(&Dave, &Charlie, 21, 0);
public::present_winner(&Dave, &Dave, 31, 0);
public::present_winner(&Dave, &Eve, 41, 0);
assert_eq!(leaderboard(), Some(vec![
(21, Charlie.into()),
......@@ -1211,7 +1220,7 @@ mod tests {
with_externalities(&mut new_test_ext(), || {
with_env(|e| e.block_number = 4);
assert!(!presentation_active());
public::present(&Eve, &Eve, 1, 0);
public::present_winner(&Eve, &Eve, 1, 0);
});
}
......@@ -1227,7 +1236,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 11, 1);
public::present_winner(&Dave, &Bob, 11, 1);
});
}
......@@ -1246,7 +1255,7 @@ mod tests {
with_env(|e| e.block_number = 6);
assert_eq!(staking::balance(&Alice), 1);
public::present(&Alice, &Alice, 30, 0);
public::present_winner(&Alice, &Alice, 30, 0);
});
}
......@@ -1264,7 +1273,7 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Bob, 80, 0);
public::present_winner(&Dave, &Bob, 80, 0);
assert_eq!(staking::balance(&Dave), 38);
});
......@@ -1291,16 +1300,16 @@ mod tests {
with_env(|e| e.block_number = 6);
assert!(presentation_active());
public::present(&Dave, &Alice, 60, 0);
public::present_winner(&Dave, &Alice, 60, 0);
assert_eq!(leaderboard(), Some(vec![
(0, AccountId::default()),
(0, AccountId::default()),
(0, AccountId::default()),
(60, Alice.to_raw_public())
]));
public::present(&Dave, &Charlie, 21, 0);
public::present(&Dave, &Dave, 31, 0);
public::present(&Dave, &Eve, 41, 0);
public::present_winner(&Dave, &Charlie, 21, 0);
public::present_winner(&Dave, &Dave, 31, 0);
public::present_winner(&Dave, &Eve, 41, 0);
assert_eq!(leaderboard(), Some(vec![
(21, Charlie.into()),
(31, Dave.into()),
......@@ -1346,10 +1355,10 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 6);
public::present(&Dave, &Alice, 60, 0);
public::present(&Dave, &Charlie, 21, 0);
public::present(&Dave, &Dave, 31, 0);
public::present(&Dave, &Eve, 41, 0);
public::present_winner(&Dave, &Alice, 60, 0);
public::present_winner(&Dave, &Charlie, 21, 0);
public::present_winner(&Dave, &Dave, 31, 0);
public::present_winner(&Dave, &Eve, 41, 0);
internal::end_block();
with_env(|e| e.block_number = 8);
......@@ -1358,8 +1367,8 @@ mod tests {
internal::end_block();
with_env(|e| e.block_number = 10);
public::present(&Dave, &Charlie, 81, 1);
public::present(&Dave, &Dave, 31, 1);
public::present_winner(&Dave, &Charlie, 81, 1);
public::present_winner(&Dave, &Dave, 31, 1);
internal::end_block();
assert!(!presentation_active());
......
......@@ -144,6 +144,39 @@ pub mod internal {
Function::TimestampSet(t) => {
::runtime::timestamp::public::set(t);
}
Function::CouncilVotePropose(ref a) => {
::runtime::council_vote::public::propose(transactor, a);
}
Function::CouncilVoteVote(ref a, b) => {
::runtime::council_vote::public::vote(transactor, a, b);
}
Function::CouncilVoteVeto(ref a) => {
::runtime::council_vote::public::veto(transactor, a);
}
Function::CouncilSetApprovals(ref a, b) => {
::runtime::council::public::set_approvals(transactor, a, b);
}
Function::CouncilReapInactiveVoter(a, ref b, c, d) => {
::runtime::council::public::reap_inactive_voter(transactor, a, b, c, d);
}
Function::CouncilRetractVoter(a) => {
::runtime::council::public::retract_voter(transactor, a);
}
Function::CouncilSubmitCandidacy(a) => {
::runtime::council::public::submit_candidacy(transactor, a);
}
Function::CouncilPresentWinner(ref a, b, c) => {
::runtime::council::public::present_winner(transactor, a, b, c);
}
Function::DemocracyPropose(ref a, b) => {
::runtime::democracy::public::propose(transactor, a, b);
}
Function::DemocracySecond(a) => {
::runtime::democracy::public::second(transactor, a);
}
Function::DemocracyVote(a, b) => {
::runtime::democracy::public::vote(transactor, a, b);
}
}
}
}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment