use solana_sdk::pubkey::Pubkey;
use spl_associated_token_account::{get_associated_token_address, get_associated_token_address_with_program_id};
use crate::types::known_tokens;
pub const TOKEN_2022_PROGRAM_ID: Pubkey =
solana_sdk::pubkey!("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb");
pub const TOKEN_PROGRAM_ID: Pubkey =
solana_sdk::pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
pub fn get_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey {
get_associated_token_address(wallet, mint)
}
pub fn get_ata_2022(wallet: &Pubkey, mint: &Pubkey) -> Pubkey {
get_associated_token_address_with_program_id(wallet, mint, &TOKEN_2022_PROGRAM_ID)
}
pub fn get_scema_ata(wallet: &Pubkey) -> Pubkey {
get_ata_2022(wallet, &known_tokens::SCEMATICA_MINT)
}
pub fn resolve_mint(symbol: &str) -> Option<Pubkey> {
match symbol.to_uppercase().as_str() {
"WSOL" | "SOL" => Some(known_tokens::WSOL_MINT),
"USDC" => Some(known_tokens::USDC_MINT),
"USDT" => Some(known_tokens::USDT_MINT),
"RAY" => Some(known_tokens::RAY_MINT),
"BONK" => Some(known_tokens::BONK_MINT),
"SCEMA" | "SCEMATICA" => Some(known_tokens::SCEMATICA_MINT),
_ => None,
}
}
pub fn resolve_decimals(symbol: &str) -> Option<u8> {
match symbol.to_uppercase().as_str() {
"WSOL" | "SOL" => Some(9),
"USDC" => Some(6),
"USDT" => Some(6),
"RAY" => Some(6),
"BONK" => Some(5),
"SCEMA" | "SCEMATICA" => Some(known_tokens::SCEMATICA_DECIMALS),
_ => None,
}
}
pub fn mint_to_symbol(mint: &str) -> String {
match mint {
m if m == known_tokens::WSOL_MINT.to_string() => "WSOL".into(),
m if m == known_tokens::USDC_MINT.to_string() => "USDC".into(),
m if m == known_tokens::USDT_MINT.to_string() => "USDT".into(),
m if m == known_tokens::RAY_MINT.to_string() => "RAY".into(),
m if m == known_tokens::BONK_MINT.to_string() => "BONK".into(),
m if m == known_tokens::SCEMATICA_MINT.to_string() => known_tokens::SCEMATICA_SYMBOL.into(),
m => m[..8.min(m.len())].into(),
}
}
pub fn ui_to_raw(ui_amount: f64, decimals: u8) -> u64 {
(ui_amount * 10f64.powi(decimals as i32)) as u64
}
pub fn raw_to_ui(raw: u64, decimals: u8) -> f64 {
raw as f64 / 10f64.powi(decimals as i32)
}
pub fn apply_slippage(amount: u64, slippage_pct: f64) -> u64 {
let factor = 1.0 - (slippage_pct / 100.0);
(amount as f64 * factor) as u64
}