to_account_info(), to: ctx. to_account_info(), authority: ctx. to_account_info(), }; let cpi_program = ctx. reward_debt; let cpi_accounts = MintTo { mint: ctx. to_account_info(), to: ctx. to_account_info(), authority: ctx. to_account_info(), }; let cpi_program = ctx. to_account_info(), to: ctx. to_account_info(), authority: ctx. to_account_info(), }; let cpi_program = ctx. reward_debt; let cpi_accounts = MintTo { mint: ctx. to_account_info(), to: ctx. to_account_info(), authority: ctx. to_account_info(), }; let cpi_program = ctx. reward_debt += reward; Ok(()) }}#[derive(Accounts)]pub struct Initialize<'info> { #[account(mut)] pub admin: Signer<'info>, #[account(init, payer = admin, space = 8 + PoolInfo::LEN)] pub pool_info: Account<'info, PoolInfo>, #[account(mut)] pub staking_token: InterfaceAccount<'info, Mint>, #[account(mut)] pub admin_staking_wallet: InterfaceAccount<'info, TokenAccount>, pub system_program: Program<'info, System>,}#[derive(Accounts)]pub struct Stake<'info> { #[account(mut)] pub user: Signer<'info>, /// CHECK: #[account(mut)] pub admin: AccountInfo<'info>, #[account(init, payer = user, space = 8 + UserInfo::LEN)] pub user_info: Account<'info, UserInfo>, #[account(mut)] pub user_staking_wallet: InterfaceAccount<'info, TokenAccount>, #[account(mut)] pub admin_staking_wallet: InterfaceAccount<'info, TokenAccount>, #[account(mut)] pub staking_token: InterfaceAccount<'info, Mint>, pub token_program: Interface<'info, TokenInterface>, pub system_program: Program<'info, System>,}#[derive(Accounts)]pub struct Unstake<'info> { /// CHECK: #[account(mut)] pub user: AccountInfo<'info>, /// CHECK: #[account(mut)] pub admin: AccountInfo<'info>, #[account(mut)] pub user_info: Account<'info, UserInfo>, #[account(mut)] pub user_staking_wallet: InterfaceAccount<'info, TokenAccount>, #[account(mut)] pub admin_staking_wallet: InterfaceAccount<'info, TokenAccount>, #[account(mut)] pub staking_token: InterfaceAccount<'info, Mint>, pub token_program: Interface<'info, TokenInterface>,}#[derive(Accounts)]pub struct ClaimReward<'info> { /// CHECK: #[account(mut)] pub user: AccountInfo<'info>, /// CHECK: #[account(mut)] pub admin: AccountInfo<'info>, #[account(mut)] pub user_info: Account<'info, UserInfo>, #[account(mut)] pub user_staking_wallet: InterfaceAccount<'info, TokenAccount>, #[account(mut)] pub admin_staking_wallet: InterfaceAccount<'info, TokenAccount>, #[account(mut)] pub staking_token: InterfaceAccount<'info, Mint>, pub token_program: Interface<'info, TokenInterface>,}#[account]pub struct PoolInfo { pub admin: Pubkey, pub start_slot: u64, pub end_slot: u64, pub token: Pubkey,}#[account]pub struct UserInfo { pub amount: u64, pub reward_debt: u64, pub deposit_slot: u64,}impl UserInfo { pub const LEN: usize = 8 + 8 + 8;}impl PoolInfo { pub const LEN: usize = 32 + 8 + 8 + 32;}Steps to Run the Test Case NPM/Yarn install dependencies ("npm i" or "yarn")Run "solana-test-validator" in the new terminalRun "anchor test --skip-local-validator"Outputsolana-staking-blog ✔ Initialize ✔ Stake ✔ Claim Reward ✔ UnstakeThe complete code can be found here.