1use cosmwasm_schema::{cw_serde, QueryResponses};
2
3#[cw_serde]
4pub struct InstantiateMsg {
5 pub owner: String,
7 pub initial_paused: bool,
9}
10
11#[cw_serde]
12pub enum ExecuteMsg {
13 Pause {
16 contract: String,
18 method: String,
20 },
21
22 Unpause {
25 contract: String,
27 method: String,
29 },
30
31 PauseGlobal {},
34
35 UnpauseGlobal {},
38
39 TransferOwnership {
40 new_owner: String,
42 },
43}
44
45#[cw_serde]
46#[derive(QueryResponses)]
47pub enum QueryMsg {
48 #[returns(IsPausedResponse)]
49 IsPaused {
50 #[serde(rename = "c")]
52 contract: String,
53 #[serde(rename = "m")]
55 method: String,
56 },
57
58 #[returns(CanExecuteResponse)]
59 CanExecute {
60 #[serde(rename = "c")]
62 contract: String,
63 #[serde(rename = "s")]
65 sender: String,
66 #[serde(rename = "m")]
68 method: String,
69 },
70}
71
72#[cw_serde]
73pub struct IsPausedResponse(pub u32);
74
75impl IsPausedResponse {
76 pub fn new(paused: bool) -> Self {
77 Self(paused as u32)
78 }
79
80 pub fn is_paused(&self) -> bool {
81 self.0 == 1
82 }
83}
84
85#[cw_serde]
86pub struct CanExecuteResponse(pub u32);
87
88#[derive(Debug, PartialEq)]
89pub enum CanExecuteFlag {
90 CanExecute = 0,
91 Paused = 1,
92 Unauthorized = 2,
93}
94
95impl From<CanExecuteFlag> for CanExecuteResponse {
96 fn from(flag: CanExecuteFlag) -> Self {
97 Self(flag as u32)
98 }
99}
100
101impl From<CanExecuteResponse> for CanExecuteFlag {
102 fn from(value: CanExecuteResponse) -> Self {
103 match value.0 {
104 0 => Self::CanExecute,
105 1 => Self::Paused,
106 2 => Self::Unauthorized,
107 _ => panic!("Unknown flag in CanExecuteResponse"),
108 }
109 }
110}
111
112#[cfg(test)]
113mod tests {
114 use super::*;
115
116 #[test]
117 fn test_paused() {
118 let msg = IsPausedResponse::new(true);
119 assert!(msg.is_paused());
120
121 let msg = IsPausedResponse::new(false);
122 assert!(!msg.is_paused());
123 }
124
125 #[test]
128 fn test_paused_raw() {
129 let msg = IsPausedResponse(0);
130 assert!(!msg.is_paused());
131
132 let msg = IsPausedResponse(1);
133 assert!(msg.is_paused());
134 }
135
136 #[test]
137 fn test_can_execute() {
138 let msg = CanExecuteResponse(0);
139 assert_eq!(msg.0, 0);
140 let flag: CanExecuteFlag = msg.into();
141 assert_eq!(flag, CanExecuteFlag::CanExecute);
142
143 let msg = CanExecuteResponse(1);
144 assert_eq!(msg.0, 1);
145 let flag: CanExecuteFlag = msg.into();
146 assert_eq!(flag, CanExecuteFlag::Paused);
147
148 let msg = CanExecuteResponse(2);
149 assert_eq!(msg.0, 2);
150 let flag: CanExecuteFlag = msg.into();
151 assert_eq!(flag, CanExecuteFlag::Unauthorized);
152 }
153}