use serde::{Deserialize, Serialize};
use solana_sdk::pubkey::Pubkey;
use crate::instruction::utils::pumpfun::global_constants::{
AUTHORITY, CREATOR_FEE, ENABLE_MIGRATE, FEE_BASIS_POINTS, FEE_RECIPIENT, GLOBAL_ACCOUNT,
INITIAL_REAL_TOKEN_RESERVES, INITIAL_VIRTUAL_SOL_RESERVES, INITIAL_VIRTUAL_TOKEN_RESERVES,
POOL_MIGRATION_FEE, PUMPFUN_AMM_FEE_1, PUMPFUN_AMM_FEE_2, PUMPFUN_AMM_FEE_3, PUMPFUN_AMM_FEE_4,
PUMPFUN_AMM_FEE_5, PUMPFUN_AMM_FEE_6, PUMPFUN_AMM_FEE_7, TOKEN_TOTAL_SUPPLY,
WITHDRAW_AUTHORITY,
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GlobalAccount {
pub discriminator: u64,
pub account: Pubkey,
pub initialized: bool,
pub authority: Pubkey,
pub fee_recipient: Pubkey,
pub initial_virtual_token_reserves: u64,
pub initial_virtual_sol_reserves: u64,
pub initial_real_token_reserves: u64,
pub token_total_supply: u64,
pub fee_basis_points: u64,
pub withdraw_authority: Pubkey,
pub enable_migrate: bool,
pub pool_migration_fee: u64,
pub creator_fee: u64,
pub fee_recipients: [Pubkey; 7],
}
impl GlobalAccount {
pub fn new() -> Self {
Self {
discriminator: 0,
account: GLOBAL_ACCOUNT,
initialized: true,
authority: AUTHORITY,
fee_recipient: FEE_RECIPIENT,
initial_virtual_token_reserves: INITIAL_VIRTUAL_TOKEN_RESERVES,
initial_virtual_sol_reserves: INITIAL_VIRTUAL_SOL_RESERVES,
initial_real_token_reserves: INITIAL_REAL_TOKEN_RESERVES,
token_total_supply: TOKEN_TOTAL_SUPPLY,
fee_basis_points: FEE_BASIS_POINTS,
withdraw_authority: WITHDRAW_AUTHORITY,
enable_migrate: ENABLE_MIGRATE,
pool_migration_fee: POOL_MIGRATION_FEE,
creator_fee: CREATOR_FEE,
fee_recipients: [
PUMPFUN_AMM_FEE_1,
PUMPFUN_AMM_FEE_2,
PUMPFUN_AMM_FEE_3,
PUMPFUN_AMM_FEE_4,
PUMPFUN_AMM_FEE_5,
PUMPFUN_AMM_FEE_6,
PUMPFUN_AMM_FEE_7,
],
}
}
pub fn get_initial_buy_price(&self, amount: u64) -> u64 {
if amount == 0 {
return 0;
}
let n: u128 = (self.initial_virtual_sol_reserves as u128)
* (self.initial_virtual_token_reserves as u128);
let i: u128 = (self.initial_virtual_sol_reserves as u128) + (amount as u128);
let r: u128 = n / i + 1;
let s: u128 = (self.initial_virtual_token_reserves as u128) - r;
if s < (self.initial_real_token_reserves as u128) {
s as u64
} else {
self.initial_real_token_reserves
}
}
}