1use crate::constants::BL_PROGRAM_ID;
2use borsh::{BorshDeserialize, BorshSerialize};
3use solana_program::instruction::{AccountMeta, Instruction};
4use solana_program::pubkey::Pubkey;
5use crate::utils::{get_account_meta_or_read_default, get_instruction_name_data};
6
7#[repr(C)]
8#[derive(BorshSerialize, BorshDeserialize, PartialEq, Eq, Debug, Clone)]
9pub struct GeneralTransferRewardArgs {
10 pub amount: u64,
12}
13
14#[repr(C)]
15#[derive(BorshSerialize, BorshDeserialize, PartialEq, Eq, Debug, Clone)]
16pub struct TransferUncheckedLocalSharedRewardArgs {
17 pub total_amount: u64,
19 pub shares_in_bps: Vec<u16>,
21 pub members_included: bool,
24}
25
26pub fn transfer_unchecked_local_shared_reward(
41 authority: Pubkey,
42 system_program: Option<Pubkey>,
43 mint: Option<Pubkey>,
44 token_program: Option<Pubkey>,
45 from_account: Option<Pubkey>,
46 remaining_accounts: &[Pubkey],
47 transfer_args: &TransferUncheckedLocalSharedRewardArgs,
48) -> Instruction {
49 let mut instruction_data = get_instruction_name_data("transfer_reward_unchecked_multiple");
50 instruction_data.extend_from_slice(&transfer_args.try_to_vec().unwrap());
51
52 let mut accounts = vec![
53 AccountMeta::new(authority, true),
54 AccountMeta::new_readonly(system_program.unwrap_or(BL_PROGRAM_ID), false),
55 AccountMeta::new_readonly(mint.unwrap_or(BL_PROGRAM_ID), false),
56 AccountMeta::new_readonly(token_program.unwrap_or(BL_PROGRAM_ID), false),
57 get_account_meta_or_read_default(&from_account),
58 ];
59
60 accounts.extend_from_slice(
61 &remaining_accounts
62 .iter()
63 .map(|account| AccountMeta {
64 pubkey: *account,
65 is_signer: false,
66 is_writable: true,
67 })
68 .collect::<Vec<AccountMeta>>(),
69 );
70
71 Instruction {
72 program_id: BL_PROGRAM_ID,
73 accounts,
74 data: instruction_data,
75 }
76}
77
78#[allow(clippy::too_many_arguments)]
99pub fn transfer_secure_local_reward(
100 authority: Pubkey,
101 mint: Pubkey,
102 token_program: Pubkey,
103 from_token_account: Pubkey,
104 referrer_token_account: Pubkey,
105 referrer_member: Pubkey,
106 referrer_treasury: Pubkey,
107 referrer_treasury_for_reward: Pubkey,
108 referee_buddy_profile: Pubkey,
109 referee_buddy: Pubkey,
110 referee_treasury: Pubkey,
111 referee_member: Pubkey,
112 transfer_args: &GeneralTransferRewardArgs,
113) -> Instruction {
114 let mut instruction_data = get_instruction_name_data("transfer_reward_secure_no_global");
115 instruction_data.extend_from_slice(&transfer_args.try_to_vec().unwrap());
116
117 Instruction {
118 program_id: BL_PROGRAM_ID,
119 accounts: vec![
120 AccountMeta::new(authority, true),
121 AccountMeta::new_readonly(mint, false),
122 AccountMeta::new_readonly(token_program, false),
123 AccountMeta::new(from_token_account, false),
124 AccountMeta::new(referrer_member, false),
125 AccountMeta::new(referrer_treasury, false),
126 AccountMeta::new(referrer_treasury_for_reward, false),
127 AccountMeta::new(referee_buddy_profile, false),
128 AccountMeta::new(referee_buddy, false),
129 AccountMeta::new(referee_treasury, false),
130 AccountMeta::new(referee_member, false),
131 AccountMeta::new(referrer_token_account, false),
132 ],
133 data: instruction_data,
134 }
135}
136
137#[allow(clippy::too_many_arguments)]
157pub fn transfer_checked_global_reward(
158 authority: Pubkey,
159 mint: Pubkey,
160 token_program: Pubkey,
161 from_token_account: Pubkey,
162 referrer_token_account: Pubkey,
163 referrer_member: Option<Pubkey>,
164 referrer_treasury: Pubkey,
165 referrer_treasury_for_reward: Pubkey,
166 referee_member: Pubkey,
167 buddy_global_referrer_treasury: Option<Pubkey>,
168 buddy_global_referrer_token_account: Option<Pubkey>,
169 transfer_args: &GeneralTransferRewardArgs,
170) -> Instruction {
171 let mut instruction_data = get_instruction_name_data("transfer_reward_spl");
172 instruction_data.extend_from_slice(&transfer_args.try_to_vec().unwrap());
173
174 Instruction {
175 program_id: BL_PROGRAM_ID,
176 accounts: vec![
177 AccountMeta::new(authority, true),
178 get_account_meta_or_read_default(&buddy_global_referrer_treasury),
179 get_account_meta_or_read_default(&buddy_global_referrer_token_account),
180 get_account_meta_or_read_default(&referrer_member),
181 AccountMeta::new(referrer_treasury, false),
182 AccountMeta::new(referrer_treasury_for_reward, false),
183 AccountMeta::new(referee_member, false),
184 AccountMeta::new_readonly(mint, false),
185 AccountMeta::new_readonly(token_program, false),
186 AccountMeta::new(from_token_account, false),
187 AccountMeta::new(referrer_token_account, false),
188 ],
189 data: instruction_data,
190 }
191}
192
193#[allow(clippy::too_many_arguments)]
213pub fn transfer_checked_global_only_reward(
214 authority: Pubkey,
215 system_program: Option<Pubkey>,
216 mint: Option<Pubkey>,
217 token_program: Option<Pubkey>,
218 from_token_account: Option<Pubkey>,
219 referrer_token_account: Option<Pubkey>,
220 buddy_global_referrer_treasury: Pubkey,
221 buddy_global_referrer_treasury_for_reward: Pubkey,
222 referee_buddy_profile: Pubkey,
223 referee_buddy: Pubkey,
224 transfer_args: &GeneralTransferRewardArgs,
225) -> Instruction {
226 let mut instruction_data = get_instruction_name_data("transfer_reward_global");
227 instruction_data.extend_from_slice(&transfer_args.try_to_vec().unwrap());
228
229 Instruction {
230 program_id: BL_PROGRAM_ID,
231 accounts: vec![
232 AccountMeta::new(authority, true),
233 AccountMeta::new(buddy_global_referrer_treasury, false),
234 AccountMeta::new(buddy_global_referrer_treasury_for_reward, false),
235 AccountMeta::new_readonly(referee_buddy_profile, false),
236 AccountMeta::new_readonly(referee_buddy, false),
237 AccountMeta::new_readonly(system_program.unwrap_or(BL_PROGRAM_ID), false),
238 AccountMeta::new_readonly(mint.unwrap_or(BL_PROGRAM_ID), false),
239 AccountMeta::new_readonly(token_program.unwrap_or(BL_PROGRAM_ID), false),
240 get_account_meta_or_read_default(&referrer_token_account),
241 get_account_meta_or_read_default(&from_token_account),
242 ],
243 data: instruction_data,
244 }
245}