use std::collections::HashMap;
use crate::market::base_liquidity::BaseLiquidityResponse;
use crate::router::client::RouterClient;
use crate::router::error::RouterError;
use cosmwasm_std::Addr;
use serde::{Deserialize, Serialize};
impl RouterClient {
pub async fn base_liquidity_all(
&self,
) -> Result<HashMap<Addr, BaseLiquidityResponse>, RouterError> {
let query = Query {
base_liquidity_all: BaseLiquidityAllRequest {},
};
let response: BaseLiquidityAllResponse = self
.query_contract(self.router_contract_address.to_string(), &query, None)
.await?
.data;
Ok(response.liquidity)
}
}
#[derive(Serialize)]
struct Query {
pub base_liquidity_all: BaseLiquidityAllRequest,
}
#[derive(Serialize)]
pub struct BaseLiquidityAllRequest {}
#[derive(Deserialize)]
pub struct BaseLiquidityAllResponse {
pub liquidity: HashMap<Addr, BaseLiquidityResponse>,
}
#[cfg(test)]
mod tests {
use crate::market::client::MarketAdminClient;
use crate::oracle::client::OracleAdminClient;
use crate::router::client::RouterAdminClient;
use crate::test_utils::helpers::{
TEST_ASSET_ARCH_SYMBOL, TEST_ASSET_ETH_SYMBOL, TEST_ASSET_USDT_SYMBOL,
};
use crate::test_utils::test_scenario::TestScenario;
use cosmrs::{AccountId, Coin};
use cosmwasm_std::{Decimal256, Uint128};
use serial_test::serial;
use std::ops::Add;
use std::str::FromStr;
use std::time::{Duration, SystemTime, UNIX_EPOCH};
#[tokio::test]
#[serial]
async fn test_base_liquidity_all() {
let mut test_scenario = TestScenario::new_from_config("config.json".to_string()).await;
let price_threshold_ratio = Decimal256::from_str("0.5").unwrap();
let price_expire_millis = Some(1000);
let oracle_contract_address = test_scenario
.instantiate_oracle_contract(price_threshold_ratio, price_expire_millis)
.await;
let default_protocol_fee = Decimal256::from_str("0.1").unwrap();
let default_lp_fee = Decimal256::from_str("0.1").unwrap();
let router_contract_address = test_scenario
.instantiate_router_contract(
oracle_contract_address.clone(),
oracle_contract_address.clone(),
default_protocol_fee,
default_lp_fee,
)
.await;
let oracle_client =
OracleAdminClient::from_scenario(&test_scenario, &oracle_contract_address)
.expect("Failed to create oracle admin client");
let price_expiry_time = SystemTime::now().add(Duration::from_secs(7200)); let price_expiry_timestamp = price_expiry_time
.duration_since(UNIX_EPOCH)
.expect("Converting to timestamp failed");
test_scenario.set_default_assets(&oracle_client).await;
test_scenario
.set_default_prices(&oracle_client, price_expiry_timestamp, "50000")
.await;
let router_client = RouterAdminClient::from_scenario(
&test_scenario,
router_contract_address.parse().unwrap(),
)
.expect("Failed to create router admin client");
let liquidities = router_client
.public_router_client
.base_liquidity_all()
.await
.expect("Failed to get base liquidity");
assert!(
liquidities.is_empty(),
"Expected no base liquidity before any market creation"
);
test_scenario
.create_market(
&router_client,
TEST_ASSET_ARCH_SYMBOL,
&[TEST_ASSET_USDT_SYMBOL],
Uint128::new(10),
)
.await;
let markets = router_client.public_router_client.markets().await.unwrap();
let market_addr = &markets.first().unwrap().market_address;
let market_client = MarketAdminClient::from_scenario(&test_scenario).unwrap();
let admin_account = test_scenario.admin_account();
test_scenario
.deposit_base(
&market_client,
AccountId::from_str(market_addr.as_ref()).unwrap(),
&admin_account,
Coin::new(42, TEST_ASSET_ARCH_SYMBOL).unwrap(),
)
.await;
let liquidities = router_client
.public_router_client
.base_liquidity_all()
.await
.unwrap();
liquidities.iter().for_each(|(addr, liquidity)| {
assert_eq!(addr, market_addr);
assert_eq!(
liquidity.base_liquidity,
cosmwasm_std::coin(42u128, TEST_ASSET_ARCH_SYMBOL)
);
assert_eq!(liquidity.total_shares, Uint128::new(42u128));
})
}
#[tokio::test]
#[serial]
async fn test_base_liquidity_all_but_no_liquidity() {
let mut test_scenario = TestScenario::new_from_config("config.json".to_string()).await;
let price_threshold_ratio = Decimal256::from_str("0.5").unwrap();
let price_expire_millis = Some(1000);
let oracle_contract_address = test_scenario
.instantiate_oracle_contract(price_threshold_ratio, price_expire_millis)
.await;
let default_protocol_fee = Decimal256::from_str("0.1").unwrap();
let default_lp_fee = Decimal256::from_str("0.1").unwrap();
let router_contract_address = test_scenario
.instantiate_router_contract(
oracle_contract_address.clone(),
oracle_contract_address.clone(),
default_protocol_fee,
default_lp_fee,
)
.await;
let oracle_client =
OracleAdminClient::from_scenario(&test_scenario, &oracle_contract_address)
.expect("Failed to create oracle admin client");
let price_expiry_time = SystemTime::now().add(Duration::from_secs(7200)); let price_expiry_timestamp = price_expiry_time
.duration_since(UNIX_EPOCH)
.expect("Converting to timestamp failed");
test_scenario.set_default_assets(&oracle_client).await;
test_scenario
.set_default_prices(&oracle_client, price_expiry_timestamp, "50000")
.await;
let router_client = RouterAdminClient::from_scenario(
&test_scenario,
router_contract_address.parse().unwrap(),
)
.unwrap();
let arch_market = test_scenario
.create_market(
&router_client,
TEST_ASSET_ARCH_SYMBOL,
&[TEST_ASSET_USDT_SYMBOL],
Uint128::new(10),
)
.await;
let eth_market = test_scenario
.create_market(
&router_client,
TEST_ASSET_ETH_SYMBOL,
&[TEST_ASSET_USDT_SYMBOL],
Uint128::new(10),
)
.await;
let usdt_market = test_scenario
.create_market(
&router_client,
TEST_ASSET_USDT_SYMBOL,
&[TEST_ASSET_ETH_SYMBOL],
Uint128::new(10),
)
.await;
let liquidities = router_client
.public_router_client
.base_liquidity_all()
.await
.unwrap();
assert_eq!(liquidities.len(), 3);
let arch_tuple = liquidities
.iter()
.find(|(addr, _)| addr.to_string() == arch_market)
.unwrap();
let eth_tuple = liquidities
.iter()
.find(|(addr, _)| addr.to_string() == eth_market)
.unwrap();
let usdt_tuple = liquidities
.iter()
.find(|(addr, _)| addr.to_string() == usdt_market)
.unwrap();
assert_eq!(
arch_tuple.1.base_liquidity,
cosmwasm_std::coin(0, TEST_ASSET_ARCH_SYMBOL)
);
assert_eq!(
eth_tuple.1.base_liquidity,
cosmwasm_std::coin(0, TEST_ASSET_ETH_SYMBOL)
);
assert_eq!(
usdt_tuple.1.base_liquidity,
cosmwasm_std::coin(0, TEST_ASSET_USDT_SYMBOL)
);
}
}