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(signer: Pubkey, payer: Pubkey, amount: u64, compound_fee: u64) -> Instruction {
31 let mint_address = MINT_ADDRESS;
32 let stake_address = stake_pda(signer).0;
33 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
34 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
35 let treasury_address = treasury_pda().0;
36 Instruction {
37 program_id: crate::ID,
38 accounts: vec![
39 AccountMeta::new(signer, true),
40 AccountMeta::new(payer, true),
41 AccountMeta::new(mint_address, false),
42 AccountMeta::new(sender_address, false),
43 AccountMeta::new(stake_address, false),
44 AccountMeta::new(stake_tokens_address, false),
45 AccountMeta::new(treasury_address, false),
46 AccountMeta::new_readonly(system_program::ID, false),
47 AccountMeta::new_readonly(spl_token::ID, false),
48 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
49 ],
50 data: Deposit {
51 amount: amount.to_le_bytes(),
52 compound_fee: compound_fee.to_le_bytes(),
53 }
54 .to_bytes(),
55 }
56}
57
58pub fn withdraw(signer: Pubkey, amount: u64) -> Instruction {
59 let stake_address = stake_pda(signer).0;
60 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
61 let mint_address = MINT_ADDRESS;
62 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
63 let treasury_address = treasury_pda().0;
64 Instruction {
65 program_id: crate::ID,
66 accounts: vec![
67 AccountMeta::new(signer, true),
68 AccountMeta::new(mint_address, false),
69 AccountMeta::new(recipient_address, false),
70 AccountMeta::new(stake_address, false),
71 AccountMeta::new(stake_tokens_address, false),
72 AccountMeta::new(treasury_address, false),
73 AccountMeta::new_readonly(system_program::ID, false),
74 AccountMeta::new_readonly(spl_token::ID, false),
75 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
76 ],
77 data: Withdraw {
78 amount: amount.to_le_bytes(),
79 }
80 .to_bytes(),
81 }
82}
83
84pub fn claim(signer: Pubkey, amount: u64) -> Instruction {
85 let stake_address = stake_pda(signer).0;
86 let mint_address = MINT_ADDRESS;
87 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
88 let treasury_address = treasury_pda().0;
89 let treasury_tokens_address = treasury_tokens_address();
90 Instruction {
91 program_id: crate::ID,
92 accounts: vec![
93 AccountMeta::new(signer, true),
94 AccountMeta::new(mint_address, false),
95 AccountMeta::new(recipient_address, false),
96 AccountMeta::new(stake_address, false),
97 AccountMeta::new(treasury_address, false),
98 AccountMeta::new(treasury_tokens_address, false),
99 AccountMeta::new_readonly(system_program::ID, false),
100 AccountMeta::new_readonly(spl_token::ID, false),
101 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
102 ],
103 data: Claim {
104 amount: amount.to_le_bytes(),
105 }
106 .to_bytes(),
107 }
108}
109
110pub fn compound(signer: Pubkey) -> Instruction {
111 let stake_address = stake_pda(signer).0;
112 let mint_address = MINT_ADDRESS;
113 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
114 let treasury_address = treasury_pda().0;
115 let treasury_tokens_address = treasury_tokens_address();
116 Instruction {
117 program_id: crate::ID,
118 accounts: vec![
119 AccountMeta::new(signer, true),
120 AccountMeta::new(mint_address, false),
121 AccountMeta::new(stake_address, false),
122 AccountMeta::new(stake_tokens_address, false),
123 AccountMeta::new(treasury_address, false),
124 AccountMeta::new(treasury_tokens_address, false),
125 AccountMeta::new_readonly(system_program::ID, false),
126 AccountMeta::new_readonly(spl_token::ID, false),
127 ],
128 data: Compound {}.to_bytes(),
129 }
130}
131
132pub fn init(signer: Pubkey) -> Instruction {
133 let mint_address = MINT_ADDRESS;
134 let treasury_address = treasury_pda().0;
135 let treasury_tokens_info = treasury_tokens_address();
136 Instruction {
137 program_id: crate::ID,
138 accounts: vec![
139 AccountMeta::new(signer, true),
140 AccountMeta::new(mint_address, false),
141 AccountMeta::new(treasury_address, false),
142 AccountMeta::new(treasury_tokens_info, false),
143 AccountMeta::new_readonly(system_program::ID, false),
144 AccountMeta::new_readonly(spl_token::ID, false),
145 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
146 ],
147 data: Init {}.to_bytes(),
148 }
149}
150
151pub fn distribute(signer: Pubkey, amount: u64) -> Instruction {
152 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
153 let ore_mint_info = MINT_ADDRESS;
154 let treasury_info = treasury_pda().0;
155 let treasury_tokens_info = treasury_tokens_address();
156 Instruction {
157 program_id: crate::ID,
158 accounts: vec![
159 AccountMeta::new(signer, true),
160 AccountMeta::new(sender_address, false),
161 AccountMeta::new(ore_mint_info, false),
162 AccountMeta::new(treasury_info, false),
163 AccountMeta::new(treasury_tokens_info, false),
164 AccountMeta::new_readonly(spl_token::ID, false),
165 ],
166 data: Distribute {
167 amount: amount.to_le_bytes(),
168 }
169 .to_bytes(),
170 }
171}