sablier_network_program/instructions/
worker_create.rs

1use {
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    // Get accounts
61    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    // Initialize the worker accounts.
67    worker.init(
68        authority,
69        registry.total_workers,
70        signatory,
71        ctx.bumps.worker,
72    )?;
73
74    // Update the registry's worker counter.
75    registry.total_workers += 1;
76
77    Ok(())
78}