2019-08-14 15:54:31 -07:00
|
|
|
use bincode::{deserialize, serialize, serialized_size};
|
|
|
|
use serde_derive::{Deserialize, Serialize};
|
|
|
|
use solana_sdk::{account::Account, pubkey::Pubkey, short_vec};
|
2019-03-14 07:55:41 -07:00
|
|
|
|
2019-04-03 09:45:57 -06:00
|
|
|
pub mod config_instruction;
|
2019-03-21 16:24:54 -06:00
|
|
|
pub mod config_processor;
|
2019-03-14 07:55:41 -07:00
|
|
|
|
|
|
|
const CONFIG_PROGRAM_ID: [u8; 32] = [
|
2019-04-25 17:58:49 -07:00
|
|
|
3, 6, 74, 163, 0, 47, 116, 220, 200, 110, 67, 49, 15, 12, 5, 42, 248, 197, 218, 39, 246, 16,
|
|
|
|
64, 25, 163, 35, 239, 160, 0, 0, 0, 0,
|
2019-03-14 07:55:41 -07:00
|
|
|
];
|
|
|
|
|
2019-06-06 19:27:49 -07:00
|
|
|
solana_sdk::solana_name_id!(
|
|
|
|
CONFIG_PROGRAM_ID,
|
|
|
|
"Config1111111111111111111111111111111111111"
|
|
|
|
);
|
2019-03-14 07:55:41 -07:00
|
|
|
|
2019-08-14 15:54:31 -07:00
|
|
|
pub trait ConfigState: serde::Serialize + Default {
|
2019-03-14 07:55:41 -07:00
|
|
|
/// Maximum space that the serialized representation will require
|
|
|
|
fn max_space() -> u64;
|
|
|
|
}
|
2019-08-14 15:54:31 -07:00
|
|
|
|
|
|
|
/// A collection of keys to be stored in Config account data.
|
|
|
|
#[derive(Debug, Default, Deserialize, Serialize)]
|
|
|
|
pub struct ConfigKeys {
|
|
|
|
// Each key tuple comprises a unique `Pubkey` identifier,
|
|
|
|
// and `bool` whether that key is a signer of the data
|
|
|
|
#[serde(with = "short_vec")]
|
|
|
|
pub keys: Vec<(Pubkey, bool)>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ConfigKeys {
|
|
|
|
pub fn serialized_size(keys: Vec<(Pubkey, bool)>) -> u64 {
|
|
|
|
serialized_size(&ConfigKeys { keys }).unwrap()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get_config_data(bytes: &[u8]) -> Result<&[u8], bincode::Error> {
|
|
|
|
deserialize::<ConfigKeys>(bytes)
|
|
|
|
.and_then(|keys| serialized_size(&keys))
|
|
|
|
.map(|offset| &bytes[offset as usize..])
|
|
|
|
}
|
|
|
|
|
|
|
|
// utility for pre-made Accounts
|
|
|
|
pub fn create_config_account<T: ConfigState>(
|
|
|
|
keys: Vec<(Pubkey, bool)>,
|
|
|
|
config_data: &T,
|
|
|
|
lamports: u64,
|
|
|
|
) -> Account {
|
|
|
|
let mut data = serialize(&ConfigKeys { keys }).unwrap();
|
|
|
|
data.extend_from_slice(&serialize(config_data).unwrap());
|
|
|
|
Account {
|
|
|
|
lamports,
|
|
|
|
data,
|
|
|
|
owner: id(),
|
|
|
|
..Account::default()
|
|
|
|
}
|
|
|
|
}
|