Skip to main content

riptide_amm/math/
quote.rs

1use super::error::{CoreError, INVALID_ORACLE_DATA};
2
3use super::oracle::OracleData;
4
5use borsh::BorshDeserialize;
6
7#[cfg(feature = "wasm")]
8use riptide_amm_macros_lib::wasm_expose;
9
10#[derive(Debug, Clone, Copy, Eq, PartialEq)]
11#[cfg_attr(feature = "wasm", wasm_expose)]
12pub enum QuoteType {
13    ExactIn,
14    ExactOut,
15}
16
17#[derive(Debug, Clone, Copy, Eq, PartialEq)]
18#[cfg_attr(feature = "wasm", wasm_expose)]
19pub struct Quote {
20    pub amount_in: u64,
21    pub amount_out: u64,
22    pub quote_type: QuoteType,
23}
24
25#[cfg_attr(feature = "wasm", wasm_expose)]
26pub fn quote_exact_in(
27    amount: u64,
28    amount_is_token_a: bool,
29    oracle_data: &[u8],
30    reserves_a: u64,
31    reserves_b: u64,
32) -> Result<Quote, CoreError> {
33    let mut oracle_data = oracle_data;
34    let oracle_data = OracleData::deserialize(&mut oracle_data).map_err(|_| INVALID_ORACLE_DATA)?;
35    oracle_data.swap(amount, amount_is_token_a, true, reserves_a, reserves_b)
36}
37
38#[cfg_attr(feature = "wasm", wasm_expose)]
39pub fn quote_exact_out(
40    amount: u64,
41    amount_is_token_a: bool,
42    oracle_data: &[u8],
43    reserves_a: u64,
44    reserves_b: u64,
45) -> Result<Quote, CoreError> {
46    let mut oracle_data = oracle_data;
47    let oracle_data = OracleData::deserialize(&mut oracle_data).map_err(|_| INVALID_ORACLE_DATA)?;
48    oracle_data.swap(amount, amount_is_token_a, false, reserves_a, reserves_b)
49}