use airdrop_api::Config;
use airdrop_api::{
consts::{CONFIG, FEE_ACCOUNT, INITIALIZER_ADDRESS},
instruction::Initialize,
loaders::AirdropAccountInfoValidation,
pda::fee_account_pda,
};
use solana_program::clock::Clock;
use steel::*;
pub fn process_initialize(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
let args = Initialize::try_from_bytes(data)?;
let admin = args.admin;
let mint_fee_lamports = u64::from_le_bytes(args.mint_fee_lamports);
let allocation_fee_per_recipient_lamports =
u64::from_le_bytes(args.allocation_fee_per_recipient_lamports);
let merkle_fee_per_recipient_lamports =
u64::from_le_bytes(args.merkle_fee_per_recipient_lamports);
let direct_transfer_fee_per_recipient_lamports =
u64::from_le_bytes(args.direct_transfer_fee_per_recipient_lamports);
let [initializer_info, config_info, fee_account_info, system_program, rent_sysvar] = accounts
else {
return Err(ProgramError::NotEnoughAccountKeys);
};
initializer_info
.is_signer()?
.has_address(&INITIALIZER_ADDRESS)?;
config_info.is_empty()?.is_writable()?.is_config()?;
fee_account_info
.is_empty()?
.is_writable()?
.has_seeds(&[FEE_ACCOUNT], &airdrop_api::ID)?;
system_program.is_program(&system_program::ID)?;
rent_sysvar.is_sysvar(&sysvar::rent::ID)?;
let (_expected_fee_account, fee_bump) = fee_account_pda();
create_program_account::<Config>(
config_info,
system_program,
initializer_info,
&airdrop_api::ID,
&[CONFIG],
)?;
allocate_account_with_bump(
fee_account_info,
system_program,
initializer_info,
0, &system_program::ID, &[FEE_ACCOUNT],
fee_bump,
)?;
let clock = Clock::get()?;
let config = config_info.as_account_mut::<Config>(&airdrop_api::ID)?;
config.admin = admin;
config.mint_fee_lamports = mint_fee_lamports;
config.allocation_fee_per_recipient_lamports = allocation_fee_per_recipient_lamports;
config.merkle_fee_per_recipient_lamports = merkle_fee_per_recipient_lamports;
config.direct_transfer_fee_per_recipient_lamports = direct_transfer_fee_per_recipient_lamports;
config.fee_account = *fee_account_info.key;
config.total_fees_collected = 0;
config.updated_at = clock.unix_timestamp;
airdrop_api::event::ConfigInitializedEvent {
admin,
mint_fee_lamports,
allocation_fee_per_recipient_lamports,
fee_account: *fee_account_info.key,
initialized_at: clock.unix_timestamp,
}
.log();
Ok(())
}