add wallet sync status to home page

This commit is contained in:
creating2morrow 2023-11-21 20:03:11 -05:00
parent 9e3b94cb79
commit 2a18056d23
3 changed files with 73 additions and 4 deletions

View file

@ -74,6 +74,7 @@ enum RpcFields {
DescribeTransfer, DescribeTransfer,
ExchangeMultisigKeys, ExchangeMultisigKeys,
Export, Export,
GetHeight,
GetTxProof, GetTxProof,
GetTxById, GetTxById,
GetVersion, GetVersion,
@ -105,6 +106,7 @@ impl RpcFields {
RpcFields::DescribeTransfer => String::from("describe_transfer"), RpcFields::DescribeTransfer => String::from("describe_transfer"),
RpcFields::ExchangeMultisigKeys => String::from("exchange_multisig_keys"), RpcFields::ExchangeMultisigKeys => String::from("exchange_multisig_keys"),
RpcFields::Export => String::from("export_multisig_info"), RpcFields::Export => String::from("export_multisig_info"),
RpcFields::GetHeight => String::from("get_height"),
RpcFields::GetTxProof => String::from("get_tx_proof"), RpcFields::GetTxProof => String::from("get_tx_proof"),
RpcFields::GetTxById => String::from("get_transfer_by_txid"), RpcFields::GetTxById => String::from("get_transfer_by_txid"),
RpcFields::GetVersion => String::from("get_version"), RpcFields::GetVersion => String::from("get_version"),
@ -1229,6 +1231,34 @@ pub async fn is_multisig() -> reqres::XmrRpcIsMultisigResponse {
} }
} }
pub async fn get_wallet_height() -> reqres::XmrRpcGetHeightResponse {
info!("executing wallet {}", RpcFields::GetHeight.value());
let client = reqwest::Client::new();
let host = get_rpc_host();
let req = reqres::XmrRpcRequest {
jsonrpc: RpcFields::JsonRpcVersion.value(),
id: RpcFields::Id.value(),
method: RpcFields::GetHeight.value(),
};
let login: RpcLogin = get_rpc_creds();
match client
.post(host)
.json(&req)
.send_with_digest_auth(&login.username, &login.credential)
.await
{
Ok(response) => {
let res = response.json::<reqres::XmrRpcGetHeightResponse>().await;
debug!("{} response: {:?}", RpcFields::GetHeight.value(), res);
match res {
Ok(res) => res,
_ => Default::default(),
}
}
Err(_) => Default::default(),
}
}
// Daemon requests // Daemon requests
//------------------------------------------------------------------- //-------------------------------------------------------------------
@ -1426,6 +1456,8 @@ pub async fn p_get_transactions(
} }
} }
// End XMR daemon methods
/// enable multisig - `monero-wallet-cli --password <> --wallet-file <> set /// enable multisig - `monero-wallet-cli --password <> --wallet-file <> set
/// enable-multisig-experimental 1` /// enable-multisig-experimental 1`
pub fn enable_experimental_multisig(wallet_file: &String) { pub fn enable_experimental_multisig(wallet_file: &String) {

View file

@ -521,6 +521,11 @@ pub struct XmrRpcIsMultisigResult {
pub total: u16, pub total: u16,
} }
#[derive(Deserialize, Debug)]
pub struct XmrRpcGetHeightResult {
pub height: u64
}
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct XmrDaemonGetInfoResult { pub struct XmrDaemonGetInfoResult {
pub adjusted_time: u64, pub adjusted_time: u64,
@ -1104,6 +1109,21 @@ impl Default for XmrRpcIsMultisigResponse {
} }
} }
} }
#[derive(Deserialize, Debug)]
pub struct XmrRpcGetHeightResponse {
pub result: XmrRpcGetHeightResult,
}
impl Default for XmrRpcGetHeightResponse {
fn default() -> Self {
XmrRpcGetHeightResponse {
result: XmrRpcGetHeightResult {
height: 0,
},
}
}
}
// END XMR Structs // END XMR Structs
/// Container for the message decryption /// Container for the message decryption
@ -1248,7 +1268,7 @@ impl Default for SignAndSubmitRequest {
#[serde(crate = "rocket::serde")] #[serde(crate = "rocket::serde")]
pub struct FinalizeOrderResponse { pub struct FinalizeOrderResponse {
pub orid: String, pub orid: String,
/// This is encrypted by the vendors NEVEKO gpg key /// This is encrypted by the customer NEVEKO gpg key
pub delivery_info: Vec<u8>, pub delivery_info: Vec<u8>,
} }

View file

@ -16,6 +16,7 @@ use std::{
pub struct HomeApp { pub struct HomeApp {
/// blocks fetched during last wallet refresh /// blocks fetched during last wallet refresh
blocks_fetched: u64, blocks_fetched: u64,
wallet_height: u64,
connections: utils::Connections, connections: utils::Connections,
core_timeout_tx: Sender<bool>, core_timeout_tx: Sender<bool>,
core_timeout_rx: Receiver<bool>, core_timeout_rx: Receiver<bool>,
@ -45,6 +46,8 @@ pub struct HomeApp {
xmr_rpc_ver_rx: Receiver<reqres::XmrRpcVersionResponse>, xmr_rpc_ver_rx: Receiver<reqres::XmrRpcVersionResponse>,
can_refresh_tx: Sender<bool>, can_refresh_tx: Sender<bool>,
can_refresh_rx: Receiver<bool>, can_refresh_rx: Receiver<bool>,
wallet_height_tx: Sender<reqres::XmrRpcGetHeightResponse>,
wallet_height_rx: Receiver<reqres::XmrRpcGetHeightResponse>,
wallet_refresh_tx: Sender<reqres::XmrRpcRefreshResponse>, wallet_refresh_tx: Sender<reqres::XmrRpcRefreshResponse>,
wallet_refresh_rx: Receiver<reqres::XmrRpcRefreshResponse>, wallet_refresh_rx: Receiver<reqres::XmrRpcRefreshResponse>,
pub qr: egui_extras::RetainedImage, pub qr: egui_extras::RetainedImage,
@ -81,6 +84,7 @@ impl Default for HomeApp {
let (xmr_address_tx, xmr_address_rx) = std::sync::mpsc::channel(); let (xmr_address_tx, xmr_address_rx) = std::sync::mpsc::channel();
let (xmr_balance_tx, xmr_balance_rx) = std::sync::mpsc::channel(); let (xmr_balance_tx, xmr_balance_rx) = std::sync::mpsc::channel();
let (wallet_refresh_tx, wallet_refresh_rx) = std::sync::mpsc::channel(); let (wallet_refresh_tx, wallet_refresh_rx) = std::sync::mpsc::channel();
let (wallet_height_tx, wallet_height_rx) = std::sync::mpsc::channel();
let (can_refresh_tx, can_refresh_rx) = std::sync::mpsc::channel(); let (can_refresh_tx, can_refresh_rx) = std::sync::mpsc::channel();
let (i2p_status_tx, i2p_status_rx) = std::sync::mpsc::channel(); let (i2p_status_tx, i2p_status_rx) = std::sync::mpsc::channel();
let (installation_tx, installation_rx) = std::sync::mpsc::channel(); let (installation_tx, installation_rx) = std::sync::mpsc::channel();
@ -97,6 +101,7 @@ impl Default for HomeApp {
let c_i2p_logo = std::fs::read("./assets/i2p.png").unwrap_or(Vec::new()); let c_i2p_logo = std::fs::read("./assets/i2p.png").unwrap_or(Vec::new());
let logo_i2p = let logo_i2p =
egui_extras::RetainedImage::from_image_bytes("./assets/i2p.png", &c_i2p_logo).unwrap(); egui_extras::RetainedImage::from_image_bytes("./assets/i2p.png", &c_i2p_logo).unwrap();
let wallet_height = 0;
Self { Self {
blocks_fetched, blocks_fetched,
connections, connections,
@ -128,6 +133,9 @@ impl Default for HomeApp {
can_refresh_rx, can_refresh_rx,
can_refresh_tx, can_refresh_tx,
qr: egui_extras::RetainedImage::from_image_bytes("qr.png", &contents).unwrap(), qr: egui_extras::RetainedImage::from_image_bytes("qr.png", &contents).unwrap(),
wallet_height,
wallet_height_rx,
wallet_height_tx,
wallet_refresh_rx, wallet_refresh_rx,
wallet_refresh_tx, wallet_refresh_tx,
// state of self defaults // state of self defaults
@ -153,6 +161,9 @@ impl eframe::App for HomeApp {
if let Ok(address) = self.xmr_address_rx.try_recv() { if let Ok(address) = self.xmr_address_rx.try_recv() {
self.s_xmr_address = address; self.s_xmr_address = address;
} }
if let Ok(wallet_height) = self.wallet_height_rx.try_recv() {
self.wallet_height = wallet_height.result.height;
}
if let Ok(wallet_refresh) = self.wallet_refresh_rx.try_recv() { if let Ok(wallet_refresh) = self.wallet_refresh_rx.try_recv() {
self.blocks_fetched = wallet_refresh.result.blocks_fetched; self.blocks_fetched = wallet_refresh.result.blocks_fetched;
} }
@ -373,6 +384,7 @@ impl eframe::App for HomeApp {
self.xmr_address_tx.clone(), self.xmr_address_tx.clone(),
self.xmr_balance_tx.clone(), self.xmr_balance_tx.clone(),
self.wallet_refresh_tx.clone(), self.wallet_refresh_tx.clone(),
self.wallet_height_tx.clone(),
ctx.clone() ctx.clone()
); );
send_i2p_status_req(self.i2p_status_tx.clone(), ctx.clone()); send_i2p_status_req(self.i2p_status_tx.clone(), ctx.clone());
@ -415,14 +427,17 @@ impl eframe::App for HomeApp {
self.logo_xmr.show(ui); self.logo_xmr.show(ui);
let address = &self.s_xmr_address.result.address; let address = &self.s_xmr_address.result.address;
let blocks_fetched = self.blocks_fetched; let blocks_fetched = self.blocks_fetched;
let height = self.wallet_height;
let unlocked_balance = self.s_xmr_balance.result.unlocked_balance; let unlocked_balance = self.s_xmr_balance.result.unlocked_balance;
let locked_balance = self.s_xmr_balance.result.balance - unlocked_balance; let locked_balance = self.s_xmr_balance.result.balance - unlocked_balance;
let unlock_time = self.s_xmr_balance.result.blocks_to_unlock * crate::BLOCK_TIME_IN_SECS_EST; let unlock_time = self.s_xmr_balance.result.blocks_to_unlock * crate::BLOCK_TIME_IN_SECS_EST;
let xmrd_info: &reqres::XmrDaemonGetInfoResult = &self.s_xmrd_get_info.result; let xmrd_info: &reqres::XmrDaemonGetInfoResult = &self.s_xmrd_get_info.result;
let sync = if xmrd_info.height != 0 { (height / xmrd_info.height) * 100 } else { 0 };
let free_space = xmrd_info.free_space / crate::BYTES_IN_GB; let free_space = xmrd_info.free_space / crate::BYTES_IN_GB;
let db_size = xmrd_info.database_size / crate::BYTES_IN_GB; let db_size = xmrd_info.database_size / crate::BYTES_IN_GB;
ui.label(format!("- rpc version: {}\n- blocks fetched: {}\n- address: {}\n- balance: {} piconero(s)\n- locked balance: {} piconero(s)\n- unlock time (secs): {}\n- daemon info\n\t- net type: {}\n\t- current hash: {}\n\t- height: {}\n\t- synced: {}\n\t- blockchain size : ~{} GB\n\t- free space : ~{} GB\n\t- version: {}\n", let ver = self.s_xmr_rpc_ver.result.version;
self.s_xmr_rpc_ver.result.version, blocks_fetched, address, unlocked_balance, locked_balance, ui.label(format!("- rpc version: {}\n- height: {}%\n- blocks fetched: {}\n- address: {}\n- balance: {} piconero(s)\n- locked balance: {} piconero(s)\n- unlock time (secs): {}\n- daemon info\n\t- net type: {}\n\t- current hash: {}\n\t- height: {}\n\t- synced: {}\n\t- blockchain size : ~{} GB\n\t- free space : ~{} GB\n\t- version: {}\n",
ver, sync, blocks_fetched, address, unlocked_balance, locked_balance,
unlock_time, xmrd_info.nettype, xmrd_info.top_block_hash, xmrd_info.height, xmrd_info.synchronized, unlock_time, xmrd_info.nettype, xmrd_info.top_block_hash, xmrd_info.height, xmrd_info.synchronized,
db_size, free_space, xmrd_info.version)); db_size, free_space, xmrd_info.version));
}); });
@ -482,6 +497,7 @@ fn send_wallet_req(
address_tx: Sender<reqres::XmrRpcAddressResponse>, address_tx: Sender<reqres::XmrRpcAddressResponse>,
balance_tx: Sender<reqres::XmrRpcBalanceResponse>, balance_tx: Sender<reqres::XmrRpcBalanceResponse>,
wallet_refresh_tx: Sender<reqres::XmrRpcRefreshResponse>, wallet_refresh_tx: Sender<reqres::XmrRpcRefreshResponse>,
wallet_height_tx: Sender<reqres::XmrRpcGetHeightResponse>,
ctx: egui::Context, ctx: egui::Context,
) { ) {
tokio::spawn(async move { tokio::spawn(async move {
@ -490,13 +506,14 @@ fn send_wallet_req(
std::env::var(neveko_core::MONERO_WALLET_PASSWORD).unwrap_or(String::from("password")); std::env::var(neveko_core::MONERO_WALLET_PASSWORD).unwrap_or(String::from("password"));
monero::open_wallet(&wallet_name, &wallet_password).await; monero::open_wallet(&wallet_name, &wallet_password).await;
let address: reqres::XmrRpcAddressResponse = monero::get_address().await; let address: reqres::XmrRpcAddressResponse = monero::get_address().await;
// hope this fixes wallet not refreshing on initial startup bug
let refresh: reqres::XmrRpcRefreshResponse = monero::refresh().await; let refresh: reqres::XmrRpcRefreshResponse = monero::refresh().await;
let balance: reqres::XmrRpcBalanceResponse = monero::get_balance().await; let balance: reqres::XmrRpcBalanceResponse = monero::get_balance().await;
let wallet_height: reqres::XmrRpcGetHeightResponse = monero::get_wallet_height().await;
monero::close_wallet(&wallet_name, &wallet_password).await; monero::close_wallet(&wallet_name, &wallet_password).await;
let _ = address_tx.send(address); let _ = address_tx.send(address);
let _ = balance_tx.send(balance); let _ = balance_tx.send(balance);
let _ = wallet_refresh_tx.send(refresh); let _ = wallet_refresh_tx.send(refresh);
let _ = wallet_height_tx.send(wallet_height);
ctx.request_repaint(); ctx.request_repaint();
}); });
} }