use serde::{Deserialize, Serialize};
use crate::wallet::Address;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct TokenDelegate {
pub validator: Address,
pub amount: String,
pub is_undelegate: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct ClaimRewards {
#[serde(skip_serializing_if = "Option::is_none")]
pub validator: Option<Address>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct LinkStakingUser {
pub target: Address,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct CDeposit {
pub amount: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct CWithdraw {
pub amount: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn token_delegate_amount_is_string() {
let a = TokenDelegate {
validator: Address::ZERO,
amount: "100.5".into(),
is_undelegate: false,
};
let j = serde_json::to_value(&a).unwrap();
assert!(j["amount"].is_string());
assert_eq!(j["is_undelegate"], serde_json::json!(false));
let dec: TokenDelegate = serde_json::from_value(j).unwrap();
assert_eq!(a, dec);
}
#[test]
fn claim_rewards_omits_none_validator() {
let a = ClaimRewards { validator: None };
let j = serde_json::to_value(a).unwrap();
assert!(j.get("validator").is_none());
}
#[test]
fn c_deposit_withdraw_amount_is_string() {
let d = CDeposit {
amount: "500".into(),
};
let jd = serde_json::to_value(&d).unwrap();
assert_eq!(jd["amount"], serde_json::json!("500"));
assert_eq!(serde_json::from_value::<CDeposit>(jd).unwrap(), d);
let w = CWithdraw {
amount: "500".into(),
};
let jw = serde_json::to_value(&w).unwrap();
assert_eq!(jw["amount"], serde_json::json!("500"));
assert_eq!(serde_json::from_value::<CWithdraw>(jw).unwrap(), w);
}
}