use crate::hashing::HashingBehavior;
use std::error::Error;
use crate::xdr;
use crate::xdr::WriteXdr;
use crate::asset::Asset;
use crate::hashing::Sha256Hasher;
use crate::asset::AssetBehavior;
const LIQUIDITY_POOL_FEE_V18: i32 = 30;
pub trait LiquidityPoolBehavior {
fn get_liquidity_pool_id(
liquidity_pool_type: &str,
liquidity_pool_parameters: xdr::LiquidityPoolParameters,
) -> Result<Vec<u8>, Box<dyn Error>>;
}
pub struct LiquidityPool;
impl LiquidityPoolBehavior for LiquidityPool {
fn get_liquidity_pool_id(
liquidity_pool_type: &str,
liquidity_pool_parameters: xdr::LiquidityPoolParameters,
) -> Result<Vec<u8>, Box<dyn Error>> {
if liquidity_pool_type != "constant_product" {
return Err(Box::new(std::io::Error::new(
std::io::ErrorKind::InvalidData,
"liquidityPoolType is invalid",
)));
}
let xdr::LiquidityPoolParameters::LiquidityPoolConstantProduct(liquidity_pool_parametes_x) =
liquidity_pool_parameters.clone();
if liquidity_pool_parametes_x.fee != LIQUIDITY_POOL_FEE_V18 {
return Err(Box::new(std::io::Error::new(
std::io::ErrorKind::InvalidData,
"fee is invalid",
)));
}
if Asset::compare(
&Asset::from_operation(liquidity_pool_parametes_x.clone().asset_a).unwrap(),
&Asset::from_operation(liquidity_pool_parametes_x.clone().asset_b).unwrap(),
) != -1
{
return Err(Box::new(std::io::Error::new(
std::io::ErrorKind::InvalidData,
"Assets are not in lexicographic order",
)));
}
let va_1 = liquidity_pool_parametes_x.clone().asset_a;
let lp_type_data =
xdr::LiquidityPoolType::LiquidityPoolConstantProduct.to_xdr(xdr::Limits::none());
let lp_params_data = xdr::LiquidityPoolConstantProductParameters {
asset_a: liquidity_pool_parametes_x.clone().asset_a,
asset_b: liquidity_pool_parametes_x.clone().asset_b,
fee: liquidity_pool_parametes_x.fee,
}
.to_xdr(xdr::Limits::none());
let mut payload = Vec::new();
payload.extend(lp_type_data.unwrap());
payload.extend(lp_params_data.unwrap());
Ok(Sha256Hasher::hash(payload).to_vec())
}
}