use cosmwasm_schema::QueryResponses;
use cosmwasm_std::{Addr, Empty};
use serde::Serialize;
use crate::{
base::{
ExecuteMsg as MiddlewareExecMsg, InstantiateMsg as MiddlewareInstantiateMsg,
QueryMsg as MiddlewareQueryMsg,
},
objects::module_version::ModuleDataResponse,
};
pub type ExecuteMsg<Request = Empty> =
MiddlewareExecMsg<BaseExecuteMsg, AdapterRequestMsg<Request>>;
pub type QueryMsg<ModuleMsg = Empty> = MiddlewareQueryMsg<BaseQueryMsg, ModuleMsg>;
pub type InstantiateMsg<ModuleMsg = Empty> =
MiddlewareInstantiateMsg<BaseInstantiateMsg, ModuleMsg>;
pub trait AdapterExecuteMsg: Serialize {}
impl<T: AdapterExecuteMsg> From<T> for ExecuteMsg<T> {
fn from(request: T) -> Self {
Self::Module(AdapterRequestMsg {
account_address: None,
request,
})
}
}
impl AdapterExecuteMsg for Empty {}
pub trait AdapterQueryMsg: Serialize {}
impl<T: AdapterQueryMsg> From<T> for QueryMsg<T> {
fn from(module: T) -> Self {
Self::Module(module)
}
}
impl AdapterQueryMsg for Empty {}
#[cosmwasm_schema::cw_serde]
pub struct BaseInstantiateMsg {
pub registry_address: String,
}
impl<RequestMsg> From<BaseExecuteMsg> for MiddlewareExecMsg<BaseExecuteMsg, RequestMsg> {
fn from(adapter_msg: BaseExecuteMsg) -> Self {
Self::Base(adapter_msg)
}
}
impl<RequestMsg, BaseExecMsg> From<AdapterRequestMsg<RequestMsg>>
for MiddlewareExecMsg<BaseExecMsg, AdapterRequestMsg<RequestMsg>>
{
fn from(request_msg: AdapterRequestMsg<RequestMsg>) -> Self {
Self::Module(request_msg)
}
}
#[cosmwasm_schema::cw_serde]
pub struct AdapterRequestMsg<Request> {
pub account_address: Option<String>,
pub request: Request,
}
impl<Request: Serialize> AdapterRequestMsg<Request> {
pub fn new(account_address: Option<String>, request: Request) -> Self {
Self {
account_address,
request,
}
}
}
#[cosmwasm_schema::cw_serde]
pub struct BaseExecuteMsg {
pub account_address: Option<String>,
pub msg: AdapterBaseMsg,
}
#[cosmwasm_schema::cw_serde]
pub enum AdapterBaseMsg {
UpdateAuthorizedAddresses {
to_add: Vec<String>,
to_remove: Vec<String>,
},
}
#[cosmwasm_schema::cw_serde]
#[derive(QueryResponses, cw_orch::QueryFns)]
pub enum BaseQueryMsg {
#[returns(AdapterConfigResponse)]
BaseConfig {},
#[returns(AuthorizedAddressesResponse)]
AuthorizedAddresses { account_address: String },
#[returns(ModuleDataResponse)]
ModuleData {},
}
impl<T> From<BaseQueryMsg> for QueryMsg<T> {
fn from(base: BaseQueryMsg) -> Self {
Self::Base(base)
}
}
#[cosmwasm_schema::cw_serde]
pub struct AdapterConfigResponse {
pub registry_address: Addr,
pub ans_host_address: Addr,
pub dependencies: Vec<String>,
}
#[cosmwasm_schema::cw_serde]
pub struct AuthorizedAddressesResponse {
pub addresses: Vec<Addr>,
}
#[cosmwasm_schema::cw_serde]
pub struct AdapterState {
pub code_id: u64,
}