arrow_sunny/instructions/
claim.rs1use crate::Claim;
4use anchor_lang::prelude::*;
5use vipers::validate::Validate;
6use vipers::*;
7
8impl<'info> Claim<'info> {
9 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 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 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 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}