use anchor_lang::prelude::*;
use anchor_lang::solana_program::system_instruction;
use anchor_lang::solana_program::program::invoke;
use std::cmp;
declare_id!("TOP100_INFINITE_AIRDROP");
#[program]
pub mod sol_airdrop {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
let state = &mut ctx.accounts.airdrop_state;
state.market_cap = 0;
state.airdrop_amount = 1;
Ok(())
}
pub fn update_market_cap(ctx: Context<UpdateMarketCap>, new_market_cap: u64) -> Result<()> {
let state = &mut ctx.accounts.airdrop_state;
if new_market_cap < 100_000 {
state.airdrop_amount = 1;
} else if new_market_cap < 1_000_000 {
state.airdrop_amount = 2;
} else {
let doubling_count = ((new_market_cap as f64) / 1_000_000.0).log2().floor() as u64;
state.airdrop_amount = 10 + (10 * cmp::max(0, doubling_count));
}
state.market_cap = new_market_cap;
msg!("Market Cap updated: {} → Airdrop: {} SOL", state.market_cap, state.airdrop_amount);
Ok(())
}
pub fn distribute_airdrop(ctx: Context<DistributeAirdrop>) -> Result<()> {
let state = &ctx.accounts.airdrop_state;
let system_program = &ctx.accounts.system_program;
let winners = &ctx.remaining_accounts;
require!(winners.len() >= 10, AirdropError::NotEnoughHolders);
for winner in winners.iter().take(10) {
invoke(
&system_instruction::transfer(
ctx.accounts.payer.key,
winner.key,
state.airdrop_amount * 1_000_000_000, // Convert SOL to lamports
),
&[ctx.accounts.payer.to_account_info(), winner.to_account_info(), system_program.to_account_info()],
)?;
}
msg!("🏆 Airdrop distributed to 10 holders!");
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(init, payer = payer, space = 8 + 16)]
pub airdrop_state: Account<'info, AirdropState>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct UpdateMarketCap<'info> {
#[account(mut)]
pub airdrop_state: Account<'info, AirdropState>,
}
#[derive(Accounts)]
pub struct DistributeAirdrop<'info> {
#[account(mut)]
pub airdrop_state: Account<'info, AirdropState>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct AirdropState {
pub market_cap: u64,
pub airdrop_amount: u64,
}
#[error_code]
pub enum AirdropError {
#[msg("Not enough holders to perform the airdrop.")]
NotEnoughHolders,
}