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