use crate::base::{
ExecuteMsg as MiddlewareExecMsg, InstantiateMsg as MiddlewareInstantiateMsg,
QueryMsg as MiddlewareQueryMsg,
};
use cosmwasm_schema::QueryResponses;
use cosmwasm_std::{Addr, Empty};
use serde::Serialize;
pub type ExecuteMsg<Request = Empty, ReceiveMsg = Empty> =
MiddlewareExecMsg<BaseExecuteMsg, AdapterRequestMsg<Request>, ReceiveMsg>;
pub type QueryMsg<ModuleMsg = Empty> = MiddlewareQueryMsg<BaseQueryMsg, ModuleMsg>;
pub type InstantiateMsg<ModuleMsg = Empty> =
MiddlewareInstantiateMsg<BaseInstantiateMsg, ModuleMsg>;
pub trait AdapterExecuteMsg: Serialize {}
impl<T: AdapterExecuteMsg, R: Serialize> From<T> for ExecuteMsg<T, R> {
fn from(adapter_msg: T) -> Self {
Self::Module(AdapterRequestMsg {
proxy_address: None,
request: adapter_msg,
})
}
}
impl AdapterExecuteMsg for Empty {}
pub trait AdapterQueryMsg: Serialize {}
impl<T: AdapterQueryMsg> From<T> for QueryMsg<T> {
fn from(app: T) -> Self {
Self::Module(app)
}
}
impl AdapterQueryMsg for Empty {}
#[cosmwasm_schema::cw_serde]
pub struct BaseInstantiateMsg {
pub ans_host_address: String,
pub version_control_address: String,
}
impl<RequestMsg, ReceiveMsg> From<BaseExecuteMsg>
for MiddlewareExecMsg<BaseExecuteMsg, RequestMsg, ReceiveMsg>
{
fn from(adapter_msg: BaseExecuteMsg) -> Self {
Self::Base(adapter_msg)
}
}
impl<RequestMsg, Request, BaseExecMsg> From<AdapterRequestMsg<RequestMsg>>
for MiddlewareExecMsg<BaseExecMsg, AdapterRequestMsg<RequestMsg>, Request>
{
fn from(request_msg: AdapterRequestMsg<RequestMsg>) -> Self {
Self::Module(request_msg)
}
}
#[cosmwasm_schema::cw_serde]
pub struct AdapterRequestMsg<Request> {
pub proxy_address: Option<String>,
pub request: Request,
}
impl<Request: Serialize> AdapterRequestMsg<Request> {
pub fn new(proxy_address: Option<String>, request: Request) -> Self {
Self {
proxy_address,
request,
}
}
}
#[cosmwasm_schema::cw_serde]
#[cfg_attr(feature = "interface", derive(cw_orch::ExecuteFns))]
#[cfg_attr(feature = "interface", impl_into(ExecuteMsg<T>))]
pub enum BaseExecuteMsg {
UpdateAuthorizedAddresses {
to_add: Vec<String>,
to_remove: Vec<String>,
},
Remove {},
}
#[cosmwasm_schema::cw_serde]
#[derive(QueryResponses)]
#[cfg_attr(feature = "interface", derive(cw_orch::QueryFns))]
#[cfg_attr(feature = "interface", impl_into(QueryMsg<ModuleMsg>))]
pub enum BaseQueryMsg {
#[returns(AdapterConfigResponse)]
Config {},
#[returns(AuthorizedAddressesResponse)]
AuthorizedAddresses { proxy_address: String },
}
impl<T> From<BaseQueryMsg> for QueryMsg<T> {
fn from(base: BaseQueryMsg) -> Self {
Self::Base(base)
}
}
#[cosmwasm_schema::cw_serde]
pub struct AdapterConfigResponse {
pub version_control_address: Addr,
pub ans_host_address: Addr,
pub dependencies: Vec<String>,
}
#[cosmwasm_schema::cw_serde]
pub struct AuthorizedAddressesResponse {
pub addresses: Vec<Addr>,
}