use crate::asset::{AssetInfo, PairInfo};
use cosmwasm_std::{Addr, Binary};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::fmt::{Display, Formatter, Result};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PairType {
Xyk {},
Stable {},
Custom(String),
}
impl Display for PairType {
fn fmt(&self, fmt: &mut Formatter) -> Result {
match self {
PairType::Xyk {} => fmt.write_str("xyk"),
PairType::Stable {} => fmt.write_str("stable"),
PairType::Custom(pair_type) => fmt.write_str(format!("custom-{}", pair_type).as_str()),
}
}
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct PairConfig {
pub code_id: u64,
pub pair_type: PairType,
pub total_fee_bps: u16,
pub maker_fee_bps: u16,
pub is_disabled: Option<bool>,
}
impl PairConfig {
pub fn valid_fee_bps(&self) -> bool {
self.total_fee_bps <= 10_000 && self.maker_fee_bps <= 10_000
}
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct InstantiateMsg {
pub pair_configs: Vec<PairConfig>,
pub token_code_id: u64,
pub fee_address: Option<String>,
pub generator_address: Option<String>,
pub owner: String,
pub whitelist_code_id: u64,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ExecuteMsg {
UpdateConfig {
token_code_id: Option<u64>,
fee_address: Option<String>,
generator_address: Option<String>,
whitelist_code_id: Option<u64>,
},
UpdatePairConfig {
config: PairConfig,
},
CreatePair {
pair_type: PairType,
asset_infos: [AssetInfo; 2],
init_params: Option<Binary>,
},
Deregister {
asset_infos: [AssetInfo; 2],
},
ProposeNewOwner {
owner: String,
expires_in: u64,
},
DropOwnershipProposal {},
ClaimOwnership {},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
Config {},
Pair {
asset_infos: [AssetInfo; 2],
},
Pairs {
start_after: Option<[AssetInfo; 2]>,
limit: Option<u32>,
},
FeeInfo {
pair_type: PairType,
},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct ConfigResponse {
pub owner: Addr,
pub pair_configs: Vec<PairConfig>,
pub token_code_id: u64,
pub fee_address: Option<Addr>,
pub generator_address: Option<Addr>,
pub whitelist_code_id: u64,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct MigrateMsg {
pub whitelist_code_id: u64,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct PairsResponse {
pub pairs: Vec<PairInfo>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct FeeInfoResponse {
pub fee_address: Option<Addr>,
pub total_fee_bps: u16,
pub maker_fee_bps: u16,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum UpdateAddr {
Set(String),
Remove {},
}