sablier_network_program/instructions/
worker_create.rs1use {
2 crate::{constants::*, errors::*, state::*},
3 anchor_lang::prelude::*,
4 anchor_spl::{
5 associated_token::AssociatedToken,
6 token::{Mint, Token, TokenAccount},
7 },
8};
9
10#[derive(Accounts)]
11pub struct WorkerCreate<'info> {
12 #[account(mut)]
13 pub authority: Signer<'info>,
14
15 #[account(address = Config::pubkey())]
16 pub config: AccountLoader<'info, Config>,
17
18 #[account(address = config.load()?.mint)]
19 pub mint: Box<Account<'info, Mint>>,
20
21 #[account(
22 mut,
23 seeds = [SEED_REGISTRY],
24 bump,
25 constraint = !registry.locked @ SablierError::RegistryLocked
26 )]
27 pub registry: Box<Account<'info, Registry>>,
28
29 #[account(constraint = signatory.key() != authority.key() @ SablierError::InvalidSignatory)]
30 pub signatory: Signer<'info>,
31
32 #[account(
33 init,
34 seeds = [
35 SEED_WORKER,
36 registry.total_workers.to_be_bytes().as_ref(),
37 ],
38 bump,
39 payer = authority,
40 space = 8 + Worker::INIT_SPACE,
41 )]
42 pub worker: Box<Account<'info, Worker>>,
43
44 #[account(
45 init,
46 payer = authority,
47 associated_token::authority = worker,
48 associated_token::mint = mint,
49 )]
50 pub worker_tokens: Box<Account<'info, TokenAccount>>,
51
52 pub system_program: Program<'info, System>,
53
54 pub associated_token_program: Program<'info, AssociatedToken>,
55
56 pub token_program: Program<'info, Token>,
57}
58
59pub fn handler(ctx: Context<WorkerCreate>) -> Result<()> {
60 let authority = &mut ctx.accounts.authority;
62 let registry = &mut ctx.accounts.registry;
63 let worker = &mut ctx.accounts.worker;
64 let signatory = &mut ctx.accounts.signatory;
65
66 worker.init(
68 authority,
69 registry.total_workers,
70 signatory,
71 ctx.bumps.worker,
72 )?;
73
74 registry.total_workers += 1;
76
77 Ok(())
78}