use crate::casper_client::{
configuration::CasperClientConfiguration, transaction_watcher::TransactionWatcher
};
use crate::error::LivenetError;
use casper_types::U512;
use std::rc::Rc;
use std::time::Duration;
use tokio::runtime::{Builder, Runtime};
pub mod accounts;
pub mod configuration;
mod node;
mod queries;
pub mod transaction_watcher;
mod transactions;
mod validators;
pub const ENV_SECRET_KEY: &str = "ODRA_CASPER_LIVENET_SECRET_KEY_PATH";
pub const ENV_NODE_ADDRESS: &str = "ODRA_CASPER_LIVENET_NODE_ADDRESS";
pub const ENV_EVENTS_ADDRESS: &str = "ODRA_CASPER_LIVENET_EVENTS_URL";
pub const ENV_CHAIN_NAME: &str = "ODRA_CASPER_LIVENET_CHAIN_NAME";
pub const ENV_ACCOUNT_PREFIX: &str = "ODRA_CASPER_LIVENET_KEY_";
pub const ENV_CSPR_CLOUD_AUTH_TOKEN: &str = "CSPR_CLOUD_AUTH_TOKEN";
pub const ENV_LIVENET_ENV_FILE: &str = "ODRA_CASPER_LIVENET_ENV";
pub const ENV_TTL: &str = "ODRA_CASPER_LIVENET_TTL";
pub const ENV_GAS_PRICE_TOLERANCE: &str = "ODRA_CASPER_LIVENET_GAS_PRICE_TOLERANCE";
pub type Result<T> = core::result::Result<T, LivenetError>;
const TRANSACTION_WAIT_TIME: u64 = 10;
const TRANSACTION_MAX_RETRIES: u64 = 12;
pub struct CasperClient {
pub configuration: CasperClientConfiguration,
watcher: TransactionWatcher,
active_account: usize,
gas: U512,
runtime: Rc<Runtime>
}
impl CasperClient {
pub fn new(configuration: CasperClientConfiguration) -> Self {
let runtime = Builder::new_current_thread()
.enable_all()
.build()
.expect("Failed to build Tokio runtime");
let timeout = Duration::from_secs(TRANSACTION_WAIT_TIME * TRANSACTION_MAX_RETRIES);
let watcher = TransactionWatcher::new(&configuration, timeout);
CasperClient {
configuration,
watcher,
active_account: 0,
gas: U512::zero(),
runtime: Rc::new(runtime)
}
}
fn runtime(&self) -> Rc<Runtime> {
self.runtime.clone()
}
}