use std::time::{SystemTime, UNIX_EPOCH};
use abstract_interchain_tests::{JUNO, STARGAZE};
use anyhow::Result as AnyResult;
use cosmwasm_std::{coin, Uint128};
use cw_orch::prelude::queriers::Ibc;
use cw_orch::prelude::*;
use cw_orch_interchain::prelude::*;
use cw_orch_proto::tokenfactory::{
create_denom, create_transfer_channel, get_denom, mint, transfer_tokens,
};
use ibc_relayer_types::core::ics24_host::identifier::PortId;
pub fn token_bridge() -> AnyResult<()> {
env_logger::init();
let rt: tokio::runtime::Runtime = tokio::runtime::Runtime::new().unwrap();
let interchain = Starship::new(rt.handle(), None)?.interchain_env();
let juno = interchain.chain(JUNO).unwrap();
let stargaze = interchain.chain(STARGAZE).unwrap();
let sender = juno.sender().to_string();
let receiver = stargaze.sender().to_string();
let test_amount: u128 = 100_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)?;
transfer_tokens(
&juno,
receiver.as_str(),
&coin(test_amount, get_denom(&juno, token_subdenom.as_str())),
&interchain,
&interchain_channel,
None,
None,
)
.unwrap()
.into_result()
.unwrap();
let trace = format!(
"{}/{}/{}",
PortId::transfer(),
interchain_channel
.get_chain(STARGAZE)
.unwrap()
.channel
.unwrap(),
get_denom(&juno, token_subdenom.as_str())
);
let ibc: Ibc = stargaze.querier();
let hash = rt.block_on(ibc._denom_hash(trace)).unwrap();
let denom = format!("ibc/{}", hash);
let balance = stargaze
.bank_querier()
.balance(stargaze.sender().to_string(), Some(denom.clone()))
.unwrap();
assert_eq!(balance[0].amount, Uint128::from(test_amount));
transfer_tokens(
&stargaze,
sender.as_str(),
&coin(test_amount, denom.clone()),
&interchain,
&interchain_channel,
None,
None,
)
.unwrap()
.into_result()
.unwrap();
let balance = stargaze
.bank_querier()
.balance(stargaze.sender().to_string(), Some(denom.clone()))
.unwrap();
assert_eq!(balance[0].amount, Uint128::zero());
Ok(())
}
pub fn main() {
token_bridge().unwrap()
}