1use anchor_client::solana_sdk::pubkey::Pubkey;
2use gmsol_store::states::{TokenMap, TokenMapAccess};
3use rust_decimal::{Decimal, RoundingStrategy};
4
5use super::unsigned_amount_to_decimal;
6
7pub fn price_to_min_output_amount(
9 token_map: &TokenMap,
10 token_in: &Pubkey,
11 token_in_amount: u64,
12 token_out: &Pubkey,
13 token_in_to_token_out_price: Decimal,
14) -> Option<u64> {
15 let token_in = token_map.get(token_in)?;
16 let token_in_amount = unsigned_amount_to_decimal(token_in_amount, token_in.token_decimals());
17 let token_out_amount = token_in_amount.checked_div(token_in_to_token_out_price)?;
18 let token_out = token_map.get(token_out)?;
19 let scale = token_out.token_decimals().into();
20 token_out_amount
21 .round_dp_with_strategy(scale, RoundingStrategy::AwayFromZero)
22 .mantissa()
23 .try_into()
24 .ok()
25}