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