quarry_mine/instructions/
new_rewarder_v2.rs

1use crate::*;
2
3pub fn handler(ctx: Context<NewRewarderV2>) -> Result<()> {
4    let rewarder = &mut ctx.accounts.rewarder;
5
6    rewarder.base = ctx.accounts.base.key();
7    rewarder.bump = unwrap_bump!(ctx, "rewarder");
8
9    rewarder.authority = ctx.accounts.initial_authority.key();
10    rewarder.pending_authority = Pubkey::default();
11
12    rewarder.annual_rewards_rate = 0;
13    rewarder.num_quarries = 0;
14    rewarder.total_rewards_shares = 0;
15    rewarder.mint_wrapper = ctx.accounts.mint_wrapper.key();
16
17    rewarder.rewards_token_mint = ctx.accounts.rewards_token_mint.key();
18
19    rewarder.claim_fee_token_account = ctx.accounts.claim_fee_token_account.key();
20    rewarder.max_claim_fee_millibps = DEFAULT_CLAIM_FEE_MILLIBPS;
21
22    rewarder.pause_authority = Pubkey::default();
23    rewarder.is_paused = false;
24
25    let current_ts = Clock::get()?.unix_timestamp;
26    emit!(NewRewarderEvent {
27        authority: rewarder.authority,
28        timestamp: current_ts,
29    });
30
31    Ok(())
32}
33
34/// Accounts for [quarry_mine::new_rewarder_v2].
35#[derive(Accounts)]
36pub struct NewRewarderV2<'info> {
37    /// Base. Arbitrary key.
38    pub base: Signer<'info>,
39
40    /// [Rewarder] of mines.
41    #[account(
42        init,
43        seeds = [
44            b"Rewarder".as_ref(),
45            base.key().to_bytes().as_ref()
46        ],
47        bump,
48        payer = payer,
49        space = 8 + Rewarder::LEN
50    )]
51    pub rewarder: Account<'info, Rewarder>,
52
53    /// Initial authority of the rewarder.
54    /// CHECK: OK
55    pub initial_authority: UncheckedAccount<'info>,
56
57    /// Payer of the [Rewarder] initialization.
58    #[account(mut)]
59    pub payer: Signer<'info>,
60
61    /// System program.
62    pub system_program: Program<'info, System>,
63
64    /// Mint wrapper.
65    pub mint_wrapper: Account<'info, quarry_mint_wrapper::MintWrapper>,
66
67    /// Rewards token mint.
68    pub rewards_token_mint: Account<'info, Mint>,
69
70    /// Token account in which the rewards token fees are collected.
71    pub claim_fee_token_account: Account<'info, TokenAccount>,
72}
73
74impl<'info> Validate<'info> for NewRewarderV2<'info> {
75    fn validate(&self) -> Result<()> {
76        invariant!(self.base.is_signer, Unauthorized);
77
78        assert_keys_eq!(self.mint_wrapper.token_mint, self.rewards_token_mint);
79        assert_keys_eq!(
80            self.rewards_token_mint.mint_authority.unwrap(),
81            self.mint_wrapper
82        );
83
84        assert_keys_eq!(self.claim_fee_token_account.owner, self.rewarder);
85        assert_keys_eq!(self.claim_fee_token_account.mint, self.rewards_token_mint);
86        invariant!(self.claim_fee_token_account.delegate.is_none());
87        invariant!(self.claim_fee_token_account.close_authority.is_none());
88
89        Ok(())
90    }
91}