use super::harness::TestHarness;
use evmlib::testnet::Testnet;
use evmlib::wallet::Wallet;
use serial_test::serial;
use std::time::Duration;
use tokio::time::sleep;
use tracing::info;
struct PaymentTestEnv {
harness: TestHarness,
testnet: Testnet,
}
impl PaymentTestEnv {
async fn teardown(self) -> Result<(), Box<dyn std::error::Error>> {
self.harness.teardown().await?;
Ok(())
}
fn create_funded_wallet(&self) -> Result<Wallet, Box<dyn std::error::Error>> {
let network = self.testnet.to_network();
let private_key = self.testnet.default_wallet_private_key()?;
let wallet = Wallet::new_from_private_key(network, &private_key)?;
info!("Created funded wallet: {}", wallet.address());
Ok(wallet)
}
}
async fn init_testnet_and_evm() -> Result<PaymentTestEnv, Box<dyn std::error::Error>> {
info!("Initializing payment test environment");
let testnet = Testnet::new().await?;
let network = testnet.to_network();
info!("Anvil testnet started");
let config = super::testnet::TestNetworkConfig::small()
.with_payment_enforcement()
.with_evm_network(network);
let harness = TestHarness::setup_with_config(config).await?;
info!("10-node test network started with payment enforcement ENABLED");
sleep(Duration::from_secs(10)).await;
let total_connections = harness.total_connections().await;
info!("Network stabilized with {total_connections} total connections");
harness.warmup_dht().await?;
sleep(Duration::from_secs(5)).await;
info!("Payment test environment ready");
Ok(PaymentTestEnv { harness, testnet })
}
#[cfg(test)]
mod helper_tests {
use super::*;
#[tokio::test]
#[serial]
async fn test_init_testnet_and_evm() -> Result<(), Box<dyn std::error::Error>> {
let env = init_testnet_and_evm().await?;
let wallet = env.create_funded_wallet()?;
assert!(!wallet.address().to_string().is_empty());
assert!(env.harness.node(0).is_some(), "Node 0 should exist");
env.teardown().await?;
Ok(())
}
}