solana_config_program/
lib.rs1#![allow(clippy::arithmetic_side_effects)]
2pub mod config_instruction;
3pub mod config_processor;
4#[deprecated(
5 since = "2.0.0",
6 note = "The config program API no longer supports date instructions."
7)]
8pub mod date_instruction;
9
10pub use solana_sdk_ids::config::id;
11#[allow(deprecated)]
12use solana_stake_interface::config::Config as StakeConfig;
13use {
14 bincode::{deserialize, serialize, serialized_size},
15 serde_derive::{Deserialize, Serialize},
16 solana_account::{Account, AccountSharedData},
17 solana_pubkey::Pubkey,
18 solana_short_vec as short_vec,
19};
20
21pub trait ConfigState: serde::Serialize + Default {
22 fn max_space() -> u64;
24}
25
26#[allow(deprecated)]
28impl ConfigState for StakeConfig {
29 fn max_space() -> u64 {
30 serialized_size(&StakeConfig::default()).unwrap()
31 }
32}
33
34#[derive(Debug, Default, Deserialize, Serialize)]
36pub struct ConfigKeys {
37 #[serde(with = "short_vec")]
40 pub keys: Vec<(Pubkey, bool)>,
41}
42
43impl ConfigKeys {
44 pub fn serialized_size(keys: Vec<(Pubkey, bool)>) -> u64 {
45 serialized_size(&ConfigKeys { keys }).unwrap()
46 }
47}
48
49pub fn get_config_data(bytes: &[u8]) -> Result<&[u8], bincode::Error> {
50 deserialize::<ConfigKeys>(bytes)
51 .and_then(|keys| serialized_size(&keys))
52 .map(|offset| &bytes[offset as usize..])
53}
54
55pub fn create_config_account<T: ConfigState>(
57 keys: Vec<(Pubkey, bool)>,
58 config_data: &T,
59 lamports: u64,
60) -> AccountSharedData {
61 let mut data = serialize(&ConfigKeys { keys }).unwrap();
62 data.extend_from_slice(&serialize(config_data).unwrap());
63 AccountSharedData::from(Account {
64 lamports,
65 data,
66 owner: id(),
67 ..Account::default()
68 })
69}