use std::collections::HashMap;
use cosmwasm_schema::cw_serde;
use cosmwasm_std::{StdResult, Storage, Uint128, Addr, Decimal256, Decimal};
use cw_storage_plus::{Item, Map};
use dexter::asset::AssetInfo;
use dexter::pool::Config;
pub const CONFIG: Item<Config> = Item::new("config");
pub const STABLESWAP_CONFIG: Item<StableSwapConfig> = Item::new("stableswap_config");
pub const TWAPINFO: Item<Twap> = Item::new("twap");
pub const MATHCONFIG: Item<MathConfig> = Item::new("math_config");
#[cw_serde]
pub struct MathConfig {
pub init_amp: u64,
pub init_amp_time: u64,
pub next_amp: u64,
pub next_amp_time: u64,
pub greatest_precision: u8,
}
#[cw_serde]
pub struct StableSwapConfig {
pub supports_scaling_factors_update: bool,
pub scaling_factors: Vec<AssetScalingFactor>,
pub scaling_factor_manager: Option<Addr>,
}
#[cw_serde]
pub struct StableSwapConfigV1 {
pub max_allowed_spread: Decimal,
pub supports_scaling_factors_update: bool,
pub scaling_factors: Vec<AssetScalingFactor>,
pub scaling_factor_manager: Option<Addr>,
}
impl StableSwapConfig {
pub fn scaling_factors(&self) -> HashMap<AssetInfo, Decimal256> {
let mut scaling_factors = HashMap::new();
for scaling_factor in &self.scaling_factors {
scaling_factors.insert(scaling_factor.asset_info.clone(), scaling_factor.scaling_factor);
}
scaling_factors
}
pub fn get_scaling_factor_for(&self, asset_info: &AssetInfo) -> Option<Decimal256> {
for scaling_factor in &self.scaling_factors {
if scaling_factor.asset_info == *asset_info {
return Some(scaling_factor.scaling_factor);
}
}
None
}
}
#[cw_serde]
pub struct Twap {
pub cumulative_prices: Vec<(AssetInfo, AssetInfo, Uint128)>,
pub block_time_last: u64,
}
#[cw_serde]
pub struct StablePoolParams {
pub amp: u64,
pub supports_scaling_factors_update: bool,
pub scaling_factors: Vec<AssetScalingFactor>,
pub scaling_factor_manager: Option<Addr>,
}
#[cw_serde]
pub struct AssetScalingFactor {
pub asset_info: AssetInfo,
pub scaling_factor: Decimal256,
}
impl AssetScalingFactor {
pub fn new(asset_info: AssetInfo, scaling_factor: Decimal256) -> Self {
Self {
asset_info,
scaling_factor,
}
}
}
#[cw_serde]
pub enum StablePoolUpdateParams {
StartChangingAmp { next_amp: u64, next_amp_time: u64 },
StopChangingAmp {},
UpdateScalingFactorManager { manager: Addr },
UpdateScalingFactor { asset_info: AssetInfo, scaling_factor: Decimal256 }
}
pub const PRECISIONS: Map<String, u8> = Map::new("precisions");
pub(crate) fn get_precision(storage: &dyn Storage, asset_info: &AssetInfo) -> StdResult<u8> {
PRECISIONS.load(storage, asset_info.to_string())
}