coal_api/
guild_loaders.rs

1use 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}