Skip to content

Commit 4a2d105

Browse files
authored
Merge pull request #2415 from KomodoPlatform/update/defi-stats-api
add pair trades 24hr stat
2 parents 66566ee + 0d2974f commit 4a2d105

File tree

5 files changed

+142
-19
lines changed

5 files changed

+142
-19
lines changed

atomic_defi_design/Dex/Exchange/Trade/OrderBook/Vertical.qml

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import Dex.Themes 1.0 as Dex
1212
Widget
1313
{
1414
title: qsTr("Order Book")
15+
readonly property string pair_trades_24hr: API.app.trading_pg.pair_trades_24hr
1516
readonly property string pair_volume_24hr: API.app.trading_pg.pair_volume_24hr
1617
readonly property string pair: atomic_qt_utilities.retrieve_main_ticker(left_ticker) + "/" + atomic_qt_utilities.retrieve_main_ticker(right_ticker)
1718

@@ -61,7 +62,7 @@ Widget
6162
Layout.bottomMargin: 2
6263
Layout.alignment: Qt.AlignHCenter
6364
color: Dex.CurrentTheme.foregroundColor2
64-
text_value: pair + qsTr(" traded 24hrs: %1").arg("<b>" + General.convertUsd(pair_volume_24hr) + "</b>")
65+
text_value: pair + qsTr(" 24hrs | %1 | %2 trades").arg(General.convertUsd(pair_volume_24hr)).arg(pair_trades_24hr)
6566
font.pixelSize: Style.textSizeSmall1
6667
}
6768
}

src/core/atomicdex/pages/qt.trading.page.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,7 @@ namespace atomic_dex
708708
this->m_preferred_order = std::nullopt;
709709
this->m_fees = QVariantMap();
710710
this->m_cex_price = "0";
711+
this->m_pair_trades_24hr = "0";
711712
this->m_pair_volume_24hr = "0";
712713
this->m_post_clear_forms = true;
713714
this->set_selected_order_status(SelectedOrderStatus::None);
@@ -1394,15 +1395,24 @@ namespace atomic_dex
13941395
const auto* market_selector = get_market_pairs_mdl();
13951396
const auto& base = utils::retrieve_main_ticker(market_selector->get_left_selected_coin().toStdString(), true);
13961397
const auto& rel = utils::retrieve_main_ticker(market_selector->get_right_selected_coin().toStdString(), true);
1398+
QString trades = QString::fromStdString(defi_stats_service.get_trades_24h(base, rel));
13971399
QString vol = QString::fromStdString(defi_stats_service.get_volume_24h_usd(base, rel));
13981400

13991401
if (vol != m_pair_volume_24hr)
14001402
{
1403+
m_pair_trades_24hr = trades;
1404+
emit pairTrades24hrChanged();
14011405
m_pair_volume_24hr = vol;
14021406
emit pairVolume24hrChanged();
14031407
}
14041408
}
14051409

1410+
QString
1411+
trading_page::get_pair_trades_24hr() const
1412+
{
1413+
return m_pair_trades_24hr;
1414+
}
1415+
14061416
QString
14071417
trading_page::get_pair_volume_24hr() const
14081418
{

src/core/atomicdex/pages/qt.trading.page.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ namespace atomic_dex
5959
Q_PROPERTY(SelectedOrderStatus selected_order_status READ get_selected_order_status WRITE set_selected_order_status NOTIFY selectedOrderStatusChanged)
6060
Q_PROPERTY(QString price_reversed READ get_price_reversed NOTIFY priceReversedChanged)
6161
Q_PROPERTY(QString pair_volume_24hr READ get_pair_volume_24hr NOTIFY pairVolume24hrChanged)
62+
Q_PROPERTY(QString pair_trades_24hr READ get_pair_trades_24hr NOTIFY pairTrades24hrChanged)
6263
Q_PROPERTY(QString cex_price READ get_cex_price NOTIFY cexPriceChanged)
6364
Q_PROPERTY(QString cex_price_reversed READ get_cex_price_reversed NOTIFY cexPriceReversedChanged)
6465
Q_PROPERTY(QString cex_price_diff READ get_cex_price_diff NOTIFY cexPriceDiffChanged)
@@ -115,6 +116,7 @@ namespace atomic_dex
115116
QString m_total_amount{"0.00777"};
116117
QString m_cex_price{"0"};
117118
QString m_pair_volume_24hr{"0"};
119+
QString m_pair_trades_24hr{"0"};
118120
QString m_minimal_trading_amount{"0.0001"};
119121
std::optional<nlohmann::json> m_preferred_order;
120122
boost::synchronized_value<QVariantMap> m_fees;
@@ -197,6 +199,7 @@ namespace atomic_dex
197199
void set_total_amount(QString total_amount);
198200
[[nodiscard]] QString get_base_amount() const;
199201
[[nodiscard]] QString get_rel_amount() const;
202+
[[nodiscard]] QString get_pair_trades_24hr() const;
200203
[[nodiscard]] QString get_pair_volume_24hr() const;
201204
[[nodiscard]] QString get_cex_price() const;
202205
[[nodiscard]] QString get_cex_price_reversed() const;
@@ -238,6 +241,7 @@ namespace atomic_dex
238241
void baseAmountChanged();
239242
void relAmountChanged();
240243
void feesChanged();
244+
void pairTrades24hrChanged();
241245
void pairVolume24hrChanged();
242246
void cexPriceChanged();
243247
void cexPriceReversedChanged();

src/core/atomicdex/services/price/defi.stats.cpp

+121-14
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,17 @@ namespace
4949
pplx::cancellation_token_source d_token_source;
5050

5151
pplx::task<web::http::http_response>
52-
async_fetch_defi_ticker_stats()
52+
async_fetch_defi_stats_volumes()
5353
{
5454
web::http::http_request req;
5555
req.set_method(web::http::methods::GET);
56-
req.set_request_uri(FROM_STD_STR("api/v3/tickers/summary"));
56+
req.set_request_uri(FROM_STD_STR("api/v3/pairs/volumes_24hr"));
5757
SPDLOG_INFO("defi_stats req: {}", TO_STD_STR(req.to_string()));
5858
return g_defi_stats_client->request(req, d_token_source.get_token());
5959
}
6060

6161
nlohmann::json
62-
process_fetch_defi_ticker_stats_answer(web::http::http_response resp)
62+
process_fetch_defi_stats_volumes_answer(web::http::http_response resp)
6363
{
6464
std::string body = TO_STD_STR(resp.extract_string(true).get());
6565
if (resp.status_code() == 200)
@@ -119,11 +119,11 @@ namespace atomic_dex
119119
this->process_update();
120120
};
121121
};
122-
async_fetch_defi_ticker_stats()
122+
async_fetch_defi_stats_volumes()
123123
.then(
124124
[this](web::http::http_response resp)
125125
{
126-
this->m_defi_ticker_stats = process_fetch_defi_ticker_stats_answer(resp);
126+
this->m_defi_stats_volumes = process_fetch_defi_stats_volumes_answer(resp);
127127
nb_try = 0;
128128
})
129129
.then(error_functor);
@@ -136,33 +136,140 @@ namespace atomic_dex
136136
auto ticker = base + "_" + quote;
137137
auto ticker_reversed = quote + "_" + base;
138138
SPDLOG_INFO("Getting 24hr volume data for {}", ticker);
139+
140+
// Check if base/quote are the same
139141
if (base == quote)
140142
{
141143
SPDLOG_INFO("Base/quote must be different, no volume data for {}", ticker);
142144
return volume_24h_usd;
143145
}
144146

145-
auto defi_ticker_stats = m_defi_ticker_stats.get();
146-
// SPDLOG_INFO("Volume data: {}", defi_ticker_stats.dump(4));
147+
// Check if defi_stats_volumes is valid
148+
auto defi_stats_volumes = m_defi_stats_volumes.get();
149+
if (!defi_stats_volumes.is_object())
150+
{
151+
SPDLOG_WARN("Invalid defi stats volumes data.");
152+
return volume_24h_usd;
153+
}
147154

148-
if (defi_ticker_stats.contains("data"))
155+
// Check if volumes key exists
156+
if (!defi_stats_volumes.contains("volumes"))
157+
{
158+
SPDLOG_WARN("No volumes data available.");
159+
return volume_24h_usd;
160+
}
161+
162+
// Extract ticker trade_volume_usd safely
163+
if (defi_stats_volumes.at("volumes").contains(ticker))
149164
{
150-
SPDLOG_INFO("Combined volume usd: {}", defi_ticker_stats["combined_volume_usd"]);
151-
if (defi_ticker_stats.at("data").contains(ticker))
165+
auto volume_node = defi_stats_volumes["volumes"][ticker]["ALL"]["trade_volume_usd"];
166+
if (volume_node.is_number())
152167
{
153-
volume_24h_usd = defi_ticker_stats.at("data").at(ticker).at("volume_usd_24hr").get<std::string>();
168+
volume_24h_usd = std::to_string(volume_node.get<double>());
154169
SPDLOG_INFO("{} volume usd: {}", ticker, volume_24h_usd);
155170
}
156-
else if (defi_ticker_stats.at("data").contains(ticker_reversed))
171+
else if (volume_node.is_null())
172+
{
173+
SPDLOG_WARN("Volume value is null for {}", ticker);
174+
}
175+
else
176+
{
177+
SPDLOG_WARN("Volume value is not a number for {}: {}", ticker, volume_node.type_name());
178+
}
179+
}
180+
else if (defi_stats_volumes["volumes"].contains(ticker_reversed))
181+
{
182+
auto volume_node = defi_stats_volumes["volumes"][ticker_reversed]["ALL"]["trade_volume_usd"];
183+
if (volume_node.is_number())
157184
{
158-
volume_24h_usd = defi_ticker_stats.at("data").at(ticker_reversed).at("volume_usd_24hr").get<std::string>();
185+
volume_24h_usd = std::to_string(volume_node.get<double>());
159186
SPDLOG_INFO("{} volume usd: {}", ticker_reversed, volume_24h_usd);
160187
}
188+
else if (volume_node.is_null())
189+
{
190+
SPDLOG_WARN("Volume value is null for {}", ticker);
191+
}
192+
else
193+
{
194+
SPDLOG_WARN("Volume value is not a number for {}: {}", ticker, volume_node.type_name());
195+
}
161196
}
162197
else
163198
{
164-
SPDLOG_WARN("Empty 24hr volume data for {}", defi_ticker_stats.dump(4));
199+
SPDLOG_WARN("No volume data available for {}", ticker);
165200
}
166201
return volume_24h_usd;
167202
}
203+
204+
std::string
205+
global_defi_stats_service::get_trades_24h(const std::string& base, const std::string& quote) const
206+
{
207+
std::string trades_24h = "0";
208+
auto ticker = base + "_" + quote;
209+
auto ticker_reversed = quote + "_" + base;
210+
SPDLOG_INFO("Getting 24hr trade data for {}", ticker);
211+
212+
// Check if base/quote are the same
213+
if (base == quote)
214+
{
215+
SPDLOG_INFO("Base/quote must be different, no volume data for {}", ticker);
216+
return trades_24h;
217+
}
218+
219+
// Check if defi_stats_volumes is valid
220+
auto defi_stats_volumes = m_defi_stats_volumes.get();
221+
if (!defi_stats_volumes.is_object())
222+
{
223+
SPDLOG_WARN("Invalid defi stats volumes data.");
224+
return trades_24h;
225+
}
226+
227+
// Check if volumes key exists
228+
if (!defi_stats_volumes.contains("volumes"))
229+
{
230+
SPDLOG_WARN("No volumes data available.");
231+
return trades_24h;
232+
}
233+
234+
// Extract ticker trade_volume_usd safely
235+
if (defi_stats_volumes.at("volumes").contains(ticker))
236+
{
237+
auto trades_node = defi_stats_volumes["volumes"][ticker]["ALL"]["trades_24hr"];
238+
if (trades_node.is_number())
239+
{
240+
trades_24h = std::to_string(trades_node.get<int>());
241+
SPDLOG_INFO("{} trades_24h: {}", ticker, trades_24h);
242+
}
243+
else if (trades_node.is_null())
244+
{
245+
SPDLOG_WARN("Trades value is null for {}", ticker);
246+
}
247+
else
248+
{
249+
SPDLOG_WARN("Trades value is not a number for {}: {}", ticker, trades_node.type_name());
250+
}
251+
}
252+
else if (defi_stats_volumes["volumes"].contains(ticker_reversed))
253+
{
254+
auto trades_node = defi_stats_volumes["volumes"][ticker_reversed]["ALL"]["trades_24hr"];
255+
if (trades_node.is_number())
256+
{
257+
trades_24h = std::to_string(trades_node.get<int>());
258+
SPDLOG_INFO("{} trades_24h: {}", ticker_reversed, trades_24h);
259+
}
260+
else if (trades_node.is_null())
261+
{
262+
SPDLOG_WARN("Trades value is null for {}", ticker);
263+
}
264+
else
265+
{
266+
SPDLOG_WARN("Trades value is not a number for {}: {}", ticker, trades_node.type_name());
267+
}
268+
}
269+
else
270+
{
271+
SPDLOG_WARN("No trades data available for {}", ticker);
272+
}
273+
return trades_24h;
274+
}
168275
} // namespace atomic_dex

src/core/atomicdex/services/price/defi.stats.hpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,18 @@
2424

2525
namespace atomic_dex::mm2
2626
{
27-
struct defi_ticker_stats_answer
27+
struct defi_stats_volumes_answer
2828
{
2929
nlohmann::json result;
3030
int status_code;
3131
};
32-
void from_json(const nlohmann::json& j, defi_ticker_stats_answer& answer);
32+
void from_json(const nlohmann::json& j, defi_stats_volumes_answer& answer);
3333
} // namespace atomic_dex::mm2
3434

3535

3636
namespace atomic_dex
3737
{
38-
using t_defi_ticker_stats_answer = mm2::defi_ticker_stats_answer;
38+
using t_defi_stats_volumes_answer = mm2::defi_stats_volumes_answer;
3939
} // namespace atomic_dex
4040

4141
namespace atomic_dex
@@ -49,7 +49,7 @@ namespace atomic_dex
4949

5050
//! Private member fields
5151
ag::ecs::system_manager& m_system_manager;
52-
t_json_synchronized m_defi_ticker_stats;
52+
t_json_synchronized m_defi_stats_volumes;
5353
t_defi_stats_time_point m_update_clock;
5454

5555
//! private functions
@@ -67,6 +67,7 @@ namespace atomic_dex
6767

6868
//! Public API
6969
void process_defi_stats();
70+
std::string get_trades_24h(const std::string& base, const std::string& quote) const;
7071
std::string get_volume_24h_usd(const std::string& base, const std::string& quote) const;
7172

7273

0 commit comments

Comments
 (0)