gmsol_timelock/instructions/
executor.rs1use 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#[derive(Accounts)]
12#[instruction(role: String)]
13pub struct InitializeExecutor<'info> {
14 #[account(mut)]
16 pub payer: Signer<'info>,
17 pub store: UncheckedAccount<'info>,
20 #[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 #[account(
36 seeds = [Executor::WALLET_SEED, executor.key().as_ref()],
37 bump,
38 )]
39 pub wallet: UncheckedAccount<'info>,
40 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}