#[cfg(feature = "evm")]
use icp::http_outcalls::handle_http_outcalls;
#[cfg(feature = "evm")]
use std::sync::Arc;
#[cfg(feature = "evm")]
use tokio::task;
use candid::{decode_one, encode_one, CandidType};
use serde::Deserialize;
mod icp;
#[cfg(feature = "evm")]
mod evm;
#[cfg(feature = "evm")]
pub use crate::evm::{Evm, EvmUser};
pub use crate::{
icp::caller::{CallBuilder, CallError, CallMode, Caller},
icp::deployer::{DeployBuilder, DeployError, DeployMode, Deployer},
icp::user::IcpUser,
icp::Icp,
};
pub struct IcpTest {
pub icp: Icp,
#[cfg(feature = "evm")]
pub evm: Evm,
}
impl IcpTest {
pub async fn new() -> Self {
let result = Self {
icp: Icp::new().await,
#[cfg(feature = "evm")]
evm: Evm::new(),
};
#[cfg(feature = "evm")]
{
let pic = Arc::downgrade(&result.icp.pic);
let urls: Vec<String> = vec![
"127.0.0.1:8545",
"localhost:8545",
"eth.llamarpc.com",
"sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001",
"rpc.holesky.ethpandaops.io",
"rpc.hoodi.ethpandaops.io",
"mainnet.optimism.io",
"sepolia.optimism.io",
"arb1.arbitrum.io/rpc",
"sepolia-rollup.arbitrum.io/rpc",
"nova.arbitrum.io/rpc",
"polygon-rpc.com",
"rpc-amoy.polygon.technology",
"api.avax.network/ext/bc/C/rpc",
"api.avax-test.network/ext/bc/C/rpc",
"bsc-dataseed1.binance.org",
"rpc.ankr.com/bsc_testnet_chapel",
"rpc.gnosischain.com",
"rpc.api.moonbeam.network",
"rpc.api.moonriver.moonbeam.network",
"rpc.testnet.moonbeam.network",
"sepolia.base.org",
"mainnet.base.org",
"sepolia.blast.io",
"rpc.blast.io",
"rpc.ankr.com/fantom",
"rpc.ankr.com/fantom_testnet",
"rpc.frax.com",
"rpc.testnet.frax.com",
"bartio.rpc.berachain.com",
"flare-api.flare.network/ext/C/rpc",
"coston2-api.flare.network/ext/C/rpc",
"mode.drpc.org",
"sepolia.mode.network",
"zora.drpc.org",
"sepolia.rpc.zora.energy",
"racemainnet.io",
"metall2.drpc.org",
"testnet.rpc.metall2.com",
"rpc.zero.thebinaryholdings.com",
"rpc.orderly.network",
"testnet-rpc.orderly.org",
]
.into_iter()
.map(String::from)
.collect();
task::spawn(handle_http_outcalls(pic, result.evm.rpc_url(), urls));
}
result
}
pub async fn tick(&self) {
self.icp.tick().await;
#[cfg(feature = "evm")]
self.evm.mine_block().await;
}
}
pub fn convert<F, T>(value: F) -> T
where
F: CandidType,
T: for<'a> Deserialize<'a> + CandidType,
{
decode_one(&encode_one(&value).unwrap()).unwrap()
}