diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 4413358c8a27fee8f029c46117283fa8476563da..33009189748a0a0513083895a64243d74ab09d82 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -842,7 +842,7 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply)
 {
     enum {
         CMD_NONE, CMD_ADD, CMD_DEL, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT, CMD_LIST, CMD_DUMP, CMD_CONNECTIONS, CMD_BALANCER,
-        CMD_BAN, CMD_UNBAN, CMD_BANLIST, CMD_ADD_RPC, CMD_LIST_RPC
+        CMD_BAN, CMD_UNBAN, CMD_BANLIST, CMD_ADD_RPC, CMD_LIST_RPC, CMD_DUMP_RPC
     };
     int arg_index = 1;
     int cmd_num = CMD_NONE;
@@ -871,7 +871,10 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply)
             cmd_num = CMD_LIST;
     }
     else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, dap_min(a_argc, arg_index + 1), "dump", NULL)) {
-        cmd_num = CMD_DUMP;
+        if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-rpc", NULL))
+            cmd_num = CMD_DUMP_RPC;
+        else
+            cmd_num = CMD_DUMP;
     }
     else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, dap_min(a_argc, arg_index + 1), "connections", NULL)) {
         cmd_num = CMD_CONNECTIONS;
@@ -897,7 +900,7 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply)
 
     int l_net_parse_val = dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, NULL, &l_net, CHAIN_TYPE_INVALID);
     if(l_net_parse_val < 0 && cmd_num != CMD_BANLIST && cmd_num != CMD_ADD_RPC && cmd_num != CMD_LIST_RPC) {
-        if ((cmd_num != CMD_CONNECTIONS && cmd_num != CMD_DUMP) || l_net_parse_val == -102)
+        if ((cmd_num != CMD_CONNECTIONS && cmd_num != CMD_DUMP && cmd_num != CMD_DUMP_RPC) || l_net_parse_val == -102)
             return -11;
     }
 
@@ -1055,6 +1058,12 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply)
         dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_string_reply->str);
         dap_string_free(l_string_reply, true);
         return 0;
+    }
+    case CMD_DUMP_RPC: {
+        dap_string_t *l_string_reply = dap_chain_node_states_info_read(l_net, l_node_info->address);
+        dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_string_reply->str);
+        dap_string_free(l_string_reply, true);
+        return 0;
     }
         // add alias
     case CMD_ALIAS:
diff --git a/modules/net/dap_chain_node_rpc.c b/modules/net/dap_chain_node_rpc.c
index eb999a33c29c2329c735289b9594234a356b5df4..7e1de0b0bce8fbc79afed861fa0ebf88448d9894 100644
--- a/modules/net/dap_chain_node_rpc.c
+++ b/modules/net/dap_chain_node_rpc.c
@@ -70,59 +70,6 @@ static void s_update_node_rpc_states_info(UNUSED_ARG void *a_arg)
     DAP_DELETE(l_info);
 }
 
-static void s_states_info_to_str(dap_chain_net_t *a_net, const char *a_node_addr_str, dap_string_t *l_info_str)
-{
-    // sanity check
-    dap_return_if_pass(!a_net || !a_node_addr_str || !l_info_str);
-    // func work
-    // dap_nanotime_t l_timestamp = 0;
-    // size_t l_data_size = 0;
-    // char *l_gdb_group = dap_strdup_printf("%s%s", a_net->pub.gdb_groups_prefix, s_states_group);
-    // byte_t *l_node_info_data = dap_global_db_get_sync(l_gdb_group, a_node_addr_str, &l_data_size, NULL, &l_timestamp);
-    // DAP_DELETE(l_gdb_group);
-    // dap_chain_node_rpc_states_info_t *l_node_info = NULL;
-    // if (!l_node_info_data)
-    //     return log_it(L_ERROR, "Can't find state of node %s in net %s", a_node_addr_str, a_net->pub.name);
-    // if ( (l_data_size - sizeof(dap_chain_node_rpc_states_info_t)) % sizeof(dap_chain_node_addr_t) ) {
-    //     if ( (l_data_size - sizeof(dap_chain_node_net_states_info_v1_t)) % sizeof(dap_chain_node_addr_t) )
-    //         return DAP_DELETE(l_node_info_data), log_it(L_ERROR, "Irrelevant size of node %s info", a_node_addr_str);
-    //     dap_chain_node_net_states_info_v1_t *l_info_old = (dap_chain_node_net_states_info_v1_t*)l_node_info_data;
-    //     l_node_info = DAP_NEW_Z_SIZE( dap_chain_node_rpc_states_info_t, sizeof(dap_chain_node_rpc_states_info_t)
-    //                                   + (l_info_old->uplinks_count + l_info_old->downlinks_count) * sizeof(dap_chain_node_addr_t) );
-    //     l_node_info->version_info = 1;
-    //     memcpy( (byte_t*)l_node_info + node_info_v1_shift, l_info_old, l_data_size );
-    //     DAP_DELETE(l_node_info_data);
-    // } else
-    //     l_node_info = (dap_chain_node_rpc_states_info_t*)l_node_info_data;
-    // char l_ts[80] = { '\0' };
-    // dap_nanotime_to_str_rfc822(l_ts, sizeof(l_ts), l_timestamp);
-    // dap_string_append_printf(l_info_str,
-    //     "Record timestamp: %s\nRecord version: %u\nNode version: %s\nNode addr: %s\nNet: %s\nRole: %s\n"
-    //     "Events count: %"DAP_UINT64_FORMAT_U"\nAtoms count: %"DAP_UINT64_FORMAT_U"\nUplinks count: %u\nDownlinks count: %u\n",
-    //     l_ts, l_node_info->version_info, l_node_info->version_node, a_node_addr_str, a_net->pub.name,
-    //     dap_chain_node_role_to_str(l_node_info->role), l_node_info->info_v1.events_count, l_node_info->info_v1.atoms_count,
-    //     l_node_info->info_v1.uplinks_count, l_node_info->info_v1.downlinks_count);
-    // size_t l_max_links = dap_max(l_node_info->info_v1.uplinks_count, l_node_info->info_v1.downlinks_count);
-    // if(l_max_links) {
-    //     dap_string_append_printf(l_info_str,
-    //     "-----------------------------------------------------------------\n"
-    //     "|\tUplinks node addrs\t|\tDownlinks node addrs\t|\n"
-    //     "-----------------------------------------------------------------\n");
-    // }
-    // for (size_t i = 0; i < l_max_links; ++i) {
-    //     char *l_upnlink_str = i < l_node_info->info_v1.uplinks_count
-    //         ? dap_stream_node_addr_to_str(l_node_info->info_v1.links_addrs[i], false)
-    //         : dap_strdup("\t\t");
-    //     char *l_downlink_str = i < l_node_info->info_v1.downlinks_count
-    //         ? dap_stream_node_addr_to_str(l_node_info->info_v1.links_addrs[i + l_node_info->info_v1.uplinks_count], false)
-    //         : dap_strdup("\t\t");
-    //     dap_string_append_printf(l_info_str, "|\t%s\t|\t%s\t|\n", l_upnlink_str, l_downlink_str);
-    //     DAP_DEL_MULTY(l_upnlink_str, l_downlink_str);
-    // }
-    // dap_string_append_printf(l_info_str, "-----------------------------------------------------------------\n");
-    // DAP_DELETE(l_node_info);
-}
-
 void dap_chain_node_rpc_init(dap_config_t *a_cfg)
 {
     if (!(s_rpc_states_cluster = dap_global_db_cluster_add(
@@ -147,37 +94,31 @@ void dap_chain_node_rpc_init(dap_config_t *a_cfg)
         log_it(L_ERROR, "Can't activate timer on node states update");
 }
 
-// /**
-//  * @brief get states info about current
-//  * @param a_arg - pointer to callback arg
-//  */
-// dap_string_t *dap_chain_node_states_info_read(dap_chain_net_t *a_net, dap_stream_node_addr_t a_addr)
-// {
-//     dap_string_t *l_ret = dap_string_new("");
-//     const char *l_node_addr_str = dap_stream_node_addr_to_str_static(a_addr.uint64 ? a_addr : g_node_addr);
-//     if(!a_net) {
-//         for (dap_chain_net_t *l_net = dap_chain_net_iter_start(); l_net; l_net = dap_chain_net_iter_next(l_net)) {
-//             s_states_info_to_str(l_net, l_node_addr_str, l_ret);
-//         }
-//     } else {
-//         s_states_info_to_str(a_net, l_node_addr_str, l_ret);
-//     }
-//     if (!l_ret->len) {
-//         const char *l_prefix = !a_addr.uint64 ? "my" : a_addr.uint64 == g_node_addr.uint64 ? "my" : "";
-//         if (a_net) {
-//             dap_string_append_printf(l_ret, "Can't find rpc state of %s node %s in net %s", l_prefix, l_node_addr_str, a_net->pub.name);
-//         } else {
-//             dap_string_append_printf(l_ret, "Can't find rpc state of %s node %s in nets ", l_prefix, l_node_addr_str);
-//             dap_chain_net_t *l_current_net = NULL, *l_next_net = dap_chain_net_iter_start();
-//             while(l_next_net) {
-//                 l_current_net = l_next_net;
-//                 l_next_net = dap_chain_net_iter_next(l_next_net);
-//                 dap_string_append_printf(l_ret, l_next_net ? "%s, " : "%s", l_current_net->pub.name);
-//             }
-//         }
-//     }
-//     return l_ret;
-// }
+/**
+ * @brief get states rpc info about current
+ * @param a_arg - pointer to callback arg
+ */
+dap_string_t *dap_chain_node_rpc_states_info_read(dap_stream_node_addr_t a_addr)
+{
+    dap_nanotime_t l_timestamp = 0;
+    size_t l_data_size = 0;
+    dap_string_t *l_ret = dap_string_new("");
+    const char *l_node_addr_str = dap_stream_node_addr_to_str_static(a_addr.uint64 ? a_addr : g_node_addr);
+    dap_chain_node_rpc_states_info_t *l_node_info = (dap_chain_node_rpc_states_info_t *)dap_global_db_get_sync(s_rpc_states_group, l_node_addr_str, &l_data_size, NULL, &l_timestamp);
+    if (!l_node_info) {
+        log_it(L_ERROR, "Can't find state of rpc node %s", l_node_addr_str);
+        dap_string_append_printf(l_ret, "Can't find state of %s rpc node", l_node_addr_str);
+        return l_ret;
+    }
+    char l_ts[80] = { '\0' };
+    dap_nanotime_to_str_rfc822(l_ts, sizeof(l_ts), l_timestamp);
+    dap_string_append_printf(l_ret,
+        "Record timestamp: %s\nRecord version: %u\nNode addr: %s\n"
+        "Location: %s\nCli thread count: %u\nLinks count: %u\n",
+        l_ts, l_node_info->version, l_node_addr_str,
+        l_node_info->location, l_node_info->cli_thread_count, l_node_info->links_count);
+    return l_ret;
+}
 
 
 bool dap_chain_node_rpc_is_my_node_authorized()