use std::sync::OnceLock;
use serde::{Deserialize, Serialize};
use tokio::sync::{Mutex, MutexGuard};
use crate::tx::{SigningKey, TxConfig};
use crate::types::state::{AccAddress, ValAddress};
use crate::Client;
pub(crate) const TEST_PRIV_KEY: &str = include_str!("../../ci/credentials/node-0.plaintext-key");
pub(crate) const TEST_RPC_URL: &str = "ws://localhost:26658";
#[cfg(not(target_arch = "wasm32"))]
pub(crate) const TEST_GRPC_URL: &str = "http://localhost:19090";
#[cfg(target_arch = "wasm32")]
const TEST_GRPC_URL: &str = "http://localhost:18080";
async fn node0_client() -> (MutexGuard<'static, ()>, Client) {
static LOCK: OnceLock<Mutex<()>> = OnceLock::new();
let lock = LOCK.get_or_init(|| Mutex::new(())).lock().await;
let client = Client::builder()
.rpc_url(TEST_RPC_URL)
.grpc_url(TEST_GRPC_URL)
.private_key_hex(TEST_PRIV_KEY)
.build()
.await
.unwrap();
(lock, client)
}
pub(crate) async fn new_rpc_only_client() -> Client {
Client::builder()
.rpc_url(TEST_RPC_URL)
.build()
.await
.unwrap()
}
pub(crate) async fn new_read_only_client() -> Client {
Client::builder()
.rpc_url(TEST_RPC_URL)
.grpc_url(TEST_GRPC_URL)
.build()
.await
.unwrap()
}
pub(crate) async fn new_client() -> Client {
let (_lock, client) = node0_client().await;
let random_key = SigningKey::random(&mut rand::thread_rng());
let random_acc = random_key.verifying_key().into();
client
.state()
.transfer(&random_acc, 20000, TxConfig::default())
.await
.unwrap();
Client::builder()
.rpc_url(TEST_RPC_URL)
.grpc_url(TEST_GRPC_URL)
.keypair(random_key)
.build()
.await
.unwrap()
}
pub(crate) fn validator_address() -> ValAddress {
let s = include_str!("../../ci/credentials/validator-0.valaddr");
s.trim().parse().expect("invalid validator address")
}
pub(crate) fn node0_address() -> AccAddress {
let s = include_str!("../../ci/credentials/node-0.addr");
s.trim().parse().expect("invalid account address")
}
pub(crate) fn ensure_serializable_deserializable<'a, T: Serialize + Deserialize<'a>>(v: T) -> T {
v
}
pub(crate) fn ensure_serializable<T: Serialize>(v: T) -> T {
v
}