gmsol_timelock/instructions/
executor.rs

1use anchor_lang::prelude::*;
2use gmsol_store::{
3    states::{Seed, MAX_ROLE_NAME_LEN},
4    utils::fixed_str::fixed_str_to_bytes,
5};
6use gmsol_utils::InitSpace;
7
8use crate::states::executor::Executor;
9
10/// The accounts definition for [`initialize_executor`](crate::gmsol_timelock::initialize_executor).
11#[derive(Accounts)]
12#[instruction(role: String)]
13pub struct InitializeExecutor<'info> {
14    /// Payer.
15    #[account(mut)]
16    pub payer: Signer<'info>,
17    /// Store.
18    /// CHECK: check by CPI.
19    pub store: UncheckedAccount<'info>,
20    /// Executor to initialize.
21    #[account(
22        init,
23        payer = payer,
24        space = 8 + Executor::INIT_SPACE,
25        seeds = [
26            Executor::SEED,
27            store.key.as_ref(),
28            &fixed_str_to_bytes::<MAX_ROLE_NAME_LEN>(&role)?,
29        ],
30        bump,
31    )]
32    pub executor: AccountLoader<'info, Executor>,
33    /// Executor wallet.
34    /// CHECK: only the bump is used.
35    #[account(
36        seeds = [Executor::WALLET_SEED, executor.key().as_ref()],
37        bump,
38    )]
39    pub wallet: UncheckedAccount<'info>,
40    /// The system program.
41    pub system_program: Program<'info, System>,
42}
43
44pub(crate) fn initialize_executor(ctx: Context<InitializeExecutor>, role: &str) -> Result<()> {
45    ctx.accounts.executor.load_init()?.try_init(
46        ctx.bumps.executor,
47        ctx.bumps.wallet,
48        ctx.accounts.store.key(),
49        role,
50    )?;
51    Ok(())
52}