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