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
use solana_program::{
account_info::AccountInfo,
entrypoint::ProgramResult,
program_error::ProgramError,
program_pack::{IsInitialized, Pack},
pubkey::Pubkey,
rent::Rent,
};
pub fn assert_signer(account_info: &AccountInfo) -> ProgramResult {
if !account_info.is_signer {
Err(ProgramError::MissingRequiredSignature)
} else {
Ok(())
}
}
pub fn assert_initialized<T: Pack + IsInitialized>(
account_info: &AccountInfo,
error: impl Into<ProgramError>,
) -> Result<T, ProgramError> {
let account: T = T::unpack_unchecked(&account_info.data.borrow())?;
if !account.is_initialized() {
Err(error.into())
} else {
Ok(account)
}
}
pub fn assert_owned_by(
account: &AccountInfo,
owner: &Pubkey,
error: impl Into<ProgramError>,
) -> ProgramResult {
if account.owner != owner {
Err(error.into())
} else {
Ok(())
}
}
pub fn assert_derivation(
program_id: &Pubkey,
account: &AccountInfo,
path: &[&[u8]],
error: impl Into<ProgramError>,
) -> Result<u8, ProgramError> {
let (key, bump) = Pubkey::find_program_address(path, program_id);
if key != *account.key {
return Err(error.into());
}
Ok(bump)
}
pub fn assert_rent_exempt(
rent: &Rent,
account_info: &AccountInfo,
error: impl Into<ProgramError>,
) -> ProgramResult {
if !rent.is_exempt(account_info.lamports(), account_info.data_len()) {
Err(error.into())
} else {
Ok(())
}
}