tip_distribution/sdk/
instruction.rs

1//! This module contains functions that build instructions to interact with the tip-distribution program.
2use 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}