arrow_sunny/instructions/
stake_internal.rs

1//! [crate::arrow_sunny::stake_internal] instruction processor.
2
3use crate::StakeInternal;
4use anchor_lang::prelude::*;
5use vipers::{assert_keys_eq, validate::Validate};
6
7impl<'info> StakeInternal<'info> {
8    /// Stakes the full contents of the vault into the internal miner.
9    pub fn stake_internal(&self) -> Result<()> {
10        let signer_seeds: &[&[&[u8]]] = gen_arrow_signer_seeds!(self.arrow);
11        sunny_anchor::cpi::stake_internal(
12            CpiContext::new(
13                self.sunny_program.to_account_info(),
14                sunny_anchor::cpi::accounts::QuarryStakeInternal {
15                    vault_owner: self.arrow.to_account_info(),
16                    internal_mint: self.internal_mint.to_account_info(),
17                    internal_mint_token_account: self
18                        .vault_internal_token_account
19                        .to_account_info(),
20                    stake: sunny_anchor::cpi::accounts::QuarryStake {
21                        rewarder: self.internal_stake.rewarder.to_account_info(),
22                        quarry: self.internal_stake.quarry.to_account_info(),
23                        miner: self.internal_stake.miner.to_account_info(),
24                        miner_vault: self.internal_stake.miner_vault.to_account_info(),
25
26                        pool: self.pool.to_account_info(),
27                        vault: self.vault.to_account_info(),
28                        token_program: self.token_program.to_account_info(),
29                        mine_program: self.mine_program.to_account_info(),
30                        clock: self.clock.to_account_info(),
31                    },
32                },
33            )
34            .with_signer(signer_seeds),
35        )
36    }
37}
38
39impl<'info> Validate<'info> for StakeInternal<'info> {
40    fn validate(&self) -> Result<()> {
41        assert_keys_eq!(self.arrow.internal_miner.mint, self.internal_mint);
42        assert_keys_eq!(
43            self.arrow.internal_miner.vault_staked_token_account,
44            *self.vault_internal_token_account
45        );
46
47        assert_keys_eq!(self.arrow.pool, self.pool);
48        assert_keys_eq!(self.arrow.vault, self.vault);
49        self.internal_stake
50            .validate_miner(&self.arrow.internal_miner)?;
51        Ok(())
52    }
53}