hpl_interface/ism/
mod.rs

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, // used with relayer carrying no metadata
19    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}