1use crate::state::ProposalId;
2use bvs_library::slashing::SlashingRequestId;
3use cosmwasm_schema::{cw_serde, QueryResponses};
4use cw3::Vote;
5use cw4::Member;
6use cw_utils::Threshold;
7
8#[cw_serde]
9pub struct InstantiateMsg {
10 pub owner: String,
11 pub members: Vec<Member>,
12 pub threshold: Threshold,
13 pub default_expiration: u64,
14}
15
16#[cw_serde]
17pub enum ExecuteMsg {
18 Propose {
19 slashing_request_id: SlashingRequestId,
20 reason: String,
21 },
22 Vote {
23 slashing_request_id: SlashingRequestId,
24 vote: Vote,
25 },
26 Close {
27 slashing_request_id: SlashingRequestId,
28 },
29 UpdateMembers {
32 remove: Vec<String>,
33 add: Vec<Member>,
34 },
35}
36
37#[cw_serde]
38#[derive(QueryResponses)]
39pub enum QueryMsg {
40 #[returns(cw_utils::ThresholdResponse)]
41 Threshold { height: Option<u64> },
42 #[returns(cw3::ProposalResponse)]
43 Proposal { proposal_id: ProposalId },
44 #[returns(cw3::ProposalResponse)]
45 ProposalBySlashingRequestId {
46 slashing_request_id: SlashingRequestId,
47 },
48 #[returns(cw3::ProposalListResponse)]
49 ListProposals {
50 start_after: Option<u64>,
51 limit: Option<u32>,
52 },
53 #[returns(cw3::VoteResponse)]
54 Vote {
55 proposal_id: ProposalId,
56 voter: String,
57 },
58 #[returns(cw3::VoteResponse)]
59 VoteBySlashingRequestId {
60 slashing_request_id: SlashingRequestId,
61 voter: String,
62 },
63 #[returns(cw3::VoteListResponse)]
64 ListVotes {
65 proposal_id: ProposalId,
66 start_after: Option<String>,
67 limit: Option<u32>,
68 },
69 #[returns(cw3::VoterResponse)]
70 Voter {
71 address: String,
72 height: Option<u64>,
73 },
74 #[returns(cw3::VoterListResponse)]
75 ListVoters {
76 start_after: Option<String>,
77 limit: Option<u32>,
78 },
79}
80
81#[cw_serde]
82pub struct Voter {
83 pub addr: String,
84 pub weight: u64,
85}
86
87#[cw_serde]
88pub struct MigrateMsg {}
89
90#[cfg(test)]
91mod tests {
92 use crate::msg::InstantiateMsg;
93 use cosmwasm_std::testing::mock_dependencies;
94 use cosmwasm_std::{to_json_string, Decimal};
95 use cw_utils::Threshold;
96
97 #[test]
98 fn to_json_string_expected() {
99 let api_deps = mock_dependencies();
100 let owner = api_deps.api.addr_make("owner");
101 let member = api_deps.api.addr_make("member");
102
103 let msg = InstantiateMsg {
104 owner: owner.to_string(),
105 members: vec![
106 cw4::Member {
107 addr: owner.to_string(),
108 weight: 1,
109 },
110 cw4::Member {
111 addr: member.to_string(),
112 weight: 1,
113 },
114 ],
115 threshold: Threshold::AbsolutePercentage {
116 percentage: Decimal::percent(50),
117 },
118 default_expiration: 60 * 60 * 24 * 100, };
120 let a = to_json_string(&msg).unwrap();
121 let b = r#"{"owner":"cosmwasm1fsgzj6t7udv8zhf6zj32mkqhcjcpv52yph5qsdcl0qt94jgdckqs2g053y","members":[{"addr":"cosmwasm1fsgzj6t7udv8zhf6zj32mkqhcjcpv52yph5qsdcl0qt94jgdckqs2g053y","weight":1},{"addr":"cosmwasm1uvdtvs7yfaaqajpykkw3r9xkpkkrxssqmpz7v8fd9zw65rcg06jqfd9qlh","weight":1}],"threshold":{"absolute_percentage":{"percentage":"0.5"}},"default_expiration":8640000}"#;
122 assert_eq!(a, b);
123 }
124}