gmsol/utils/
token.rs

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
7/// Price to min output amount.
8pub 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}