use {
crate::state::{
enums::GovernanceAccountType,
program_metadata::{
get_program_metadata_data, get_program_metadata_seeds, ProgramMetadata,
},
},
solana_program::{
account_info::{next_account_info, AccountInfo},
clock::Clock,
entrypoint::ProgramResult,
msg,
pubkey::Pubkey,
rent::Rent,
sysvar::Sysvar,
},
spl_governance_tools::account::create_and_serialize_account_signed,
};
pub fn process_update_program_metadata(
program_id: &Pubkey,
accounts: &[AccountInfo],
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let program_metadata_info = next_account_info(account_info_iter)?; let payer_info = next_account_info(account_info_iter)?; let system_info = next_account_info(account_info_iter)?;
let rent = Rent::get()?;
let updated_at = Clock::get()?.slot;
const VERSION: &str = env!("CARGO_PKG_VERSION");
msg!("PROGRAM-VERSION:{:?}", VERSION);
if program_metadata_info.data_is_empty() {
let program_metadata_data = ProgramMetadata {
account_type: GovernanceAccountType::ProgramMetadata,
updated_at,
version: VERSION.to_string(),
reserved: [0; 64],
};
create_and_serialize_account_signed(
payer_info,
program_metadata_info,
&program_metadata_data,
&get_program_metadata_seeds(),
program_id,
system_info,
&rent,
0,
)?;
} else {
let mut program_metadata_data =
get_program_metadata_data(program_id, program_metadata_info)?;
program_metadata_data.version = VERSION.to_string();
program_metadata_data.updated_at = updated_at;
borsh::to_writer(
&mut program_metadata_info.data.borrow_mut()[..],
&program_metadata_data,
)?;
}
Ok(())
}