cardinal-configs 1.0.0

Cardinal Configs
Documentation
use {crate::state::*, anchor_lang::prelude::*};

#[derive(AnchorSerialize, AnchorDeserialize)]
pub struct UpdateConfigEntryIx {
    value: String,
    extends: Vec<Pubkey>,
}

#[derive(Accounts)]
#[instruction(ix: UpdateConfigEntryIx)]
pub struct UpdateConfigEntryCtx<'info> {
    config_entry: Account<'info, ConfigEntry>,
    #[account(mut)]
    authority: Signer<'info>,
    system_program: Program<'info, System>,
}

pub fn handler(ctx: Context<UpdateConfigEntryCtx>, ix: UpdateConfigEntryIx) -> Result<()> {
    assert_authority(&ctx.accounts.config_entry.key, ctx.accounts.authority.key(), &mut ctx.remaining_accounts.iter())?;
    let config_entry = &mut ctx.accounts.config_entry;

    let new_config_entry = ConfigEntry {
        bump: config_entry.bump,
        key: config_entry.key.to_string(),
        value: ix.value,
        extends: ix.extends,
    };
    let new_space = new_config_entry.try_to_vec()?.len() + 8;
    config_entry.set_inner(new_config_entry);

    resize_account(
        &config_entry.to_account_info(),
        new_space,
        &ctx.accounts.authority.to_account_info(),
        &ctx.accounts.system_program.to_account_info(),
    )?;

    Ok(())
}