solana_central/
constants.rs

1use solana_sdk::pubkey::Pubkey;
2
3pub const LAMPORTS_PER_SOL: u128 = 1_000_000_000;
4
5pub struct Tokens {
6  pub wsol: Pubkey,
7  pub usdc: Pubkey,
8  pub usdt: Pubkey,
9}
10
11pub const TOKENS: Tokens = Tokens {
12  wsol: Pubkey::from_str_const("So11111111111111111111111111111111111111112"),
13  usdc: Pubkey::from_str_const("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),
14  usdt: Pubkey::from_str_const("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"),
15};
16
17pub struct PumpConstants {
18  pub bonding_curve_global_config: Pubkey,
19  pub bonding_curve_program: Pubkey,
20  pub bonding_curve_event_authority: Pubkey,
21  pub bonding_curve_update_authority: Pubkey,
22  pub bonding_curve_fee_config: Pubkey,
23  pub pump_swap_migrator_wallet: Pubkey,
24  pub pump_swap_program: Pubkey,
25  pub pump_swap_global_config: Pubkey,
26  pub pump_swap_event_authority: Pubkey,
27  pub bonding_curve_global_volume_accumulator: Pubkey,
28  pub pumpswap_fee_config: Pubkey,
29  pub pumpswap_global_volume_accumulator: Pubkey,
30  pub fee_program: Pubkey,
31  /*
32  Both the pumpswap and pf bonding curve programs use the same buy and sell instruction
33  discriminators.
34  */
35  pub buy_instruction_discriminator: [u8; 8],
36  pub sell_instruction_discriminator: [u8; 8],
37  pub create_pool_instruction_discriminator: [u8; 8],
38  pub bonding_curve_event_discriminator: [u8; 16],
39  pub bonding_curve_create_instruction_discriminator: [u8; 8],
40  pub bonding_curve_buy_exact_sol_in_instruction_discriminator: [u8; 8],
41  pub pumpswap_buy_exact_quote_in_instruction_discriminator: [u8; 8],
42  pub pumpswap_swap_event_discriminator: [u8; 8],
43  pub pumpswap_buy_swap_event_discriminator: [u8; 8],
44  pub bc_init_virtual_sol_reserves: u64,
45  pub bc_init_virtual_token_reserve_diff: u64,
46}
47
48pub const PUMP_CONSTANTS: PumpConstants = PumpConstants {
49  bonding_curve_global_config: Pubkey::from_str_const(
50    "4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf",
51  ),
52  bonding_curve_program: Pubkey::from_str_const("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"),
53  bonding_curve_event_authority: Pubkey::from_str_const(
54    "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1",
55  ),
56  bonding_curve_update_authority: Pubkey::from_str_const(
57    "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM",
58  ),
59  bonding_curve_fee_config: Pubkey::from_str_const("8Wf5TiAheLUqBrKXeYg2JtAFFMWtKdG2BSFgqUcPVwTt"),
60  pump_swap_migrator_wallet: Pubkey::from_str_const("39azUYFWPz3VHgKCf3VChUwbpURdCHRxjWVowf5jUJjg"),
61  pump_swap_program: Pubkey::from_str_const("pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA"),
62  pump_swap_global_config: Pubkey::from_str_const("ADyA8hdefvWN2dbGGWFotbzWxrAvLW83WG6QCVXvJKqw"),
63  pump_swap_event_authority: Pubkey::from_str_const("GS4CU59F31iL7aR2Q8zVS8DRrcRnXX1yjQ66TqNVQnaR"),
64  bonding_curve_global_volume_accumulator: Pubkey::from_str_const(
65    "Hq2wp8uJ9jCPsYgNHex8RtqdvMPfVGoYwjvF1ATiwn2Y",
66  ),
67  pumpswap_global_volume_accumulator: Pubkey::from_str_const(
68    "C2aFPdENg4A2HQsmrd5rTw5TaYBX5Ku887cWjbFKtZpw",
69  ),
70  fee_program: Pubkey::from_str_const("pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ"),
71  pumpswap_fee_config: Pubkey::from_str_const("5PHirr8joyTMp9JMm6nW7hNDVyEYdkzDqazxPD7RaTjx"),
72  buy_instruction_discriminator: [102, 6, 61, 18, 1, 218, 235, 234],
73  sell_instruction_discriminator: [51, 230, 133, 164, 1, 127, 131, 173],
74  create_pool_instruction_discriminator: [233, 146, 209, 142, 207, 104, 64, 188],
75  bonding_curve_event_discriminator: [
76    228, 69, 165, 46, 81, 203, 154, 29, 189, 219, 127, 211, 78, 230, 97, 238,
77  ],
78  bonding_curve_create_instruction_discriminator: [24, 30, 200, 40, 5, 28, 7, 119],
79  bonding_curve_buy_exact_sol_in_instruction_discriminator: [56, 252, 116, 8, 158, 223, 205, 95],
80  pumpswap_buy_exact_quote_in_instruction_discriminator: [198, 46, 21, 82, 180, 217, 232, 112],
81  pumpswap_swap_event_discriminator: [228, 69, 165, 46, 81, 203, 154, 29],
82  pumpswap_buy_swap_event_discriminator: [103, 244, 82, 31, 44, 245, 119, 119],
83  /*
84  Initial virtual reserves and liquidity offsets used in bonding curve in raw token units
85  */
86  bc_init_virtual_sol_reserves: 30_000_000_000,
87  bc_init_virtual_token_reserve_diff: 279_900_000_000_000,
88};
89
90pub const PUMP_SWAP_FEE_VAULTS: [Pubkey; 8] = [
91  Pubkey::from_str_const("62qc2CNXwrYqQScmEdiZFFAnJR262PxWEuNQtxfafNgV"),
92  Pubkey::from_str_const("7VtfL8fvgNfhz17qKRMjzQEXgbdpnHHHQRh54R9jP2RJ"),
93  Pubkey::from_str_const("7hTckgnGnLQR6sdH7YkqFTAA7VwTfYFaZ6EhEsU3saCX"),
94  Pubkey::from_str_const("9rPYyANsfQZw3DnDmKE3YCQF5E8oD89UXoHn9JFEhJUz"),
95  Pubkey::from_str_const("AVmoTthdrX6tKt4nDjco2D775W2YK3sDhxPcMmzUAmTY"),
96  Pubkey::from_str_const("FWsW1xNtWscwNmKv6wVsU1iTzRN6wmmk3MjxRP5tT7hz"),
97  Pubkey::from_str_const("G5UZAVbAf46s7cKWoyKu8kYTip9DGTpbLZ2qa9Aq69dP"),
98  Pubkey::from_str_const("JCRGumoE9Qi5BBgULTgdgTLjSgkCMSbF62ZZfGs84JeU"),
99];
100
101pub struct RaydiumConstants {
102  pub amm_authority: Pubkey,
103  pub market_program_id: Pubkey,
104  pub amm_program: Pubkey,
105  pub cpmm_program: Pubkey,
106  pub cpmm_authority: Pubkey,
107  pub launchpad_global_config: Pubkey,
108  pub launchpad_event_authority: Pubkey,
109  pub launchpad_program: Pubkey,
110  pub launchpad_authority: Pubkey,
111  pub cpmm_swap_discriminators: [[u8; 8]; 2],
112  pub launchpad_swap_discriminators: [[u8; 8]; 4],
113  pub cpmm_create_pool_instruction_discriminator: [u8; 8],
114  pub ammv4_create_pool_instruction_discriminator: u8,
115  pub ammv4_swap_discriminators: [u8; 2],
116}
117
118pub const RAYDIUM_CONSTANTS: RaydiumConstants = RaydiumConstants {
119  amm_authority: Pubkey::from_str_const("5Q544fKrFoe6tsEbD7S8EmxGTJYAKtTVhAW5Q5pge4j1"),
120  market_program_id: Pubkey::from_str_const("srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX"),
121  amm_program: Pubkey::from_str_const("675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"),
122  cpmm_program: Pubkey::from_str_const("CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C"),
123  cpmm_authority: Pubkey::from_str_const("GpMZbSM2GgvTKHJirzeGfMFoaZ8UR2X7F4v8vHTvxFbL"),
124  // This is the only global config in use for now constant product curves 0.25% protocol fee
125  launchpad_global_config: Pubkey::from_str_const("6s1xP3hpbAfFoNtUNF8mfHsjr2Bd97JxFJRWLbL6aHuX"),
126  launchpad_event_authority: Pubkey::from_str_const("2DPAtwB8L12vrMRExbLuyGnC7n2J5LNoZQSejeQGpwkr"),
127  launchpad_program: Pubkey::from_str_const("LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj"),
128  launchpad_authority: Pubkey::from_str_const("WLHv2UAZm6z4KyaaELi5pjdbJh6RESMva1Rnn8pJVVh"),
129  /*
130  Cpmm has two swap discriminators, swap exact in and swap exact out. Direction is determined by
131  the order of input and output vault/mint accounts.
132  */
133  cpmm_swap_discriminators: [
134    // Swap exact in
135    [143, 190, 90, 218, 196, 30, 51, 222],
136    // Swap exact out
137    [55, 217, 98, 86, 163, 74, 180, 173],
138  ],
139  // Ammv4 also uses swap exact in and swap exact out instructions, but the discriminator is 1 byte
140  ammv4_swap_discriminators: [9, 11],
141  cpmm_create_pool_instruction_discriminator: [175, 175, 109, 31, 13, 152, 155, 237],
142  ammv4_create_pool_instruction_discriminator: 1,
143  // The set of all discriminators for all possible launchpad swap instructions
144  launchpad_swap_discriminators: [
145    // Buy exact in
146    [250, 234, 13, 123, 213, 156, 19, 236],
147    // Sell exact in
148    [149, 39, 222, 155, 211, 124, 152, 26],
149    // Buy exact out
150    [24, 211, 116, 40, 105, 3, 153, 56],
151    // Sell exact out
152    [95, 200, 71, 34, 8, 9, 11, 166],
153  ],
154};
155
156pub struct MeteoraConstants {
157  pub amm_program: Pubkey,
158  pub vault_program: Pubkey,
159  pub vault_base_key: Pubkey,
160  pub locked_profit_degradation_denominator: u128,
161  pub dammv2_program: Pubkey,
162  pub dammv2_pool_authority: Pubkey,
163  pub dammv2_event_authority: Pubkey,
164  pub dammv2_max_fee_numerator: u64,
165  pub dammv2_max_fee_denominator: u128,
166  pub dbc_program: Pubkey,
167  pub dbc_pool_authority: Pubkey,
168  pub dbc_event_authority: Pubkey,
169  pub dbc_swap_discriminator: [u8; 8],
170}
171
172pub const METEORA_CONSTANTS: MeteoraConstants = MeteoraConstants {
173  amm_program: Pubkey::from_str_const("Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB"),
174  vault_program: Pubkey::from_str_const("24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi"),
175  vault_base_key: Pubkey::from_str_const("HWzXGcGHy4tcpYfaRDCyLNzXqBTv3E6BttpCH2vJxArv"),
176  locked_profit_degradation_denominator: 1_000_000_000_000,
177  dammv2_program: Pubkey::from_str_const("cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG"),
178  dammv2_pool_authority: Pubkey::from_str_const("HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC"),
179  dammv2_event_authority: Pubkey::from_str_const("3rmHSu74h1ZcmAisVcWerTCiRDQbUrBKmcwptYGjHfet"),
180  dammv2_max_fee_numerator: 500_000_000,
181  dammv2_max_fee_denominator: 1_000_000_000,
182  dbc_program: Pubkey::from_str_const("dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN"),
183  dbc_pool_authority: Pubkey::from_str_const("FhVo3mqL8PW5pH5U2CN4XE33DokiyZnUwuGpH2hmHLuM"),
184  dbc_event_authority: Pubkey::from_str_const("8Ks12pbrD6PXxfty1hVQiE9sc289zgU1zHkvXhrSdriF"),
185  dbc_swap_discriminator: [248, 198, 158, 145, 225, 117, 135, 200],
186};
187
188pub struct SolanaPrograms {
189  pub token_program: Pubkey,
190  pub token_2022_program: Pubkey,
191  pub system_program: Pubkey,
192  pub associated_token_program: Pubkey,
193  pub compute_budget_program: Pubkey,
194  pub metaplex_program: Pubkey,
195}
196
197pub const SOLANA_PROGRAMS: SolanaPrograms = SolanaPrograms {
198  token_program: Pubkey::from_str_const("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"),
199  token_2022_program: Pubkey::from_str_const("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"),
200  system_program: Pubkey::from_str_const("11111111111111111111111111111111"),
201  associated_token_program: Pubkey::from_str_const("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"),
202  compute_budget_program: Pubkey::from_str_const("ComputeBudget111111111111111111111111111111"),
203  metaplex_program: Pubkey::from_str_const("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"),
204};
205
206/// The size of the raw, onchain account data for each pool type in bytes
207pub struct PoolsAccountSizes {
208  pub pump_swap: usize,
209  pub meteora_amm: usize,
210  pub meteora_dammv2: usize,
211  pub raydium_ammv4: usize,
212  pub raydium_cpmm: usize,
213}
214
215pub const POOLS_ACCOUNT_SIZES: PoolsAccountSizes = PoolsAccountSizes {
216  pump_swap: 300,
217  meteora_amm: 952,
218  meteora_dammv2: 1112,
219  raydium_ammv4: 752,
220  raydium_cpmm: 637,
221};