use anchor_lang::solana_program::account_info::AccountInfo; use anchor_lang::solana_program::pubkey::Pubkey; use anchor_lang::Result; use anchor_lang::{context::CpiContext, Accounts}; pub fn group_pointer_initialize<'info>( ctx: CpiContext<'_, '_, '_, 'info, GroupPointerInitialize<'info>>, authority: Option, group_address: Option, ) -> Result<()> { let ix = spl_token_2022::extension::group_pointer::instruction::initialize( ctx.accounts.token_program_id.key, ctx.accounts.mint.key, authority, group_address, )?; solana_program::program::invoke_signed( &ix, &[ctx.accounts.token_program_id, ctx.accounts.mint], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] pub struct GroupPointerInitialize<'info> { pub token_program_id: AccountInfo<'info>, pub mint: AccountInfo<'info>, } pub fn group_pointer_update<'info>( ctx: CpiContext<'_, '_, '_, 'info, GroupPointerUpdate<'info>>, group_address: Option, ) -> Result<()> { let ix = spl_token_2022::extension::group_pointer::instruction::update( ctx.accounts.token_program_id.key, ctx.accounts.mint.key, ctx.accounts.authority.key, &[&ctx.accounts.authority.key], group_address, )?; solana_program::program::invoke_signed( &ix, &[ctx.accounts.token_program_id, ctx.accounts.mint], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] pub struct GroupPointerUpdate<'info> { pub token_program_id: AccountInfo<'info>, pub mint: AccountInfo<'info>, pub authority: AccountInfo<'info>, }