use cosmwasm_std::{Binary, Decimal, HumanAddr, Uint128};
use cw20::Cw20ReceiveMsg;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::common::OrderBy;
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct InitMsg {
pub mirror_token: HumanAddr,
pub quorum: Decimal,
pub threshold: Decimal,
pub voting_period: u64,
pub effective_delay: u64,
pub expiration_period: u64,
pub proposal_deposit: Uint128,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum HandleMsg {
Receive(Cw20ReceiveMsg),
UpdateConfig {
owner: Option<HumanAddr>,
quorum: Option<Decimal>,
threshold: Option<Decimal>,
voting_period: Option<u64>,
effective_delay: Option<u64>,
expiration_period: Option<u64>,
proposal_deposit: Option<Uint128>,
},
CastVote {
poll_id: u64,
vote: VoteOption,
amount: Uint128,
},
WithdrawVotingTokens {
amount: Option<Uint128>,
},
EndPoll {
poll_id: u64,
},
ExecutePoll {
poll_id: u64,
},
ExpirePoll {
poll_id: u64,
},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Cw20HookMsg {
StakeVotingTokens {},
CreatePoll {
title: String,
description: String,
link: Option<String>,
execute_msg: Option<ExecuteMsg>,
},
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct ExecuteMsg {
pub contract: HumanAddr,
pub msg: Binary,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum QueryMsg {
Config {},
State {},
Staker {
address: HumanAddr,
},
Poll {
poll_id: u64,
},
Polls {
filter: Option<PollStatus>,
start_after: Option<u64>,
limit: Option<u32>,
order_by: Option<OrderBy>,
},
Voters {
poll_id: u64,
start_after: Option<HumanAddr>,
limit: Option<u32>,
order_by: Option<OrderBy>,
},
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema)]
pub struct ConfigResponse {
pub owner: HumanAddr,
pub mirror_token: HumanAddr,
pub quorum: Decimal,
pub threshold: Decimal,
pub voting_period: u64,
pub effective_delay: u64,
pub expiration_period: u64,
pub proposal_deposit: Uint128,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema)]
pub struct StateResponse {
pub poll_count: u64,
pub total_share: Uint128,
pub total_deposit: Uint128,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema)]
pub struct PollResponse {
pub id: u64,
pub creator: HumanAddr,
pub status: PollStatus,
pub end_height: u64,
pub title: String,
pub description: String,
pub link: Option<String>,
pub deposit_amount: Uint128,
pub execute_data: Option<ExecuteMsg>,
pub yes_votes: Uint128,
pub no_votes: Uint128,
pub total_balance_at_end_poll: Option<Uint128>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema)]
pub struct PollsResponse {
pub polls: Vec<PollResponse>,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema)]
pub struct PollCountResponse {
pub poll_count: u64,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema)]
pub struct StakerResponse {
pub balance: Uint128,
pub share: Uint128,
pub locked_balance: Vec<(u64, VoterInfo)>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema)]
pub struct VotersResponseItem {
pub voter: HumanAddr,
pub vote: VoteOption,
pub balance: Uint128,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema)]
pub struct VotersResponse {
pub voters: Vec<VotersResponseItem>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct MigrateMsg {
pub version: u32,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct VoterInfo {
pub vote: VoteOption,
pub balance: Uint128,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PollStatus {
InProgress,
Passed,
Rejected,
Executed,
Expired,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum VoteOption {
Yes,
No,
}