use color_eyre::Result;
use autonomi::client::{payment::PaymentOption, Client};
use autonomi::TransactionConfig;
use autonomi::{Network, Wallet};
use crate::token::{Rate, ShowCost};
#[derive(Clone)]
pub struct ApiControl {
pub tries: u32,
pub use_public_archive: bool,
pub upload_file_by_file: bool,
pub ignore_pointers: Option<bool>,
pub show_dweb_costs: ShowCost,
pub max_fee_per_gas: Option<u128>,
}
impl Default for ApiControl {
fn default() -> Self {
ApiControl {
tries: 1,
use_public_archive: false,
upload_file_by_file: false,
ignore_pointers: None,
show_dweb_costs: ShowCost::Both,
max_fee_per_gas: None,
}
}
}
#[derive(Clone)]
pub struct DwebClient {
pub client: Client,
pub network: Network,
pub is_local: bool,
pub wallet: Wallet,
pub api_control: ApiControl,
pub ant_rate: Option<Rate>,
pub eth_rate: Option<Rate>,
}
impl DwebClient {
pub async fn initialise_and_connect(
local_network: bool,
alpha_network: bool,
api_control: ApiControl,
) -> Result<DwebClient> {
println!("Dweb Autonomi client initialising...");
let client = if local_network {
Client::init_local().await?
} else if alpha_network {
Client::init_alpha().await?
} else {
Client::init().await?
};
let mut wallet = match crate::autonomi::wallet::load_wallet(&client.evm_network()) {
Ok(wallet) => wallet,
Err(_e) => {
let client = client.clone();
println!("Failed to load wallet for payments - client will only have read accesss to Autonomi");
Wallet::new_with_random_wallet(client.evm_network().clone())
}
};
if let Some(max_fee_per_gas) = api_control.max_fee_per_gas {
wallet.set_transaction_config(TransactionConfig::new(max_fee_per_gas))
}
println!("DEBUG loaded wallet: {}", wallet.address());
println!(
"DEBUG tokens: {}",
wallet.balance_of_tokens().await.unwrap()
);
println!(
"DEBUG gas : {}",
wallet.balance_of_gas_tokens().await.unwrap()
);
if let Some(max_fee_per_gas) = api_control.max_fee_per_gas {
wallet.set_transaction_config(TransactionConfig::new(max_fee_per_gas));
println!("Max fee per gas set to: {}", max_fee_per_gas);
}
let client = client.clone();
let ant_rate = Rate::from_environment("ANT".to_string());
let eth_rate = Rate::from_environment("ETH".to_string());
Ok(DwebClient {
client: client.clone(),
network: client.evm_network().clone(),
is_local: local_network,
wallet,
api_control,
ant_rate,
eth_rate,
})
}
pub fn payment_option(&self) -> PaymentOption {
PaymentOption::from(&self.wallet)
}
}