use color_eyre::Result;
use crate::token::{Rate, ShowCost};
use crate::web::{LOCALHOST_STR, SERVER_PORTS_MAIN_PORT};
use autonomi::client::payment::PaymentOption;
use autonomi::{Client, PaymentMode, TransactionConfig};
use autonomi::{Network, Wallet};
use crate::autonomi::args::max_fee_per_gas::{
MaxFeePerGasParam, get_max_fee_per_gas_from_opt_param,
};
#[derive(Clone)]
pub struct ApiControl {
pub file_retries: u64,
pub api_tries: u32,
pub use_public_archive: bool,
pub ignore_pointers: bool,
pub show_dweb_costs: ShowCost,
pub max_fee_per_gas: Option<MaxFeePerGasParam>,
pub disable_single_node_payment: bool,
}
impl Default for ApiControl {
fn default() -> Self {
ApiControl {
file_retries: 0,
api_tries: 1,
use_public_archive: false,
ignore_pointers: false,
show_dweb_costs: ShowCost::Both,
max_fee_per_gas: None,
disable_single_node_payment: false,
}
}
}
#[derive(Clone)]
pub struct DwebClientConfig {
pub local_network: bool,
pub alpha_network: bool,
pub host: Option<String>,
pub port: Option<u16>,
pub client: Option<autonomi::Client>,
pub wallet: Option<Wallet>,
pub api_control: ApiControl,
}
impl Default for DwebClientConfig {
fn default() -> Self {
DwebClientConfig {
local_network: false,
alpha_network: false,
host: None,
port: None,
client: None,
wallet: None,
api_control: ApiControl::default(),
}
}
}
#[derive(Clone)]
pub struct DwebClient {
pub client: autonomi::Client,
pub client_config: DwebClientConfig, pub network: Network,
pub is_local: bool,
pub host: String,
pub port: u16,
pub wallet: Wallet, pub is_wallet_temporary: bool,
pub api_control: ApiControl,
pub ant_rate: Option<Rate>,
pub eth_rate: Option<Rate>,
}
impl DwebClient {
pub async fn initialise_and_connect(client_config: &DwebClientConfig) -> Result<DwebClient> {
println!("Dweb Autonomi client initialising...");
let mut client = if client_config.client.is_some() {
client_config.clone().client.unwrap()
} else {
if client_config.local_network {
println!("๐ก Connecting to local testnet...");
Client::init_local().await?
} else if client_config.alpha_network {
println!("๐งช Connecting to public alpha testnet...");
Client::init_alpha().await?
} else {
println!("๐ Connecting to Autonomi mainnet...");
Client::init().await?
}
};
if client_config.api_control.file_retries != 0 {
client = client.with_retry_failed(client_config.api_control.file_retries);
println!(
"๐ Client configured to retry failed chunk uploads until successful or exceeds {} retries",
client_config.api_control.file_retries
);
}
if client_config.api_control.disable_single_node_payment {
client = client.with_payment_mode(PaymentMode::Standard);
println!("๐ณ Using standard payment mode (pays 3 nodes individually)");
} else {
println!("๐ฏ Using single node payment mode (default - saves gas fees)");
}
let (mut wallet, is_wallet_temporary) = if client_config.wallet.is_some() {
(client_config.clone().wallet.unwrap(), false)
} else {
match crate::autonomi::wallet::load_wallet(&client.evm_network()) {
Ok(wallet) => (wallet, false),
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()),
true,
)
}
}
};
let max_fee_per_gas = get_max_fee_per_gas_from_opt_param(
client_config.api_control.max_fee_per_gas,
client.evm_network(),
)?;
wallet.set_transaction_config(TransactionConfig {
max_fee_per_gas: max_fee_per_gas.clone(),
});
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()
);
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());
let host = client_config
.clone()
.host
.unwrap_or(LOCALHOST_STR.to_string());
let port = client_config.port.unwrap_or(SERVER_PORTS_MAIN_PORT);
Ok(DwebClient {
client: client.clone(),
client_config: client_config.clone(),
network: client.evm_network().clone(),
is_local: client_config.local_network,
host,
port,
wallet,
is_wallet_temporary,
api_control: client_config.api_control.clone(),
ant_rate,
eth_rate,
})
}
pub fn payment_option(&self) -> PaymentOption {
PaymentOption::from(&self.wallet)
}
}