Skip to main content

ore_stake_api/
sdk.rs

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}