use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use thiserror::Error;
use cosmwasm_std::{Addr, Decimal as StdDecimal};
use crate::error::MarsError;
use crate::helpers::decimal_param_le_one;
use crate::math::decimal::Decimal;
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct Config {
pub owner: Addr,
pub address_provider_address: Addr,
pub safety_fund_fee_share: Decimal,
pub treasury_fee_share: Decimal,
pub astroport_factory_address: Addr,
pub astroport_max_spread: StdDecimal,
}
impl Config {
pub fn validate(&self) -> Result<(), ConfigError> {
decimal_param_le_one(&self.safety_fund_fee_share, "safety_fund_fee_share")?;
decimal_param_le_one(&self.treasury_fee_share, "treasury_fee_share")?;
let combined_fee_share = self.safety_fund_fee_share + self.treasury_fee_share;
if combined_fee_share > Decimal::one() {
return Err(ConfigError::InvalidFeeShareAmounts {});
}
Ok(())
}
}
#[derive(Error, Debug, PartialEq)]
pub enum ConfigError {
#[error("{0}")]
Mars(#[from] MarsError),
#[error("Invalid fee share amounts. Sum of safety and treasury fee shares exceeds one")]
InvalidFeeShareAmounts {},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct AssetConfig {
pub enabled_for_distribution: bool,
}
#[allow(clippy::derivable_impls)]
impl Default for AssetConfig {
fn default() -> Self {
AssetConfig {
enabled_for_distribution: false,
}
}
}
pub mod msg {
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use cosmwasm_std::{CosmosMsg, Decimal as StdDecimal, Uint128};
use astroport::asset::AssetInfo;
use crate::asset::Asset;
use crate::math::decimal::Decimal;
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct InstantiateMsg {
pub config: CreateOrUpdateConfig,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct CreateOrUpdateConfig {
pub owner: Option<String>,
pub address_provider_address: Option<String>,
pub safety_fund_fee_share: Option<Decimal>,
pub treasury_fee_share: Option<Decimal>,
pub astroport_factory_address: Option<String>,
pub astroport_max_spread: Option<StdDecimal>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
UpdateConfig { config: CreateOrUpdateConfig },
UpdateAssetConfig { asset: Asset, enabled: bool },
WithdrawFromRedBank {
asset: Asset,
amount: Option<Uint128>,
},
DistributeProtocolRewards {
asset: Asset,
amount: Option<Uint128>,
},
SwapAssetToUusd {
offer_asset_info: AssetInfo,
amount: Option<Uint128>,
},
ExecuteCosmosMsg(CosmosMsg),
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
Config {},
AssetConfig { asset: Asset },
}
}