use std::time::{SystemTime, UNIX_EPOCH};
use abstract_interchain_tests::{
interchain_accounts::{create_test_remote_account, set_env},
JUNO, STARGAZE,
};
use abstract_interface::{Abstract, AbstractAccount, ProxyQueryFns};
use abstract_std::{ans_host::ExecuteMsgFns, objects::UncheckedChannelEntry, ICS20, PROXY};
use anyhow::Result as AnyResult;
use cosmwasm_std::coins;
use cw_orch::prelude::*;
use cw_orch_interchain::prelude::*;
use cw_orch_proto::tokenfactory::{create_denom, create_transfer_channel, get_denom, mint};
pub fn test_send_funds() -> AnyResult<()> {
env_logger::init();
set_env();
let rt: tokio::runtime::Runtime = tokio::runtime::Runtime::new().unwrap();
let starship = Starship::new(rt.handle(), None).unwrap();
let interchain = starship.interchain_env();
let juno = interchain.chain(JUNO).unwrap();
let stargaze = interchain.chain(STARGAZE).unwrap();
let abstr_stargaze: Abstract<Daemon> = Abstract::load_from(stargaze.clone())?;
let abstr_juno: Abstract<Daemon> = Abstract::load_from(juno.clone())?;
let sender = juno.sender().to_string();
let test_amount: u128 = 100_000_000_000;
let token_subdenom = format!(
"testtoken{}",
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs()
);
create_denom(&juno, token_subdenom.as_str())?;
mint(&juno, sender.as_str(), token_subdenom.as_str(), test_amount)?;
let interchain_channel = create_transfer_channel(JUNO, STARGAZE, &interchain)?;
abstr_stargaze.ans_host.update_channels(
vec![(
UncheckedChannelEntry {
connected_chain: "juno".to_string(),
protocol: ICS20.to_string(),
},
interchain_channel
.get_chain(STARGAZE)?
.channel
.unwrap()
.to_string(),
)],
vec![],
)?;
let (origin_account, remote_account_id) =
create_test_remote_account(&abstr_stargaze, STARGAZE, JUNO, &interchain, None)?;
let remote_account = AbstractAccount::new(&abstr_stargaze, remote_account_id.clone());
let client = remote_account.proxy.config()?;
log::info!("client adddress {:?}", client);
let send_funds_tx = origin_account.manager.execute_on_module(
PROXY,
abstract_std::proxy::ExecuteMsg::IbcAction {
msg: abstract_std::ibc_client::ExecuteMsg::SendFunds {
host_chain: "juno".into(),
funds: coins(test_amount, get_denom(&stargaze, token_subdenom.as_str())),
},
},
)?;
interchain.check_ibc(STARGAZE, send_funds_tx)?;
let remote_account_config = abstr_juno
.version_control
.get_account(remote_account_id.clone())?;
let balance = juno
.bank_querier()
.balance(remote_account_config.proxy, None)?;
log::info!("juno balance, {:?}", balance);
Ok(())
}
pub fn main() {
test_send_funds().unwrap();
}