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(
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}