airdrop 0.1.0

Mint and Airdrop Framework on Solana for Sovereign Individuals
Documentation
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 {
    // Parse instruction data
    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);

    // Load accounts
    let [admin_info, config_info] = accounts else {
        return Err(ProgramError::NotEnoughAccountKeys);
    };

    // Validate admin
    admin_info.is_signer()?;

    // Load and validate config
    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()?;

    // Update admin if provided (not Pubkey::default())
    if new_admin != Pubkey::default() {
        config.admin = new_admin;
    }

    // Update mint fee if provided (not u64::MAX)
    if new_mint_fee != u64::MAX {
        config.mint_fee_lamports = new_mint_fee;
    }

    // Update allocation fee if provided (not u64::MAX)
    if new_allocation_fee != u64::MAX {
        config.allocation_fee_per_recipient_lamports = new_allocation_fee;
    }

    // Update merkle fee if provided (not u64::MAX)
    if new_merkle_fee != u64::MAX {
        config.merkle_fee_per_recipient_lamports = new_merkle_fee;
    }

    // Update direct transfer fee if provided (not u64::MAX)
    if new_direct_transfer_fee != u64::MAX {
        config.direct_transfer_fee_per_recipient_lamports = new_direct_transfer_fee;
    }

    // Update timestamp
    config.updated_at = clock.unix_timestamp;

    // Emit event
    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(())
}