coal_api/
guild_loaders.rs1use solana_program::{
2 account_info::AccountInfo,
3 program_error::ProgramError,
4 pubkey::Pubkey,
5};
6use coal_guilds_api::state::{Guild, Member, Config as GuildConfig};
7use steel::AccountDeserialize;
8
9pub fn load_guild_with_member<'a, 'info>(guild_info: &'a AccountInfo<'info>, member_info: &'a AccountInfo<'info>, authority: &Pubkey) -> Result<u64, ProgramError> {
10 if guild_info.owner.ne(&coal_guilds_api::id()) {
11 return Err(ProgramError::InvalidAccountOwner);
12 }
13
14 if member_info.owner.ne(&coal_guilds_api::id()) {
15 return Err(ProgramError::InvalidAccountOwner);
16 }
17
18 let guild_data = &guild_info.data.borrow();
19 let member_data = &member_info.data.borrow();
20
21 let guild = Guild::try_from_bytes(guild_data)?;
22 let member = Member::try_from_bytes(member_data)?;
23
24 if member.authority.ne(authority) {
25 return Err(ProgramError::InvalidAccountOwner);
26 }
27
28 if member.is_active.ne(&1) {
29 return Err(ProgramError::InvalidAccountData);
30 }
31
32 if member.guild.ne(&guild_info.key) {
33 return Err(ProgramError::InvalidAccountOwner);
34 }
35
36 Ok(guild.total_stake)
37}
38
39pub fn load_member<'a, 'info>(member_info: &'a AccountInfo<'info>, authority: &Pubkey) -> Result<u64, ProgramError> {
40 if member_info.owner.ne(&coal_guilds_api::id()) {
41 return Err(ProgramError::InvalidAccountOwner);
42 }
43
44 let member_data = &member_info.data.borrow();
45 let member = Member::try_from_bytes(member_data)?;
46
47 if member.authority.ne(authority) {
48 return Err(ProgramError::InvalidAccountData);
49 }
50
51 if member.is_active.ne(&1) {
52 return Err(ProgramError::InvalidAccountData);
53 }
54
55 Ok(member.total_stake)
56}
57
58pub fn load_guild_config<'a, 'info>(guild_config_info: &'a AccountInfo<'info>) -> Result<(u64, u64), ProgramError> {
59 if guild_config_info.owner.ne(&coal_guilds_api::id()) {
60 return Err(ProgramError::InvalidAccountOwner);
61 }
62
63 let guild_config_data = &guild_config_info.data.borrow();
64 let guild_config = GuildConfig::try_from_bytes(guild_config_data)?;
65
66 Ok((guild_config.total_stake, guild_config.total_multiplier))
67}