miclockwork_network_program/instructions/
worker_create.rs

1use {
2    crate::{errors::*, 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
15#[derive(Accounts)]
16pub struct WorkerCreate<'info> {
17    #[account(address = anchor_spl::associated_token::ID)]
18    pub associated_token_program: Program<'info, AssociatedToken>,
19
20    #[account(mut)]
21    pub authority: Signer<'info>,
22
23    #[account(address = Config::pubkey())]
24    pub config: Box<Account<'info, Config>>,
25
26    #[account(
27        init,
28        seeds = [
29            SEED_FEE,
30            worker.key().as_ref(),
31        ],
32        bump,
33        payer = authority,
34        space = 8 + size_of::<Fee>(),
35    )]
36    pub fee: Box<Account<'info, Fee>>,
37
38    #[account(
39        init,
40        seeds = [
41            SEED_PENALTY,
42            worker.key().as_ref(),
43        ],
44        bump,
45        payer = authority,
46        space = 8 + size_of::<Penalty>(),
47    )]
48    pub penalty: Box<Account<'info, Penalty>>,
49
50    #[account(address = config.mint)]
51    pub mint: Box<Account<'info, Mint>>,
52
53    #[account(
54        mut, 
55        seeds = [SEED_REGISTRY],
56        bump,
57        constraint = !registry.locked @ ClockworkError::RegistryLocked
58    )]
59    pub registry: Box<Account<'info, Registry>>,
60
61    #[account(address = sysvar::rent::ID)]
62    pub rent: Sysvar<'info, Rent>,
63
64    #[account(constraint = signatory.key().ne(&authority.key()) @ ClockworkError::InvalidSignatory)]
65    pub signatory: Signer<'info>,
66
67    #[account(address = system_program::ID)]
68    pub system_program: Program<'info, System>,
69
70    #[account(address = anchor_spl::token::ID)]
71    pub token_program: Program<'info, Token>,
72
73    #[account(
74        init,
75        seeds = [
76            SEED_WORKER,
77            registry.total_workers.to_be_bytes().as_ref(),
78        ],
79        bump,
80        payer = authority,
81        space = 8 + size_of::<Worker>(),
82    )]
83    pub worker: Box<Account<'info, Worker>>,
84
85    #[account(
86        init,
87        payer = authority,
88        associated_token::authority = worker,
89        associated_token::mint = mint,
90    )]
91    pub worker_tokens: Box<Account<'info, TokenAccount>>,
92
93}
94
95pub fn handler(ctx: Context<WorkerCreate>) -> Result<()> {
96    // Get accounts
97    let authority = &mut ctx.accounts.authority;
98    let fee = &mut ctx.accounts.fee;
99    let penalty = &mut ctx.accounts.penalty;
100    let registry = &mut ctx.accounts.registry;
101    let signatory = &mut ctx.accounts.signatory;
102    let worker = &mut ctx.accounts.worker;
103
104    // Initialize the worker accounts.
105    worker.init(authority, registry.total_workers, signatory)?;
106    fee.init(worker.key())?;
107    penalty.init(worker.key())?;
108
109    // Update the registry's worker counter.
110    registry.total_workers = registry.total_workers.checked_add(1).unwrap();
111
112    Ok(())
113}