cronos_network/instructions/
node_stake.rs

1use {
2    crate::state::*,
3    anchor_lang::prelude::*,
4    anchor_spl::token::{transfer, Mint, Token, TokenAccount, Transfer},
5};
6
7#[derive(Accounts)]
8#[instruction(
9    amount: u64,
10    delegate: Pubkey
11)]
12pub struct NodeStake<'info> {
13    #[account(
14        seeds = [SEED_CONFIG],
15        bump
16    )]
17    pub config: Account<'info, Config>,
18
19    #[account(
20        seeds = [
21            SEED_NODE,
22            node.delegate.as_ref()
23        ],
24        bump,
25        constraint = node.delegate == delegate
26    )]
27    pub node: Account<'info, Node>,
28
29    #[account(
30        mut,
31        associated_token::authority = node,
32        associated_token::mint = mint,
33    )]
34    pub node_stake: Account<'info, TokenAccount>,
35
36    #[account(address = config.mint)]
37    pub mint: Account<'info, Mint>,
38
39    #[account(mut)]
40    pub signer: Signer<'info>,
41
42    #[account(address = anchor_spl::token::ID)]
43    pub token_program: Program<'info, Token>,
44
45    #[account(
46        mut,
47        associated_token::authority = signer,
48        associated_token::mint = mint,
49    )]
50    pub tokens: Account<'info, TokenAccount>,
51}
52
53pub fn handler(ctx: Context<NodeStake>, amount: u64, _delegate: Pubkey) -> Result<()> {
54    let node_stake = &mut ctx.accounts.node_stake;
55    let signer = &mut ctx.accounts.signer;
56    let token_program = &ctx.accounts.token_program;
57    let tokens = &mut ctx.accounts.tokens;
58
59    transfer(
60        CpiContext::new(
61            token_program.to_account_info(),
62            Transfer {
63                from: tokens.to_account_info(),
64                to: node_stake.to_account_info(),
65                authority: signer.to_account_info(),
66            },
67        ),
68        amount,
69    )?;
70
71    Ok(())
72}