solana-with-rpc-optimizations/programs/vote_api/src/vote_instruction.rs

81 lines
2.7 KiB
Rust
Raw Normal View History

2019-03-02 13:51:26 -08:00
use crate::id;
2019-03-23 04:15:15 -07:00
use crate::vote_state::VoteState;
2019-03-02 13:51:26 -08:00
use serde_derive::{Deserialize, Serialize};
2019-03-23 20:12:27 -07:00
use solana_sdk::instruction::{AccountMeta, Instruction};
2019-03-02 13:51:26 -08:00
use solana_sdk::pubkey::Pubkey;
2019-03-23 04:15:15 -07:00
use solana_sdk::system_instruction::SystemInstruction;
2019-03-02 13:51:26 -08:00
#[derive(Serialize, Default, Deserialize, Debug, PartialEq, Eq, Clone)]
pub struct Vote {
// TODO: add signature of the state here as well
/// A vote for height slot
pub slot: u64,
2019-03-02 13:51:26 -08:00
}
impl Vote {
pub fn new(slot: u64) -> Self {
Self { slot }
2019-03-02 13:51:26 -08:00
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
pub enum VoteInstruction {
/// Initialize the VoteState for this `vote account`
2019-03-05 09:53:10 -08:00
/// * Instruction::keys[0] - the new "vote account" to be associated with the delegate
2019-03-02 13:51:26 -08:00
InitializeAccount,
2019-03-25 19:57:25 -07:00
/// `Delegate` or `Assign` a vote account to a particular node
2019-03-02 13:51:26 -08:00
DelegateStake(Pubkey),
2019-03-25 19:57:25 -07:00
2019-03-06 13:33:12 -08:00
/// Authorize a voter to send signed votes.
AuthorizeVoter(Pubkey),
2019-03-25 19:57:25 -07:00
2019-03-02 13:51:26 -08:00
Vote(Vote),
2019-03-25 19:57:25 -07:00
2019-03-02 13:51:26 -08:00
/// Clear the credits in the vote account
/// * Transaction::keys[0] - the "vote account"
ClearCredits,
}
impl VoteInstruction {
2019-03-25 19:57:25 -07:00
fn new_initialize_account(vote_id: &Pubkey) -> Instruction {
let account_metas = vec![AccountMeta::new(*vote_id, false)];
Instruction::new(id(), &VoteInstruction::InitializeAccount, account_metas)
}
2019-03-23 04:15:15 -07:00
pub fn new_account(from_id: &Pubkey, staker_id: &Pubkey, lamports: u64) -> Vec<Instruction> {
let space = VoteState::max_size() as u64;
let create_ix = SystemInstruction::new_account(&from_id, staker_id, lamports, space, &id());
2019-03-23 04:15:15 -07:00
let init_ix = VoteInstruction::new_initialize_account(staker_id);
vec![create_ix, init_ix]
}
2019-03-25 19:57:25 -07:00
pub fn new_clear_credits(vote_id: &Pubkey) -> Instruction {
let account_metas = vec![AccountMeta::new(*vote_id, true)];
2019-03-19 12:03:20 -07:00
Instruction::new(id(), &VoteInstruction::ClearCredits, account_metas)
2019-03-02 13:51:26 -08:00
}
2019-03-25 19:57:25 -07:00
pub fn new_delegate_stake(vote_id: &Pubkey, delegate_id: &Pubkey) -> Instruction {
let account_metas = vec![AccountMeta::new(*vote_id, true)];
Instruction::new(
2019-03-02 13:51:26 -08:00
id(),
&VoteInstruction::DelegateStake(*delegate_id),
2019-03-19 12:03:20 -07:00
account_metas,
2019-03-02 13:51:26 -08:00
)
}
2019-03-25 19:57:25 -07:00
pub fn new_authorize_voter(vote_id: &Pubkey, authorized_voter_id: &Pubkey) -> Instruction {
let account_metas = vec![AccountMeta::new(*vote_id, true)];
Instruction::new(
2019-03-06 13:33:12 -08:00
id(),
&VoteInstruction::AuthorizeVoter(*authorized_voter_id),
2019-03-19 12:03:20 -07:00
account_metas,
2019-03-06 13:33:12 -08:00
)
}
2019-03-25 19:57:25 -07:00
pub fn new_vote(vote_id: &Pubkey, vote: Vote) -> Instruction {
let account_metas = vec![AccountMeta::new(*vote_id, true)];
2019-03-19 12:03:20 -07:00
Instruction::new(id(), &VoteInstruction::Vote(vote), account_metas)
2019-03-02 13:51:26 -08:00
}
}