solana_config_program/
lib.rs

1#![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::config::program::id;
11#[allow(deprecated)]
12use solana_sdk::stake::config::Config as StakeConfig;
13use {
14    bincode::{deserialize, serialize, serialized_size},
15    serde_derive::{Deserialize, Serialize},
16    solana_sdk::{
17        account::{Account, AccountSharedData},
18        pubkey::Pubkey,
19    },
20    solana_short_vec as short_vec,
21};
22
23pub trait ConfigState: serde::Serialize + Default {
24    /// Maximum space that the serialized representation will require
25    fn max_space() -> u64;
26}
27
28// TODO move ConfigState into `solana_program` to implement trait locally
29#[allow(deprecated)]
30impl ConfigState for StakeConfig {
31    fn max_space() -> u64 {
32        serialized_size(&StakeConfig::default()).unwrap()
33    }
34}
35
36/// A collection of keys to be stored in Config account data.
37#[derive(Debug, Default, Deserialize, Serialize)]
38pub struct ConfigKeys {
39    // Each key tuple comprises a unique `Pubkey` identifier,
40    // and `bool` whether that key is a signer of the data
41    #[serde(with = "short_vec")]
42    pub keys: Vec<(Pubkey, bool)>,
43}
44
45impl ConfigKeys {
46    pub fn serialized_size(keys: Vec<(Pubkey, bool)>) -> u64 {
47        serialized_size(&ConfigKeys { keys }).unwrap()
48    }
49}
50
51pub fn get_config_data(bytes: &[u8]) -> Result<&[u8], bincode::Error> {
52    deserialize::<ConfigKeys>(bytes)
53        .and_then(|keys| serialized_size(&keys))
54        .map(|offset| &bytes[offset as usize..])
55}
56
57// utility for pre-made Accounts
58pub fn create_config_account<T: ConfigState>(
59    keys: Vec<(Pubkey, bool)>,
60    config_data: &T,
61    lamports: u64,
62) -> AccountSharedData {
63    let mut data = serialize(&ConfigKeys { keys }).unwrap();
64    data.extend_from_slice(&serialize(config_data).unwrap());
65    AccountSharedData::from(Account {
66        lamports,
67        data,
68        owner: id(),
69        ..Account::default()
70    })
71}