use futures::{stream::Stream, Future}; use hex; use interledger::stream::StreamDelivery; use interledger::{ packet::Address, service::Account as AccountTrait, store_redis::{Account, AccountId}, }; use ring::rand::{SecureRandom, SystemRandom}; use serde::Serialize; use serde_json::json; use std::collections::HashMap; use std::fmt::{Debug, Display}; use std::str; use tracing_subscriber; pub fn install_tracing_subscriber() { tracing_subscriber::fmt::Subscriber::builder() .with_timer(tracing_subscriber::fmt::time::ChronoUtc::rfc3339()) .with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env()) .try_init() .unwrap_or(()); } #[allow(unused)] pub fn random_secret() -> String { let mut bytes: [u8; 32] = [0; 32]; SystemRandom::new().fill(&mut bytes).unwrap(); hex::encode(bytes) } #[derive(serde::Deserialize)] pub struct BalanceData { pub balance: i64, } #[allow(unused)] pub fn create_account_on_node( api_port: u16, data: T, auth: &str, ) -> impl Future { let client = reqwest::r#async::Client::new(); client .post(&format!("http://localhost:{}/accounts", api_port)) .header("Content-Type", "application/json") .header("Authorization", format!("Bearer {}", auth)) .json(&data) .send() .and_then(move |res| res.error_for_status()) .and_then(move |res| res.into_body().concat2()) .map_err(|err| { eprintln!("Error creating account on node: {:?}", err); }) .and_then(move |chunk| Ok(str::from_utf8(&chunk).unwrap().to_string())) } #[allow(unused)] pub fn create_account_on_engine( engine_port: u16, account_id: T, ) -> impl Future { let client = reqwest::r#async::Client::new(); client .post(&format!("http://localhost:{}/accounts", engine_port)) .header("Content-Type", "application/json") .json(&json!({ "id": account_id })) .send() .and_then(move |res| res.error_for_status()) .and_then(move |res| res.into_body().concat2()) .map_err(|err| { eprintln!("Error creating account: {:?}", err); }) .and_then(move |chunk| Ok(str::from_utf8(&chunk).unwrap().to_string())) } #[allow(unused)] pub fn send_money_to_username( from_port: u16, to_port: u16, amount: u64, to_username: T, from_username: &str, from_auth: &str, ) -> impl Future { let client = reqwest::r#async::Client::new(); let auth = format!("{}:{}", from_username, from_auth); client .post(&format!( "http://localhost:{}/accounts/{}/payments", from_port, from_username )) .header("Authorization", format!("Bearer {}", auth)) .json(&json!({ "receiver": format!("http://localhost:{}/accounts/{}/spsp", to_port, to_username), "source_amount": amount, })) .send() .and_then(|res| res.error_for_status()) .and_then(|res| res.into_body().concat2()) .map_err(|err| { eprintln!("Error sending SPSP payment: {:?}", err); }) .and_then(move |body| { let ret: StreamDelivery = serde_json::from_slice(&body).unwrap(); Ok(ret) }) } #[allow(unused)] pub fn get_all_accounts( node_port: u16, admin_token: &str, ) -> impl Future, Error = ()> { let client = reqwest::r#async::Client::new(); client .get(&format!("http://localhost:{}/accounts", node_port)) .header("Authorization", format!("Bearer {}", admin_token)) .send() .and_then(|res| res.error_for_status()) .and_then(|res| res.into_body().concat2()) .map_err(|err| { eprintln!("Error getting account data: {:?}", err); }) .and_then(move |body| { let ret: Vec = serde_json::from_slice(&body).unwrap(); Ok(ret) }) } #[allow(unused)] pub fn accounts_to_ids(accounts: Vec) -> HashMap { let mut map = HashMap::new(); for a in accounts { map.insert(a.ilp_address().clone(), a.id()); } map } #[allow(unused)] pub fn get_balance( account_id: T, node_port: u16, admin_token: &str, ) -> impl Future { let client = reqwest::r#async::Client::new(); client .get(&format!( "http://localhost:{}/accounts/{}/balance", node_port, account_id )) .header("Authorization", format!("Bearer {}", admin_token)) .send() .and_then(|res| res.error_for_status()) .and_then(|res| res.into_body().concat2()) .map_err(|err| { eprintln!("Error getting account data: {:?}", err); }) .and_then(|body| { let ret: BalanceData = serde_json::from_slice(&body).unwrap(); Ok(ret.balance) }) }