1use std::{str::FromStr, sync::OnceLock};
2
3use solana_sdk::pubkey::Pubkey;
4
5static DEVNET_TOKEN_MAP: OnceLock<TokenMap> = OnceLock::new();
6static MAINNET_TOKEN_MAP: OnceLock<TokenMap> = OnceLock::new();
7
8pub fn devnet_token_map() -> &'static TokenMap {
9 DEVNET_TOKEN_MAP.get_or_init(|| TokenMap::new(true))
10}
11
12pub fn mainnet_token_map() -> &'static TokenMap {
13 MAINNET_TOKEN_MAP.get_or_init(|| TokenMap::new(false))
14}
15
16pub fn token_map(devnet_tokens: bool) -> &'static TokenMap {
17 if devnet_tokens {
18 devnet_token_map()
19 } else {
20 mainnet_token_map()
21 }
22}
23
24pub type TokenType = &'static Token;
25
26#[derive(Debug, Clone)]
27pub struct Token {
28 pub mint: Pubkey,
29 pub symbol: &'static str,
30 pub decimals: u32,
31}
32
33impl Token {
34 pub fn ui_amount(&self, amount: u64) -> f64 {
36 amount as f64 / 10f64.powf(self.decimals as f64)
37 }
38}
39
40#[derive(Debug, Clone)]
41pub struct TokenMap {
42 pub usdc: Token,
44
45 pub usdc_9: Token,
47}
48
49impl TokenMap {
50 pub fn new(devnet_tokens: bool) -> Self {
51 if devnet_tokens {
52 Self {
54 usdc: Token {
55 mint: solana_sdk::pubkey!("DGFhnr4oofkJ3K1vtNWhwfLGTDz6vJWoUcXkpwXe1X78"),
56 symbol: "USDC",
57 decimals: 6,
58 },
59 usdc_9: Token {
60 mint: solana_sdk::pubkey!("BR5T9y8RwtNjMSsz9SzzJsSveVc476ujSJzrzQfcWFz3"),
61 symbol: "USDC_9",
62 decimals: 9,
63 },
64 }
65 } else {
66 Self {
68 usdc: Token {
69 mint: solana_sdk::pubkey!("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),
70 symbol: "USDC",
71 decimals: 6,
72 },
73 usdc_9: Token {
74 mint: solana_sdk::pubkey!("BR5T9y8RwtNjMSsz9SzzJsSveVc476ujSJzrzQfcWFz3"),
75 symbol: "USDC_9",
76 decimals: 9,
77 },
78 }
79 }
80 }
81
82 pub fn find(&'static self, token: &str) -> Option<TokenType> {
99 match token.to_ascii_uppercase().as_str() {
100 "USDC" => Some(&self.usdc),
101 "USDC_9" => Some(&self.usdc_9),
102
103 _ => {
108 Pubkey::from_str(token).ok().and_then(|mint| {
109 [
110 &self.usdc,
112 &self.usdc_9,
113 ]
114 .iter()
115 .find(|t| t.mint == mint)
116 .map(|v| &**v)
117 })
118 }
119 }
120 }
121}