1pub mod aggregate;
2pub mod multisig;
3pub mod routing;
4pub mod pausable;
5
6use cosmwasm_schema::{cw_serde, QueryResponses};
7use cosmwasm_std::{Addr, CustomQuery, HexBinary, QuerierWrapper, StdResult};
8
9#[cw_serde]
10#[repr(u32)]
11pub enum IsmType {
12 Unused = 0,
13 Routing = 1,
14 Aggregation = 2,
15 LegacyMultisig = 3,
16 MerkleRootMultisig = 4,
17 MessageIdMultisig = 5,
18 Null = 6, CcipRead = 7,
20}
21
22#[cw_serde]
23#[derive(QueryResponses)]
24pub enum IsmQueryMsg {
25 #[returns(ModuleTypeResponse)]
26 ModuleType {},
27
28 #[returns(VerifyResponse)]
29 Verify {
30 metadata: HexBinary,
31 message: HexBinary,
32 },
33
34 #[returns(VerifyInfoResponse)]
35 VerifyInfo { message: HexBinary },
36}
37
38impl IsmQueryMsg {
39 pub fn wrap(self) -> ExpectedIsmQueryMsg {
40 ExpectedIsmQueryMsg::Ism(self)
41 }
42}
43
44#[cw_serde]
45#[derive(QueryResponses)]
46#[query_responses(nested)]
47pub enum ExpectedIsmQueryMsg {
48 Ism(IsmQueryMsg),
49}
50
51#[cw_serde]
52#[derive(QueryResponses)]
53#[query_responses(nested)]
54pub enum ExpectedIsmSpecifierQueryMsg {
55 IsmSpecifier(IsmSpecifierQueryMsg),
56}
57
58#[cw_serde]
59#[derive(QueryResponses)]
60pub enum IsmSpecifierQueryMsg {
61 #[returns(InterchainSecurityModuleResponse)]
62 InterchainSecurityModule(),
63}
64
65impl IsmSpecifierQueryMsg {
66 pub fn wrap(self) -> ExpectedIsmSpecifierQueryMsg {
67 ExpectedIsmSpecifierQueryMsg::IsmSpecifier(self)
68 }
69}
70
71#[cw_serde]
72pub struct ModuleTypeResponse {
73 #[serde(rename = "type")]
74 pub typ: IsmType,
75}
76
77#[cw_serde]
78pub struct VerifyResponse {
79 pub verified: bool,
80}
81
82#[cw_serde]
83pub struct VerifyInfoResponse {
84 pub threshold: u8,
85 pub validators: Vec<HexBinary>,
86}
87
88#[cw_serde]
89pub struct InterchainSecurityModuleResponse {
90 pub ism: Option<Addr>,
91}
92
93pub fn recipient<C: CustomQuery>(
94 querier: &QuerierWrapper<C>,
95 recipient: impl Into<String>,
96) -> StdResult<Option<Addr>> {
97 let res = querier.query_wasm_smart::<InterchainSecurityModuleResponse>(
98 recipient,
99 &IsmSpecifierQueryMsg::InterchainSecurityModule().wrap(),
100 )?;
101
102 Ok(res.ism)
103}
104
105pub fn verify<C: CustomQuery>(
106 querier: &QuerierWrapper<C>,
107 ism: impl Into<String>,
108 metadata: HexBinary,
109 message: HexBinary,
110) -> StdResult<bool> {
111 let verify_resp = querier.query_wasm_smart::<VerifyResponse>(
112 ism,
113 &IsmQueryMsg::Verify { metadata, message }.wrap(),
114 )?;
115
116 Ok(verify_resp.verified)
117}