use crate::*;
pub fn handler(ctx: Context<CreateOperator>) -> Result<()> {
let operator = &mut ctx.accounts.operator;
operator.base = ctx.accounts.base.key();
operator.bump = unwrap_bump!(ctx, "operator");
operator.rewarder = ctx.accounts.rewarder.key();
operator.admin = ctx.accounts.admin.key();
operator.rate_setter = operator.admin;
operator.quarry_creator = operator.admin;
operator.share_allocator = operator.admin;
operator.record_update()?;
let signer_seeds: &[&[&[u8]]] = &[gen_operator_signer_seeds!(operator)];
quarry_mine::cpi::accept_authority(CpiContext::new_with_signer(
ctx.accounts.quarry_mine_program.to_account_info(),
quarry_mine::cpi::accounts::AcceptAuthority {
authority: ctx.accounts.operator.to_account_info(),
rewarder: ctx.accounts.rewarder.to_account_info(),
},
signer_seeds,
))?;
Ok(())
}
#[derive(Accounts)]
pub struct CreateOperator<'info> {
pub base: Signer<'info>,
#[account(
init,
seeds = [
b"Operator".as_ref(),
base.key().to_bytes().as_ref()
],
bump,
payer = payer,
space = 8 + Operator::LEN
)]
pub operator: Account<'info, Operator>,
#[account(mut)]
pub rewarder: Box<Account<'info, Rewarder>>,
pub admin: UncheckedAccount<'info>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
pub quarry_mine_program: Program<'info, quarry_mine::program::QuarryMine>,
}
impl<'info> Validate<'info> for CreateOperator<'info> {
fn validate(&self) -> Result<()> {
assert_keys_eq!(
self.operator,
self.rewarder.pending_authority,
PendingAuthorityNotSet
);
Ok(())
}
}