use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use cosmwasm_std::{Binary, Coin, CosmosMsg, CustomMsg, Uint128};
use crate::gov::GovProposal;
use crate::hooks::PrivilegeMsg;
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)]
#[serde(rename_all = "snake_case")]
pub enum TgradeMsg {
Privilege(PrivilegeMsg),
MintTokens {
denom: String,
amount: Uint128,
recipient: String,
},
ConsensusParams(ConsensusParams),
WasmSudo {
contract_addr: String,
msg: Binary,
},
ExecuteGovProposal {
title: String,
description: String,
proposal: GovProposal,
},
Delegate { funds: Coin, staker: String },
Undelegate { funds: Coin, recipient: String },
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug, Default)]
pub struct ConsensusParams {
pub block: Option<BlockParams>,
pub evidence: Option<EvidenceParams>,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug, Default)]
pub struct BlockParams {
pub max_bytes: Option<i64>,
pub max_gas: Option<i64>,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug, Default)]
pub struct EvidenceParams {
pub max_age_num_blocks: Option<i64>,
pub max_age_duration: Option<i64>,
pub max_bytes: Option<i64>,
}
impl ConsensusParams {
pub fn max_block_gas(gas: i64) -> Self {
ConsensusParams {
block: Some(BlockParams {
max_bytes: None,
max_gas: Some(gas),
}),
evidence: None,
}
}
pub fn max_block_size(bytes: i64) -> Self {
ConsensusParams {
block: Some(BlockParams {
max_bytes: Some(bytes),
max_gas: None,
}),
evidence: None,
}
}
pub fn max_evidence_age(seconds: i64) -> Self {
ConsensusParams {
block: None,
evidence: Some(EvidenceParams {
max_age_num_blocks: None,
max_age_duration: Some(seconds),
max_bytes: None,
}),
}
}
}
impl From<TgradeMsg> for CosmosMsg<TgradeMsg> {
fn from(msg: TgradeMsg) -> CosmosMsg<TgradeMsg> {
CosmosMsg::Custom(msg)
}
}
impl From<PrivilegeMsg> for TgradeMsg {
fn from(msg: PrivilegeMsg) -> TgradeMsg {
TgradeMsg::Privilege(msg)
}
}
impl From<PrivilegeMsg> for CosmosMsg<TgradeMsg> {
fn from(msg: PrivilegeMsg) -> CosmosMsg<TgradeMsg> {
CosmosMsg::Custom(TgradeMsg::from(msg))
}
}
impl From<ConsensusParams> for CosmosMsg<TgradeMsg> {
fn from(params: ConsensusParams) -> CosmosMsg<TgradeMsg> {
CosmosMsg::Custom(TgradeMsg::ConsensusParams(params))
}
}
impl CustomMsg for TgradeMsg {}