1use solana_program::pubkey::Pubkey;
2use spl_associated_token_account::get_associated_token_address;
3use steel::*;
4
5use crate::{
6 consts::{MINT_ADDRESS, TREASURY},
7 instruction::*,
8 state::*,
9};
10
11pub fn log(signer: Pubkey, msg: &[u8]) -> Instruction {
12 let mut data = Log {}.to_bytes();
13 data.extend_from_slice(msg);
14 Instruction {
15 program_id: crate::ID,
16 accounts: vec![AccountMeta::new(signer, true)],
17 data: data,
18 }
19}
20
21pub fn program_log(accounts: &[AccountInfo], msg: &[u8]) -> Result<(), ProgramError> {
22 invoke_signed(
23 &log(*accounts[0].key, msg),
24 accounts,
25 &crate::ID,
26 &[TREASURY],
27 )
28}
29
30pub fn deposit(
31 signer: Pubkey,
32 payer: Pubkey,
33 amount: u64,
34 compound_fee: u64,
35 compound_fee_deposit: u64,
36) -> Instruction {
37 let mint_address = MINT_ADDRESS;
38 let stake_address = stake_pda(signer).0;
39 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
40 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
41 let treasury_address = treasury_pda().0;
42 Instruction {
43 program_id: crate::ID,
44 accounts: vec![
45 AccountMeta::new(signer, true),
46 AccountMeta::new(payer, true),
47 AccountMeta::new(mint_address, false),
48 AccountMeta::new(sender_address, false),
49 AccountMeta::new(stake_address, false),
50 AccountMeta::new(stake_tokens_address, false),
51 AccountMeta::new(treasury_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: Deposit {
57 amount: amount.to_le_bytes(),
58 compound_fee: compound_fee.to_le_bytes(),
59 compound_fee_deposit: compound_fee_deposit.to_le_bytes(),
60 }
61 .to_bytes(),
62 }
63}
64
65pub fn withdraw(signer: Pubkey, amount: u64) -> Instruction {
66 let stake_address = stake_pda(signer).0;
67 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
68 let mint_address = MINT_ADDRESS;
69 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
70 let treasury_address = treasury_pda().0;
71 Instruction {
72 program_id: crate::ID,
73 accounts: vec![
74 AccountMeta::new(signer, true),
75 AccountMeta::new(mint_address, false),
76 AccountMeta::new(recipient_address, false),
77 AccountMeta::new(stake_address, false),
78 AccountMeta::new(stake_tokens_address, false),
79 AccountMeta::new(treasury_address, false),
80 AccountMeta::new_readonly(system_program::ID, false),
81 AccountMeta::new_readonly(spl_token::ID, false),
82 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
83 ],
84 data: Withdraw {
85 amount: amount.to_le_bytes(),
86 }
87 .to_bytes(),
88 }
89}
90
91pub fn claim(signer: Pubkey, amount: u64) -> Instruction {
92 let stake_address = stake_pda(signer).0;
93 let mint_address = MINT_ADDRESS;
94 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
95 let treasury_address = treasury_pda().0;
96 let treasury_tokens_address = treasury_tokens_address();
97 Instruction {
98 program_id: crate::ID,
99 accounts: vec![
100 AccountMeta::new(signer, true),
101 AccountMeta::new(mint_address, false),
102 AccountMeta::new(recipient_address, false),
103 AccountMeta::new(stake_address, false),
104 AccountMeta::new(treasury_address, false),
105 AccountMeta::new(treasury_tokens_address, false),
106 AccountMeta::new_readonly(system_program::ID, false),
107 AccountMeta::new_readonly(spl_token::ID, false),
108 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
109 ],
110 data: Claim {
111 amount: amount.to_le_bytes(),
112 }
113 .to_bytes(),
114 }
115}
116
117pub fn compound(signer: Pubkey) -> Instruction {
118 let stake_address = stake_pda(signer).0;
119 let mint_address = MINT_ADDRESS;
120 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
121 let treasury_address = treasury_pda().0;
122 let treasury_tokens_address = treasury_tokens_address();
123 Instruction {
124 program_id: crate::ID,
125 accounts: vec![
126 AccountMeta::new(signer, true),
127 AccountMeta::new(mint_address, false),
128 AccountMeta::new(stake_address, false),
129 AccountMeta::new(stake_tokens_address, false),
130 AccountMeta::new(treasury_address, false),
131 AccountMeta::new(treasury_tokens_address, false),
132 AccountMeta::new_readonly(system_program::ID, false),
133 AccountMeta::new_readonly(spl_token::ID, false),
134 ],
135 data: Compound {}.to_bytes(),
136 }
137}
138
139pub fn init(signer: Pubkey) -> Instruction {
140 let mint_address = MINT_ADDRESS;
141 let treasury_address = treasury_pda().0;
142 let treasury_tokens_info = treasury_tokens_address();
143 Instruction {
144 program_id: crate::ID,
145 accounts: vec![
146 AccountMeta::new(signer, true),
147 AccountMeta::new(mint_address, false),
148 AccountMeta::new(treasury_address, false),
149 AccountMeta::new(treasury_tokens_info, false),
150 AccountMeta::new_readonly(system_program::ID, false),
151 AccountMeta::new_readonly(spl_token::ID, false),
152 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
153 ],
154 data: Init {}.to_bytes(),
155 }
156}
157
158pub fn distribute(signer: Pubkey, amount: u64) -> Instruction {
159 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
160 let ore_mint_info = MINT_ADDRESS;
161 let treasury_info = treasury_pda().0;
162 let treasury_tokens_info = treasury_tokens_address();
163 Instruction {
164 program_id: crate::ID,
165 accounts: vec![
166 AccountMeta::new(signer, true),
167 AccountMeta::new(sender_address, false),
168 AccountMeta::new(ore_mint_info, false),
169 AccountMeta::new(treasury_info, false),
170 AccountMeta::new(treasury_tokens_info, false),
171 AccountMeta::new_readonly(spl_token::ID, false),
172 ],
173 data: Distribute {
174 amount: amount.to_le_bytes(),
175 }
176 .to_bytes(),
177 }
178}