coal_guilds_api/
sdk.rs

1use steel::*;
2
3use crate::{
4    consts::LP_MINT_ADDRESS, instruction::*, state::{config_pda, guild_pda, invite_pda, member_pda}
5};
6
7// Build initialize instruction.
8pub fn initialize(signer: Pubkey) -> Instruction {
9    let config_pda = config_pda();
10    Instruction {
11        program_id: crate::ID,
12        accounts: vec![
13            AccountMeta::new(signer, true),
14            AccountMeta::new(config_pda.0, false),
15            AccountMeta::new_readonly(system_program::ID, false),
16        ],
17        data: Initialize {
18            config_bump: config_pda.1,
19        }
20        .to_bytes(),
21    }
22}
23
24pub fn new_guild(signer: Pubkey) -> Instruction {
25    let guild = guild_pda(signer);
26
27    Instruction {
28        program_id: crate::ID,
29        accounts: vec![
30            AccountMeta::new(signer, true),
31            AccountMeta::new(guild.0, false),   
32            AccountMeta::new_readonly(system_program::ID, false),
33        ],
34        data: NewGuild {
35            guild_bump: guild.1,
36        }
37        .to_bytes(),
38    }
39}
40
41pub fn new_member(signer: Pubkey) -> Instruction {
42    let member = member_pda(signer);
43    let stake_tokens_info = spl_associated_token_account::get_associated_token_address(&member.0, &LP_MINT_ADDRESS);
44    
45    Instruction {
46        program_id: crate::ID,
47        accounts: vec![
48            AccountMeta::new(signer, true),
49            AccountMeta::new(member.0, false),
50            AccountMeta::new(stake_tokens_info, false),
51            AccountMeta::new_readonly(LP_MINT_ADDRESS, false),
52            AccountMeta::new_readonly(system_program::ID, false),
53            AccountMeta::new_readonly(spl_token::ID, false),
54            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
55        ],
56        data: NewMember {
57            member_bump: member.1,
58        }
59        .to_bytes(),
60    }
61}
62
63pub fn invite(signer: Pubkey, address: Pubkey) -> Instruction {
64    let guild = guild_pda(signer);
65    let member = member_pda(address);
66    let invite = invite_pda(guild.0, member.0);
67
68    Instruction {
69        program_id: crate::ID,
70        accounts: vec![
71            AccountMeta::new(signer, true),
72            AccountMeta::new_readonly(guild.0, false),
73            AccountMeta::new(invite.0, false),
74            AccountMeta::new_readonly(member.0, false),
75            AccountMeta::new_readonly(system_program::ID, false),
76        ],
77        data: NewInvite {
78            invite_bump: invite.1,
79            guild_bump: guild.1,
80        }
81        .to_bytes(),
82    }
83}
84
85pub fn join(signer: Pubkey, guild: Pubkey, guild_authority: Pubkey) -> Instruction {
86    let member = member_pda(signer);
87    let invite = invite_pda(guild, member.0);
88
89    Instruction {
90        program_id: crate::ID,
91        accounts: vec![
92            AccountMeta::new(signer, true),
93            AccountMeta::new(guild, false),
94            AccountMeta::new(guild_authority, false),
95            AccountMeta::new(invite.0, false),
96            AccountMeta::new(member.0, false),
97            AccountMeta::new_readonly(system_program::ID, false),
98        ],
99        data: Join {
100            invite_bump: invite.1,
101            member_bump: member.1
102        }
103        .to_bytes(),
104    }
105}
106
107pub fn delegate(signer: Pubkey, guild: Pubkey) -> Instruction {
108    let member = member_pda(signer);
109
110    Instruction {
111        program_id: crate::ID,
112        accounts: vec![
113            AccountMeta::new(signer, true),
114            AccountMeta::new(guild, false),
115            AccountMeta::new(member.0, false),
116            AccountMeta::new_readonly(system_program::ID, false),
117        ],
118        data: Delegate {
119            member_bump: member.1
120        }
121        .to_bytes(),
122    }
123}
124
125pub fn leave(signer: Pubkey, guild: Pubkey) -> Instruction {
126    let member = member_pda(signer);
127
128    Instruction {
129        program_id: crate::ID,
130        accounts: vec![
131            AccountMeta::new(signer, true),
132            AccountMeta::new(guild, false),
133            AccountMeta::new(member.0, false),
134        ],
135        data: Leave {}.to_bytes(),
136    }
137}
138
139
140pub fn stake(signer: Pubkey, guild: Pubkey, amount: u64) -> Instruction {
141    let config = config_pda();
142    let member = member_pda(signer);
143    let member_tokens = spl_associated_token_account::get_associated_token_address(&signer, &LP_MINT_ADDRESS);
144    let stake_tokens_info = spl_associated_token_account::get_associated_token_address(&member.0, &LP_MINT_ADDRESS);
145
146    Instruction {
147        program_id: crate::ID,
148        accounts: vec![
149            AccountMeta::new(signer, true),
150            AccountMeta::new(config.0, false),
151            AccountMeta::new(guild, false),
152            AccountMeta::new(member.0, false),
153            AccountMeta::new(member_tokens, false),
154            AccountMeta::new(stake_tokens_info, false),
155            AccountMeta::new_readonly(spl_token::ID, false),
156        ],
157        data: Stake {
158            amount: amount.to_le_bytes(),
159        }.to_bytes(),
160    }
161}
162
163pub fn unstake(signer: Pubkey, guild: Pubkey, amount: u64) -> Instruction {
164    let config = config_pda();
165    let member = member_pda(signer);
166    let member_tokens = spl_associated_token_account::get_associated_token_address(&signer, &LP_MINT_ADDRESS);
167    let stake_tokens_info = spl_associated_token_account::get_associated_token_address(&member.0, &LP_MINT_ADDRESS);
168
169    Instruction {
170        program_id: crate::ID,
171        accounts: vec![
172            AccountMeta::new(signer, true),
173            AccountMeta::new(config.0, false),
174            AccountMeta::new(guild, false),
175            AccountMeta::new(member.0, false),
176            AccountMeta::new(member_tokens, false),
177            AccountMeta::new(stake_tokens_info, false),
178            AccountMeta::new_readonly(spl_token::ID, false),
179        ],
180        data: Unstake {
181            amount: amount.to_le_bytes(),
182        }.to_bytes(),
183    }
184}