bvs_guardrail/
msg.rs

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    /// apply a diff to the existing members.
30    /// remove is applied after add, so if an address is in both, it is removed
31    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, // 100 days
119        };
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}