use vipers::assert_keys_eq;
use crate::*;
#[derive(Accounts)]
pub struct CreateGaugeVoter<'info> {
#[account(
init,
seeds = [
b"GaugeVoter".as_ref(),
gaugemeister.key().as_ref(),
escrow.key().as_ref(),
],
bump,
space = 8 + GaugeVoter::LEN,
payer = payer
)]
pub gauge_voter: Account<'info, GaugeVoter>,
pub gaugemeister: Account<'info, Gaugemeister>,
pub escrow: Account<'info, locked_voter::Escrow>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
pub fn handler(ctx: Context<CreateGaugeVoter>) -> Result<()> {
let gauge_voter = &mut ctx.accounts.gauge_voter;
gauge_voter.gaugemeister = ctx.accounts.gaugemeister.key();
gauge_voter.escrow = ctx.accounts.escrow.key();
gauge_voter.owner = ctx.accounts.escrow.owner;
gauge_voter.total_weight = 0;
gauge_voter.weight_change_seqno = 0;
emit!(GaugeVoterCreateEvent {
gaugemeister: gauge_voter.gaugemeister,
rewarder: ctx.accounts.gaugemeister.rewarder,
gauge_voter_owner: gauge_voter.owner,
});
Ok(())
}
impl<'info> Validate<'info> for CreateGaugeVoter<'info> {
fn validate(&self) -> Result<()> {
assert_keys_eq!(self.escrow.locker, self.gaugemeister.locker);
Ok(())
}
}
#[event]
pub struct GaugeVoterCreateEvent {
#[index]
pub gaugemeister: Pubkey,
#[index]
pub rewarder: Pubkey,
#[index]
pub gauge_voter_owner: Pubkey,
}