quartz_contract_core/
handler.rs

1pub mod execute;
2pub mod instantiate;
3
4use cosmwasm_std::{DepsMut, Env, MessageInfo, Response};
5
6use crate::{error::Error, msg::HasDomainType};
7
8pub trait Handler {
9    fn handle(self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo) -> Result<Response, Error>;
10}
11
12pub trait RawHandler: HasDomainType {
13    fn handle_raw(
14        self,
15        deps: DepsMut<'_>,
16        env: &Env,
17        info: &MessageInfo,
18    ) -> Result<Response, Error>;
19}
20
21impl<RM> RawHandler for RM
22where
23    RM: HasDomainType,
24    RM::DomainType: Handler,
25{
26    fn handle_raw(
27        self,
28        deps: DepsMut<'_>,
29        env: &Env,
30        info: &MessageInfo,
31    ) -> Result<Response, Error> {
32        let execute: RM::DomainType = self.try_into()?;
33        execute.handle(deps, env, info)
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use cosmwasm_std::{
40        testing::{message_info, mock_dependencies, mock_env},
41        DepsMut,
42    };
43    use serde::Deserialize;
44
45    use crate::{
46        handler::Handler,
47        msg::{HasDomainType, RawExecuteMsg, RawInstantiateMsg},
48        state::SESSION,
49    };
50
51    fn parse_msg<'a, R>(msg_str: &'a str) -> R::DomainType
52    where
53        R: HasDomainType + Deserialize<'a>,
54    {
55        let raw_msg: R =
56            serde_json::from_str(msg_str).expect("deserialization failure for hard-coded RawMsg");
57        raw_msg.try_into().expect("invalid hard-coded RawMsg")
58    }
59
60    fn handle_msg<'a, R>(mut deps: DepsMut<'_>, msg_str: &'a str)
61    where
62        R: HasDomainType + Deserialize<'a>,
63        R::DomainType: Handler,
64    {
65        let msg = parse_msg::<R>(msg_str);
66        let creator = deps
67            .api
68            .addr_validate("creator")
69            .expect("Hardcoded creator");
70        let info = message_info(&creator, &[]);
71        let env = mock_env();
72        let res = msg
73            .handle(deps.branch(), &env, &info)
74            .expect("msg handler failure");
75
76        assert_eq!(0, res.messages.len());
77    }
78
79    fn instantiate(deps: DepsMut<'_>) {
80        handle_msg::<RawInstantiateMsg>(
81            deps,
82            r#"{
83                "msg": {
84                    "mr_enclave": "e3c2f2a5b840d89e069acaffcadb6510ef866a73d3a9ee57100ed5f8646ee4bb"
85                },
86                "attestation": {
87                    "report": {
88                        "report": {
89                            "id": "5246688123689513540899231107533660789",
90                            "timestamp": "2024-02-07T17:06:23.913745",
91                            "version": 4,
92                            "epidPseudonym": "+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=",
93                            "advisoryURL": "https://security-center.intel.com",
94                            "advisoryIDs": [
95                                "INTEL-SA-00161",
96                                "INTEL-SA-00219",
97                                "INTEL-SA-00289",
98                                "INTEL-SA-00334",
99                                "INTEL-SA-00615"
100                            ],
101                            "isvEnclaveQuoteStatus": "CONFIGURATION_AND_SW_HARDENING_NEEDED",
102                            "platformInfoBlob": "150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB0F08115F3DE71AE97980FE5E10B042054930ACE356C79EC44603D3F890756EC6ED73927A7C58CDE9AF1E754AEC77E335E8D80294407936BEB6404F27669FF7BB1",
103                            "isvEnclaveQuoteBody": "AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAOPC8qW4QNieBprK/8rbZRDvhmpz06nuVxAO1fhkbuS7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc8uUpEUEPvz8ZkFapjVh5WlWaLoAJM/f80T0EhGInHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRE7C+d+1dDWhoDsdyBrjVh+1AZ5txMhzN1UBeTVSmggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
104                        },
105                        "reportsig": "YcY4SPvkfR4P2E8A5huutCeS+vY/ir+xq6disalNfNtAcUyOIOqTPVXhAZgY1M5B47Hjj1oYWf2qC2w+dnj7VcZjzO9oR0pJYdA+A7jaVrNzH2eXA79yICkuU8WE/x58I0j5vjXLoHXahaKlpZkMeTphqBY8u+FTVSdP3cWPho4viPapTfQRuEWmYq4KIq2zSr6wLg3Pz+yQ+G3e9BASVkLYxdYGTDFH1pMmfas9SEI7V4I+j8DaXmL8bucSRakmcQdmDMPGiA7mvIhSAlprzCrdxM7CHeUC6MPLN1fmFFcc9kyO/ved69j/651MWC83GgxSJ15L80U+DQzmrSW8xg=="
106                    },
107                    "mr_enclave": "e3c2f2a5b840d89e069acaffcadb6510ef866a73d3a9ee57100ed5f8646ee4bb",
108                    "user_data": "9113b0be77ed5d0d68680ec77206b8d587ed40679b71321ccdd5405e4d54a6820000000000000000000000000000000000000000000000000000000000000000"
109                }
110            }"#,
111        );
112    }
113
114    fn session_create(deps: DepsMut<'_>) {
115        handle_msg::<RawExecuteMsg>(
116            deps,
117            r#"{
118                "session_create": {
119                    "msg": {
120                        "nonce": "425d87f8620e1dedeee70590cc55b164b8f01480ee59e0b1da35436a2f7c2777"
121                    },
122                    "attestation": {
123                        "report": {
124                            "report": {
125                                "id": "5246688123689513540899231107533660789",
126                                "timestamp": "2024-02-07T17:06:23.913745",
127                                "version": 4,
128                                "epidPseudonym": "+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=",
129                                "advisoryURL": "https://security-center.intel.com",
130                                "advisoryIDs": [
131                                    "INTEL-SA-00161",
132                                    "INTEL-SA-00219",
133                                    "INTEL-SA-00289",
134                                    "INTEL-SA-00334",
135                                    "INTEL-SA-00615"
136                                ],
137                                "isvEnclaveQuoteStatus": "CONFIGURATION_AND_SW_HARDENING_NEEDED",
138                                "platformInfoBlob": "150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB0F08115F3DE71AE97980FE5E10B042054930ACE356C79EC44603D3F890756EC6ED73927A7C58CDE9AF1E754AEC77E335E8D80294407936BEB6404F27669FF7BB1",
139                                "isvEnclaveQuoteBody": "AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAOPC8qW4QNieBprK/8rbZRDvhmpz06nuVxAO1fhkbuS7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc8uUpEUEPvz8ZkFapjVh5WlWaLoAJM/f80T0EhGInHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRE7C+d+1dDWhoDsdyBrjVh+1AZ5txMhzN1UBeTVSmggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
140                            },
141                            "reportsig": "YcY4SPvkfR4P2E8A5huutCeS+vY/ir+xq6disalNfNtAcUyOIOqTPVXhAZgY1M5B47Hjj1oYWf2qC2w+dnj7VcZjzO9oR0pJYdA+A7jaVrNzH2eXA79yICkuU8WE/x58I0j5vjXLoHXahaKlpZkMeTphqBY8u+FTVSdP3cWPho4viPapTfQRuEWmYq4KIq2zSr6wLg3Pz+yQ+G3e9BASVkLYxdYGTDFH1pMmfas9SEI7V4I+j8DaXmL8bucSRakmcQdmDMPGiA7mvIhSAlprzCrdxM7CHeUC6MPLN1fmFFcc9kyO/ved69j/651MWC83GgxSJ15L80U+DQzmrSW8xg=="
142                        },
143                        "mr_enclave": "e3c2f2a5b840d89e069acaffcadb6510ef866a73d3a9ee57100ed5f8646ee4bb",
144                        "user_data": "425d87f8620e1dedeee70590cc55b164b8f01480ee59e0b1da35436a2f7c27770000000000000000000000000000000000000000000000000000000000000000"
145                    }
146                }
147            }"#,
148        );
149    }
150
151    fn session_set_pub_key(deps: DepsMut<'_>) {
152        handle_msg::<RawExecuteMsg>(
153            deps,
154            r#"{
155                "session_set_pub_key": {
156                    "msg": {
157                        "nonce": "425d87f8620e1dedeee70590cc55b164b8f01480ee59e0b1da35436a2f7c2777"
158                        "pub_key": "03E67EF09213633074FB4FBF338643F4F0C574ED60EF11D03422EEB06FA38C8F3F"
159                    },
160                    "attestation": {
161                        "report": {
162                            "report": {
163                                "id": "5246688123689513540899231107533660789",
164                                "timestamp": "2024-02-07T17:06:23.913745",
165                                "version": 4,
166                                "epidPseudonym": "+CUyIi74LPqS6M0NF7YrSxLqPdX3MKs6D6LIPqRG/ZEB4WmxZVvxAJwdwg/0m9cYnUUQguLnJotthX645lAogfJgO8Xg5/91lSegwyUKvHmKgtjOHX/YTbVe/wmgWiBdaL+KmarY0Je459Px/FqGLWLsAF7egPAJRd1Xn88Znrs=",
167                                "advisoryURL": "https://security-center.intel.com",
168                                "advisoryIDs": [
169                                    "INTEL-SA-00161",
170                                    "INTEL-SA-00219",
171                                    "INTEL-SA-00289",
172                                    "INTEL-SA-00334",
173                                    "INTEL-SA-00615"
174                                ],
175                                "isvEnclaveQuoteStatus": "CONFIGURATION_AND_SW_HARDENING_NEEDED",
176                                "platformInfoBlob": "150200650000080000141402040180070000000000000000000D00000C000000020000000000000CB0F08115F3DE71AE97980FE5E10B042054930ACE356C79EC44603D3F890756EC6ED73927A7C58CDE9AF1E754AEC77E335E8D80294407936BEB6404F27669FF7BB1",
177                                "isvEnclaveQuoteBody": "AgABALAMAAAPAA8AAAAAAFHK9aSLRQ1iSu/jKG0xSJQAAAAAAAAAAAAAAAAAAAAAFBQCBwGAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAHAAAAAAAAAOPC8qW4QNieBprK/8rbZRDvhmpz06nuVxAO1fhkbuS7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc8uUpEUEPvz8ZkFapjVh5WlWaLoAJM/f80T0EhGInHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRE7C+d+1dDWhoDsdyBrjVh+1AZ5txMhzN1UBeTVSmggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
178                            },
179                            "reportsig": "YcY4SPvkfR4P2E8A5huutCeS+vY/ir+xq6disalNfNtAcUyOIOqTPVXhAZgY1M5B47Hjj1oYWf2qC2w+dnj7VcZjzO9oR0pJYdA+A7jaVrNzH2eXA79yICkuU8WE/x58I0j5vjXLoHXahaKlpZkMeTphqBY8u+FTVSdP3cWPho4viPapTfQRuEWmYq4KIq2zSr6wLg3Pz+yQ+G3e9BASVkLYxdYGTDFH1pMmfas9SEI7V4I+j8DaXmL8bucSRakmcQdmDMPGiA7mvIhSAlprzCrdxM7CHeUC6MPLN1fmFFcc9kyO/ved69j/651MWC83GgxSJ15L80U+DQzmrSW8xg=="
180                        },
181                        "mr_enclave": "e3c2f2a5b840d89e069acaffcadb6510ef866a73d3a9ee57100ed5f8646ee4bb",
182                        "user_data": "425d87f8620e1dedeee70590cc55b164b8f01480ee59e0b1da35436a2f7c27770000000000000000000000000000000000000000000000000000000000000000"
183                    }
184                }
185            }"#,
186        );
187    }
188
189    #[test]
190    #[ignore]
191    fn test_instantiate_handler() {
192        let mut deps = mock_dependencies();
193        instantiate(deps.as_mut());
194    }
195
196    #[test]
197    #[ignore]
198    fn test_session_create_handler() {
199        let mut deps = mock_dependencies();
200        instantiate(deps.as_mut());
201        session_create(deps.as_mut());
202        SESSION.load(&deps.storage).expect("Session not created");
203    }
204
205    #[test]
206    #[ignore]
207    fn test_session_set_pub_key_handler() {
208        let mut deps = mock_dependencies();
209        instantiate(deps.as_mut());
210        session_create(deps.as_mut());
211        session_set_pub_key(deps.as_mut());
212        SESSION.load(&deps.storage).expect("Session not created");
213        // TODO(hu55a1n1): check that nonce & pub_key match, etc.
214    }
215}