Adds an asset to a group. ### Accounts: 0. `[writable]` asset 1. `[writable]` group 2. `[signer]` authority
(program_id: &Pubkey, ctx: Context<Group>)
| 20 | /// 1. `[writable]` group |
| 21 | /// 2. `[signer]` authority |
| 22 | pub fn process_group(program_id: &Pubkey, ctx: Context<Group>) -> ProgramResult { |
| 23 | // account validation |
| 24 | |
| 25 | require!( |
| 26 | ctx.accounts.authority.is_signer(), |
| 27 | ProgramError::MissingRequiredSignature, |
| 28 | "authority" |
| 29 | ); |
| 30 | |
| 31 | require!( |
| 32 | ctx.accounts.asset.owner() == program_id, |
| 33 | ProgramError::IllegalOwner, |
| 34 | "asset" |
| 35 | ); |
| 36 | |
| 37 | require!( |
| 38 | ctx.accounts.group.owner() == program_id, |
| 39 | ProgramError::IllegalOwner, |
| 40 | "group" |
| 41 | ); |
| 42 | |
| 43 | let mut asset_data = ctx.accounts.asset.try_borrow_mut_data()?; |
| 44 | |
| 45 | require!( |
| 46 | asset_data.len() >= Asset::LEN && asset_data[0] == Discriminator::Asset.into(), |
| 47 | AssetError::Uninitialized, |
| 48 | "asset" |
| 49 | ); |
| 50 | |
| 51 | let mut group_data = ctx.accounts.group.try_borrow_mut_data()?; |
| 52 | |
| 53 | require!( |
| 54 | group_data.len() >= Asset::LEN && group_data[0] == Discriminator::Asset.into(), |
| 55 | AssetError::Uninitialized, |
| 56 | "group" |
| 57 | ); |
| 58 | |
| 59 | let asset = Asset::load_mut(&mut asset_data); |
| 60 | |
| 61 | require!( |
| 62 | asset.group.value().is_none(), |
| 63 | AssetError::AlreadyInGroup, |
| 64 | "asset" |
| 65 | ); |
| 66 | |
| 67 | let (group, extensions) = group_data.split_at_mut(Asset::LEN); |
| 68 | let group = Asset::load_mut(group); |
| 69 | |
| 70 | // authority of the group must match the asset |
| 71 | require!( |
| 72 | group.authority == asset.authority, |
| 73 | AssetError::InvalidAuthority, |
| 74 | "Group and asset authority mismatch" |
| 75 | ); |
| 76 | |
| 77 | let grouping = if let Some(grouping) = Extension::get_mut::<GroupingMut>(extensions) { |
| 78 | grouping |
| 79 | } else { |
no test coverage detected