clockwork_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(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}