From a7fe41e4df5baf8e2fcba9d25b999eb0fa82511f Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Fri, 4 Oct 2024 14:17:54 +0700
Subject: [PATCH 01/33] [+]exec_cmd http

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index f2b762fcfb..0e4a8af4bf 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit f2b762fcfbf3d799029d9a52963b09fefd9e711b
+Subproject commit 0e4a8af4bf206fc6ce5c90d3bb4f4426f7847589
-- 
GitLab


From 8d12fefcebc7c72bf57f6c082b379dcef3060bcc Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Fri, 4 Oct 2024 14:22:24 +0700
Subject: [PATCH 02/33] ...

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 0e4a8af4bf..137194f397 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 0e4a8af4bf206fc6ce5c90d3bb4f4426f7847589
+Subproject commit 137194f3972fc70c496e7bb2a97274d6f9004a32
-- 
GitLab


From 0e2875691b089fab9e335f4b9e94c620499f4cf5 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 9 Oct 2024 17:11:53 +0700
Subject: [PATCH 03/33] [*] http json

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 137194f397..0809235356 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 137194f3972fc70c496e7bb2a97274d6f9004a32
+Subproject commit 0809235356b18200560c866e95294cda39ff3a68
-- 
GitLab


From 6153bdc93ac4962eee3a98aa67374a7ea09a66a9 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Mon, 14 Oct 2024 14:24:45 +0700
Subject: [PATCH 04/33] [*] fix exec_cmd

---
 dap-sdk                                      |  2 +-
 modules/net/dap_chain_node_cli.c             |  3 ++
 modules/net/dap_chain_node_cli_cmd.c         | 43 ++++++++++++++++++++
 modules/net/include/dap_chain_node_cli_cmd.h |  2 +
 4 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 0809235356..188dd5b6c0 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 0809235356b18200560c866e95294cda39ff3a68
+Subproject commit 188dd5b6c0dca38a173d1dcc3413f562dfa3c920
diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index 99484040af..13e8e6799b 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -342,6 +342,9 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
             "decree info -net <net_name>\n"
             "Displays information about the parameters of the decrees in the network.\n");
 
+    dap_cli_server_cmd_add ("exit", com_exec_cmd, "Execute command on remote node",
+            "exec_cmd -net <net_name> -addr <node_addr> -cmd <command,and,all,args,separated,by,commas>\n" );
+
     // Exit - always last!
     dap_cli_server_cmd_add ("exit", com_exit, "Stop application and exit",
                 "exit\n" );
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 2aa446bd15..66ef5a5659 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -103,6 +103,8 @@
 #include "dap_json_rpc_errors.h"
 #include "dap_http_ban_list_client.h"
 #include "dap_chain_datum_tx_voting.h"
+#include "dap_json_rpc.h"
+#include "dap_json_rpc_request.h"
 
 
 #define LOG_TAG "chain_node_cli_cmd"
@@ -8538,3 +8540,44 @@ void dap_notify_new_client_send_info(dap_events_socket_t *a_es, UNUSED_ARG void
     }
     json_object_put(l_json_wallets);
 }
+
+int com_exec_cmd(int argc, char **argv, void **reply) {
+    json_object ** a_json_arr_reply = (json_object **) reply;
+    if (!dap_json_rpc_exec_cmd_inited()) {
+        log_it(L_ERROR, "Json-rpc module doesn't inited, check confings");
+        return -1;
+    }
+
+    const char * l_cmd_arg_str = NULL, * l_ip_str = NULL, * l_net_str = NULL;
+    int arg_index = 1;
+    dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-cmd", &l_cmd_arg_str);
+    dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-addr", &l_ip_str);
+    dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-net", &l_net_str);
+    if (!l_cmd_arg_str || ! l_ip_str || !l_net_str) {
+        dap_json_rpc_error_add(-1, "Command exec_cmd require args -cmd, -addr, -net");
+    }
+    dap_chain_net_t* l_net = NULL;
+    l_net = dap_chain_net_by_name(l_net_str);
+
+    dap_json_rpc_params_t * params = dap_json_rpc_params_create();
+    char *l_cmd_str = dap_strdup(l_cmd_arg_str);
+    for(int i = 0; l_cmd_str[i] != '\0'; i++) {
+        if (l_cmd_str[i] == ',')
+            l_cmd_str[i] = ';';
+    }
+    dap_json_rpc_params_add_data(params, l_cmd_str, TYPE_PARAM_STRING);
+    uint64_t l_id_response = dap_json_rpc_response_get_new_id();
+    char ** l_cmd_arr_str = dap_strsplit(l_cmd_str, ";", -1);
+    dap_json_rpc_request_t *a_request = dap_json_rpc_request_creation(l_cmd_arr_str[0], params, l_id_response);
+    dap_strfreev(l_cmd_arr_str);
+    // char * request_str = dap_json_rpc_request_to_json_string(a_request);
+    dap_chain_node_addr_t l_node_addr;
+    dap_chain_node_addr_from_str(&l_node_addr, l_ip_str);
+    dap_chain_node_info_t *l_remote = dap_chain_node_info_read(l_net, &l_node_addr);
+    DAP_DEL_Z(l_cmd_str);
+    if (!dap_json_rpc_request_send(a_request, dap_json_rpc_response_accepted, l_remote->ext_host, l_remote->ext_port, dap_json_rpc_error_callback))
+        log_it(L_INFO, "com_exec sent request to %s:%d", l_remote->ext_host, l_remote->ext_port);
+
+    json_object_array_add(*a_json_arr_reply, json_object_new_string("DONE"));
+    return 0;
+}
diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h
index bf894e4123..cb6e5eb6c1 100644
--- a/modules/net/include/dap_chain_node_cli_cmd.h
+++ b/modules/net/include/dap_chain_node_cli_cmd.h
@@ -363,3 +363,5 @@ int com_signer(int a_argc, char **a_argv, void **a_str_reply);
 int cmd_remove(int a_argc, char **a_argv, void **a_str_reply);
 
 void dap_notify_new_client_send_info(dap_events_socket_t *a_es, void *a_arg);
+
+int com_exec_cmd(int argc, char **argv, void **reply);
-- 
GitLab


From cd14ea41255f769b4e439f3b7849347483e84fd5 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Mon, 14 Oct 2024 15:19:00 +0700
Subject: [PATCH 05/33] [*] fix exec_cmd

---
 modules/net/dap_chain_node_cli.c     |  2 +-
 modules/net/dap_chain_node_cli_cmd.c | 15 ++++++++++-----
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index 13e8e6799b..7de59d2354 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -342,7 +342,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
             "decree info -net <net_name>\n"
             "Displays information about the parameters of the decrees in the network.\n");
 
-    dap_cli_server_cmd_add ("exit", com_exec_cmd, "Execute command on remote node",
+    dap_cli_server_cmd_add ("exec_cmd", com_exec_cmd, "Execute command on remote node",
             "exec_cmd -net <net_name> -addr <node_addr> -cmd <command,and,all,args,separated,by,commas>\n" );
 
     // Exit - always last!
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 66ef5a5659..64a501efa3 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8544,17 +8544,18 @@ void dap_notify_new_client_send_info(dap_events_socket_t *a_es, UNUSED_ARG void
 int com_exec_cmd(int argc, char **argv, void **reply) {
     json_object ** a_json_arr_reply = (json_object **) reply;
     if (!dap_json_rpc_exec_cmd_inited()) {
-        log_it(L_ERROR, "Json-rpc module doesn't inited, check confings");
+        dap_json_rpc_error_add(-1, "Json-rpc module doesn't inited, check confings");
         return -1;
     }
 
-    const char * l_cmd_arg_str = NULL, * l_ip_str = NULL, * l_net_str = NULL;
+    const char * l_cmd_arg_str = NULL, * l_addr_str = NULL, * l_net_str = NULL;
     int arg_index = 1;
     dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-cmd", &l_cmd_arg_str);
-    dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-addr", &l_ip_str);
+    dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-addr", &l_addr_str);
     dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-net", &l_net_str);
-    if (!l_cmd_arg_str || ! l_ip_str || !l_net_str) {
+    if (!l_cmd_arg_str || ! l_addr_str || !l_net_str) {
         dap_json_rpc_error_add(-1, "Command exec_cmd require args -cmd, -addr, -net");
+        return -2;
     }
     dap_chain_net_t* l_net = NULL;
     l_net = dap_chain_net_by_name(l_net_str);
@@ -8572,9 +8573,13 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     dap_strfreev(l_cmd_arr_str);
     // char * request_str = dap_json_rpc_request_to_json_string(a_request);
     dap_chain_node_addr_t l_node_addr;
-    dap_chain_node_addr_from_str(&l_node_addr, l_ip_str);
+    dap_chain_node_addr_from_str(&l_node_addr, l_addr_str);
     dap_chain_node_info_t *l_remote = dap_chain_node_info_read(l_net, &l_node_addr);
     DAP_DEL_Z(l_cmd_str);
+    if (!l_remote) {
+        dap_json_rpc_error_add(-1, "Can't find remote node: %s", l_addr_str);
+        return -3;
+    }
     if (!dap_json_rpc_request_send(a_request, dap_json_rpc_response_accepted, l_remote->ext_host, l_remote->ext_port, dap_json_rpc_error_callback))
         log_it(L_INFO, "com_exec sent request to %s:%d", l_remote->ext_host, l_remote->ext_port);
 
-- 
GitLab


From 90c1e2394ac4bc4c788b32b387233cc309e4b60b Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Mon, 14 Oct 2024 17:46:04 +0700
Subject: [PATCH 06/33] [*] sub up

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 188dd5b6c0..dda5cbce37 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 188dd5b6c0dca38a173d1dcc3413f562dfa3c920
+Subproject commit dda5cbce37bcec5906c8bee9081f51b44f91525b
-- 
GitLab


From 2580789b1d851913198fe8c6e7795d0bab052f14 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Thu, 17 Oct 2024 17:05:33 +0700
Subject: [PATCH 07/33] [+] json enc

---
 dap-sdk                              |   2 +-
 modules/net/dap_chain_node_cli_cmd.c | 120 +++++++++++++++++++++++++--
 2 files changed, 113 insertions(+), 9 deletions(-)

diff --git a/dap-sdk b/dap-sdk
index dda5cbce37..f78db0429f 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit dda5cbce37bcec5906c8bee9081f51b44f91525b
+Subproject commit f78db0429fe83e344840ad96dd82ef70dd5ea3ce
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 64a501efa3..d25e17bc22 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -105,6 +105,8 @@
 #include "dap_chain_datum_tx_voting.h"
 #include "dap_json_rpc.h"
 #include "dap_json_rpc_request.h"
+#include "dap_client_pvt.h"
+#include "dap_enc.h"
 
 
 #define LOG_TAG "chain_node_cli_cmd"
@@ -8569,20 +8571,122 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     dap_json_rpc_params_add_data(params, l_cmd_str, TYPE_PARAM_STRING);
     uint64_t l_id_response = dap_json_rpc_response_get_new_id();
     char ** l_cmd_arr_str = dap_strsplit(l_cmd_str, ";", -1);
-    dap_json_rpc_request_t *a_request = dap_json_rpc_request_creation(l_cmd_arr_str[0], params, l_id_response);
+    dap_json_rpc_request_t *l_request = dap_json_rpc_request_creation(l_cmd_arr_str[0], params, l_id_response);
     dap_strfreev(l_cmd_arr_str);
     // char * request_str = dap_json_rpc_request_to_json_string(a_request);
     dap_chain_node_addr_t l_node_addr;
     dap_chain_node_addr_from_str(&l_node_addr, l_addr_str);
-    dap_chain_node_info_t *l_remote = dap_chain_node_info_read(l_net, &l_node_addr);
-    DAP_DEL_Z(l_cmd_str);
-    if (!l_remote) {
-        dap_json_rpc_error_add(-1, "Can't find remote node: %s", l_addr_str);
-        return -3;
+
+    dap_chain_node_info_t *node_info = node_info_read_and_reply(l_net, &l_node_addr, NULL);
+    if(!node_info)
+        return -6;
+    int timeout_ms = 5000; //5 sec = 5000 ms
+    // start handshake
+    dap_chain_node_client_t *l_client = dap_chain_node_client_connect_default_channels(l_net,node_info);
+    if(!l_client) {
+        // dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't connect");
+        DAP_DELETE(node_info);
+        return -7;
+    }
+    // wait handshake
+    int res = dap_chain_node_client_wait(l_client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
+    if (res) {
+        // dap_cli_server_cmd_set_reply_text(a_str_reply, "No response from node");
+        // clean client struct
+        dap_chain_node_client_close_unsafe(l_client);
+        DAP_DELETE(node_info);
+        return -8;
     }
-    if (!dap_json_rpc_request_send(a_request, dap_json_rpc_response_accepted, l_remote->ext_host, l_remote->ext_port, dap_json_rpc_error_callback))
-        log_it(L_INFO, "com_exec sent request to %s:%d", l_remote->ext_host, l_remote->ext_port);
+    char* l_request_data_str =  dap_json_rpc_request_to_http_str(l_request);
+
+    // if (!dap_json_rpc_request_send(l_request, dap_json_rpc_response_accepted, node_info->ext_host, node_info->ext_port, dap_json_rpc_error_callback))
+    //     log_it(L_INFO, "com_exec sent request to %s:%d", node_info->ext_host, node_info->ext_port);
+
+    dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(l_client->client);
 
+    const char * l_sub_url = dap_strdup_printf("channels=%s,enc_type=%d,enc_key_size=%zu,enc_headers=%d",
+                                                     l_client_internal->client->active_channels, l_client_internal->session_key_type,
+                                                     l_client_internal->session_key_block_size, 0);
+
+    bool is_query_enc = true;
+    const char * a_query = "type=tcp,maxconn=4";
+    size_t l_sub_url_size = l_sub_url ? strlen(l_sub_url) : 0;
+    size_t l_query_size = a_query ? strlen(a_query) : 0;
+
+    size_t l_sub_url_enc_size_max = l_sub_url_size ? (5 * l_sub_url_size + 16) : 0;
+    char *l_sub_url_enc = l_sub_url_size ? DAP_NEW_Z_SIZE(char, l_sub_url_enc_size_max + 1) : NULL;
+
+    size_t l_query_enc_size_max = (is_query_enc) ? (l_query_size * 5 + 16) : l_query_size;
+    char *l_query_enc =
+            (is_query_enc) ? (l_query_size ? DAP_NEW_Z_SIZE(char, l_query_enc_size_max + 1) : NULL) : (char*) a_query;
+
+    size_t l_request_data_size = strlen(l_request_data_str);
+    size_t l_request_enc_size_max = l_request_data_size ? l_request_data_size * 2 + 16 : 0;
+    char * l_request_enc = l_request_data_size ? DAP_NEW_Z_SIZE(char, l_request_enc_size_max + 1) : NULL;
+    size_t l_request_enc_size = 0;
+
+    // l_client_internal->request_response_callback = dap_json_rpc_response_accepted;
+    // l_client_internal->request_error_callback = dap_json_rpc_error_callback;
+    l_client_internal->is_encrypted = true;
+    dap_enc_data_type_t l_enc_type;
+
+    if(l_client_internal->uplink_protocol_version >= 21)
+        l_enc_type = DAP_ENC_DATA_TYPE_B64_URLSAFE;
+    else
+        l_enc_type = DAP_ENC_DATA_TYPE_B64;
+
+    if(l_sub_url_size)
+        dap_enc_code(l_client_internal->session_key,
+                l_sub_url, l_sub_url_size,
+                l_sub_url_enc, l_sub_url_enc_size_max,
+                l_enc_type);
+
+    if(is_query_enc && l_query_size)
+        dap_enc_code(l_client_internal->session_key,
+                a_query, l_query_size,
+                l_query_enc, l_query_enc_size_max,
+                l_enc_type);
+
+    if(l_request_data_size)
+        l_request_enc_size = dap_enc_code(l_client_internal->session_key,
+                l_request_data_str, l_request_data_size,
+                l_request_enc, l_request_enc_size_max,
+                DAP_ENC_DATA_TYPE_RAW);
+
+    size_t l_path_size= l_query_enc_size_max + l_sub_url_enc_size_max + 1;
+    const char * path = "exec_cmd";
+    char *l_path = DAP_NEW_Z_SIZE(char, l_path_size);
+    l_path[0] = '\0';
+    if(path) {
+        if(l_sub_url_size){
+            if(l_query_size){
+                snprintf(l_path, l_path_size, "%s/%s?%s", path?path:"",
+                             l_sub_url_enc?l_sub_url_enc:"",
+                                   l_query_enc?l_query_enc:"");
+            }else{
+                snprintf(l_path, l_path_size, "%s/%s", path, l_sub_url_enc);
+            }
+        } else {
+            dap_stpcpy(l_path, path);
+        }
+    }
+
+    size_t l_size_required = l_client_internal->session_key_id ? strlen(l_client_internal->session_key_id) + 40 : 40;
+    char *l_custom = DAP_NEW_Z_SIZE(char, l_size_required);
+    size_t l_off = snprintf(l_custom, l_size_required, "KeyID: %s\r\n", l_client_internal->session_key_id ? l_client_internal->session_key_id : "NULL");
+    if (l_client_internal->is_close_session)
+        snprintf(l_custom + l_off, l_size_required - l_off, "%s\r\n", "SessionCloseAfterRequest: true");
+
+    l_client_internal->http_client = dap_client_http_request(l_client_internal->worker, l_client_internal->client->link_info.uplink_addr,
+                        l_client_internal->client->link_info.uplink_port,
+                        "POST", "application/json",
+                        l_path, l_request_enc, l_request_enc_size, NULL,
+                        dap_json_rpc_response_accepted, NULL, l_client_internal, l_custom);
+    DAP_DEL_Z(l_sub_url_enc);
+    DAP_DEL_Z(l_custom);
+    DAP_DEL_Z(l_query_enc);
+    DAP_DEL_Z(l_path);
+    DAP_DEL_Z(l_request_enc);
     json_object_array_add(*a_json_arr_reply, json_object_new_string("DONE"));
     return 0;
 }
-- 
GitLab


From 345cb2d9e9c81e3444b10a036a3e3b211c097bc6 Mon Sep 17 00:00:00 2001
From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net>
Date: Sun, 20 Oct 2024 20:36:13 +0700
Subject: [PATCH 08/33] [*] fix exec_cmd

---
 modules/net/dap_chain_node_cli_cmd.c | 37 ++++++++++++++--------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index d25e17bc22..82d657a014 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8580,29 +8580,30 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     dap_chain_node_info_t *node_info = node_info_read_and_reply(l_net, &l_node_addr, NULL);
     if(!node_info)
         return -6;
-    int timeout_ms = 5000; //5 sec = 5000 ms
-    // start handshake
-    dap_chain_node_client_t *l_client = dap_chain_node_client_connect_default_channels(l_net,node_info);
-    if(!l_client) {
-        // dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't connect");
-        DAP_DELETE(node_info);
-        return -7;
-    }
-    // wait handshake
-    int res = dap_chain_node_client_wait(l_client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
-    if (res) {
-        // dap_cli_server_cmd_set_reply_text(a_str_reply, "No response from node");
-        // clean client struct
-        dap_chain_node_client_close_unsafe(l_client);
-        DAP_DELETE(node_info);
-        return -8;
-    }
+    // int timeout_ms = 5000; //5 sec = 5000 ms
+    // // start handshake
+    // dap_chain_node_client_t *l_client = dap_chain_node_client_connect_default_channels(l_net,node_info);
+    // if(!l_client) {
+    //     // dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't connect");
+    //     DAP_DELETE(node_info);
+    //     return -7;
+    // }
+    // // wait handshake
+    // int res = dap_chain_node_client_wait(l_client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
+    // if (res) {
+    //     // dap_cli_server_cmd_set_reply_text(a_str_reply, "No response from node");
+    //     // clean client struct
+    //     dap_chain_node_client_close_unsafe(l_client);
+    //     DAP_DELETE(node_info);
+    //     return -8;
+    // }
     char* l_request_data_str =  dap_json_rpc_request_to_http_str(l_request);
 
     // if (!dap_json_rpc_request_send(l_request, dap_json_rpc_response_accepted, node_info->ext_host, node_info->ext_port, dap_json_rpc_error_callback))
     //     log_it(L_INFO, "com_exec sent request to %s:%d", node_info->ext_host, node_info->ext_port);
 
-    dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(l_client->client);
+    dap_client_pvt_t * l_client_internal = NULL;
+    dap_client_pvt_new(l_client_internal);
 
     const char * l_sub_url = dap_strdup_printf("channels=%s,enc_type=%d,enc_key_size=%zu,enc_headers=%d",
                                                      l_client_internal->client->active_channels, l_client_internal->session_key_type,
-- 
GitLab


From 51263258dbc5e43f5ebc81c0437230f8108b0f4a Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Mon, 21 Oct 2024 12:25:17 +0700
Subject: [PATCH 09/33] [*]

---
 modules/net/dap_chain_node_cli_cmd.c | 100 +++++++++++++++++++++++----
 1 file changed, 88 insertions(+), 12 deletions(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 82d657a014..ebf766c373 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8543,6 +8543,18 @@ void dap_notify_new_client_send_info(dap_events_socket_t *a_es, UNUSED_ARG void
     json_object_put(l_json_wallets);
 }
 
+static void s_stage_connected_callback(dap_client_t* a_client, void * a_arg) {
+    dap_chain_node_client_t *l_node_client = DAP_CHAIN_NODE_CLIENT(a_client);
+    UNUSED(a_arg);
+    if(l_node_client) {
+        pthread_mutex_lock(&l_node_client->wait_mutex);
+        l_node_client->state = NODE_CLIENT_STATE_ESTABLISHED;
+        pthread_cond_signal(&l_node_client->wait_cond);
+        pthread_mutex_unlock(&l_node_client->wait_mutex);
+    }
+}
+
+
 int com_exec_cmd(int argc, char **argv, void **reply) {
     json_object ** a_json_arr_reply = (json_object **) reply;
     if (!dap_json_rpc_exec_cmd_inited()) {
@@ -8580,30 +8592,93 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     dap_chain_node_info_t *node_info = node_info_read_and_reply(l_net, &l_node_addr, NULL);
     if(!node_info)
         return -6;
-    // int timeout_ms = 5000; //5 sec = 5000 ms
-    // // start handshake
+    int timeout_ms = 5000; //5 sec = 5000 ms
+    // start handshake
     // dap_chain_node_client_t *l_client = dap_chain_node_client_connect_default_channels(l_net,node_info);
     // if(!l_client) {
     //     // dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't connect");
     //     DAP_DELETE(node_info);
     //     return -7;
     // }
-    // // wait handshake
-    // int res = dap_chain_node_client_wait(l_client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
-    // if (res) {
-    //     // dap_cli_server_cmd_set_reply_text(a_str_reply, "No response from node");
-    //     // clean client struct
-    //     dap_chain_node_client_close_unsafe(l_client);
-    //     DAP_DELETE(node_info);
-    //     return -8;
+
+    dap_chain_node_client_t * l_node_client = dap_chain_node_client_create(l_net, node_info, NULL, NULL);
+
+    l_node_client->client = dap_client_new(NULL, l_node_client);
+    l_node_client->client->_inheritor = l_node_client;
+    dap_client_set_uplink_unsafe(l_node_client->client, &l_node_client->info->address, node_info->ext_host, node_info->ext_port);
+
+    dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(l_node_client->client);
+
+    dap_client_go_stage(l_node_client->client, STAGE_ENC_INIT, s_stage_connected_callback);
+
+    int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
+    if (res) {
+        // dap_cli_server_cmd_set_reply_text(a_str_reply, "No response from node");
+        // clean client struct
+        dap_chain_node_client_close_unsafe(l_node_client);
+        DAP_DELETE(node_info);
+        return -8;
+    }
+
+    // if (!*l_client_pvt->client->link_info.uplink_addr || !l_client_pvt->client->link_info.uplink_port) {
+    //     log_it(L_ERROR, "Client remote address is empty");
+    //     l_client_pvt->stage_status = STAGE_STATUS_ERROR;
+    //     l_client_pvt->last_error = ERROR_WRONG_ADDRESS;
+    //     return -1;
     // }
+
+    // if (l_client_pvt->session_key_open)
+    //     dap_enc_key_delete(l_client_pvt->session_key_open);
+    // l_client_pvt->session_key_open = dap_enc_key_new_generate(l_client_pvt->session_key_open_type, NULL, 0, NULL, 0,
+    //                                                             l_client_pvt->session_key_block_size);
+    // if (!l_client_pvt->session_key_open) {
+    //     log_it(L_ERROR, "Insufficient memory! May be a huge memory leak present");
+    //     l_client_pvt->stage_status = STAGE_STATUS_ERROR;
+    //     l_client_pvt->last_error = ERROR_OUT_OF_MEMORY;
+    //     return -1;
+    // }
+    // size_t l_data_size = l_client_pvt->session_key_open->pub_key_data_size;
+    // uint8_t *l_data = DAP_NEW_Z_SIZE(uint8_t, l_data_size);
+    // memcpy(l_data, l_client_pvt->session_key_open->pub_key_data, l_client_pvt->session_key_open->pub_key_data_size);
+
+    // dap_cert_t *l_node_cert = dap_cert_find_by_name(DAP_STREAM_NODE_ADDR_CERT_NAME);
+    // size_t l_sign_count = 0;
+    // if (l_client_pvt->client->auth_cert)
+    //     l_sign_count += s_add_cert_sign_to_data(l_client_pvt->client->auth_cert, &l_data, &l_data_size,
+    //                                             l_client_pvt->session_key_open->pub_key_data,
+    //                                             l_client_pvt->session_key_open->pub_key_data_size);
+    // l_sign_count += s_add_cert_sign_to_data(l_node_cert, &l_data, &l_data_size,
+    //                                             l_client_pvt->session_key_open->pub_key_data,
+    //                                             l_client_pvt->session_key_open->pub_key_data_size);
+
+
+    // size_t l_data_str_size_max = DAP_ENC_BASE64_ENCODE_SIZE(l_data_size);
+    // char *l_data_str = DAP_NEW_Z_SIZE(char, l_data_str_size_max + 1);
+    // // DAP_ENC_DATA_TYPE_B64_URLSAFE not need because send it by POST request
+    // size_t l_data_str_enc_size = dap_enc_base64_encode(l_data, l_data_size, l_data_str, DAP_ENC_DATA_TYPE_B64);
+
+
+    // char l_enc_init_url[1024] = { '\0' };
+    // snprintf(l_enc_init_url, sizeof(l_enc_init_url), DAP_UPLINK_PATH_ENC_INIT
+    //                 "/gd4y5yh78w42aaagh" "?enc_type=%d,pkey_exchange_type=%d,pkey_exchange_size=%zd,block_key_size=%zd,protocol_version=%d,sign_count=%zu",
+    //                 l_client_pvt->session_key_type, l_client_pvt->session_key_open_type, l_client_pvt->session_key_open->pub_key_data_size,
+    //                 l_client_pvt->session_key_block_size,  DAP_CLIENT_PROTOCOL_VERSION, l_sign_count);
+    // int l_res = dap_client_pvt_request(l_client_pvt, l_enc_init_url,
+    //         l_data_str, l_data_str_enc_size, s_enc_init_response, s_enc_init_error);
+
+
+
+
+
+    // wait handshake
+
     char* l_request_data_str =  dap_json_rpc_request_to_http_str(l_request);
 
     // if (!dap_json_rpc_request_send(l_request, dap_json_rpc_response_accepted, node_info->ext_host, node_info->ext_port, dap_json_rpc_error_callback))
     //     log_it(L_INFO, "com_exec sent request to %s:%d", node_info->ext_host, node_info->ext_port);
 
-    dap_client_pvt_t * l_client_internal = NULL;
-    dap_client_pvt_new(l_client_internal);
+
+    // dap_client_pvt_new(l_client_internal);
 
     const char * l_sub_url = dap_strdup_printf("channels=%s,enc_type=%d,enc_key_size=%zu,enc_headers=%d",
                                                      l_client_internal->client->active_channels, l_client_internal->session_key_type,
@@ -8683,6 +8758,7 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
                         "POST", "application/json",
                         l_path, l_request_enc, l_request_enc_size, NULL,
                         dap_json_rpc_response_accepted, NULL, l_client_internal, l_custom);
+    log_it(L_MSG, "enc request = %s", l_request_enc);
     DAP_DEL_Z(l_sub_url_enc);
     DAP_DEL_Z(l_custom);
     DAP_DEL_Z(l_query_enc);
-- 
GitLab


From 83e3ff8738e5d8a666cab874c75083ee10b6935c Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Mon, 21 Oct 2024 15:20:40 +0700
Subject: [PATCH 10/33] [*] fix

---
 dap-sdk                              |   2 +-
 modules/net/dap_chain_node_cli_cmd.c | 221 ++++++++++++++++++---------
 2 files changed, 148 insertions(+), 75 deletions(-)

diff --git a/dap-sdk b/dap-sdk
index f78db0429f..a1003ac894 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit f78db0429fe83e344840ad96dd82ef70dd5ea3ce
+Subproject commit a1003ac89487bfc41ed22fec2bd9e722470de433
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index ebf766c373..f645761897 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8554,6 +8554,139 @@ static void s_stage_connected_callback(dap_client_t* a_client, void * a_arg) {
     }
 }
 
+struct exec_cmd_request {
+    dap_client_pvt_t * client_pvt;
+#ifdef DAP_OS_WINDOWS
+    CONDITION_VARIABLE wait_cond;
+    CRITICAL_SECTION wait_crit_sec;
+#else
+    pthread_cond_t wait_cond;
+    pthread_mutex_t wait_mutex;
+#endif
+    char* response;
+    size_t response_size;
+};
+
+enum ExecCmdRetCode {
+    EXEC_CMD_OK = 1,
+    EXEC_CMD_ERR_NO_SERVER,
+    EXEC_CMDERR_HANDSHAKE,
+    EXEC_CMD_ERR_WAIT_TIMEOUT,
+    EXEC_CMD_ERR_UNKNOWN
+};
+
+static struct exec_cmd_request* s_exec_cmd_request_init(dap_client_pvt_t * a_client_pvt)
+{
+    struct exec_cmd_request *l_exec_cmd_request = DAP_NEW_Z(struct exec_cmd_request);
+    if (!l_exec_cmd_request)
+        return NULL;
+    l_exec_cmd_request->client_pvt = a_client_pvt;
+#ifdef DAP_OS_WINDOWS
+    InitializeCriticalSection(&l_exec_cmd_request->wait_crit_sec);
+    InitializeConditionVariable(&l_exec_cmd_request->wait_cond);
+#else
+    pthread_mutex_init(&l_exec_cmd_request->wait_mutex, NULL);
+#ifdef DAP_OS_DARWIN
+    pthread_cond_init(&l_exec_cmd_request->wait_cond, NULL);
+#else
+    pthread_condattr_t attr;
+    pthread_condattr_init(&attr);
+    pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
+    pthread_cond_init(&l_exec_cmd_request->wait_cond, &attr);    
+#endif
+#endif
+    return l_exec_cmd_request;
+}
+
+static void s_exec_cmd_response_handler(void *a_response, size_t a_response_size, void *a_arg,
+                                            http_status_code_t http_status_code) {
+    (void)http_status_code;
+    struct exec_cmd_request *l_exec_cmd_request = (struct exec_cmd_request *)a_arg;
+#ifdef DAP_OS_WINDOWS
+    EnterCriticalSection(&l_exec_cmd_request->wait_crit_sec);
+#else
+    pthread_mutex_lock(&l_exec_cmd_request->wait_mutex);
+#endif
+
+    dap_client_pvt_t * l_client_pvt = l_exec_cmd_request->client_pvt;
+    l_client_pvt->http_client = NULL;
+        size_t l_response_dec_size_max = a_response_size ? a_response_size * 2 + 16 : 0;
+        char * l_response_dec = a_response_size ? DAP_NEW_Z_SIZE(char, l_response_dec_size_max) : NULL;
+        size_t l_response_dec_size = 0;
+        if(a_response_size)
+            l_response_dec_size = dap_enc_decode(l_client_pvt->session_key,
+                    a_response, a_response_size,
+                    l_response_dec, l_response_dec_size_max,
+                    DAP_ENC_DATA_TYPE_RAW);
+
+        l_exec_cmd_request->response = l_response_dec;
+        l_exec_cmd_request->response_size = l_response_dec_size;
+#ifdef DAP_OS_WINDOWS
+    WakeConditionVariable(&l_exec_cmd_request->wait_cond);
+    LeaveCriticalSection(&l_exec_cmd_request->wait_crit_sec);
+#else
+    pthread_cond_signal(&l_exec_cmd_request->wait_cond);
+    pthread_mutex_unlock(&l_exec_cmd_request->wait_mutex);
+#endif
+}
+
+static void s_exec_cmd_error_handler(int a_error_code, void *a_arg){
+    struct exec_cmd_request * l_exec_cmd_request = (struct exec_cmd_request *)a_arg;
+#ifdef DAP_OS_WINDOWS
+    EnterCriticalSection(&l_exec_cmd_request->wait_crit_sec);
+    l_exec_cmd_request->response = a_error_code;
+    WakeConditionVariable(&l_exec_cmd_request->wait_cond);
+    LeaveCriticalSection(&l_exec_cmd_request->wait_crit_sec);
+#else
+    pthread_mutex_lock(&l_exec_cmd_request->wait_mutex);
+    // l_exec_cmd_request->response = a_error_code;
+    pthread_cond_signal(&l_exec_cmd_request->wait_cond);
+    pthread_mutex_unlock(&l_exec_cmd_request->wait_mutex);
+#endif
+}
+
+
+static int dap_chain_exec_cmd_list_wait(struct exec_cmd_request *a_exec_cmd_request, int a_timeout_ms) {
+#ifdef DAP_OS_WINDOWS
+    EnterCriticalSection(&a_exec_cmd_request->wait_crit_sec);
+    if (a_exec_cmd_request->response)
+        return LeaveCriticalSection(&a_exec_cmd_request->wait_crit_sec), a_exec_cmd_request->response;
+    while (!a_exec_cmd_request->response) {
+        if ( !SleepConditionVariableCS(&a_exec_cmd_request->wait_cond, &a_exec_cmd_request->wait_crit_sec, a_timeout_ms) )
+            a_exec_cmd_request->response = GetLastError() == ERROR_TIMEOUT ? ERR_WAIT_TIMEOUT : ERR_UNKNOWN;
+    }
+    return LeaveCriticalSection(&a_exec_cmd_request->wait_crit_sec), a_exec_cmd_request->response;     
+#else
+    pthread_mutex_lock(&a_exec_cmd_request->wait_mutex);
+    if(a_exec_cmd_request->response) {
+        pthread_mutex_unlock(&a_exec_cmd_request->wait_mutex);
+        return EXEC_CMD_OK;
+    }
+    struct timespec l_cond_timeout;
+#ifdef DAP_OS_DARWIN
+    l_cond_timeout = (struct timespec){ .tv_sec = a_timeout_ms / 1000 };
+#else
+    clock_gettime(CLOCK_MONOTONIC, &l_cond_timeout);
+    l_cond_timeout.tv_sec += a_timeout_ms / 1000;
+#endif
+    while (!a_exec_cmd_request->response) {
+        switch (
+#ifdef DAP_OS_DARWIN
+            pthread_cond_timedwait_relative_np(&a_exec_cmd_request->wait_cond, &a_exec_cmd_request->wait_mutex, &l_cond_timeout)
+#else
+            pthread_cond_timedwait(&a_exec_cmd_request->wait_cond, &a_exec_cmd_request->wait_mutex, &l_cond_timeout)
+#endif
+        ) {
+        case ETIMEDOUT:
+            a_exec_cmd_request->response = "ERR_WAIT_TIMEOUT";
+        default:
+            break;
+        }
+    }
+    pthread_mutex_unlock(&a_exec_cmd_request->wait_mutex);
+    return  EXEC_CMD_ERR_WAIT_TIMEOUT;
+#endif
+}
 
 int com_exec_cmd(int argc, char **argv, void **reply) {
     json_object ** a_json_arr_reply = (json_object **) reply;
@@ -8585,7 +8718,6 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     char ** l_cmd_arr_str = dap_strsplit(l_cmd_str, ";", -1);
     dap_json_rpc_request_t *l_request = dap_json_rpc_request_creation(l_cmd_arr_str[0], params, l_id_response);
     dap_strfreev(l_cmd_arr_str);
-    // char * request_str = dap_json_rpc_request_to_json_string(a_request);
     dap_chain_node_addr_t l_node_addr;
     dap_chain_node_addr_from_str(&l_node_addr, l_addr_str);
 
@@ -8593,24 +8725,15 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     if(!node_info)
         return -6;
     int timeout_ms = 5000; //5 sec = 5000 ms
-    // start handshake
-    // dap_chain_node_client_t *l_client = dap_chain_node_client_connect_default_channels(l_net,node_info);
-    // if(!l_client) {
-    //     // dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't connect");
-    //     DAP_DELETE(node_info);
-    //     return -7;
-    // }
-
     dap_chain_node_client_t * l_node_client = dap_chain_node_client_create(l_net, node_info, NULL, NULL);
 
+    //handshake
     l_node_client->client = dap_client_new(NULL, l_node_client);
     l_node_client->client->_inheritor = l_node_client;
     dap_client_set_uplink_unsafe(l_node_client->client, &l_node_client->info->address, node_info->ext_host, node_info->ext_port);
-
     dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(l_node_client->client);
-
     dap_client_go_stage(l_node_client->client, STAGE_ENC_INIT, s_stage_connected_callback);
-
+    //wait handshake
     int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
     if (res) {
         // dap_cli_server_cmd_set_reply_text(a_str_reply, "No response from node");
@@ -8620,65 +8743,8 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
         return -8;
     }
 
-    // if (!*l_client_pvt->client->link_info.uplink_addr || !l_client_pvt->client->link_info.uplink_port) {
-    //     log_it(L_ERROR, "Client remote address is empty");
-    //     l_client_pvt->stage_status = STAGE_STATUS_ERROR;
-    //     l_client_pvt->last_error = ERROR_WRONG_ADDRESS;
-    //     return -1;
-    // }
-
-    // if (l_client_pvt->session_key_open)
-    //     dap_enc_key_delete(l_client_pvt->session_key_open);
-    // l_client_pvt->session_key_open = dap_enc_key_new_generate(l_client_pvt->session_key_open_type, NULL, 0, NULL, 0,
-    //                                                             l_client_pvt->session_key_block_size);
-    // if (!l_client_pvt->session_key_open) {
-    //     log_it(L_ERROR, "Insufficient memory! May be a huge memory leak present");
-    //     l_client_pvt->stage_status = STAGE_STATUS_ERROR;
-    //     l_client_pvt->last_error = ERROR_OUT_OF_MEMORY;
-    //     return -1;
-    // }
-    // size_t l_data_size = l_client_pvt->session_key_open->pub_key_data_size;
-    // uint8_t *l_data = DAP_NEW_Z_SIZE(uint8_t, l_data_size);
-    // memcpy(l_data, l_client_pvt->session_key_open->pub_key_data, l_client_pvt->session_key_open->pub_key_data_size);
-
-    // dap_cert_t *l_node_cert = dap_cert_find_by_name(DAP_STREAM_NODE_ADDR_CERT_NAME);
-    // size_t l_sign_count = 0;
-    // if (l_client_pvt->client->auth_cert)
-    //     l_sign_count += s_add_cert_sign_to_data(l_client_pvt->client->auth_cert, &l_data, &l_data_size,
-    //                                             l_client_pvt->session_key_open->pub_key_data,
-    //                                             l_client_pvt->session_key_open->pub_key_data_size);
-    // l_sign_count += s_add_cert_sign_to_data(l_node_cert, &l_data, &l_data_size,
-    //                                             l_client_pvt->session_key_open->pub_key_data,
-    //                                             l_client_pvt->session_key_open->pub_key_data_size);
-
-
-    // size_t l_data_str_size_max = DAP_ENC_BASE64_ENCODE_SIZE(l_data_size);
-    // char *l_data_str = DAP_NEW_Z_SIZE(char, l_data_str_size_max + 1);
-    // // DAP_ENC_DATA_TYPE_B64_URLSAFE not need because send it by POST request
-    // size_t l_data_str_enc_size = dap_enc_base64_encode(l_data, l_data_size, l_data_str, DAP_ENC_DATA_TYPE_B64);
-
-
-    // char l_enc_init_url[1024] = { '\0' };
-    // snprintf(l_enc_init_url, sizeof(l_enc_init_url), DAP_UPLINK_PATH_ENC_INIT
-    //                 "/gd4y5yh78w42aaagh" "?enc_type=%d,pkey_exchange_type=%d,pkey_exchange_size=%zd,block_key_size=%zd,protocol_version=%d,sign_count=%zu",
-    //                 l_client_pvt->session_key_type, l_client_pvt->session_key_open_type, l_client_pvt->session_key_open->pub_key_data_size,
-    //                 l_client_pvt->session_key_block_size,  DAP_CLIENT_PROTOCOL_VERSION, l_sign_count);
-    // int l_res = dap_client_pvt_request(l_client_pvt, l_enc_init_url,
-    //         l_data_str, l_data_str_enc_size, s_enc_init_response, s_enc_init_error);
-
-
-
-
-
-    // wait handshake
-
-    char* l_request_data_str =  dap_json_rpc_request_to_http_str(l_request);
-
-    // if (!dap_json_rpc_request_send(l_request, dap_json_rpc_response_accepted, node_info->ext_host, node_info->ext_port, dap_json_rpc_error_callback))
-    //     log_it(L_INFO, "com_exec sent request to %s:%d", node_info->ext_host, node_info->ext_port);
-
-
-    // dap_client_pvt_new(l_client_internal);
+    size_t l_request_data_size = 0;
+    char* l_request_data_str =  dap_json_rpc_request_to_http_str(l_request, &l_request_data_size);
 
     const char * l_sub_url = dap_strdup_printf("channels=%s,enc_type=%d,enc_key_size=%zu,enc_headers=%d",
                                                      l_client_internal->client->active_channels, l_client_internal->session_key_type,
@@ -8696,7 +8762,6 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     char *l_query_enc =
             (is_query_enc) ? (l_query_size ? DAP_NEW_Z_SIZE(char, l_query_enc_size_max + 1) : NULL) : (char*) a_query;
 
-    size_t l_request_data_size = strlen(l_request_data_str);
     size_t l_request_enc_size_max = l_request_data_size ? l_request_data_size * 2 + 16 : 0;
     char * l_request_enc = l_request_data_size ? DAP_NEW_Z_SIZE(char, l_request_enc_size_max + 1) : NULL;
     size_t l_request_enc_size = 0;
@@ -8753,12 +8818,20 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     if (l_client_internal->is_close_session)
         snprintf(l_custom + l_off, l_size_required - l_off, "%s\r\n", "SessionCloseAfterRequest: true");
 
+    struct exec_cmd_request* l_exec_cmd_request = s_exec_cmd_request_init(l_client_internal);
+
     l_client_internal->http_client = dap_client_http_request(l_client_internal->worker, l_client_internal->client->link_info.uplink_addr,
                         l_client_internal->client->link_info.uplink_port,
                         "POST", "application/json",
                         l_path, l_request_enc, l_request_enc_size, NULL,
-                        dap_json_rpc_response_accepted, NULL, l_client_internal, l_custom);
-    log_it(L_MSG, "enc request = %s", l_request_enc);
+                        s_exec_cmd_response_handler, s_exec_cmd_error_handler, l_exec_cmd_request, l_custom);
+
+    int l_ret = dap_chain_exec_cmd_list_wait(l_exec_cmd_request, 10000);
+    // switch (l_ret) {
+    //     case EXEC_CMD_OK: {
+            json_object_array_add(*a_json_arr_reply, json_object_new_string(l_exec_cmd_request->response));
+    //     }
+    // }
     DAP_DEL_Z(l_sub_url_enc);
     DAP_DEL_Z(l_custom);
     DAP_DEL_Z(l_query_enc);
-- 
GitLab


From d35087110d83e0c829af5520b32d7eb0d36f2c64 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Tue, 22 Oct 2024 11:34:16 +0700
Subject: [PATCH 11/33] [*] refactoring

---
 modules/net/dap_chain_node_cli_cmd.c | 233 +--------------------------
 1 file changed, 3 insertions(+), 230 deletions(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index f645761897..eb39d5604e 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8554,140 +8554,6 @@ static void s_stage_connected_callback(dap_client_t* a_client, void * a_arg) {
     }
 }
 
-struct exec_cmd_request {
-    dap_client_pvt_t * client_pvt;
-#ifdef DAP_OS_WINDOWS
-    CONDITION_VARIABLE wait_cond;
-    CRITICAL_SECTION wait_crit_sec;
-#else
-    pthread_cond_t wait_cond;
-    pthread_mutex_t wait_mutex;
-#endif
-    char* response;
-    size_t response_size;
-};
-
-enum ExecCmdRetCode {
-    EXEC_CMD_OK = 1,
-    EXEC_CMD_ERR_NO_SERVER,
-    EXEC_CMDERR_HANDSHAKE,
-    EXEC_CMD_ERR_WAIT_TIMEOUT,
-    EXEC_CMD_ERR_UNKNOWN
-};
-
-static struct exec_cmd_request* s_exec_cmd_request_init(dap_client_pvt_t * a_client_pvt)
-{
-    struct exec_cmd_request *l_exec_cmd_request = DAP_NEW_Z(struct exec_cmd_request);
-    if (!l_exec_cmd_request)
-        return NULL;
-    l_exec_cmd_request->client_pvt = a_client_pvt;
-#ifdef DAP_OS_WINDOWS
-    InitializeCriticalSection(&l_exec_cmd_request->wait_crit_sec);
-    InitializeConditionVariable(&l_exec_cmd_request->wait_cond);
-#else
-    pthread_mutex_init(&l_exec_cmd_request->wait_mutex, NULL);
-#ifdef DAP_OS_DARWIN
-    pthread_cond_init(&l_exec_cmd_request->wait_cond, NULL);
-#else
-    pthread_condattr_t attr;
-    pthread_condattr_init(&attr);
-    pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
-    pthread_cond_init(&l_exec_cmd_request->wait_cond, &attr);    
-#endif
-#endif
-    return l_exec_cmd_request;
-}
-
-static void s_exec_cmd_response_handler(void *a_response, size_t a_response_size, void *a_arg,
-                                            http_status_code_t http_status_code) {
-    (void)http_status_code;
-    struct exec_cmd_request *l_exec_cmd_request = (struct exec_cmd_request *)a_arg;
-#ifdef DAP_OS_WINDOWS
-    EnterCriticalSection(&l_exec_cmd_request->wait_crit_sec);
-#else
-    pthread_mutex_lock(&l_exec_cmd_request->wait_mutex);
-#endif
-
-    dap_client_pvt_t * l_client_pvt = l_exec_cmd_request->client_pvt;
-    l_client_pvt->http_client = NULL;
-        size_t l_response_dec_size_max = a_response_size ? a_response_size * 2 + 16 : 0;
-        char * l_response_dec = a_response_size ? DAP_NEW_Z_SIZE(char, l_response_dec_size_max) : NULL;
-        size_t l_response_dec_size = 0;
-        if(a_response_size)
-            l_response_dec_size = dap_enc_decode(l_client_pvt->session_key,
-                    a_response, a_response_size,
-                    l_response_dec, l_response_dec_size_max,
-                    DAP_ENC_DATA_TYPE_RAW);
-
-        l_exec_cmd_request->response = l_response_dec;
-        l_exec_cmd_request->response_size = l_response_dec_size;
-#ifdef DAP_OS_WINDOWS
-    WakeConditionVariable(&l_exec_cmd_request->wait_cond);
-    LeaveCriticalSection(&l_exec_cmd_request->wait_crit_sec);
-#else
-    pthread_cond_signal(&l_exec_cmd_request->wait_cond);
-    pthread_mutex_unlock(&l_exec_cmd_request->wait_mutex);
-#endif
-}
-
-static void s_exec_cmd_error_handler(int a_error_code, void *a_arg){
-    struct exec_cmd_request * l_exec_cmd_request = (struct exec_cmd_request *)a_arg;
-#ifdef DAP_OS_WINDOWS
-    EnterCriticalSection(&l_exec_cmd_request->wait_crit_sec);
-    l_exec_cmd_request->response = a_error_code;
-    WakeConditionVariable(&l_exec_cmd_request->wait_cond);
-    LeaveCriticalSection(&l_exec_cmd_request->wait_crit_sec);
-#else
-    pthread_mutex_lock(&l_exec_cmd_request->wait_mutex);
-    // l_exec_cmd_request->response = a_error_code;
-    pthread_cond_signal(&l_exec_cmd_request->wait_cond);
-    pthread_mutex_unlock(&l_exec_cmd_request->wait_mutex);
-#endif
-}
-
-
-static int dap_chain_exec_cmd_list_wait(struct exec_cmd_request *a_exec_cmd_request, int a_timeout_ms) {
-#ifdef DAP_OS_WINDOWS
-    EnterCriticalSection(&a_exec_cmd_request->wait_crit_sec);
-    if (a_exec_cmd_request->response)
-        return LeaveCriticalSection(&a_exec_cmd_request->wait_crit_sec), a_exec_cmd_request->response;
-    while (!a_exec_cmd_request->response) {
-        if ( !SleepConditionVariableCS(&a_exec_cmd_request->wait_cond, &a_exec_cmd_request->wait_crit_sec, a_timeout_ms) )
-            a_exec_cmd_request->response = GetLastError() == ERROR_TIMEOUT ? ERR_WAIT_TIMEOUT : ERR_UNKNOWN;
-    }
-    return LeaveCriticalSection(&a_exec_cmd_request->wait_crit_sec), a_exec_cmd_request->response;     
-#else
-    pthread_mutex_lock(&a_exec_cmd_request->wait_mutex);
-    if(a_exec_cmd_request->response) {
-        pthread_mutex_unlock(&a_exec_cmd_request->wait_mutex);
-        return EXEC_CMD_OK;
-    }
-    struct timespec l_cond_timeout;
-#ifdef DAP_OS_DARWIN
-    l_cond_timeout = (struct timespec){ .tv_sec = a_timeout_ms / 1000 };
-#else
-    clock_gettime(CLOCK_MONOTONIC, &l_cond_timeout);
-    l_cond_timeout.tv_sec += a_timeout_ms / 1000;
-#endif
-    while (!a_exec_cmd_request->response) {
-        switch (
-#ifdef DAP_OS_DARWIN
-            pthread_cond_timedwait_relative_np(&a_exec_cmd_request->wait_cond, &a_exec_cmd_request->wait_mutex, &l_cond_timeout)
-#else
-            pthread_cond_timedwait(&a_exec_cmd_request->wait_cond, &a_exec_cmd_request->wait_mutex, &l_cond_timeout)
-#endif
-        ) {
-        case ETIMEDOUT:
-            a_exec_cmd_request->response = "ERR_WAIT_TIMEOUT";
-        default:
-            break;
-        }
-    }
-    pthread_mutex_unlock(&a_exec_cmd_request->wait_mutex);
-    return  EXEC_CMD_ERR_WAIT_TIMEOUT;
-#endif
-}
-
 int com_exec_cmd(int argc, char **argv, void **reply) {
     json_object ** a_json_arr_reply = (json_object **) reply;
     if (!dap_json_rpc_exec_cmd_inited()) {
@@ -8742,101 +8608,8 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
         DAP_DELETE(node_info);
         return -8;
     }
-
-    size_t l_request_data_size = 0;
-    char* l_request_data_str =  dap_json_rpc_request_to_http_str(l_request, &l_request_data_size);
-
-    const char * l_sub_url = dap_strdup_printf("channels=%s,enc_type=%d,enc_key_size=%zu,enc_headers=%d",
-                                                     l_client_internal->client->active_channels, l_client_internal->session_key_type,
-                                                     l_client_internal->session_key_block_size, 0);
-
-    bool is_query_enc = true;
-    const char * a_query = "type=tcp,maxconn=4";
-    size_t l_sub_url_size = l_sub_url ? strlen(l_sub_url) : 0;
-    size_t l_query_size = a_query ? strlen(a_query) : 0;
-
-    size_t l_sub_url_enc_size_max = l_sub_url_size ? (5 * l_sub_url_size + 16) : 0;
-    char *l_sub_url_enc = l_sub_url_size ? DAP_NEW_Z_SIZE(char, l_sub_url_enc_size_max + 1) : NULL;
-
-    size_t l_query_enc_size_max = (is_query_enc) ? (l_query_size * 5 + 16) : l_query_size;
-    char *l_query_enc =
-            (is_query_enc) ? (l_query_size ? DAP_NEW_Z_SIZE(char, l_query_enc_size_max + 1) : NULL) : (char*) a_query;
-
-    size_t l_request_enc_size_max = l_request_data_size ? l_request_data_size * 2 + 16 : 0;
-    char * l_request_enc = l_request_data_size ? DAP_NEW_Z_SIZE(char, l_request_enc_size_max + 1) : NULL;
-    size_t l_request_enc_size = 0;
-
-    // l_client_internal->request_response_callback = dap_json_rpc_response_accepted;
-    // l_client_internal->request_error_callback = dap_json_rpc_error_callback;
-    l_client_internal->is_encrypted = true;
-    dap_enc_data_type_t l_enc_type;
-
-    if(l_client_internal->uplink_protocol_version >= 21)
-        l_enc_type = DAP_ENC_DATA_TYPE_B64_URLSAFE;
-    else
-        l_enc_type = DAP_ENC_DATA_TYPE_B64;
-
-    if(l_sub_url_size)
-        dap_enc_code(l_client_internal->session_key,
-                l_sub_url, l_sub_url_size,
-                l_sub_url_enc, l_sub_url_enc_size_max,
-                l_enc_type);
-
-    if(is_query_enc && l_query_size)
-        dap_enc_code(l_client_internal->session_key,
-                a_query, l_query_size,
-                l_query_enc, l_query_enc_size_max,
-                l_enc_type);
-
-    if(l_request_data_size)
-        l_request_enc_size = dap_enc_code(l_client_internal->session_key,
-                l_request_data_str, l_request_data_size,
-                l_request_enc, l_request_enc_size_max,
-                DAP_ENC_DATA_TYPE_RAW);
-
-    size_t l_path_size= l_query_enc_size_max + l_sub_url_enc_size_max + 1;
-    const char * path = "exec_cmd";
-    char *l_path = DAP_NEW_Z_SIZE(char, l_path_size);
-    l_path[0] = '\0';
-    if(path) {
-        if(l_sub_url_size){
-            if(l_query_size){
-                snprintf(l_path, l_path_size, "%s/%s?%s", path?path:"",
-                             l_sub_url_enc?l_sub_url_enc:"",
-                                   l_query_enc?l_query_enc:"");
-            }else{
-                snprintf(l_path, l_path_size, "%s/%s", path, l_sub_url_enc);
-            }
-        } else {
-            dap_stpcpy(l_path, path);
-        }
-    }
-
-    size_t l_size_required = l_client_internal->session_key_id ? strlen(l_client_internal->session_key_id) + 40 : 40;
-    char *l_custom = DAP_NEW_Z_SIZE(char, l_size_required);
-    size_t l_off = snprintf(l_custom, l_size_required, "KeyID: %s\r\n", l_client_internal->session_key_id ? l_client_internal->session_key_id : "NULL");
-    if (l_client_internal->is_close_session)
-        snprintf(l_custom + l_off, l_size_required - l_off, "%s\r\n", "SessionCloseAfterRequest: true");
-
-    struct exec_cmd_request* l_exec_cmd_request = s_exec_cmd_request_init(l_client_internal);
-
-    l_client_internal->http_client = dap_client_http_request(l_client_internal->worker, l_client_internal->client->link_info.uplink_addr,
-                        l_client_internal->client->link_info.uplink_port,
-                        "POST", "application/json",
-                        l_path, l_request_enc, l_request_enc_size, NULL,
-                        s_exec_cmd_response_handler, s_exec_cmd_error_handler, l_exec_cmd_request, l_custom);
-
-    int l_ret = dap_chain_exec_cmd_list_wait(l_exec_cmd_request, 10000);
-    // switch (l_ret) {
-    //     case EXEC_CMD_OK: {
-            json_object_array_add(*a_json_arr_reply, json_object_new_string(l_exec_cmd_request->response));
-    //     }
-    // }
-    DAP_DEL_Z(l_sub_url_enc);
-    DAP_DEL_Z(l_custom);
-    DAP_DEL_Z(l_query_enc);
-    DAP_DEL_Z(l_path);
-    DAP_DEL_Z(l_request_enc);
-    json_object_array_add(*a_json_arr_reply, json_object_new_string("DONE"));
+    char * l_response = NULL;
+    dap_json_rpc_request_send(l_client_internal, l_request, l_response);
+    json_object_array_add(*a_json_arr_reply, json_object_new_string(l_response));
     return 0;
 }
-- 
GitLab


From 67b27b9e8a3b94102bd535233ab70b6ffffbb300 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Tue, 22 Oct 2024 16:40:39 +0700
Subject: [PATCH 12/33] [*] refactor

---
 modules/net/dap_chain_node_cli_cmd.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index eb39d5604e..f6b4ddb1b9 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8602,14 +8602,22 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     //wait handshake
     int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
     if (res) {
-        // dap_cli_server_cmd_set_reply_text(a_str_reply, "No response from node");
-        // clean client struct
+        log_it(L_ERROR, "No response from node");
+        dap_json_rpc_error_add(-8, "No reponse from node");
         dap_chain_node_client_close_unsafe(l_node_client);
         DAP_DELETE(node_info);
         return -8;
     }
+
+    //send response
     char * l_response = NULL;
-    dap_json_rpc_request_send(l_client_internal, l_request, l_response);
-    json_object_array_add(*a_json_arr_reply, json_object_new_string(l_response));
+    dap_json_rpc_request_send(l_client_internal, l_request, &l_response);
+
+    if (l_response) {
+        json_object * l_json_response = json_tokener_parse(l_response);
+        json_object_array_add(*a_json_arr_reply, l_json_response);
+    } else {
+        json_object_array_add(*a_json_arr_reply, json_object_new_string("Empty reply"));
+    }
     return 0;
 }
-- 
GitLab


From 3b4bb15f76f9df08afa9f86fce6b480d61d3574c Mon Sep 17 00:00:00 2001
From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net>
Date: Tue, 22 Oct 2024 20:43:03 +0700
Subject: [PATCH 13/33] [*] fix build

---
 modules/net/dap_chain_node_cli_cmd.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 0ebe61d385..4f3159a478 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8555,7 +8555,7 @@ static void s_stage_connected_callback(dap_client_t* a_client, void * a_arg) {
 int com_exec_cmd(int argc, char **argv, void **reply) {
     json_object ** a_json_arr_reply = (json_object **) reply;
     if (!dap_json_rpc_exec_cmd_inited()) {
-        dap_json_rpc_error_add(-1, "Json-rpc module doesn't inited, check confings");
+        dap_json_rpc_error_add(*a_json_arr_reply, -1, "Json-rpc module doesn't inited, check confings");
         return -1;
     }
 
@@ -8565,7 +8565,7 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-addr", &l_addr_str);
     dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-net", &l_net_str);
     if (!l_cmd_arg_str || ! l_addr_str || !l_net_str) {
-        dap_json_rpc_error_add(-1, "Command exec_cmd require args -cmd, -addr, -net");
+        dap_json_rpc_error_add(*a_json_arr_reply, -1, "Command exec_cmd require args -cmd, -addr, -net");
         return -2;
     }
     dap_chain_net_t* l_net = NULL;
@@ -8601,7 +8601,7 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_ESTABLISHED, timeout_ms);
     if (res) {
         log_it(L_ERROR, "No response from node");
-        dap_json_rpc_error_add(-8, "No reponse from node");
+        dap_json_rpc_error_add(*a_json_arr_reply, -8, "No reponse from node");
         dap_chain_node_client_close_unsafe(l_node_client);
         DAP_DELETE(node_info);
         return -8;
-- 
GitLab


From 13467735dca93641e7fe516e16b9aa8b037e6e09 Mon Sep 17 00:00:00 2001
From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net>
Date: Tue, 22 Oct 2024 21:45:49 +0700
Subject: [PATCH 14/33] [*] merge

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 2369891071..0acc278966 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 2369891071a68216ad58c42627fe24dcfa96a859
+Subproject commit 0acc278966e3f53ed62941660edb5dcf01c57244
-- 
GitLab


From b4879381fc6f37364e5e5b88a716af16364d3b98 Mon Sep 17 00:00:00 2001
From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net>
Date: Tue, 22 Oct 2024 21:50:01 +0700
Subject: [PATCH 15/33] [*] some fix

---
 modules/net/dap_chain_node_cli_cmd.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 4f3159a478..e8b3e3a485 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8586,8 +8586,11 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     dap_chain_node_addr_from_str(&l_node_addr, l_addr_str);
 
     dap_chain_node_info_t *node_info = node_info_read_and_reply(l_net, &l_node_addr, NULL);
-    if(!node_info)
+    if(!node_info) {
+        log_it(L_DEBUG, "Can't find node with addr: %s", l_node_addr);
+        dap_json_rpc_error_add(*a_json_arr_reply, -6, "Can't find node with addr: %s", l_node_addr);
         return -6;
+    }
     int timeout_ms = 5000; //5 sec = 5000 ms
     dap_chain_node_client_t * l_node_client = dap_chain_node_client_create(l_net, node_info, NULL, NULL);
 
-- 
GitLab


From d955cbf324fa2961dfee9d28db8713a79fa4740c Mon Sep 17 00:00:00 2001
From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net>
Date: Tue, 22 Oct 2024 21:50:36 +0700
Subject: [PATCH 16/33] [*] sub up

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 0acc278966..a939eaa5aa 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 0acc278966e3f53ed62941660edb5dcf01c57244
+Subproject commit a939eaa5aac824fc208fa48b9943a6ef977090ec
-- 
GitLab


From 2476594e55ee25eb4b0be96b0ec083062d465b28 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Tue, 22 Oct 2024 23:46:49 +0700
Subject: [PATCH 17/33] [*] fix

---
 dap-sdk                              | 2 +-
 modules/net/dap_chain_node_cli_cmd.c | 6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/dap-sdk b/dap-sdk
index a939eaa5aa..af95f2d61f 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit a939eaa5aac824fc208fa48b9943a6ef977090ec
+Subproject commit af95f2d61ffca0151c825a2e7f468971397748da
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index e8b3e3a485..84a160c948 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8587,8 +8587,8 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
 
     dap_chain_node_info_t *node_info = node_info_read_and_reply(l_net, &l_node_addr, NULL);
     if(!node_info) {
-        log_it(L_DEBUG, "Can't find node with addr: %s", l_node_addr);
-        dap_json_rpc_error_add(*a_json_arr_reply, -6, "Can't find node with addr: %s", l_node_addr);
+        log_it(L_DEBUG, "Can't find node with addr: %s", l_addr_str);
+        dap_json_rpc_error_add(*a_json_arr_reply, -6, "Can't find node with addr: %s", l_addr_str);
         return -6;
     }
     int timeout_ms = 5000; //5 sec = 5000 ms
@@ -8620,5 +8620,7 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     } else {
         json_object_array_add(*a_json_arr_reply, json_object_new_string("Empty reply"));
     }
+
+    dap_chain_node_client_close_mt(l_node_client);
     return 0;
 }
-- 
GitLab


From f5ff3d12df37f470f8d9eda92db334535e778f45 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 23 Oct 2024 00:13:31 +0700
Subject: [PATCH 18/33] [*] fix err

---
 dap-sdk                              | 2 +-
 modules/net/dap_chain_node_cli_cmd.c | 5 ++---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/dap-sdk b/dap-sdk
index af95f2d61f..6a4bd9f931 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit af95f2d61ffca0151c825a2e7f468971397748da
+Subproject commit 6a4bd9f931e0645695c83e98113bbbaf0ae9d0c1
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 84a160c948..7852ab7015 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8611,12 +8611,11 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     }
 
     //send response
-    char * l_response = NULL;
+    json_object * l_response = NULL;
     dap_json_rpc_request_send(l_client_internal, l_request, &l_response);
 
     if (l_response) {
-        json_object * l_json_response = json_tokener_parse(l_response);
-        json_object_array_add(*a_json_arr_reply, l_json_response);
+        json_object_array_add(*a_json_arr_reply, l_response);
     } else {
         json_object_array_add(*a_json_arr_reply, json_object_new_string("Empty reply"));
     }
-- 
GitLab


From 323238c69cae44e7e535f35975c6e3e059d706eb Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 23 Oct 2024 11:23:04 +0700
Subject: [PATCH 19/33] [*] sub up

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 6a4bd9f931..142a1919f0 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 6a4bd9f931e0645695c83e98113bbbaf0ae9d0c1
+Subproject commit 142a1919f08e19970bd68e898ab6061118fe492e
-- 
GitLab


From acad97f0ba3a3ff0a5e9c9e35566e8480f48a8d4 Mon Sep 17 00:00:00 2001
From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net>
Date: Tue, 29 Oct 2024 16:28:36 +0700
Subject: [PATCH 20/33] [*] err handler

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 142a1919f0..75cf3ef4f5 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 142a1919f08e19970bd68e898ab6061118fe492e
+Subproject commit 75cf3ef4f567f89095bcb5ad6da42f5dce4478a4
-- 
GitLab


From 5d57d133fb9f7ccc69af5631ec4ecbb844945cf0 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 30 Oct 2024 12:42:18 +0700
Subject: [PATCH 21/33] [*] fix leaks

---
 dap-sdk                              | 2 +-
 modules/net/dap_chain_node_cli_cmd.c | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/dap-sdk b/dap-sdk
index 142a1919f0..4d7dec28f7 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 142a1919f08e19970bd68e898ab6061118fe492e
+Subproject commit 4d7dec28f790622ac2f729fbad1d95dec97c2cfa
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 7852ab7015..5bd7ed2db1 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8606,7 +8606,7 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
         log_it(L_ERROR, "No response from node");
         dap_json_rpc_error_add(*a_json_arr_reply, -8, "No reponse from node");
         dap_chain_node_client_close_unsafe(l_node_client);
-        DAP_DELETE(node_info);
+        DAP_DEL_Z(node_info);
         return -8;
     }
 
@@ -8619,7 +8619,7 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     } else {
         json_object_array_add(*a_json_arr_reply, json_object_new_string("Empty reply"));
     }
-
-    dap_chain_node_client_close_mt(l_node_client);
+    DAP_DEL_Z(node_info);
+    dap_json_rpc_request_free(l_request);
     return 0;
 }
-- 
GitLab


From 9c6ba19324f9c5879d694b9583355c51292fb7f1 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 30 Oct 2024 12:43:05 +0700
Subject: [PATCH 22/33] [*] sub up

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 4d7dec28f7..35005eecc0 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 4d7dec28f790622ac2f729fbad1d95dec97c2cfa
+Subproject commit 35005eecc017edce57b728de65d06a041da1a842
-- 
GitLab


From 26e1282e0cbf259521ed1ba5a2717d92db034b64 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 30 Oct 2024 15:48:41 +0700
Subject: [PATCH 23/33] [*] sub up

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 88a46f20ed..ceab8de09d 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 88a46f20ed096abaf50eacf5c991b6a2c552ca9e
+Subproject commit ceab8de09dbdec712c17ad80b7bac316083a6a92
-- 
GitLab


From d631634c8c94d544070b8ad2ad3b62a26d803630 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 30 Oct 2024 15:55:50 +0700
Subject: [PATCH 24/33] [*] fix

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index ceab8de09d..d4989c7e44 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit ceab8de09dbdec712c17ad80b7bac316083a6a92
+Subproject commit d4989c7e448a6da993e27d084fab974663721f33
-- 
GitLab


From a57550f3f5c511b74de38aec182ef5c07607eb7e Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Thu, 31 Oct 2024 14:03:51 +0700
Subject: [PATCH 25/33] [*] fix lock

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index d4989c7e44..d9be7bc026 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit d4989c7e448a6da993e27d084fab974663721f33
+Subproject commit d9be7bc026e42030d847ee2a645436be2da1e26c
-- 
GitLab


From 71fa557159b3525e6f448ec032e514941c2032a7 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Thu, 31 Oct 2024 14:16:39 +0700
Subject: [PATCH 26/33] ...|

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index d9be7bc026..6e6c77c255 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit d9be7bc026e42030d847ee2a645436be2da1e26c
+Subproject commit 6e6c77c255089cf55022f94065f48d785c92deaa
-- 
GitLab


From dacfb1ddbedc2e066ac4d4b076ccffb2c07ad719 Mon Sep 17 00:00:00 2001
From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net>
Date: Sat, 2 Nov 2024 13:25:13 +0700
Subject: [PATCH 27/33] [*] fix error

---
 modules/net/dap_chain_node_cli_cmd.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index c514dc77e3..b213a6f1cf 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8768,6 +8768,17 @@ static void s_stage_connected_callback(dap_client_t* a_client, void * a_arg) {
     }
 }
 
+static void s_stage_connected_error_callback(dap_client_t* a_client, void * a_arg) {
+    dap_chain_node_client_t *l_node_client = DAP_CHAIN_NODE_CLIENT(a_client);
+    UNUSED(a_arg);
+    if(l_node_client) {
+        pthread_mutex_lock(&l_node_client->wait_mutex);
+        l_node_client->state = NODE_CLIENT_STATE_ERROR;
+        pthread_cond_signal(&l_node_client->wait_cond);
+        pthread_mutex_unlock(&l_node_client->wait_mutex);
+    }
+}
+
 int com_exec_cmd(int argc, char **argv, void **reply) {
     json_object ** a_json_arr_reply = (json_object **) reply;
     if (!dap_json_rpc_exec_cmd_inited()) {
@@ -8811,7 +8822,7 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     dap_chain_node_client_t * l_node_client = dap_chain_node_client_create(l_net, node_info, NULL, NULL);
 
     //handshake
-    l_node_client->client = dap_client_new(NULL, l_node_client);
+    l_node_client->client = dap_client_new(s_stage_connected_error_callback, l_node_client);
     l_node_client->client->_inheritor = l_node_client;
     dap_client_set_uplink_unsafe(l_node_client->client, &l_node_client->info->address, node_info->ext_host, node_info->ext_port);
     dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(l_node_client->client);
-- 
GitLab


From 5933c16992d1289f38d988f244df3ddc952ee635 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 6 Nov 2024 12:42:49 +0700
Subject: [PATCH 28/33] [*] add net check

---
 modules/net/dap_chain_node_cli_cmd.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index b213a6f1cf..189ae08989 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8797,6 +8797,10 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     }
     dap_chain_net_t* l_net = NULL;
     l_net = dap_chain_net_by_name(l_net_str);
+    if (!l_net)     [
+        dap_json_rpc_error_add(*a_json_arr_reply, -1, "Can't find net %s", l_net_str);
+        return -3;
+    ]
 
     dap_json_rpc_params_t * params = dap_json_rpc_params_create();
     char *l_cmd_str = dap_strdup(l_cmd_arg_str);
-- 
GitLab


From 0f9268ee100fe56e9a76fe4fadd6b56006ce58c8 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 6 Nov 2024 12:51:46 +0700
Subject: [PATCH 29/33] [*] fix

---
 modules/net/dap_chain_node_cli_cmd.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 189ae08989..eb9e4c8fcd 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8792,13 +8792,13 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-addr", &l_addr_str);
     dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-net", &l_net_str);
     if (!l_cmd_arg_str || ! l_addr_str || !l_net_str) {
-        dap_json_rpc_error_add(*a_json_arr_reply, -1, "Command exec_cmd require args -cmd, -addr, -net");
+        dap_json_rpc_error_add(*a_json_arr_reply, -2, "Command exec_cmd require args -cmd, -addr, -net");
         return -2;
     }
     dap_chain_net_t* l_net = NULL;
     l_net = dap_chain_net_by_name(l_net_str);
     if (!l_net)     [
-        dap_json_rpc_error_add(*a_json_arr_reply, -1, "Can't find net %s", l_net_str);
+        dap_json_rpc_error_add(*a_json_arr_reply, -3, "Can't find net %s", l_net_str);
         return -3;
     ]
 
@@ -8841,7 +8841,7 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
         return -8;
     }
 
-    //send response
+    //send request
     json_object * l_response = NULL;
     dap_json_rpc_request_send(l_client_internal, l_request, &l_response);
 
-- 
GitLab


From c93a3bbaad03587cb80aa1c905ed82b92146cd29 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 6 Nov 2024 12:56:35 +0700
Subject: [PATCH 30/33] [*] fix build

---
 modules/net/dap_chain_node_cli_cmd.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index eb9e4c8fcd..d57ed48c6c 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -8797,10 +8797,10 @@ int com_exec_cmd(int argc, char **argv, void **reply) {
     }
     dap_chain_net_t* l_net = NULL;
     l_net = dap_chain_net_by_name(l_net_str);
-    if (!l_net)     [
+    if (!l_net){
         dap_json_rpc_error_add(*a_json_arr_reply, -3, "Can't find net %s", l_net_str);
         return -3;
-    ]
+    }
 
     dap_json_rpc_params_t * params = dap_json_rpc_params_create();
     char *l_cmd_str = dap_strdup(l_cmd_arg_str);
-- 
GitLab


From 0e5ba2e11a2e705705ba4648b535496957810ee6 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Wed, 6 Nov 2024 14:46:48 +0700
Subject: [PATCH 31/33] [*] subup

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 6e6c77c255..2e8eae0cc0 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 6e6c77c255089cf55022f94065f48d785c92deaa
+Subproject commit 2e8eae0cc0687efac9a018576361e22703a2407b
-- 
GitLab


From 61482b4ee5ee5d2b72b936fb4784d9445b462017 Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Thu, 7 Nov 2024 11:36:31 +0700
Subject: [PATCH 32/33] [*] subup

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 2e8eae0cc0..39a40320ea 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 2e8eae0cc0687efac9a018576361e22703a2407b
+Subproject commit 39a40320ead624929297216eae957872450fef52
-- 
GitLab


From ac769fa45cf7c6577babbe6aa64904b21fb8a1ac Mon Sep 17 00:00:00 2001
From: Olzhas <oljas.jarasbaev@demlabs.net>
Date: Thu, 7 Nov 2024 16:19:23 +0700
Subject: [PATCH 33/33] [*] subup

---
 dap-sdk | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dap-sdk b/dap-sdk
index 39a40320ea..9898f5774d 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 39a40320ead624929297216eae957872450fef52
+Subproject commit 9898f5774dea5c5dfaffce489e79611465efb302
-- 
GitLab