1use anchor_lang::{
3 prelude::Pubkey, solana_program::instruction::Instruction, InstructionData, ToAccountMetas,
4};
5
6use crate::Config;
7
8pub struct InitializeArgs {
9 pub authority: Pubkey,
10 pub expired_funds_account: Pubkey,
11 pub num_epochs_valid: u64,
12 pub max_validator_commission_bps: u16,
13 pub bump: u8,
14}
15pub struct InitializeAccounts {
16 pub config: Pubkey,
17 pub system_program: Pubkey,
18 pub initializer: Pubkey,
19}
20pub fn initialize_ix(
21 program_id: Pubkey,
22 args: InitializeArgs,
23 accounts: InitializeAccounts,
24) -> Instruction {
25 let InitializeArgs {
26 authority,
27 expired_funds_account,
28 num_epochs_valid,
29 max_validator_commission_bps,
30 bump,
31 } = args;
32
33 let InitializeAccounts {
34 config,
35 system_program,
36 initializer,
37 } = accounts;
38
39 Instruction {
40 program_id,
41 data: crate::instruction::Initialize {
42 authority,
43 expired_funds_account,
44 num_epochs_valid,
45 max_validator_commission_bps,
46 bump,
47 }
48 .data(),
49 accounts: crate::accounts::Initialize {
50 config,
51 system_program,
52 initializer,
53 }
54 .to_account_metas(None),
55 }
56}
57
58pub struct InitializeTipDistributionAccountArgs {
59 pub merkle_root_upload_authority: Pubkey,
60 pub validator_commission_bps: u16,
61 pub bump: u8,
62}
63pub struct InitializeTipDistributionAccountAccounts {
64 pub config: Pubkey,
65 pub signer: Pubkey,
66 pub system_program: Pubkey,
67 pub tip_distribution_account: Pubkey,
68 pub validator_vote_account: Pubkey,
69}
70pub fn initialize_tip_distribution_account_ix(
71 program_id: Pubkey,
72 args: InitializeTipDistributionAccountArgs,
73 accounts: InitializeTipDistributionAccountAccounts,
74) -> Instruction {
75 let InitializeTipDistributionAccountArgs {
76 merkle_root_upload_authority,
77 validator_commission_bps,
78 bump,
79 } = args;
80
81 let InitializeTipDistributionAccountAccounts {
82 config,
83 tip_distribution_account,
84 system_program,
85 validator_vote_account,
86 signer,
87 } = accounts;
88
89 Instruction {
90 program_id,
91 data: crate::instruction::InitializeTipDistributionAccount {
92 merkle_root_upload_authority,
93 validator_commission_bps,
94 bump,
95 }
96 .data(),
97 accounts: crate::accounts::InitializeTipDistributionAccount {
98 config,
99 signer,
100 system_program,
101 tip_distribution_account,
102 validator_vote_account,
103 }
104 .to_account_metas(None),
105 }
106}
107
108pub struct CloseClaimStatusArgs;
109pub struct CloseClaimStatusAccounts {
110 pub config: Pubkey,
111 pub claim_status: Pubkey,
112 pub claim_status_payer: Pubkey,
113}
114pub fn close_claim_status_ix(
115 program_id: Pubkey,
116 _args: CloseClaimStatusArgs,
117 accounts: CloseClaimStatusAccounts,
118) -> Instruction {
119 let CloseClaimStatusAccounts {
120 config,
121 claim_status,
122 claim_status_payer,
123 } = accounts;
124
125 Instruction {
126 program_id,
127 data: crate::instruction::CloseClaimStatus {}.data(),
128 accounts: crate::accounts::CloseClaimStatus {
129 config,
130 claim_status,
131 claim_status_payer,
132 }
133 .to_account_metas(None),
134 }
135}
136
137pub struct UpdateConfigArgs {
138 new_config: Config,
139}
140pub struct UpdateConfigAccounts {
141 pub config: Pubkey,
142 pub authority: Pubkey,
143}
144pub fn update_config_ix(
145 program_id: Pubkey,
146 args: UpdateConfigArgs,
147 accounts: UpdateConfigAccounts,
148) -> Instruction {
149 let UpdateConfigArgs { new_config } = args;
150
151 let UpdateConfigAccounts { config, authority } = accounts;
152
153 Instruction {
154 program_id,
155 data: crate::instruction::UpdateConfig { new_config }.data(),
156 accounts: crate::accounts::UpdateConfig { config, authority }.to_account_metas(None),
157 }
158}
159
160pub struct UploadMerkleRootArgs {
161 pub root: [u8; 32],
162 pub max_total_claim: u64,
163 pub max_num_nodes: u64,
164}
165pub struct UploadMerkleRootAccounts {
166 pub config: Pubkey,
167 pub merkle_root_upload_authority: Pubkey,
168 pub tip_distribution_account: Pubkey,
169}
170pub fn upload_merkle_root_ix(
171 program_id: Pubkey,
172 args: UploadMerkleRootArgs,
173 accounts: UploadMerkleRootAccounts,
174) -> Instruction {
175 let UploadMerkleRootArgs {
176 root,
177 max_total_claim,
178 max_num_nodes,
179 } = args;
180
181 let UploadMerkleRootAccounts {
182 config,
183 merkle_root_upload_authority,
184 tip_distribution_account,
185 } = accounts;
186
187 Instruction {
188 program_id,
189 data: crate::instruction::UploadMerkleRoot {
190 max_total_claim,
191 max_num_nodes,
192 root,
193 }
194 .data(),
195 accounts: crate::accounts::UploadMerkleRoot {
196 config,
197 merkle_root_upload_authority,
198 tip_distribution_account,
199 }
200 .to_account_metas(None),
201 }
202}
203
204pub struct CloseTipDistributionAccountArgs {
205 pub _epoch: u64,
206}
207pub struct CloseTipDistributionAccounts {
208 pub config: Pubkey,
209 pub tip_distribution_account: Pubkey,
210 pub validator_vote_account: Pubkey,
211 pub expired_funds_account: Pubkey,
212 pub signer: Pubkey,
213}
214pub fn close_tip_distribution_account_ix(
215 program_id: Pubkey,
216 args: CloseTipDistributionAccountArgs,
217 accounts: CloseTipDistributionAccounts,
218) -> Instruction {
219 let CloseTipDistributionAccountArgs { _epoch } = args;
220
221 let CloseTipDistributionAccounts {
222 config,
223 tip_distribution_account,
224 validator_vote_account,
225 expired_funds_account,
226 signer,
227 } = accounts;
228
229 Instruction {
230 program_id,
231 data: crate::instruction::CloseTipDistributionAccount { _epoch }.data(),
232 accounts: crate::accounts::CloseTipDistributionAccount {
233 config,
234 validator_vote_account,
235 expired_funds_account,
236 tip_distribution_account,
237 signer,
238 }
239 .to_account_metas(None),
240 }
241}
242
243pub struct ClaimArgs {
244 pub proof: Vec<[u8; 32]>,
245 pub amount: u64,
246 pub bump: u8,
247}
248pub struct ClaimAccounts {
249 pub config: Pubkey,
250 pub tip_distribution_account: Pubkey,
251 pub claim_status: Pubkey,
252 pub claimant: Pubkey,
253 pub payer: Pubkey,
254 pub system_program: Pubkey,
255}
256pub fn claim_ix(program_id: Pubkey, args: ClaimArgs, accounts: ClaimAccounts) -> Instruction {
257 let ClaimArgs {
258 proof,
259 amount,
260 bump,
261 } = args;
262
263 let ClaimAccounts {
264 config,
265 tip_distribution_account,
266 claim_status,
267 claimant,
268 payer,
269 system_program,
270 } = accounts;
271
272 Instruction {
273 program_id,
274 data: crate::instruction::Claim {
275 proof,
276 amount,
277 bump,
278 }
279 .data(),
280 accounts: crate::accounts::Claim {
281 config,
282 tip_distribution_account,
283 claimant,
284 claim_status,
285 payer,
286 system_program,
287 }
288 .to_account_metas(None),
289 }
290}