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