-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclose.rs
More file actions
69 lines (63 loc) · 2.28 KB
/
Copy pathclose.rs
File metadata and controls
69 lines (63 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use ore_mint_api::consts::MINT_ADDRESS;
use ore_stake_api::prelude::*;
use steel::*;
/// Closes an empty stake account and returns rent to the payer.
pub fn process_close(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResult {
// Load accounts.
let [signer_info, mint_info, recipient_info, stake_info, stake_tokens_info, system_program, token_program, associated_token_program] =
accounts
else {
return Err(ProgramError::NotEnoughAccountKeys);
};
signer_info.is_signer()?;
mint_info.has_address(&MINT_ADDRESS)?.as_mint()?;
recipient_info.is_writable()?;
let stake = stake_info
.has_seeds(&[STAKE, &signer_info.key.to_bytes()], &ore_stake_api::ID)?
.as_account_mut::<Stake>(&ore_stake_api::ID)?
.assert_mut(|s| s.authority == *signer_info.key)?
.assert_mut(|s| s.balance == 0 && s.rewards == 0)?;
let stake_tokens = stake_tokens_info
.is_writable()?
.as_associated_token_account(stake_info.key, mint_info.key)?;
system_program.is_program(&system_program::ID)?;
token_program.is_program(&spl_token::ID)?;
associated_token_program.is_program(&spl_associated_token_account::ID)?;
// Transfer any remaining ORE to recipient.
if stake_tokens.amount() > 0 {
// Open recipient token account.
if recipient_info.data_is_empty() {
create_associated_token_account(
signer_info,
signer_info,
recipient_info,
mint_info,
system_program,
token_program,
associated_token_program,
)?;
} else {
recipient_info.as_associated_token_account(&signer_info.key, &mint_info.key)?;
}
// Transfer ORE to recipient.
transfer_signed(
stake_info,
stake_tokens_info,
recipient_info,
token_program,
stake_tokens.amount(),
&[STAKE, &stake.authority.to_bytes()],
)?;
}
// Close stake token account.
close_token_account_signed(
stake_tokens_info,
signer_info,
stake_info,
token_program,
&[STAKE, &stake.authority.to_bytes()],
)?;
// Close stake account.
stake_info.close(&signer_info)?;
Ok(())
}