triad_protocol/instructions/stake/
initialize_stake_vault.rs

1use crate::{ constraints::is_admin, state::InitializeStakeVaultArgs, StakeVault };
2use anchor_lang::prelude::*;
3use anchor_spl::token::Token;
4
5#[derive(Accounts)]
6#[instruction(args: InitializeStakeVaultArgs)]
7pub struct InitializeStakeVault<'info> {
8    #[account(mut)]
9    pub signer: Signer<'info>,
10
11    #[account(
12        init,
13        payer = signer,
14        constraint = is_admin(&signer)?,
15        space = StakeVault::SPACE,
16        seeds = [StakeVault::PREFIX_SEED, args.name.as_bytes()],
17        bump
18    )]
19    pub stake_vault: Box<Account<'info, StakeVault>>,
20
21    pub system_program: Program<'info, System>,
22    pub token_program: Program<'info, Token>,
23}
24
25pub fn initialize_stake_vault(
26    ctx: Context<InitializeStakeVault>,
27    args: InitializeStakeVaultArgs
28) -> Result<()> {
29    let stake_vault = &mut ctx.accounts.stake_vault;
30
31    stake_vault.bump = ctx.bumps.stake_vault;
32    stake_vault.authority = *ctx.accounts.signer.key;
33    stake_vault.init_ts = Clock::get()?.unix_timestamp;
34    stake_vault.end_ts = Clock::get()?.unix_timestamp + 30 * 24 * 60 * 60;
35    stake_vault.amount = args.amount;
36    stake_vault.name = args.name;
37    stake_vault.amount_paid = 0;
38    stake_vault.nft_staked = 0;
39    stake_vault.token_staked = 0;
40    stake_vault.collection = args.collection;
41    stake_vault.slots = args.slots;
42    stake_vault.is_locked = false;
43
44    Ok(())
45}