quarry_operator/instructions/
create_operator.rs

1use 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/// Accounts for [crate::quarry_operator::create_operator].
30#[derive(Accounts)]
31pub struct CreateOperator<'info> {
32    /// Base key used to create the [Operator].
33    pub base: Signer<'info>,
34    /// Operator PDA.
35    #[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    /// [Rewarder] of the token.
47    #[account(mut)]
48    pub rewarder: Box<Account<'info, Rewarder>>,
49    /// CHECK: The admin to set.
50    pub admin: UncheckedAccount<'info>,
51    /// Payer.
52    #[account(mut)]
53    pub payer: Signer<'info>,
54    /// [System] program.
55    pub system_program: Program<'info, System>,
56    /// Quarry mine
57    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}