@ -1573,8 +1573,16 @@ void RPC::refreshPrice() {
if ( conn = = nullptr )
return noConnection ( ) ;
QString price_feed ;
QString history_feed ;
// TODO: Make feeds dynamic to support HACs
if ( isdragonx ) {
return ;
price_feed = " https://api.coingecko.com/api/v3/simple/price?ids=dragonx-2&vs_currencies=btc%2Cusd%2Ceur%2Ceth%2Cgbp%2Ccny%2Cjpy%2Cidr%2Crub%2Ccad%2Csgd%2Cchf%2Cinr%2Caud%2Cinr%2Ckrw%2Cthb%2Cnzd%2Czar%2Cvef%2Cxau%2Cxag%2Cvnd%2Csar%2Ctwd%2Caed%2Cars%2Cbdt%2Cbhd%2Cbmd%2Cbrl%2Cclp%2Cczk%2Cdkk%2Chuf%2Cils%2Ckwd%2Clkr%2Cpkr%2Cnok%2Ctry%2Csek%2Cmxn%2Cuah%2Chkd&include_market_cap=true&include_24hr_vol=true&include_24hr_change=true " ;
history_feed = " https://api.coingecko.com/api/v3/coins/dragonx-2/market_chart?vs_currency=usd&days=90&precision=full " ;
} else {
price_feed = " https://api.coingecko.com/api/v3/simple/price?ids=hush&vs_currencies=btc%2Cusd%2Ceur%2Ceth%2Cgbp%2Ccny%2Cjpy%2Cidr%2Crub%2Ccad%2Csgd%2Cchf%2Cinr%2Caud%2Cinr%2Ckrw%2Cthb%2Cnzd%2Czar%2Cvef%2Cxau%2Cxag%2Cvnd%2Csar%2Ctwd%2Caed%2Cars%2Cbdt%2Cbhd%2Cbmd%2Cbrl%2Cclp%2Cczk%2Cdkk%2Chuf%2Cils%2Ckwd%2Clkr%2Cpkr%2Cnok%2Ctry%2Csek%2Cmxn%2Cuah%2Chkd&include_market_cap=true&include_24hr_vol=true&include_24hr_change=true " ;
history_feed = " https://api.coingecko.com/api/v3/coins/hush/market_chart?vs_currency=usd&days=90&precision=full " ;
}
auto s = Settings : : getInstance ( ) ;
@ -1584,7 +1592,6 @@ void RPC::refreshPrice() {
return ;
}
QString price_feed = " https://api.coingecko.com/api/v3/simple/price?ids=hush&vs_currencies=btc%2Cusd%2Ceur%2Ceth%2Cgbp%2Ccny%2Cjpy%2Cidr%2Crub%2Ccad%2Csgd%2Cchf%2Cinr%2Caud%2Cinr%2Ckrw%2Cthb%2Cnzd%2Czar%2Cvef%2Cxau%2Cxag%2Cvnd%2Csar%2Ctwd%2Caed%2Cars%2Cbdt%2Cbhd%2Cbmd%2Cbrl%2Cclp%2Cczk%2Cdkk%2Chuf%2Cils%2Ckwd%2Clkr%2Cpkr%2Cnok%2Ctry%2Csek%2Cmxn%2Cuah%2Chkd&include_market_cap=true&include_24hr_vol=true&include_24hr_change=true " ;
qDebug ( ) < < " Requesting price feed data via " < < price_feed ;
QUrl cmcURL ( price_feed ) ;
@ -1632,7 +1639,16 @@ void RPC::refreshPrice() {
qDebug ( ) < < " Parsed JSON " ;
const QJsonValue & item = parsed ;
const QJsonValue & hush = item [ " hush " ] . toObject ( ) ;
// TODO: Rename hush to be more universal for HACs and avoid confusion
QJsonValue hush ;
if ( isdragonx ) {
hush = item [ " dragonx-2 " ] . toObject ( ) ;
} else {
hush = item [ " hush " ] . toObject ( ) ;
}
QString ticker = s - > get_currency_name ( ) ;
ticker = ticker . toLower ( ) ;
fprintf ( stderr , " ticker=%s \n " , ticker . toLocal8Bit ( ) . data ( ) ) ;
@ -1666,17 +1682,24 @@ void RPC::refreshPrice() {
qDebug ( ) < < " Volume = " < < ( double ) vol ;
ticker = ticker . toUpper ( ) ;
ui - > volume - > setText ( QString : : number ( ( double ) vol , ' f ' , 2 ) + " " + ticker ) ;
ui - > volumeBTC - > setText ( QString : : number ( ( double ) btcvol , ' f ' , 2 ) + " BTC " ) ;
ui - > volume - > setText ( QString : : number ( ( double ) vol , ' f ' , 8 ) + " " + ticker ) ;
ui - > volumeBTC - > setText ( QString : : number ( ( double ) btcvol , ' f ' , 8 ) + " BTC " ) ;
ticker = ticker . toUpper ( ) ;
// We don't get an actual HUSH volume stat, so we calculate it
if ( price > 0 )
ui - > volumeLocal - > setText ( QString : : number ( ( double ) vol / ( double ) price ) + " HUSH " ) ;
if ( price > 0 ) {
// TODO: Make dynamic to support HACs
if ( isdragonx ) {
ui - > volumeLocal - > setText ( QString : : number ( ( double ) vol / ( double ) price ) + " DRGX " ) ;
} else {
ui - > volumeLocal - > setText ( QString : : number ( ( double ) vol / ( double ) price ) + " HUSH " ) ;
}
}
qDebug ( ) < < " Mcap = " < < ( double ) mcap ;
ui - > marketcap - > setText ( QString : : number ( ( double ) mcap , ' f ' , 2 ) + " " + ticker ) ;
ui - > marketcapBTC - > setText ( QString : : number ( ( double ) btcmcap , ' f ' , 2 ) + " BTC " ) ;
ui - > marketcap - > setText ( QString : : number ( ( double ) mcap , ' f ' , 8 ) + " " + ticker ) ;
ui - > marketcapBTC - > setText ( QString : : number ( ( double ) btcmcap , ' f ' , 8 ) + " BTC " ) ;
//ui->marketcapLocal->setText( QString::number((double) mcap * (double) price) + " " + ticker );
refresh ( true ) ;
@ -1693,6 +1716,222 @@ void RPC::refreshPrice() {
Settings : : getInstance ( ) - > setHUSHPrice ( 0 ) ;
Settings : : getInstance ( ) - > setBTCPrice ( 0 ) ;
} ) ;
getMarketChart ( " Price " ) ;
}
// Get price history chart
void RPC : : getMarketChart ( QString chartType ) {
if ( conn = = nullptr )
return noConnection ( ) ;
QString history_feed ;
// TODO: Make feeds dynamic to support HACs
if ( isdragonx ) {
history_feed = " https://api.coingecko.com/api/v3/coins/dragonx-2/market_chart?vs_currency=usd&days=7 " ;
} else {
history_feed = " https://api.coingecko.com/api/v3/coins/hush/market_chart?vs_currency=usd&days=7 " ;
}
auto s = Settings : : getInstance ( ) ;
if ( s - > getAllowFetchPrices ( ) = = false ) {
qDebug ( ) < < " Price fetching disabled " ;
return ;
}
qDebug ( ) < < " Requesting history feed data via " < < history_feed ;
QUrl histURL ( history_feed ) ;
QNetworkRequest req ;
req . setUrl ( histURL ) ;
QNetworkReply * reply = conn - > restclient - > get ( req ) ;
QObject : : connect ( reply , & QNetworkReply : : finished , [ = ] {
reply - > deleteLater ( ) ;
try {
QByteArray ba_raw_reply = reply - > readAll ( ) ;
QString raw_reply = QString : : fromUtf8 ( ba_raw_reply ) ;
QByteArray unescaped_raw_reply = raw_reply . toUtf8 ( ) ;
QJsonDocument jd_reply = QJsonDocument : : fromJson ( unescaped_raw_reply ) ;
QJsonObject parsed = jd_reply . object ( ) ;
QJsonArray prices = parsed [ " prices " ] . toArray ( ) ;
QJsonArray volumes = parsed [ " total_volumes " ] . toArray ( ) ;
QJsonArray mcaps = parsed [ " market_caps " ] . toArray ( ) ;
if ( prices . size ( ) > 0 & & volumes . size ( ) > 0 ) {
// Create Price Series
QLineSeries * priceSeries = new QLineSeries ( ) ;
// Loop through price data and add to series
for ( int i = 0 ; i < prices . size ( ) ; i + + ) {
// QJson doesn't support long ints so we convert - https://bugreports.qt.io/browse/QTBUG-28560
quint64 timestamp = QString ( " %1 " ) . arg ( prices . at ( i ) . toArray ( ) . at ( 0 ) . toDouble ( ) , 0 , ' f ' , 0 ) . toLongLong ( ) ;
auto price = prices . at ( i ) . toArray ( ) . at ( 1 ) . toDouble ( ) ;
qDebug ( ) < < " Epoch = " < < timestamp ;
qDebug ( ) < < " Price = " < < price ;
priceSeries - > append ( timestamp , price ) ;
}
// Set color of price series
priceSeries - > setColor ( Qt : : green ) ;
// Create Price chart
QChart * priceChart = new QChart ( ) ;
priceChart - > setTitleBrush ( QBrush ( Qt : : darkGray ) ) ;
priceChart - > addSeries ( priceSeries ) ;
priceChart - > setTitle ( " Price History " ) ;
priceChart - > setBackgroundVisible ( false ) ;
priceChart - > legend ( ) - > hide ( ) ;
auto priceaxisX = new QDateTimeAxis ;
priceaxisX - > setTickCount ( 7 ) ;
priceaxisX - > setFormat ( " yyyy-MM-dd " ) ;
priceaxisX - > setLabelsColor ( Qt : : lightGray ) ;
priceaxisX - > setGridLineColor ( Qt : : darkGray ) ;
priceaxisX - > setTitleText ( " Date " ) ;
priceChart - > addAxis ( priceaxisX , Qt : : AlignBottom ) ;
priceSeries - > attachAxis ( priceaxisX ) ;
auto priceaxisY = new QValueAxis ;
priceaxisY - > setTickCount ( 10 ) ;
priceaxisY - > setLabelsColor ( Qt : : lightGray ) ;
priceaxisY - > setGridLineColor ( Qt : : darkGray ) ;
priceaxisY - > setTitleText ( " USD Price " ) ;
priceChart - > addAxis ( priceaxisY , Qt : : AlignLeft ) ;
priceSeries - > attachAxis ( priceaxisY ) ;
// Create Volume Series
QLineSeries * volumeSeries = new QLineSeries ( ) ;
// Loop through price data and add to series
for ( int i = 0 ; i < volumes . size ( ) ; i + + ) {
// QJson doesn't support long ints so we convert - https://bugreports.qt.io/browse/QTBUG-28560
quint64 timestamp = QString ( " %1 " ) . arg ( volumes . at ( i ) . toArray ( ) . at ( 0 ) . toDouble ( ) , 0 , ' f ' , 0 ) . toLongLong ( ) ;
auto volume = volumes . at ( i ) . toArray ( ) . at ( 1 ) . toDouble ( ) ;
qDebug ( ) < < " Epoch = " < < timestamp ;
qDebug ( ) < < " Volume = " < < volume ;
volumeSeries - > append ( timestamp , volume ) ;
}
// Set color of Volume series
volumeSeries - > setColor ( Qt : : green ) ;
// Create Volume chart
QChart * volumeChart = new QChart ( ) ;
volumeChart - > setTitleBrush ( QBrush ( Qt : : darkGray ) ) ;
volumeChart - > addSeries ( volumeSeries ) ;
volumeChart - > setTitle ( " Volume History " ) ;
volumeChart - > setBackgroundVisible ( false ) ;
volumeChart - > legend ( ) - > hide ( ) ;
auto volumeaxisX = new QDateTimeAxis ;
volumeaxisX - > setTickCount ( 7 ) ;
volumeaxisX - > setFormat ( " yyyy-MM-dd " ) ;
volumeaxisX - > setLabelsColor ( Qt : : lightGray ) ;
volumeaxisX - > setGridLineColor ( Qt : : darkGray ) ;
volumeaxisX - > setTitleText ( " Date " ) ;
volumeChart - > addAxis ( volumeaxisX , Qt : : AlignBottom ) ;
volumeSeries - > attachAxis ( volumeaxisX ) ;
auto volumeaxisY = new QValueAxis ;
volumeaxisY - > setTickCount ( 10 ) ;
volumeaxisY - > setLabelsColor ( Qt : : lightGray ) ;
volumeaxisY - > setGridLineColor ( Qt : : darkGray ) ;
volumeaxisY - > setTitleText ( " DRGX " ) ;
volumeChart - > addAxis ( volumeaxisY , Qt : : AlignLeft ) ;
volumeSeries - > attachAxis ( volumeaxisY ) ;
// Create Market Cap Series
/*
QLineSeries * mcapSeries = new QLineSeries ( ) ;
// Loop through price data and add to series
for ( int i = 0 ; i < mcaps . size ( ) ; i + + ) {
// QJson doesn't support long ints so we convert - https://bugreports.qt.io/browse/QTBUG-28560
quint64 timestamp = QString ( " %1 " ) . arg ( mcaps . at ( i ) . toArray ( ) . at ( 0 ) . toDouble ( ) , 0 , ' f ' , 0 ) . toLongLong ( ) ;
auto mcap = mcaps . at ( i ) . toArray ( ) . at ( 1 ) . toDouble ( ) ;
qDebug ( ) < < " Epoch = " < < timestamp ;
qDebug ( ) < < " Mcap = " < < mcap ;
mcapSeries - > append ( timestamp , mcap ) ;
}
// Set color of Market Cap series
mcapSeries - > setColor ( Qt : : green ) ;
// Create Market Cap chart
QChart * mcapChart = new QChart ( ) ;
mcapChart - > setTitleBrush ( QBrush ( Qt : : darkGray ) ) ;
mcapChart - > addSeries ( mcapSeries ) ;
mcapChart - > setTitle ( " Market Cap History " ) ;
mcapChart - > setBackgroundVisible ( false ) ;
mcapChart - > legend ( ) - > hide ( ) ;
auto mcapaxisX = new QDateTimeAxis ;
mcapaxisX - > setTickCount ( 7 ) ;
mcapaxisX - > setFormat ( " yyyy-MM-dd " ) ;
mcapaxisX - > setLabelsColor ( Qt : : lightGray ) ;
mcapaxisX - > setGridLineColor ( Qt : : darkGray ) ;
mcapaxisX - > setTitleText ( " Date " ) ;
mcapChart - > addAxis ( mcapaxisX , Qt : : AlignBottom ) ;
mcapSeries - > attachAxis ( mcapaxisX ) ;
auto mcapaxisY = new QValueAxis ;
mcapaxisY - > setTickCount ( 10 ) ;
mcapaxisY - > setLabelsColor ( Qt : : lightGray ) ;
mcapaxisY - > setGridLineColor ( Qt : : darkGray ) ;
mcapaxisY - > setTitleText ( " DRGX " ) ;
mcapChart - > addAxis ( mcapaxisY , Qt : : AlignLeft ) ;
mcapSeries - > attachAxis ( mcapaxisY ) ;
*/
// Add chart to UI
qDebug ( ) < < " chartType = " < < chartType ;
if ( chartType = = " Price " ) {
ui - > marketChart - > setChart ( priceChart ) ;
} else if ( chartType = = " Volume " ) {
ui - > marketChart - > setChart ( volumeChart ) ;
/*} else if(chartType=="Marketcap") {
ui - > marketChart - > setChart ( mcapChart ) ; */
} else {
ui - > marketChart - > setChart ( priceChart ) ;
}
// Set anti-aliasing
ui - > marketChart - > setRenderHint ( QPainter : : Antialiasing , true ) ;
return ;
} else {
qDebug ( ) < < " No market_chart history returned. API might be down or we are rate-limited " ;
QMessageBox msgBox ;
msgBox . setText ( " No market data returned. API is down or rate limited. Try again after a minute. " ) ;
msgBox . exec ( ) ;
}
} catch ( const std : : exception & e ) {
qDebug ( ) < < QString ( " History feed update failure " ) ;
}
} ) ;
}
void RPC : : shutdownHushd ( ) {