miclockwork_network_program/instructions/
worker_create.rs1use {
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 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 worker.init(authority, registry.total_workers, signatory)?;
106 fee.init(worker.key())?;
107 penalty.init(worker.key())?;
108
109 registry.total_workers = registry.total_workers.checked_add(1).unwrap();
111
112 Ok(())
113}