arrow_sunny/instructions/
claim.rs

1//! [crate::arrow_sunny::claim] instruction processor.
2
3use crate::Claim;
4use anchor_lang::prelude::*;
5use vipers::validate::Validate;
6use vipers::*;
7
8impl<'info> Claim<'info> {
9    /// Claims tokens.
10    pub fn claim(&self) -> Result<()> {
11        sunny_anchor::cpi::claim_rewards(CpiContext::new(
12            self.sunny_program.to_account_info(),
13            sunny_anchor::cpi::accounts::ClaimRewards {
14                mint_wrapper: self.mint_wrapper.to_account_info(),
15                mint_wrapper_program: self.mint_wrapper_program.to_account_info(),
16                minter: self.minter.to_account_info(),
17                rewards_token_mint: self.rewards_token_mint.to_account_info(),
18                rewards_token_account: self.vault_rewards_token_account.to_account_info(),
19                claim_fee_token_account: self.claim_fee_token_account.to_account_info(),
20                stake_token_account: self.stake_token_account.to_account_info(),
21                stake: sunny_anchor::cpi::accounts::QuarryStake {
22                    rewarder: self.stake.rewarder.to_account_info(),
23                    quarry: self.stake.quarry.to_account_info(),
24                    miner: self.stake.miner.to_account_info(),
25                    miner_vault: self.stake.miner_vault.to_account_info(),
26
27                    pool: self.pool.to_account_info(),
28                    vault: self.vault.to_account_info(),
29                    token_program: self.token_program.to_account_info(),
30                    mine_program: self.mine_program.to_account_info(),
31                    clock: self.clock.to_account_info(),
32                },
33            },
34        ))
35    }
36}
37
38impl<'info> Validate<'info> for Claim<'info> {
39    fn validate(&self) -> Result<()> {
40        let rewards_mint = self.rewards_token_mint.key();
41
42        // rewards token accounts
43        assert_keys_eq!(self.vault_rewards_token_account.owner, self.vault);
44        assert_keys_eq!(self.vault_rewards_token_account.mint, rewards_mint);
45
46        // mine
47        // figure out which miner we are
48        let miner = self.arrow.miner_for_rewards(rewards_mint)?;
49        assert_keys_eq!(self.claim_fee_token_account, miner.claim_fee_token_account);
50        self.stake.validate_miner(miner)?;
51
52        // mint wrapper
53        assert_keys_eq!(self.mint_wrapper, miner.mint_wrapper);
54        assert_keys_eq!(self.minter.mint_wrapper, self.mint_wrapper);
55
56        assert_keys_eq!(self.arrow.pool, self.pool);
57        assert_keys_eq!(self.arrow.vault, self.vault);
58
59        Ok(())
60    }
61}