use crate::client::client_types::{terra_decimal_format, terra_opt_decimal_format};
use crate::core_types::{Coin, MsgInternal};
use crate::messages::Message;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Debug)]
pub struct ValidatorDescription {
pub details: String,
pub identity: String,
pub moniker: String,
pub security_contact: String,
pub website: String,
}
impl ValidatorDescription {
pub fn create_create(
details: Option<String>,
identity: Option<String>,
moniker: String,
security_contact: Option<String>,
website: Option<String>,
) -> ValidatorDescription {
ValidatorDescription {
details: details.unwrap_or_else(|| "".into()),
identity: identity.unwrap_or_else(|| "".into()),
moniker,
security_contact: security_contact.unwrap_or_else(|| "".into()),
website: website.unwrap_or_else(|| "".into()),
}
}
pub fn create_edit(
details: Option<String>,
identity: Option<String>,
moniker: Option<String>,
security_contact: Option<String>,
website: Option<String>,
) -> ValidatorDescription {
ValidatorDescription {
details: details.unwrap_or_else(|| "[do-not-modify]".into()),
identity: identity.unwrap_or_else(|| "[do-not-modify]".into()),
moniker: moniker.unwrap_or_else(|| "[do-not-modify]".into()),
security_contact: security_contact.unwrap_or_else(|| "[do-not-modify]".into()),
website: website.unwrap_or_else(|| "[do-not-modify]".into()),
}
}
}
#[derive(Deserialize, Serialize, Debug)]
pub struct ValidatorCommission {
#[serde(with = "terra_decimal_format")]
pub max_change_rate: Decimal,
#[serde(with = "terra_decimal_format")]
pub max_rate: Decimal,
#[serde(with = "terra_decimal_format")]
pub rate: Decimal,
}
#[derive(Serialize, Debug)]
pub struct MsgCreateValidator {
pub commission: ValidatorCommission,
pub delegator_address: String,
pub description: ValidatorDescription,
#[serde(with = "terra_decimal_format")]
pub min_self_delegation: Decimal,
pub pubkey: String,
pub value: Coin,
pub validator_address: String,
}
impl MsgInternal for MsgCreateValidator {}
impl MsgCreateValidator {
pub fn create(
description: ValidatorDescription,
commission: ValidatorCommission,
min_self_delegation: Decimal,
delegator_address: String,
validator_address: String,
pubkey: String,
value: Coin,
) -> Message {
let internal = MsgCreateValidator {
commission,
delegator_address,
description,
min_self_delegation,
pubkey,
value,
validator_address,
};
Message {
s_type: "staking/MsgCreateValidator".into(),
value: serde_json::to_value(internal).unwrap(),
}
}
}
#[derive(Serialize, Debug)]
pub struct MsgEditValidator {
pub address: String,
#[serde(with = "terra_opt_decimal_format")]
pub commission_rate: Option<Decimal>,
pub description: ValidatorDescription,
#[serde(with = "terra_opt_decimal_format")]
pub min_self_delegation: Option<Decimal>,
}
impl MsgInternal for MsgEditValidator {}
impl MsgEditValidator {
pub fn create(
description: ValidatorDescription,
address: String,
commission_rate: Option<Decimal>,
min_self_delegation: Option<Decimal>,
) -> anyhow::Result<Message> {
let internal = MsgEditValidator {
address,
commission_rate,
description,
min_self_delegation,
};
Ok(Message {
s_type: "staking/MsgEditValidator".into(),
value: serde_json::to_value(internal)?,
})
}
}
#[derive(Serialize, Debug)]
pub struct MsgUndelegate {
pub amount: Coin,
pub delegator_address: String,
pub validator_address: String,
}
impl MsgInternal for MsgUndelegate {}
impl MsgUndelegate {
pub fn create(
delegator_address: String,
validator_address: String,
amount: Coin,
) -> anyhow::Result<Message> {
let internal = MsgUndelegate {
amount,
delegator_address,
validator_address,
};
Ok(Message {
s_type: "staking/MsgUndelegate".into(),
value: serde_json::to_value(internal)?,
})
}
}
#[derive(Serialize, Debug)]
pub struct MsgDelegate {
pub amount: Coin,
pub delegator_address: String,
pub validator_address: String,
}
impl MsgInternal for MsgDelegate {}
impl MsgDelegate {
pub fn create(
delegator_address: String,
validator_address: String,
amount: Coin,
) -> anyhow::Result<Message> {
let internal = MsgDelegate {
amount,
delegator_address,
validator_address,
};
Ok(Message {
s_type: "staking/MsgDelegate".into(),
value: serde_json::to_value(internal)?,
})
}
}
#[derive(Serialize, Debug)]
pub struct MsgBeginRedelegate {
pub amount: Coin,
pub delegator_address: String,
pub validator_dst_address: String,
pub validator_src_address: String,
}
impl MsgInternal for MsgBeginRedelegate {}
impl MsgBeginRedelegate {
pub fn create(
delegator_address: String,
validator_dst_address: String,
validator_src_address: String,
amount: Coin,
) -> anyhow::Result<Message> {
let internal = MsgBeginRedelegate {
amount,
delegator_address,
validator_src_address,
validator_dst_address,
};
Ok(Message {
s_type: "staking/MsgBeginRedelegate".into(),
value: serde_json::to_value(internal)?,
})
}
}