use crate::state::{asset::Asset, error::MultisigError, group::Group, member::AssetMember};
use anchor_lang::{prelude::*, solana_program::system_program};
#[derive(Accounts)]
pub struct CleanUpAssetMemberInstructionAccounts<'info> {
#[account(
seeds = [b"group", group.group_seed.as_ref()],
bump = group.account_bump
)]
pub group: Account<'info, Group>,
#[account(
mut,
seeds = [
b"asset-member",
group.key().as_ref(),
asset_member.asset.as_ref(),
member.key().as_ref()
],
bump = asset_member.account_bump,
close = rent_collector
)]
pub asset_member: Account<'info, AssetMember>,
#[account(
mut,
seeds = [b"asset", group.key().as_ref(), asset_member.asset.as_ref()],
bump = asset.account_bump
)]
pub asset: Account<'info, Asset>,
#[account(
seeds = [b"member", group.key().as_ref(), member.key().as_ref()],
bump,
)]
pub group_member: UncheckedAccount<'info>,
pub member: UncheckedAccount<'info>,
#[account(mut)]
pub rent_collector: UncheckedAccount<'info>,
}
#[inline(always)]
fn checks(ctx: &Context<CleanUpAssetMemberInstructionAccounts>) -> Result<()> {
let group = &ctx.accounts.group;
let group_member = &ctx.accounts.group_member;
let rent_collector = &ctx.accounts.rent_collector;
require_keys_eq!(
rent_collector.key(),
group.rent_collector,
MultisigError::UnexpectedRentCollector
);
require!(
group_member.owner == &system_program::ID && group_member.data_is_empty(),
MultisigError::GroupMemberStillActive
);
Ok(())
}
pub fn clean_up_asset_member_handler(
ctx: Context<CleanUpAssetMemberInstructionAccounts>,
) -> Result<()> {
checks(&ctx)?;
ctx.accounts.asset.decrement_member_count()
}