From 512f7f7a1d4d17b79dd9b0f8523d24e67cd03bdd Mon Sep 17 00:00:00 2001
From: "alexey.stratulat" <alexey.stratulat@demlabs.net>
Date: Fri, 20 Jan 2023 05:07:28 +0000
Subject: [PATCH] Features 7409

---
 modules/net/CMakeLists.txt                    |  6 +-
 modules/net/dap_chain_net.c                   | 32 ++++++++++-
 modules/net/srv/include/dap_chain_net_srv.h   | 10 ++++
 .../dap_chain_net_srv_stake_pos_delegate.c    | 57 +++++++++++++++++++
 .../dap_chain_net_srv_stake_pos_delegate.h    |  3 +
 .../xchange/dap_chain_net_srv_xchange.c       | 21 +++++++
 .../include/dap_chain_net_srv_xchange.h       |  2 +
 7 files changed, 126 insertions(+), 5 deletions(-)

diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt
index 6b7d71b810..f8cb5ff9f3 100644
--- a/modules/net/CMakeLists.txt
+++ b/modules/net/CMakeLists.txt
@@ -38,16 +38,16 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS
 
 if(WIN32)
   target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_client dap_io dap_notify_srv dap_cli_server dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_chain dap_chain_wallet dap_chain_net_srv dap_stream_ch_chain_voting
-                            dap_chain_mempool dap_global_db dap_chain_cs_none)
+                            dap_chain_mempool dap_global_db dap_chain_cs_none dap_chain_net_srv_stake_pos_delegate dap_chain_net_srv_xchange)
 endif()
 
 if(LINUX)
     target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_io dap_notify_srv dap_cli_server dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_stream_ch_chain_voting dap_chain
-      dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_global_db dap_chain_cs_none
+      dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_global_db dap_chain_cs_none dap_chain_net_srv_stake_pos_delegate dap_chain_net_srv_xchange
       resolv )
 elseif(BSD)
     target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_io dap_notify_srv dap_cli_server dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_stream_ch_chain_net_srv dap_stream_ch_chain_voting dap_chain
-      dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_global_db dap_chain_cs_none )
+      dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_global_db dap_chain_cs_none dap_chain_net_srv_stake_pos_delegate dap_chain_net_srv_xchange)
 endif()
 
 
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 5f508e225f..a69304f694 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -113,6 +113,8 @@
 
 #include "json-c/json.h"
 #include "json-c/json_object.h"
+#include "dap_chain_net_srv_stake_pos_delegate.h"
+#include "dap_chain_net_srv_xchange.h"
 
 #include <stdio.h>
 #include <sys/types.h>
@@ -285,8 +287,8 @@ int dap_chain_net_init()
         "net -net <chain net name> [-mode {update | all}] go {online | offline | sync}\n"
             "\tFind and establish links and stay online. \n"
             "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n"
-        "net -net <chain net name> get status\n"
-            "\tLook at current status\n"
+        "net -net <chain net name> get {status | fee}\n"
+            "\tDisplays the current current status or current fee.\n"
         "net -net <chain net name> stats {tx | tps} [-from <From time>] [-to <To time>] [-prev_sec <Seconds>] \n"
             "\tTransactions statistics. Time format is <Year>-<Month>-<Day>_<Hours>:<Minutes>:<Seconds> or just <Seconds> \n"
         "net -net <chain net name> [-mode {update | all}] sync {all | gdb | chains}\n"
@@ -1812,6 +1814,32 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
                 s_set_reply_text_node_status(a_str_reply, l_net);
                 l_ret = 0;
             }
+            if ( strcmp(l_get_str, "fee") == 0) {
+                dap_string_t *l_str = dap_string_new("\0");
+                // Network fee
+                uint256_t l_network_fee = {};
+                dap_chain_addr_t l_network_fee_addr = {};
+                dap_chain_net_tx_get_fee(l_net->pub.id, &l_network_fee, &l_network_fee_addr);
+                char *l_network_fee_balance_str = dap_chain_balance_print(l_network_fee);
+                char *l_network_fee_coins_str = dap_chain_balance_to_coins(l_network_fee);
+                char *l_network_fee_addr_str = dap_chain_addr_to_str(&l_network_fee_addr);
+                dap_string_append_printf(l_str, "Fees on %s network:\n"
+                                                "\t Network: %s (%s) %s Addr: %s\n",
+                                                  l_net->pub.name, l_network_fee_coins_str, l_network_fee_balance_str,
+                                                  l_net->pub.native_ticker, l_network_fee_addr_str);
+                DAP_DELETE(l_network_fee_coins_str);
+                DAP_DELETE(l_network_fee_balance_str);
+                DAP_DELETE(l_network_fee_addr_str);
+
+                //Get validators fee
+                dap_chain_net_srv_stake_get_fee_validators(l_net, l_str);
+                //Get services fee
+                dap_string_append_printf(l_str, "Services fee: \n");
+                dap_chain_net_srv_xchange_print_fee(l_net, l_str); //Xchaneg fee
+
+                *a_str_reply = dap_string_free(l_str, false);
+                l_ret = 0;
+            }
         } else if ( l_links_str ){
             if ( strcmp(l_links_str,"list") == 0 ) {
                 size_t i =0;
diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h
index 94984ee154..fe6d85e9cc 100755
--- a/modules/net/srv/include/dap_chain_net_srv.h
+++ b/modules/net/srv/include/dap_chain_net_srv.h
@@ -341,3 +341,13 @@ DAP_STATIC_INLINE bool dap_chain_net_srv_uid_compare(dap_chain_net_srv_uid_t a,
     return !memcmp(&a, &b, DAP_CHAIN_NET_SRV_UID_SIZE);
 #endif
 }
+
+DAP_STATIC_INLINE const char *dap_chain_net_srv_fee_type_to_str(dap_chain_net_srv_fee_type_t a_fee_type) {
+    switch (a_fee_type) {
+        case SERVICE_FEE_OWN_FIXED: return "SERVICE_FEE_OWN_FIXED";
+        case SERVICE_FEE_OWN_PERCENT: return "SERVICE_FEE_OWN_PERCENT";
+        case SERVICE_FEE_NATIVE_FIXED: return "SERVICE_FEE_NATIVE_FIXED";
+        case SERIVCE_FEE_NATIVE_PERCENT: return "SERIVCE_FEE_NATIVE_PERCENT";
+        default: return "UNKNOWN";
+    }
+}
diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c
index 7cf8556811..1c1624f1f7 100644
--- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c
+++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c
@@ -1327,3 +1327,60 @@ static bool s_verificator_stake_updater_callback(dap_ledger_t *a_ledger, dap_cha
     }
     return s_stake_conditions_calc(a_cond, a_tx, true, true);
 }
+
+void dap_chain_net_srv_stake_get_fee_validators(dap_chain_net_t *a_net, dap_string_t *a_string_ret){
+    if (!a_net || !a_string_ret)
+        return;
+    char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(a_net);
+    size_t l_orders_count = 0;
+    dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count);
+    uint256_t l_max = {0};
+    uint256_t l_min = {0};
+    uint256_t l_average = {0};
+//    bool setMinimal = false;
+    uint64_t l_order_fee_count = 0;
+    for (size_t i = 0; i < l_orders_count; i++) {
+        dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_orders[i].value;
+        if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID)
+            continue;
+        if (l_orders_count == 0) {
+            l_min = l_order->price;
+            l_max = l_order->price;
+        }
+        l_order_fee_count++;
+        uint256_t t = {0};
+        SUM_256_256(l_order->price, l_average, &t);
+        l_average = t;
+        int res = compare256(l_min, l_order->price);
+        if (res == 1) {
+            l_min = l_order->price;
+        }
+        res = compare256(l_max, l_order->price);
+        if (res == -1) {
+            l_max = l_order->price;
+        }
+    }
+    uint256_t t = {0};
+    if (!IS_ZERO_256(l_average)) DIV_256(l_average, dap_chain_uint256_from(l_order_fee_count), &t);
+    dap_global_db_objs_delete(l_orders, l_orders_count);
+    DAP_DELETE( l_gdb_group_str);
+    const char *l_native_token  =  a_net->pub.native_ticker;
+    char *l_min_balance = dap_chain_balance_print(l_min);
+    char *l_min_coins = dap_chain_balance_to_coins(l_min);
+    char *l_max_balance = dap_chain_balance_print(l_max);
+    char *l_max_coins = dap_chain_balance_to_coins(l_max);
+    char *l_average_balance = dap_chain_balance_print(t);
+    char *l_average_coins = dap_chain_balance_to_coins(t);
+    dap_string_append_printf(a_string_ret, "Validator fee: \n"
+                                           "\t MIN: %s (%s) %s\n"
+                                           "\t MAX: %s (%s) %s\n"
+                                           "\t Average: %s (%s) %s \n", l_min_coins, l_min_balance, l_native_token,
+                                           l_max_coins, l_max_balance, l_native_token,
+                                           l_average_coins, l_average_balance, l_native_token);
+    DAP_DELETE(l_min_balance);
+    DAP_DELETE(l_min_coins);
+    DAP_DELETE(l_max_balance);
+    DAP_DELETE(l_max_coins);
+    DAP_DELETE(l_average_balance);
+    DAP_DELETE(l_average_coins);
+}
diff --git a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h
index 5c1ebf6a8f..8d62350107 100644
--- a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h
+++ b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h
@@ -27,6 +27,7 @@
 #include "dap_chain_ledger.h"
 #include "dap_chain_net_srv.h"
 #include "dap_chain_net_srv_order.h"
+#include "dap_math_ops.h"
 
 #define DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID 0x13
 
@@ -60,3 +61,5 @@ void dap_chain_net_srv_stake_pos_delegate_deinit();
 bool dap_chain_net_srv_stake_validator(dap_chain_addr_t *a_addr, dap_chain_datum_t *a_datum);
 bool dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_addr);
 dap_list_t *dap_chain_net_srv_stake_get_validators();
+
+void dap_chain_net_srv_stake_get_fee_validators(dap_chain_net_t *a_net, dap_string_t *a_string);
diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c
index bc43f524af..08588196b4 100644
--- a/modules/service/xchange/dap_chain_net_srv_xchange.c
+++ b/modules/service/xchange/dap_chain_net_srv_xchange.c
@@ -2233,3 +2233,24 @@ static int s_callback_receipt_next_success(dap_chain_net_srv_t *a_srv, uint32_t
 {
     return 0;
 }
+
+void dap_chain_net_srv_xchange_print_fee(dap_chain_net_t *a_net, dap_string_t *a_string_ret){
+    if (!a_net || !a_string_ret)
+        return;
+    uint256_t l_fee = {0};
+    dap_chain_addr_t l_addr = {0};
+    uint16_t l_type = 0;
+    if (s_srv_xchange_get_fee(a_net->pub.id, &l_fee, &l_addr, &l_type)) {
+        char *l_fee_balance = dap_chain_balance_print(l_fee);
+        char *l_fee_coins = dap_chain_balance_to_coins(l_fee);
+        char *l_addr_str = dap_chain_addr_to_str(&l_addr);
+        const char *l_type_str = dap_chain_net_srv_fee_type_to_str((dap_chain_net_srv_fee_type_t)l_type);
+        dap_string_append_printf(a_string_ret, "\txchange:\n"
+                                               "\t\tFee: %s (%s)\n"
+                                               "\t\tAddr: %s\n"
+                                               "\t\tType: %s\n", l_fee_coins, l_fee_balance, l_addr_str, l_type_str);
+    } else {
+        dap_string_append_printf(a_string_ret, "\txchange:\n"
+                                               "\t\tThe xchanger service has not announced a commission fee.\n");
+    }
+}
diff --git a/modules/service/xchange/include/dap_chain_net_srv_xchange.h b/modules/service/xchange/include/dap_chain_net_srv_xchange.h
index cbc65a355f..94544ab8df 100644
--- a/modules/service/xchange/include/dap_chain_net_srv_xchange.h
+++ b/modules/service/xchange/include/dap_chain_net_srv_xchange.h
@@ -59,3 +59,5 @@ extern const dap_chain_net_srv_uid_t c_dap_chain_net_srv_xchange_uid;
 
 int dap_chain_net_srv_xchange_init();
 void dap_chain_net_srv_xchange_deinit();
+
+void dap_chain_net_srv_xchange_print_fee(dap_chain_net_t *a_net, dap_string_t *a_string_ret);
-- 
GitLab