use {
crate::{Account, AccountSharedData, ReadableAccount, WritableAccount},
solana_clock::{Epoch, INITIAL_RENT_EPOCH},
solana_sysvar::SysvarSerialize,
};
pub type InheritableAccountFields = (u64, Epoch);
pub const DUMMY_INHERITABLE_ACCOUNT_FIELDS: InheritableAccountFields = (1, INITIAL_RENT_EPOCH);
fn account_data<S: SysvarSerialize>(sysvar: &S) -> Vec<u8> {
let mut data = bincode::serialize(sysvar).unwrap_or_default();
data.resize(data.len().max(S::size_of()), 0);
data
}
pub fn create_account_with_fields<S: SysvarSerialize>(
sysvar: &S,
(lamports, rent_epoch): InheritableAccountFields,
) -> Account {
Account {
lamports,
data: account_data(sysvar),
owner: solana_sdk_ids::sysvar::id(),
executable: false,
rent_epoch,
}
}
pub fn create_account_for_test<S: SysvarSerialize>(sysvar: &S) -> Account {
create_account_with_fields(sysvar, DUMMY_INHERITABLE_ACCOUNT_FIELDS)
}
pub fn create_account_shared_data_with_fields<S: SysvarSerialize>(
sysvar: &S,
fields: InheritableAccountFields,
) -> AccountSharedData {
AccountSharedData::from(create_account_with_fields(sysvar, fields))
}
pub fn create_account_shared_data_for_test<S: SysvarSerialize>(sysvar: &S) -> AccountSharedData {
create_account_shared_data_with_fields(sysvar, DUMMY_INHERITABLE_ACCOUNT_FIELDS)
}
pub fn from_account<S: SysvarSerialize, T: ReadableAccount>(account: &T) -> Option<S> {
bincode::deserialize(account.data()).ok()
}
pub fn to_account<S: SysvarSerialize, T: WritableAccount>(
sysvar: &S,
account: &mut T,
) -> Option<()> {
bincode::serialize_into(account.data_as_mut_slice(), sysvar).ok()
}