use crate::{
endpoints::reply::RECEIVE_DISPATCH_ID,
host_commands::PACKET_LIFETIME,
state::{ContractError, RESULTS},
Host, HostError,
};
use abstract_sdk::{
core::{
abstract_ica::{BalancesResponse, DispatchResponse, SendAllBackResponse, StdAck},
objects::ChannelEntry,
ICS20,
},
features::AbstractNameService,
};
use cosmwasm_std::{
wasm_execute, CosmosMsg, Deps, DepsMut, Empty, Env, IbcMsg, IbcReceiveResponse, SubMsg,
};
impl<
Error: ContractError,
CustomInitMsg,
CustomExecMsg,
CustomQueryMsg,
CustomMigrateMsg,
ReceiveMsg,
SudoMsg,
>
Host<Error, CustomInitMsg, CustomExecMsg, CustomQueryMsg, CustomMigrateMsg, ReceiveMsg, SudoMsg>
{
pub fn receive_balances(&self, deps: DepsMut) -> Result<IbcReceiveResponse, HostError> {
let account = self.proxy_address.as_ref().unwrap();
let balances = deps.querier.query_all_balances(account)?;
let response = BalancesResponse {
account: account.into(),
balances,
};
let acknowledgement = StdAck::success(&response);
Ok(IbcReceiveResponse::new()
.set_ack(acknowledgement)
.add_attribute("action", "receive_balances"))
}
pub fn receive_dispatch(
&self,
deps: DepsMut,
msgs: Vec<CosmosMsg>,
) -> Result<IbcReceiveResponse, HostError> {
let reflect_addr = self.proxy_address.as_ref().unwrap();
let response = DispatchResponse { results: vec![] };
let acknowledgement = StdAck::success(&response);
let reflect_msg = cw1_whitelist::msg::ExecuteMsg::Execute { msgs };
let wasm_msg = wasm_execute(reflect_addr, &reflect_msg, vec![])?;
let msg = SubMsg::reply_on_success(wasm_msg, RECEIVE_DISPATCH_ID);
RESULTS.save(deps.storage, &vec![])?;
Ok(IbcReceiveResponse::new()
.set_ack(acknowledgement)
.add_submessage(msg)
.add_attribute("action", "receive_dispatch"))
}
pub fn receive_send_all_back(
&self,
deps: DepsMut,
env: Env,
client_proxy_address: String,
client_chain: String,
) -> Result<IbcReceiveResponse, HostError> {
let response = SendAllBackResponse {};
let acknowledgement = StdAck::success(&response);
let wasm_msg =
self.send_all_back(deps.as_ref(), env, client_proxy_address, client_chain)?;
RESULTS.save(deps.storage, &vec![])?;
Ok(IbcReceiveResponse::new()
.set_ack(acknowledgement)
.add_message(wasm_msg)
.add_attribute("action", "receive_dispatch"))
}
pub fn send_all_back(
&self,
deps: Deps,
env: Env,
client_proxy_address: String,
client_chain: String,
) -> Result<CosmosMsg, HostError> {
let ans = self.name_service(deps);
let ics20_channel_entry = ChannelEntry {
connected_chain: client_chain,
protocol: ICS20.to_string(),
};
let ics20_channel_id = ans.query(&ics20_channel_entry)?;
let reflect_addr = self.proxy_address.as_ref().unwrap();
let coins = deps.querier.query_all_balances(reflect_addr)?;
let mut msgs: Vec<CosmosMsg> = vec![];
for coin in coins {
msgs.push(
IbcMsg::Transfer {
channel_id: ics20_channel_id.clone(),
to_address: client_proxy_address.to_string(),
amount: coin,
timeout: env.block.time.plus_seconds(PACKET_LIFETIME).into(),
}
.into(),
)
}
let reflect_msg = cw1_whitelist::msg::ExecuteMsg::Execute { msgs };
let wasm_msg: CosmosMsg<Empty> = wasm_execute(reflect_addr, &reflect_msg, vec![])?.into();
Ok(wasm_msg)
}
}