use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
#[serde(rename_all = "snake_case")]
pub enum Tg4QueryMsg {
Admin {},
TotalPoints {},
ListMembers {
start_after: Option<String>,
limit: Option<u32>,
},
ListMembersByPoints {
start_after: Option<Member>,
limit: Option<u32>,
},
Member {
addr: String,
at_height: Option<u64>,
},
Hooks {},
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
pub struct AdminResponse {
pub admin: Option<String>,
}
#[derive(Serialize, Deserialize, Default, Clone, PartialEq, Debug)]
pub struct MemberInfo {
pub points: u64,
pub start_height: Option<u64>,
}
impl MemberInfo {
pub fn new(points: u64) -> Self {
Self {
points,
start_height: None,
}
}
pub fn new_with_height(points: u64, height: u64) -> Self {
Self {
points,
start_height: Some(height),
}
}
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
pub struct Member {
pub addr: String,
pub points: u64,
pub start_height: Option<u64>,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
pub struct MemberListResponse {
pub members: Vec<Member>,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
pub struct MemberResponse {
pub points: Option<u64>,
pub start_height: Option<u64>,
}
impl From<Option<MemberInfo>> for MemberResponse {
fn from(mi: Option<MemberInfo>) -> Self {
match mi {
None => Self {
points: None,
start_height: None,
},
Some(mi) => Self {
points: Some(mi.points),
start_height: mi.start_height,
},
}
}
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
pub struct TotalPointsResponse {
pub points: u64,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)]
pub struct HooksResponse {
pub hooks: Vec<String>,
}
pub const TOTAL_KEY: &str = "total";
pub const MEMBERS_KEY: &str = "members";
pub const MEMBERS_CHECKPOINTS: &str = "members__checkpoints";
pub const MEMBERS_CHANGELOG: &str = "members__changelog";
pub fn member_key(address: &str) -> Vec<u8> {
let mut key = [b"\x00", &[MEMBERS_KEY.len() as u8], MEMBERS_KEY.as_bytes()].concat();
key.extend_from_slice(address.as_bytes());
key
}