@ -1,11 +1,13 @@
// Copyright 2019-2022 The Hush Developers
// Released under the GPLv3
# include <QLCDNumber>
# include "rpc.h"
# include "addressbook.h"
# include "settings.h"
# include "senttxstore.h"
# include "version.h"
# include "websockets.h"
# include "sd.h"
extern bool isdragonx ;
@ -208,6 +210,16 @@ void RPC::getRescanInfo(const std::function<void(QJsonValue)>& cb){
conn - > doRPCIgnoreError ( makePayload ( method ) , cb ) ;
}
void RPC : : getnetworksolps ( const std : : function < void ( QJsonValue ) > & cb ) {
QString method = " getnetworksolps " ;
conn - > doRPCWithDefaultErrorHandling ( makePayload ( method ) , cb ) ;
}
void RPC : : getlocalsolps ( const std : : function < void ( QJsonValue ) > & cb ) {
QString method = " getlocalsolps " ;
conn - > doRPCWithDefaultErrorHandling ( makePayload ( method ) , cb ) ;
}
// get help
void RPC : : help ( const std : : function < void ( QJsonValue ) > & cb ) {
QString method = " help " ;
@ -280,6 +292,28 @@ void RPC::newTaddr(const std::function<void(QJsonValue)>& cb) {
conn - > doRPCWithDefaultErrorHandling ( makePayload ( method ) , cb ) ;
}
void RPC : : setGenerate ( int proclimit , const std : : function < void ( QJsonValue ) > & cb ) {
QString method = " setgenerate " ;
QJsonObject payload = {
{ " jsonrpc " , " 1.0 " } ,
{ " id " , " 42 " } ,
{ " method " , method } ,
{ " params " , QJsonArray { true , proclimit } }
} ;
conn - > doRPCWithDefaultErrorHandling ( payload , cb ) ;
}
void RPC : : stopGenerate ( int proclimit , const std : : function < void ( QJsonValue ) > & cb ) {
QString method = " setgenerate " ;
QJsonObject payload = {
{ " jsonrpc " , " 1.0 " } ,
{ " id " , " 42 " } ,
{ " method " , method } ,
{ " params " , QJsonArray { false , proclimit } }
} ;
conn - > doRPCWithDefaultErrorHandling ( payload , cb ) ;
}
void RPC : : getZViewKey ( QString addr , const std : : function < void ( QJsonValue ) > & cb ) {
QString method = " z_exportviewingkey " ;
conn - > doRPCWithDefaultErrorHandling ( makePayload ( method , addr ) , cb ) ;
@ -776,6 +810,7 @@ void RPC::getInfoThenRefresh(bool force) {
ui - > numconnections - > setText ( QString : : number ( connections ) + " ( " + QString : : number ( tlsconnections ) + " TLS) " ) ;
ui - > tlssupport - > setText ( hasTLS ? " Yes " : " No " ) ;
/*
// Get network sol/s
QString method = " getnetworksolps " ;
conn - > doRPCIgnoreError ( makePayload ( method ) , [ = ] ( const QJsonValue & reply ) {
@ -787,6 +822,126 @@ void RPC::getInfoThenRefresh(bool force) {
} else {
ui - > solrate - > setText ( QString : : number ( ( double ) solrate / 1000000 ) % " MegaSol/s " ) ;
}
// find a QLCDNumber child of tabWidget named networkhashrate
auto hashrate = ui - > tabWidget - > findChild < QLCDNumber * > ( " networkhashrate " ) ;
qDebug ( ) < < " solrate= " < < QString : : number ( solrate ) ;
if ( hashrate ! = nullptr ) {
hashrate - > display ( QString : : number ( solrate , ' f ' , 2 ) ) ;
} else {
qDebug ( ) < < " no widget named networkhashrate found " ;
}
// hashrate->display( QString::number( (double) solrate) );
} ) ;
// only look at local hashrate for dragonx
if ( isdragonx ) {
QString method = " getlocalsolps " ;
DEBUG ( " calling getlocalsolps " ) ;
conn - > doRPCIgnoreError ( makePayload ( method ) , [ = ] ( const QJsonValue & reply ) {
qDebug ( ) < < " reply= " < < reply ;
double solrate = reply . toDouble ( ) ;
DEBUG ( " solrate= " % QString : : number ( solrate ) ) ;
// find a QLCDNumber child of tabWidget named localhashrate
auto hashrate = ui - > tabWidget - > findChild < QLCDNumber * > ( " localhashrate " ) ;
if ( hashrate ! = nullptr ) {
hashrate - > display ( QString : : number ( ( double ) solrate , ' f ' , 2 ) ) ;
} else {
qDebug ( ) < < " no widget named localhashrate found " ;
}
} ) ;
}
*/
// Get mining info
// This is better+faster than calling multiple RPCs such as getlocalsolps/getnetworksolps/getgenerate
// and getlocalsolps returns non-zero values even when not mining, which is not what we want
conn - > doRPCIgnoreError ( makePayload ( " getmininginfo " ) , [ = ] ( const QJsonValue & reply ) {
QString localhashps = QString : : number ( reply [ " localhashps " ] . toDouble ( ) ) ;
QString networkhashps = QString : : number ( reply [ " networkhashps " ] . toDouble ( ) ) ;
QString generate = QString : : number ( reply [ " generate " ] . toBool ( ) ) ;
QString difficulty = QString : : number ( reply [ " difficulty " ] . toDouble ( ) ) ;
QString genproclimit = QString : : number ( reply [ " genproclimit " ] . toInt ( ) ) ;
if ( genproclimit = = " -1 " ) {
// Showing users they are mining with -1 threads by default is confusing
genproclimit = QString : : number ( 0 ) ;
}
auto stopbutton = ui - > tabWidget - > findChild < QPushButton * > ( " stopmining " ) ;
auto startbutton = ui - > tabWidget - > findChild < QPushButton * > ( " startmining " ) ;
if ( generate = = " 1 " ) {
// already mining
stopbutton - > setEnabled ( true ) ;
startbutton - > setEnabled ( false ) ;
DEBUG ( " enabled stop mining button, disabled start mining button " ) ;
} else {
// not yet mining
startbutton - > setEnabled ( true ) ;
stopbutton - > setEnabled ( false ) ;
DEBUG ( " enabled start mining button, disabled stop mining button " ) ;
}
// Update network hashrate in "Node Info" tab
if ( isdragonx ) {
ui - > solrate - > setText ( QString : : number ( networkhashps . toDouble ( ) ) % " Hash/s " ) ;
} else {
ui - > solrate - > setText ( QString : : number ( networkhashps . toDouble ( ) / 1000000 ) % " MegaSol/s " ) ;
}
// find a QLCDNumber child of tabWidget named localhashrate
auto localhashrate = ui - > tabWidget - > findChild < QLCDNumber * > ( " localhashrate " ) ;
if ( localhashrate ! = nullptr ) {
localhashrate - > display ( QString : : number ( localhashps . toDouble ( ) , ' f ' , 2 ) ) ;
} else {
qDebug ( ) < < " no widget named localhashrate found " ;
}
// find a QLCDNumber child of tabWidget named networkhashrate
auto nethashrate = ui - > tabWidget - > findChild < QLCDNumber * > ( " networkhashrate " ) ;
if ( nethashrate ! = nullptr ) {
nethashrate - > display ( QString : : number ( networkhashps . toInt ( ) ) ) ;
} else {
qDebug ( ) < < " no widget named networkhashrate found " ;
}
// find a QLCDNumber child of tabWidget named difficulty
auto diff = ui - > tabWidget - > findChild < QLCDNumber * > ( " difficulty " ) ;
if ( nethashrate ! = nullptr ) {
diff - > display ( QString : : number ( difficulty . toDouble ( ) , ' f ' , 2 ) ) ;
} else {
qDebug ( ) < < " no widget named difficulty found " ;
}
// find a QLCDNumber child of tabWidget named miningthreads
auto miningthreads = ui - > tabWidget - > findChild < QLCDNumber * > ( " miningthreads " ) ;
if ( miningthreads ! = nullptr ) {
miningthreads - > display ( QString : : number ( genproclimit . toInt ( ) ) ) ;
} else {
qDebug ( ) < < " no widget named difficulty found " ;
}
// find a QLCDNumber child of tabWidget named luck
auto luck = ui - > tabWidget - > findChild < QLCDNumber * > ( " luck " ) ;
if ( luck ! = nullptr ) {
if ( generate = = " 0 " ) {
// not mining, luck is not applicable
luck - > display ( QString ( " - " ) ) ;
} else {
// luck = current estimate of time to find a block given current localhash and nethash
double percentOfNetHash = localhashps . toDouble ( ) / networkhashps . toInt ( ) ;
DEBUG ( " % of nethash= " < < percentOfNetHash ) ;
if ( percentOfNetHash > 0 ) {
//TODO: this is only for DRAGONX
int blocktime = 36 ;
double luckInSeconds = ( 1 / percentOfNetHash ) * blocktime ;
double luckInHours = luckInSeconds / ( 60 * 60 ) ;
luck - > display ( QString : : number ( luckInHours , ' f ' , 2 ) ) ;
}
}
} else {
qDebug ( ) < < " no widget named luck found " ;
}
} ) ;
// Get network info