clockwork_network/instructions/
node_register.rs1use {
2 crate::state::*,
3 anchor_lang::{
4 prelude::*,
5 solana_program::{system_program, sysvar},
6 },
7 anchor_spl::{
8 associated_token::AssociatedToken,
9 token::{Mint, Token, TokenAccount},
10 },
11 std::mem::size_of,
12};
13
14#[derive(Accounts)]
15pub struct NodeRegister<'info> {
16 #[account(address = anchor_spl::associated_token::ID)]
17 pub associated_token_program: Program<'info, AssociatedToken>,
18
19 #[account(mut, constraint = authority.key() != worker.key())]
20 pub authority: Signer<'info>,
21
22 #[account(seeds = [SEED_CONFIG], bump)]
23 pub config: Box<Account<'info, Config>>,
24
25 #[account(
26 init,
27 seeds = [
28 SEED_SNAPSHOT_ENTRY,
29 snapshot.key().as_ref(),
30 snapshot.node_count.to_be_bytes().as_ref(),
31 ],
32 bump,
33 payer = authority,
34 space = 8 + size_of::<SnapshotEntry>(),
35 )]
36 pub entry: Account<'info, SnapshotEntry>,
37
38 #[account(address = config.mint)]
39 pub mint: Box<Account<'info, Mint>>,
40
41 #[account(
42 init,
43 seeds = [
44 SEED_NODE,
45 registry.node_count.to_be_bytes().as_ref()
46 ],
47 bump,
48 payer = authority,
49 space = 8 + size_of::<Node>(),
50 )]
51 pub node: Account<'info, Node>,
52
53 #[account(
54 mut,
55 seeds = [SEED_REGISTRY],
56 bump,
57 constraint = !registry.is_locked
58 )]
59 pub registry: Account<'info, Registry>,
60
61 #[account(address = sysvar::rent::ID)]
62 pub rent: Sysvar<'info, Rent>,
63
64 #[account(
65 mut,
66 seeds = [
67 SEED_SNAPSHOT,
68 snapshot.id.to_be_bytes().as_ref(),
69 ],
70 bump,
71 constraint = snapshot.status == SnapshotStatus::Current
72 )]
73 pub snapshot: Account<'info, Snapshot>,
74
75 #[account(
76 init,
77 payer = authority,
78 associated_token::authority = node,
79 associated_token::mint = mint,
80 )]
81 pub stake: Account<'info, TokenAccount>,
82
83 #[account(address = system_program::ID)]
84 pub system_program: Program<'info, System>,
85
86 #[account(address = anchor_spl::token::ID)]
87 pub token_program: Program<'info, Token>,
88
89 #[account()]
90 pub worker: Signer<'info>,
91}
92
93pub fn handler(ctx: Context<NodeRegister>) -> Result<()> {
94 let authority = &mut ctx.accounts.authority;
96 let node = &mut ctx.accounts.node;
97 let registry = &mut ctx.accounts.registry;
98 let stake = &mut ctx.accounts.stake;
99 let worker = &ctx.accounts.worker;
100
101 registry.new_node(authority, node, stake, worker)?;
103
104 Ok(())
105}