cronos_network/instructions/
node_stake.rs1use {
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}