-
Notifications
You must be signed in to change notification settings - Fork 110
/
Copy pathresize_mapping.rs
71 lines (65 loc) · 1.76 KB
/
resize_mapping.rs
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
70
71
use {
crate::{
accounts::{
AccountHeader,
MappingAccount,
PythAccount,
},
c_oracle_header::PC_MAGIC,
deserialize::{
load,
load_account_as,
},
instruction::CommandHeader,
utils::{
check_valid_writable_account,
pyth_assert,
},
OracleError,
},
solana_program::{
account_info::AccountInfo,
entrypoint::{
ProgramResult,
MAX_PERMITTED_DATA_INCREASE,
},
pubkey::Pubkey,
},
std::{
cmp::min,
mem::size_of,
},
};
/// Resize mapping account.
// account[1] mapping account [writable]
pub fn resize_mapping(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
let mapping_account = match accounts {
[x] => Ok(x),
_ => Err(OracleError::InvalidNumberOfAccounts),
}?;
let hdr = load::<CommandHeader>(instruction_data)?;
check_valid_writable_account(program_id, mapping_account)?;
{
let account_header = load_account_as::<AccountHeader>(mapping_account)?;
pyth_assert(
account_header.magic_number == PC_MAGIC
&& account_header.version == hdr.version
&& account_header.account_type == MappingAccount::ACCOUNT_TYPE,
OracleError::InvalidAccountHeader.into(),
)?;
}
pyth_assert(
mapping_account.data_len() < size_of::<MappingAccount>(),
OracleError::NoNeedToResize.into(),
)?;
let new_size = min(
size_of::<MappingAccount>(),
mapping_account.data_len() + MAX_PERMITTED_DATA_INCREASE,
);
mapping_account.realloc(new_size, true)?;
Ok(())
}