use crate::{
base::{
ExecuteMsg as MiddlewareExecMsg, InstantiateMsg as MiddlewareInstantiateMsg,
MigrateMsg as MiddlewareMigrateMsg, QueryMsg as MiddlewareQueryMsg,
},
ibc_client::CallbackInfo,
objects::account::AccountId,
};
use cosmwasm_schema::QueryResponses;
use cosmwasm_std::{Addr, Binary, CosmosMsg, Empty, QueryRequest};
pub type ExecuteMsg<T, R = Empty> = MiddlewareExecMsg<BaseExecuteMsg, T, R>;
pub type QueryMsg<T = Empty> = MiddlewareQueryMsg<BaseQueryMsg, T>;
pub type InstantiateMsg<T = Empty> = MiddlewareInstantiateMsg<BaseInstantiateMsg, T>;
pub type MigrateMsg<T = Empty> = MiddlewareMigrateMsg<BaseMigrateMsg, T>;
#[cosmwasm_schema::cw_serde]
pub struct BaseInstantiateMsg {
pub ans_host_address: String,
pub cw1_code_id: u64,
}
#[cosmwasm_schema::cw_serde]
pub struct BaseMigrateMsg {}
#[cosmwasm_schema::cw_serde]
pub enum InternalAction {
Register { account_proxy_address: String },
WhoAmI,
}
#[cosmwasm_schema::cw_serde]
pub enum HostAction {
App {
msg: Binary,
},
Dispatch {
msgs: Vec<CosmosMsg<Empty>>,
},
Query {
msgs: Vec<QueryRequest<Empty>>,
},
SendAllBack {},
Balances {},
Internal(InternalAction),
}
impl HostAction {
pub fn into_packet(
self,
account_id: AccountId,
retries: u8,
client_chain: String,
callback_info: Option<CallbackInfo>,
) -> PacketMsg {
PacketMsg {
client_chain,
retries,
callback_info,
account_id,
action: self,
}
}
}
#[cosmwasm_schema::cw_serde]
pub struct PacketMsg {
pub client_chain: String,
pub retries: u8,
pub account_id: AccountId,
pub callback_info: Option<CallbackInfo>,
pub action: HostAction,
}
#[cosmwasm_schema::cw_serde]
pub enum BaseExecuteMsg {
UpdateAdmin { admin: String },
UpdateConfig {
ans_host_address: Option<String>,
cw1_code_id: Option<u64>,
},
RecoverAccount {
closed_channel: String,
account_id: AccountId,
msgs: Vec<CosmosMsg>,
},
}
#[cosmwasm_schema::cw_serde]
#[derive(QueryResponses)]
pub enum BaseQueryMsg {
#[returns(HostConfigResponse)]
Config {},
#[returns(AccountResponse)]
Account {
client_chain: String,
account_id: AccountId,
},
#[returns(ListAccountsResponse)]
ListAccounts {},
}
#[cosmwasm_schema::cw_serde]
pub struct HostConfigResponse {
pub ans_host_address: Addr,
}
#[cosmwasm_schema::cw_serde]
pub struct AccountResponse {
pub account: Option<String>,
}
#[cosmwasm_schema::cw_serde]
pub struct ListAccountsResponse {
pub accounts: Vec<AccountInfo>,
}
#[cosmwasm_schema::cw_serde]
pub struct AccountInfo {
pub account_id: AccountId,
pub account: String,
pub channel_id: String,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::objects::account::TEST_ACCOUNT_ID;
use speculoos::prelude::*;
#[test]
fn test_into_packet() {
let host_action = HostAction::SendAllBack {};
let retries = 5u8;
let client_chain = String::from("test_client_chain");
let callback_info = Some(CallbackInfo {
id: "15".to_string(),
receiver: "receiver".to_string(),
});
let packet_msg = host_action.clone().into_packet(
TEST_ACCOUNT_ID,
retries,
client_chain.clone(),
callback_info.clone(),
);
assert_that!(packet_msg.client_chain).is_equal_to(client_chain);
assert_that!(packet_msg.retries).is_equal_to(retries);
assert_that!(packet_msg.callback_info).is_equal_to(callback_info);
assert_that!(packet_msg.account_id).is_equal_to(TEST_ACCOUNT_ID);
assert_that!(packet_msg.action).is_equal_to(host_action);
}
}