use cosmwasm_std::CanonicalAddr;
use cw_storage_plus::{Item, Map};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
pub const CONFIG: Item<Config> = Item::new("CONFIG");
pub const AUCTIONS: Map<u64, Auction> = Map::new("AUCTIONS");
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct Config {
pub auction_num: u64,
pub min_auction_duration: u64,
pub max_auction_duration: u64,
pub enable_auction: bool,
pub fee_rate: u64,
pub default_denom: String,
pub support_contract: Vec<String>,
pub version: ContractVersion,
pub owner: CanonicalAddr,
pub oracle_contract: CanonicalAddr,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)]
pub struct ContractVersion {
pub contract: String,
pub version: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PaymentType {
Coin = 0,
Cw20 = 1,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Auction {
pub name: String,
pub start_timestmap: u64,
pub auction_duration: u64,
pub bidders: Vec<(String, u64, u128)>,
pub curr_winner: Option<(String, u64, u128)>,
pub tokens: Vec<(String, String)>,
pub seller: CanonicalAddr,
pub payment_type: PaymentType,
pub payment: String,
pub min_price: Option<u128>,
pub bid_num: u32,
pub is_candle_blow: bool,
}
impl Auction {
pub fn status(&self, curr_timestamp: u64) -> AuctionStatus {
if self.start_timestmap > curr_timestamp {
return AuctionStatus::NotStarted;
}
if curr_timestamp
> self
.start_timestmap
.checked_add(self.auction_duration)
.unwrap_or(u64::MAX)
{
return AuctionStatus::Ended;
}
AuctionStatus::OpeningPeriod
}
pub fn bid_min_price(&self) -> u128 {
if let Some((_, _, amt)) = self.curr_winner {
u128::max(amt, self.min_price.unwrap_or(0u128))
} else {
self.min_price.unwrap_or(0u128)
}
}
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)]
pub enum AuctionStatus {
NotStarted = 0,
OpeningPeriod = 1,
Ended = 2,
}