use airdrop_api::Config;
use airdrop_api::{instruction::UpdateConfig, loaders::AirdropAccountInfoValidation};
use solana_program::clock::Clock;
use steel::*;
pub fn process_update_config(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
let args = UpdateConfig::try_from_bytes(data)?;
let new_admin = args.new_admin;
let new_mint_fee = u64::from_le_bytes(args.mint_fee_lamports);
let new_allocation_fee = u64::from_le_bytes(args.allocation_fee_per_recipient_lamports);
let new_merkle_fee = u64::from_le_bytes(args.merkle_fee_per_recipient_lamports);
let new_direct_transfer_fee =
u64::from_le_bytes(args.direct_transfer_fee_per_recipient_lamports);
let [admin_info, config_info] = accounts else {
return Err(ProgramError::NotEnoughAccountKeys);
};
admin_info.is_signer()?;
let config = config_info
.is_config()?
.is_writable()?
.as_account_mut::<Config>(&airdrop_api::ID)?
.assert_mut(|c| c.admin == *admin_info.key)?;
let clock = Clock::get()?;
if new_admin != Pubkey::default() {
config.admin = new_admin;
}
if new_mint_fee != u64::MAX {
config.mint_fee_lamports = new_mint_fee;
}
if new_allocation_fee != u64::MAX {
config.allocation_fee_per_recipient_lamports = new_allocation_fee;
}
if new_merkle_fee != u64::MAX {
config.merkle_fee_per_recipient_lamports = new_merkle_fee;
}
if new_direct_transfer_fee != u64::MAX {
config.direct_transfer_fee_per_recipient_lamports = new_direct_transfer_fee;
}
config.updated_at = clock.unix_timestamp;
airdrop_api::event::ConfigUpdatedEvent {
admin: config.admin,
mint_fee_lamports: config.mint_fee_lamports,
allocation_fee_per_recipient_lamports: config.allocation_fee_per_recipient_lamports,
merkle_fee_per_recipient_lamports: config.merkle_fee_per_recipient_lamports,
direct_transfer_fee_per_recipient_lamports: config
.direct_transfer_fee_per_recipient_lamports,
updated_at: clock.unix_timestamp,
}
.log();
Ok(())
}