use solana_program::{
account_info::AccountInfo, entrypoint::ProgramResult, msg,
program_error::ProgramError, pubkey::Pubkey, rent::Rent,
};
use crate::{
error::DlpError::Unauthorized,
processor::utils::loaders::{
load_initialized_protocol_fees_vault, load_program_upgrade_authority,
load_signer,
},
};
pub fn process_protocol_claim_fees(
_program_id: &Pubkey,
accounts: &[AccountInfo],
_data: &[u8],
) -> ProgramResult {
let [admin, fees_vault, delegation_program_data] = accounts else {
return Err(ProgramError::NotEnoughAccountKeys);
};
load_signer(admin, "admin")?;
load_initialized_protocol_fees_vault(fees_vault, true)?;
let admin_pubkey =
load_program_upgrade_authority(&crate::ID, delegation_program_data)?
.ok_or(Unauthorized)?;
if !admin.key.eq(&admin_pubkey) {
msg!(
"Expected admin pubkey: {} but got {}",
admin_pubkey,
admin.key
);
return Err(Unauthorized.into());
}
let min_rent = Rent::default().minimum_balance(8);
if fees_vault.lamports() < min_rent {
return Err(ProgramError::InsufficientFunds);
}
let amount = fees_vault.lamports() - min_rent;
**fees_vault.try_borrow_mut_lamports()? = fees_vault
.lamports()
.checked_sub(amount)
.ok_or(ProgramError::InsufficientFunds)?;
**admin.try_borrow_mut_lamports()? =
admin
.lamports()
.checked_add(amount)
.ok_or(ProgramError::ArithmeticOverflow)?;
Ok(())
}