clockwork_network/instructions/
node_register.rs

1use {
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    // Get accounts
95    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    // Add node to the registry
102    registry.new_node(authority, node, stake, worker)?;
103
104    Ok(())
105}