1use cosmwasm_schema::QueryResponses;
11use cosmwasm_std::{Addr, Empty};
12use serde::Serialize;
13
14use crate::{
15 base::{
16 ExecuteMsg as MiddlewareExecMsg, InstantiateMsg as MiddlewareInstantiateMsg,
17 QueryMsg as MiddlewareQueryMsg,
18 },
19 objects::module_version::ModuleDataResponse,
20};
21
22pub type ExecuteMsg<Request = Empty, ReceiveMsg = Empty> =
23 MiddlewareExecMsg<BaseExecuteMsg, AdapterRequestMsg<Request>, ReceiveMsg>;
24pub type QueryMsg<ModuleMsg = Empty> = MiddlewareQueryMsg<BaseQueryMsg, ModuleMsg>;
25pub type InstantiateMsg<ModuleMsg = Empty> =
26 MiddlewareInstantiateMsg<BaseInstantiateMsg, ModuleMsg>;
27
28pub trait AdapterExecuteMsg: Serialize {}
32
33impl<T: AdapterExecuteMsg, R: Serialize> From<T> for ExecuteMsg<T, R> {
34 fn from(adapter_msg: T) -> Self {
35 Self::Module(AdapterRequestMsg {
36 proxy_address: None,
37 request: adapter_msg,
38 })
39 }
40}
41
42impl AdapterExecuteMsg for Empty {}
43
44pub trait AdapterQueryMsg: Serialize {}
48
49impl<T: AdapterQueryMsg> From<T> for QueryMsg<T> {
50 fn from(app: T) -> Self {
51 Self::Module(app)
52 }
53}
54
55impl AdapterQueryMsg for Empty {}
56
57#[cosmwasm_schema::cw_serde]
60pub struct BaseInstantiateMsg {
61 pub ans_host_address: String,
63 pub version_control_address: String,
65}
66
67impl<RequestMsg, ReceiveMsg> From<BaseExecuteMsg>
68 for MiddlewareExecMsg<BaseExecuteMsg, RequestMsg, ReceiveMsg>
69{
70 fn from(adapter_msg: BaseExecuteMsg) -> Self {
71 Self::Base(adapter_msg)
72 }
73}
74
75impl<RequestMsg, Request, BaseExecMsg> From<AdapterRequestMsg<RequestMsg>>
76 for MiddlewareExecMsg<BaseExecMsg, AdapterRequestMsg<RequestMsg>, Request>
77{
78 fn from(request_msg: AdapterRequestMsg<RequestMsg>) -> Self {
79 Self::Module(request_msg)
80 }
81}
82
83#[cosmwasm_schema::cw_serde]
86pub struct AdapterRequestMsg<Request> {
87 pub proxy_address: Option<String>,
88 pub request: Request,
90}
91
92impl<Request: Serialize> AdapterRequestMsg<Request> {
93 pub fn new(proxy_address: Option<String>, request: Request) -> Self {
94 Self {
95 proxy_address,
96 request,
97 }
98 }
99}
100
101#[cosmwasm_schema::cw_serde]
103pub struct BaseExecuteMsg {
104 pub proxy_address: Option<String>,
108 pub msg: AdapterBaseMsg,
110}
111
112#[cosmwasm_schema::cw_serde]
114pub enum AdapterBaseMsg {
115 UpdateAuthorizedAddresses {
118 to_add: Vec<String>,
119 to_remove: Vec<String>,
120 },
121}
122
123#[cosmwasm_schema::cw_serde]
125#[derive(QueryResponses)]
126#[cfg_attr(feature = "interface", derive(cw_orch::QueryFns))]
127#[cfg_attr(feature = "interface", impl_into(QueryMsg<ModuleMsg>))]
128pub enum BaseQueryMsg {
129 #[returns(AdapterConfigResponse)]
131 BaseConfig {},
132 #[returns(AuthorizedAddressesResponse)]
134 AuthorizedAddresses { proxy_address: String },
135 #[returns(ModuleDataResponse)]
138 ModuleData {},
139}
140
141impl<T> From<BaseQueryMsg> for QueryMsg<T> {
142 fn from(base: BaseQueryMsg) -> Self {
143 Self::Base(base)
144 }
145}
146
147#[cosmwasm_schema::cw_serde]
148pub struct AdapterConfigResponse {
149 pub version_control_address: Addr,
150 pub ans_host_address: Addr,
151 pub dependencies: Vec<String>,
152}
153
154#[cosmwasm_schema::cw_serde]
155pub struct AuthorizedAddressesResponse {
156 pub addresses: Vec<Addr>,
158}