hpl_interface/hook/
merkle.rs

1use cosmwasm_schema::{cw_serde, QueryResponses};
2use cosmwasm_std::HexBinary;
3
4use super::{HookQueryMsg, PostDispatchMsg};
5
6pub const TREE_DEPTH: usize = 32;
7
8#[cw_serde]
9pub struct InstantiateMsg {
10    pub mailbox: String,
11}
12
13#[cw_serde]
14pub enum ExecuteMsg {
15    PostDispatch(PostDispatchMsg),
16}
17
18#[cw_serde]
19#[derive(QueryResponses)]
20#[query_responses(nested)]
21pub enum QueryMsg {
22    Hook(HookQueryMsg),
23    MerkleHook(MerkleHookQueryMsg),
24}
25
26#[cw_serde]
27#[derive(QueryResponses)]
28pub enum MerkleHookQueryMsg {
29    #[returns(CountResponse)]
30    Count {},
31
32    #[returns(RootResponse)]
33    Root {},
34
35    #[returns(BranchResponse)]
36    Branch {},
37
38    #[returns(TreeResponse)]
39    Tree {},
40
41    #[returns(CheckPointResponse)]
42    CheckPoint {},
43}
44
45#[cw_serde]
46pub struct CountResponse {
47    pub count: u32,
48}
49
50#[cw_serde]
51pub struct RootResponse {
52    pub root: HexBinary,
53}
54
55#[cw_serde]
56pub struct BranchResponse {
57    pub branch: [HexBinary; TREE_DEPTH],
58}
59
60#[cw_serde]
61pub struct TreeResponse {
62    pub branch: [HexBinary; TREE_DEPTH],
63    pub count: u32,
64}
65
66#[cw_serde]
67pub struct CheckPointResponse {
68    pub root: HexBinary,
69    pub count: u32,
70}
71
72#[cfg(test)]
73mod test {
74    use super::*;
75    use crate::{
76        hook::{ExpectedHookQueryMsg, PostDispatchMsg, QuoteDispatchMsg},
77        msg_checker,
78    };
79
80    #[test]
81    fn test_hook_interface() {
82        let _checked: ExecuteMsg = msg_checker(
83            PostDispatchMsg {
84                metadata: HexBinary::default(),
85                message: HexBinary::default(),
86            }
87            .wrap(),
88        );
89
90        let _checked: QueryMsg = msg_checker(ExpectedHookQueryMsg::Hook(HookQueryMsg::Mailbox {}));
91        let _checked: QueryMsg = msg_checker(
92            QuoteDispatchMsg {
93                metadata: HexBinary::default(),
94                message: HexBinary::default(),
95            }
96            .request(),
97        );
98    }
99}