use vipers::assert_keys_eq;
use crate::*;
#[derive(Accounts)]
pub struct CreateGaugeVote<'info> {
#[account(
init,
seeds = [
b"GaugeVote".as_ref(),
gauge_voter.key().as_ref(),
gauge.key().as_ref(),
],
bump,
space = 8 + GaugeVote::LEN,
payer = payer
)]
pub gauge_vote: Account<'info, GaugeVote>,
pub gauge_voter: Account<'info, GaugeVoter>,
pub gauge: Account<'info, Gauge>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
pub fn handler(ctx: Context<CreateGaugeVote>) -> Result<()> {
let gauge_vote = &mut ctx.accounts.gauge_vote;
gauge_vote.gauge_voter = ctx.accounts.gauge_voter.key();
gauge_vote.gauge = ctx.accounts.gauge.key();
gauge_vote.weight = 0;
emit!(GaugeVoteCreateEvent {
gaugemeister: ctx.accounts.gauge.gaugemeister,
gauge: gauge_vote.gauge,
quarry: ctx.accounts.gauge.quarry,
gauge_voter_owner: ctx.accounts.gauge_voter.owner,
});
Ok(())
}
impl<'info> Validate<'info> for CreateGaugeVote<'info> {
fn validate(&self) -> Result<()> {
assert_keys_eq!(self.gauge_voter.gaugemeister, self.gauge.gaugemeister);
Ok(())
}
}
#[event]
pub struct GaugeVoteCreateEvent {
#[index]
pub gaugemeister: Pubkey,
#[index]
pub gauge: Pubkey,
#[index]
pub quarry: Pubkey,
#[index]
pub gauge_voter_owner: Pubkey,
}