1use steel::*;
2
3use crate::{
4 consts::LP_MINT_ADDRESS, instruction::*, state::{config_pda, guild_pda, invite_pda, member_pda}
5};
6
7pub 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}