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
58// let [signer_info, mint_info, recipient_info, stake_info, stake_tokens_info, treasury_info, system_program, token_program, associated_token_program] =
59
60pub 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
134// let [payer_info, mint_info, old_stake_info, old_stake_tokens_info, stake_info, stake_tokens_info, system_program, token_program, associated_token_program] =
135
136pub 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}