quarry_operator/instructions/
create_operator.rs1use crate::*;
2
3pub fn handler(ctx: Context<CreateOperator>) -> Result<()> {
4 let operator = &mut ctx.accounts.operator;
5 operator.base = ctx.accounts.base.key();
6 operator.bump = unwrap_bump!(ctx, "operator");
7
8 operator.rewarder = ctx.accounts.rewarder.key();
9 operator.admin = ctx.accounts.admin.key();
10
11 operator.rate_setter = operator.admin;
12 operator.quarry_creator = operator.admin;
13 operator.share_allocator = operator.admin;
14 operator.record_update()?;
15
16 let signer_seeds: &[&[&[u8]]] = &[gen_operator_signer_seeds!(operator)];
17 quarry_mine::cpi::accept_authority(CpiContext::new_with_signer(
18 ctx.accounts.quarry_mine_program.to_account_info(),
19 quarry_mine::cpi::accounts::AcceptAuthority {
20 authority: ctx.accounts.operator.to_account_info(),
21 rewarder: ctx.accounts.rewarder.to_account_info(),
22 },
23 signer_seeds,
24 ))?;
25
26 Ok(())
27}
28
29#[derive(Accounts)]
31pub struct CreateOperator<'info> {
32 pub base: Signer<'info>,
34 #[account(
36 init,
37 seeds = [
38 b"Operator".as_ref(),
39 base.key().to_bytes().as_ref()
40 ],
41 bump,
42 payer = payer,
43 space = 8 + Operator::LEN
44 )]
45 pub operator: Account<'info, Operator>,
46 #[account(mut)]
48 pub rewarder: Box<Account<'info, Rewarder>>,
49 pub admin: UncheckedAccount<'info>,
51 #[account(mut)]
53 pub payer: Signer<'info>,
54 pub system_program: Program<'info, System>,
56 pub quarry_mine_program: Program<'info, quarry_mine::program::QuarryMine>,
58}
59
60impl<'info> Validate<'info> for CreateOperator<'info> {
61 fn validate(&self) -> Result<()> {
62 assert_keys_eq!(
63 self.operator,
64 self.rewarder.pending_authority,
65 PendingAuthorityNotSet
66 );
67 Ok(())
68 }
69}