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 {
61 let stake_address = stake_pda(signer).0;
62 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
63 let mint_address = MINT_ADDRESS;
64 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
65 let treasury_address = treasury_pda().0;
66 Instruction {
67 program_id: crate::ID,
68 accounts: vec![
69 AccountMeta::new(signer, true),
70 AccountMeta::new(mint_address, false),
71 AccountMeta::new(recipient_address, false),
72 AccountMeta::new(stake_address, false),
73 AccountMeta::new(stake_tokens_address, false),
74 AccountMeta::new(treasury_address, false),
75 AccountMeta::new_readonly(system_program::ID, false),
76 AccountMeta::new_readonly(spl_token::ID, false),
77 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
78 ],
79 data: Withdraw {
80 amount: amount.to_le_bytes(),
81 }
82 .to_bytes(),
83 }
84}
85
86pub fn claim_yield(signer: Pubkey, amount: u64) -> Instruction {
87 let stake_address = stake_pda(signer).0;
88 let mint_address = MINT_ADDRESS;
89 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
90 let treasury_address = treasury_pda().0;
91 let treasury_tokens_address = treasury_tokens_address();
92 Instruction {
93 program_id: crate::ID,
94 accounts: vec![
95 AccountMeta::new(signer, true),
96 AccountMeta::new(mint_address, false),
97 AccountMeta::new(recipient_address, false),
98 AccountMeta::new(stake_address, false),
99 AccountMeta::new(treasury_address, false),
100 AccountMeta::new(treasury_tokens_address, false),
101 AccountMeta::new_readonly(system_program::ID, false),
102 AccountMeta::new_readonly(spl_token::ID, false),
103 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
104 ],
105 data: ClaimYield {
106 amount: amount.to_le_bytes(),
107 }
108 .to_bytes(),
109 }
110}
111
112pub fn compound_yield(signer: Pubkey) -> Instruction {
113 let stake_address = stake_pda(signer).0;
114 let mint_address = MINT_ADDRESS;
115 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
116 let treasury_address = treasury_pda().0;
117 let treasury_tokens_address = treasury_tokens_address();
118 Instruction {
119 program_id: crate::ID,
120 accounts: vec![
121 AccountMeta::new(signer, true),
122 AccountMeta::new(mint_address, false),
123 AccountMeta::new(stake_address, false),
124 AccountMeta::new(stake_tokens_address, false),
125 AccountMeta::new(treasury_address, false),
126 AccountMeta::new(treasury_tokens_address, false),
127 AccountMeta::new_readonly(system_program::ID, false),
128 AccountMeta::new_readonly(spl_token::ID, false),
129 ],
130 data: CompoundYield {}.to_bytes(),
131 }
132}
133
134pub fn migrate_stake(payer: Pubkey, authority: Pubkey) -> Instruction {
137 let mint_address = MINT_ADDRESS;
138 let old_stake_info = ore_api::prelude::stake_pda(authority).0;
139 let old_stake_tokens_info = get_associated_token_address(&old_stake_info, &MINT_ADDRESS);
140 let stake_info = stake_pda(authority).0;
141 let stake_tokens_info = get_associated_token_address(&stake_info, &MINT_ADDRESS);
142 Instruction {
143 program_id: crate::ID,
144 accounts: vec![
145 AccountMeta::new(payer, true),
146 AccountMeta::new(mint_address, false),
147 AccountMeta::new(old_stake_info, true),
148 AccountMeta::new(old_stake_tokens_info, false),
149 AccountMeta::new(stake_info, false),
150 AccountMeta::new(stake_tokens_info, false),
151 AccountMeta::new_readonly(system_program::ID, false),
152 AccountMeta::new_readonly(spl_token::ID, false),
153 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
154 ],
155 data: MigrateStake {}.to_bytes(),
156 }
157}