diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b1aead7a2cd2b93165a0550736b4b01d410d1870..8c378737b1afc6b5db86abf37661bedffc464c40 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -16,7 +16,7 @@ stages:
   dependencies: []
   
   
-tests:
+linux-amd64-tests:
     extends: .tests
     image: demlabs/amd64/debian-bullseye:linuxbuilder
     before_script: /opt/buildtools/prepare_environment.sh amd64-linux
@@ -24,5 +24,35 @@ tests:
       - mkdir build
       - cd build && cmake .. -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="new-hope, multisign" && make -j$(nproc)
 
+linux-arm32v7-tests:
+    extends: .tests
+    image: demlabs/arm32v7/debian-bullseye:linuxbuilder
+    before_script: /opt/buildtools/prepare_environment.sh arm32v7-linux
+    script:
+      - mkdir build
+      - cd build && cmake .. -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="new-hope, multisign" && make -j$(nproc)
+
+linux-arm64v8-tests:
+    extends: .tests
+    image: demlabs/arm64v8/debian-bullseye:linuxbuilder
+    before_script: /opt/buildtools/prepare_environment.sh arm64-linux
+    script:
+      - mkdir build
+      - cd build && cmake .. -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="new-hope, multisign" && make -j$(nproc)
+
+windows-tests:
+    extends: .tests
+    image: demlabs/amd64/debian-bullseye:windowsbuilder
+    before_script: /opt/buildtools/prepare_environment.sh amd64-windows
+    script:
+      - mkdir build
+      - cd build && export PATH=${MXE_ROOT}/usr/bin:$PATH && x86_64-w64-mingw32.static-cmake .. -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="new-hope, multisign" && make -j$(nproc)
     
 
+macos-tests:
+    extends: .tests
+    image: demlabs/amd64/debian-bullseye:osxbuilder
+    before_script: /opt/buildtools/prepare_environment.sh amd64-windows
+    script:
+      - mkdir build
+      - cd build && $(${OSXCROSS_ROOT}/bin/osxcross-conf) && export OSXCROSS_NO_INCLUDE_PATH_WARNINGS=1 && export OSXCROSS_HOST=x86_64-apple-darwin20.4 && cmake -DCMAKE_TOOLCHAIN_FILE=${OSXCROSS_ROOT}/toolchain.cmake -DBUILD_CELLFRAME_SDK_TESTS=ON -DOFF_CORE_CELLFRAME_SDK_TESTS_OFF=network-monitor -DOFF_CRYPTO_CELLFRAME_SDK_TESTS_OFF="new-hope, multisign" .. && make -j$(nproc)
diff --git a/3rdparty/iputils/ping.c b/3rdparty/iputils/ping.c
index e634a606e8bde2c67697719a6d1295cbc4960a1d..a0a92de404de0d3c0c977fcd63f015f72d377848 100644
--- a/3rdparty/iputils/ping.c
+++ b/3rdparty/iputils/ping.c
@@ -656,7 +656,7 @@ int ping4_run(ping_handle_t *a_ping_handle, int argc, char **argv, struct addrin
                 ai = result;
             }
 
-            memcpy(&a_ping_handle->whereto, ai->ai_addr, sizeof (a_ping_handle->whereto));
+            a_ping_handle->whereto = *(struct sockaddr_in*)ai->ai_addr;
             memset(hnamebuf, 0, sizeof hnamebuf);
             if(ai->ai_canonname)
                 strncpy(hnamebuf, ai->ai_canonname, sizeof hnamebuf - 1);
@@ -1601,7 +1601,8 @@ pr_addr(ping_handle_t *a_ping_handle, void *sa, socklen_t salen)
     if(salen == last_salen && !memcmp(sa, &last_sa, salen))
         return buffer;
 
-    memcpy(&last_sa, sa, (last_salen = salen));
+    last_sa = *(struct sockaddr_storage*)sa;
+    last_salen = salen;
 
     a_ping_handle->ping_common.in_pr_addr = !setjmp(a_ping_handle->ping_common.pr_addr_jmp);
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0cf516a40594c91dac194817f2bbeb2023fd7516..f9c106dd63c15c0467af1ac6b212e37414020077 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -226,18 +226,20 @@ if (CELLFRAME_MODULES MATCHES "srv-xchange")
     set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_chain_net_srv_xchange)
 endif()
 
-# Enable service of delegated stake
-if (CELLFRAME_MODULES MATCHES "srv-stake-pos-delegate")
-    message("[+] Module 'srv-stake-pos-delegate'")
-    set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_chain_net_srv_stake_pos_delegate)
-endif()
-
 # Enable service of stake token
 if (CELLFRAME_MODULES MATCHES "srv-stake-lock")
     message("[+] Module 'srv-stake-lock'")
     set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_chain_net_srv_stake_lock)
 endif()
 
+# Enable service of delegated stake
+if (CELLFRAME_MODULES MATCHES "srv-stake-pos-delegate")
+    message("[+] Module 'srv-stake-pos-delegate'")
+    #add TARGET_FILE for proper symbols resolving
+    #pos_delegate depends on symbols from this libs
+    set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_chain_net_srv_stake_pos_delegate $<TARGET_FILE:dap_chain_cs_dag_poa> $<TARGET_FILE:dap_chain_cs_block_poa> $<TARGET_FILE:dap_chain_cs_dag> $<TARGET_FILE:dap_chain_cs_blocks>)
+endif()
+
 # Enable service for dynamic modules
 if (CELLFRAME_MODULES MATCHES "modules-dynamic")
     message("[+] Module 'dap_modules_dynamic_cdb'")
@@ -245,9 +247,9 @@ if (CELLFRAME_MODULES MATCHES "modules-dynamic")
 endif()
 
 if (WIN32)
-    set(CELLFRAME_LIBS ${CELLFRAME_LIBS} KERNEL32 USER32 SHELL32 WINMM GDI32 ADVAPI32
-					 Ole32 Version Imm32 OleAut32 ws2_32 ntdll psapi 
-                                         Shlwapi Bcrypt Crypt32 Secur32 userenv mqrt)
+    set(CELLFRAME_LIBS ${CELLFRAME_LIBS} kernel32 user32 shell32 winmm gdi32 advapi32
+					 ole32 version imm32 oleaut32 ws2_32 ntdll psapi 
+                                         shlwapi bcrypt crypt32 secur32 userenv mqrt)
 endif()
 
 if (DARWIN)
diff --git a/dap-sdk/core/include/dap_config.h b/dap-sdk/core/include/dap_config.h
index 944c32002002835bbab45191988e7a5f2a109bd1..41cab495498aa73cf079294010ad70f31ab1e7e4 100755
--- a/dap-sdk/core/include/dap_config.h
+++ b/dap-sdk/core/include/dap_config.h
@@ -65,6 +65,10 @@ uint64_t dap_config_get_item_uint64_default(dap_config_t * a_config, const char
 
 const char * dap_config_get_item_str(dap_config_t * a_config, const char * a_section_path, const char * a_item_name);
 const char * dap_config_get_item_str_default(dap_config_t * a_config, const char * a_section_path, const char * a_item_name, const char * a_value_default);
+
+const char * dap_config_get_item_path(dap_config_t * a_config, const char * a_section_path, const char * a_item_name);
+const char * dap_config_get_item_path_default(dap_config_t * a_config, const char * a_section_path, const char * a_item_name, const char * a_value_default);
+
 char** dap_config_get_array_str(dap_config_t * a_config, const char * a_section_path,
                                       const char * a_item_name, uint16_t * array_length);
 
diff --git a/dap-sdk/core/include/dap_math_ops.h b/dap-sdk/core/include/dap_math_ops.h
index 348c37c26e28f8e208bdc0c839eb59bbb75986ea..4d16ade7f3468ecbef84f9b6d617bf882c95ccfd 100755
--- a/dap-sdk/core/include/dap_math_ops.h
+++ b/dap-sdk/core/include/dap_math_ops.h
@@ -1022,21 +1022,20 @@ static inline int MULT_256_FRAC_FRAC(uint256_t a_val, uint256_t a_mult, uint256_
 static inline int MULT_256_COIN(uint256_t a_val, uint256_t b_val, uint256_t* result) {
     uint256_t tmp;
     uint256_t rem;
-    uint256_t ten17 = GET_256_FROM_64(100000000000000000ULL);
+    uint256_t ten18 = GET_256_FROM_64(1000000000000000000ULL);
     uint256_t ten = GET_256_FROM_64(10ULL);
     uint256_t five = GET_256_FROM_64(500000000000000000);
     int overflow = MULT_256_256(a_val, b_val, &tmp);
-    divmod_impl_256(tmp, ten17, &tmp, &rem);
+    divmod_impl_256(tmp, ten18, &tmp, &rem);
     if (compare256(rem, five) >= 0) {
         SUM_256_256(tmp, ten, &tmp);
     }
-    if (compare256(ten, uint256_0) != 0)
-        DIV_256(tmp, ten, result);
+    *result = tmp;
     return overflow;
 }
 
 /**
- * Divides to fixed-point values, represented as 256-bit values
+ * Divides two fixed-point values, represented as 256-bit values
  * @param a_val
  * @param b_val
  * @param result is a fixed-point value, represented as 256-bit value
@@ -1044,16 +1043,26 @@ static inline int MULT_256_COIN(uint256_t a_val, uint256_t b_val, uint256_t* res
  */
 static inline void DIV_256_COIN(uint256_t a, uint256_t b, uint256_t *res)
 {
-    // define 10^36
-#ifdef DAP_GLOBAL_IS_INT128
-    uint128_t quad = *(uint128_t *)"\x0\x0\x0\x0\x10\x9f\x4b\xb3\x15\x07\xc9\x7b\xce\x97\xc0\x0";
-#else
-    uint128_t quad = {.lo = 54210108624275221ULL, .hi = 12919594847110692864ULL};
-#endif
-    uint256_t quad256 = GET_256_FROM_128(quad);
-    uint256_t tmp = uint256_0;
-    DIV_256(quad256, b, &tmp);  // assertion with zero divisor inside
-    MULT_256_COIN(a, tmp, res);
+    if (compare256(a, uint256_0) == 0) {
+        *res = uint256_0;
+        return;
+    }
+    int counter = 0;
+    uint256_t a_copy = a;
+    uint256_t ten18 = GET_256_FROM_64(1000000000000000000ULL);
+    uint256_t ten = GET_256_FROM_64(10l);
+    while (compare256(a_copy, b) < 0) {
+        counter++;
+        MULT_256_256(a_copy, ten, &a_copy);
+    }
+    DIV_256(a_copy, b, &a_copy);
+    MULT_256_256(a_copy, ten18, &a_copy);
+    uint256_t loan = GET_256_FROM_64(1l);
+    while(counter--) {
+        MULT_256_256(loan, ten, &loan); //maybe we should use same table as in dap_chain_common.c instead of cycle ?
+    }
+    DIV_256(a_copy, loan, &a_copy);
+    *res = a_copy;
 }
 
 #ifdef __cplusplus
diff --git a/dap-sdk/core/src/dap_cbuf.c b/dap-sdk/core/src/dap_cbuf.c
index 93d32f9444d8639b16f0211a0a02f2c8efe39dad..7de74e14b4d900bcbad3e7d30c45d2c5fb8405b9 100755
--- a/dap-sdk/core/src/dap_cbuf.c
+++ b/dap-sdk/core/src/dap_cbuf.c
@@ -133,7 +133,7 @@ void dap_cbuf_push(dap_cbuf_t cBuf, const void *src, size_t length)
 #include <sys/types.h>
 #include <sys/socket.h>
 
-int dap_cbuf_write_In_socket(dap_cbuf_t cBuf, int sockfd)
+int dap_cbuf_write_in_socket(dap_cbuf_t cBuf, int sockfd)
 {
     if(cBuf->data_size == 0) {
         return 0;
diff --git a/dap-sdk/core/src/dap_config.c b/dap-sdk/core/src/dap_config.c
index e4961e6621e917a4c7fa215ab5cb3af4e7fc9b7f..019610f0f6ae7119b57545b2ae6ce377a298ab03 100755
--- a/dap-sdk/core/src/dap_config.c
+++ b/dap-sdk/core/src/dap_config.c
@@ -38,6 +38,7 @@ typedef struct dap_config_item{
 typedef struct dap_config_internal
 {
     dap_config_item_t * item_root;
+    char * path;
 } dap_config_internal_t;
 #define DAP_CONFIG_INTERNAL(a) ( (dap_config_internal_t* ) a->_internal )
 
@@ -112,7 +113,7 @@ dap_config_t * dap_config_open(const char * a_name)
         char *l_config_path = DAP_NEW_SIZE(char,l_config_path_size_max);
         snprintf(l_config_path,l_config_path_size_max, "%s/%s.cfg",s_configs_path,a_name);
         l_ret = dap_config_load(l_config_path);
-        DAP_DELETE(l_config_path);
+//        DAP_DELETE(l_config_path);
     }else{
         log_it(L_ERROR,"Config name is NULL");
     }
@@ -137,6 +138,7 @@ dap_config_t * dap_config_load(const char * a_file_path)
         log_it(L_DEBUG,"Opened config %s",a_file_path);
         l_ret = DAP_NEW_Z(dap_config_t);
         dap_config_internal_t * l_config_internal = DAP_NEW_Z(dap_config_internal_t);
+        l_config_internal->path = (char*)a_file_path;
         l_ret->_internal = l_config_internal;
         size_t l_global_offset=0;
         size_t l_buf_size=0;
@@ -339,6 +341,7 @@ void dap_config_close(dap_config_t * a_config)
         l_item = DAP_CONFIG_INTERNAL(a_config)->item_root;
     }
 
+    free(DAP_CONFIG_INTERNAL(a_config)->path);
     free(a_config->_internal);
     free(a_config);
 
@@ -550,6 +553,35 @@ const char * dap_config_get_item_str(dap_config_t * a_config, const char * a_sec
     return  (!item) ?  NULL : item->data_str;
 }
 
+/**
+ * @brief dap_config_get_item_path Getting a configuration item as a filsystem path (may be relative to config location)
+ * @param[in] a_config Configuration
+ * @param[in] a_section_path Path
+ * @param[in] a_item_name setting
+ * @return
+ */
+const char * dap_config_get_item_path(dap_config_t * a_config, const char * a_section_path, const char * a_item_name)
+{
+    const char* raw_path = dap_config_get_item_str(a_config, a_section_path, a_item_name);
+    if (!raw_path) return NULL;
+    char * res = dap_canonicalize_filename(raw_path, dap_path_get_dirname(DAP_CONFIG_INTERNAL(a_config)->path));
+    log_it(L_DEBUG, "Config-path item: '%s': composed from '%s' and '%s'", res, raw_path, dap_path_get_dirname(DAP_CONFIG_INTERNAL(a_config)->path));
+    return res;
+}
+
+/**
+ * @brief dap_config_get_item_path_default Getting a configuration item as a filsystem path (may be relative to config location) (or default)
+ * @param[in] a_config Configuration
+ * @param[in] a_section_path Path
+ * @param[in] a_item_name setting
+ * @param[in] a_value_default Default value
+ * @return
+ */
+const char * dap_config_get_item_path_default(dap_config_t * a_config, const char * a_section_path, const char * a_item_name, const char * a_value_default)
+{
+    const char * res = dap_config_get_item_path(a_config, a_section_path, a_item_name);
+    return res ?  res : a_value_default;
+}
 
 /**
  * @brief dap_config_get_array_str Getting an array of configuration items as a string
diff --git a/dap-sdk/core/src/dap_file_utils.c b/dap-sdk/core/src/dap_file_utils.c
index 342fdd2ab464a9f4b44d47005337dd4436b7af44..ebc11bd7294596cb56a0f1e49d167783e25cb09d 100755
--- a/dap-sdk/core/src/dap_file_utils.c
+++ b/dap-sdk/core/src/dap_file_utils.c
@@ -1141,10 +1141,6 @@ char* dap_canonicalize_filename(const char *filename, const char *relative_to)
     if(*output == DAP_DIR_SEPARATOR)
         output++;
 
-    /* Ignore % to prevent Unicode attacks*/
-    while(input[0] == '%' )
-       input++;
-
     /* POSIX allows double slashes at the start to mean something special
      * (as does windows too). So, "//" != "/", but more than two slashes
      * is treated as "/".
diff --git a/dap-sdk/core/src/dap_time.c b/dap-sdk/core/src/dap_time.c
index 411392f732e1affe2f1dbb3af25ee5a2d56b367b..46bf930e91b9a63e3c3ee4a2af7c832128e04c7d 100644
--- a/dap-sdk/core/src/dap_time.c
+++ b/dap-sdk/core/src/dap_time.c
@@ -159,9 +159,11 @@ int dap_time_to_str_rfc822(char * a_out, size_t a_out_size_max, dap_time_t a_t)
 }
 
 /**
- * @brief Get time_t from string with RFC822 formatted [%y%m%d = 220610 = 10 june 2022]
+ * @brief Get time_t from string with RFC822 formatted
+ * @brief (not WIN32) "%a, %d %b %y %T %z" == "Tue, 02 Aug 22 19:50:41 +0300"
+ * @brief (WIN32) !DOES NOT WORK! please, use dap_time_from_str_simplified()
  * @param[out] a_time_str
- * @return time from string or 0 if bad time format
+ * @return time from string or 0 if bad time forma
  */
 dap_time_t dap_time_from_str_rfc822(const char *a_time_str)
 {
@@ -231,11 +233,10 @@ dap_time_t dap_time_from_str_simplified(const char *a_time_str)
 {
     dap_time_t l_time = 0;
     if(!a_time_str) {
+        return l_time;
     }
     struct tm l_tm;
     memset(&l_tm, 0, sizeof(struct tm));
-    strptime(a_time_str, "%y%m%d%H%M%S", &l_tm);
-    l_time = mktime(&l_tm);
 
 #ifndef _WIN32
     strptime(a_time_str, "%y%m%d", &l_tm);
diff --git a/dap-sdk/core/test/CMakeLists.txt b/dap-sdk/core/test/CMakeLists.txt
index 0fdb03295b05301a1d7865277eb6a20583d8957d..06e68949d64e673af4cead93a47a0146dee2cfa2 100755
--- a/dap-sdk/core/test/CMakeLists.txt
+++ b/dap-sdk/core/test/CMakeLists.txt
@@ -7,7 +7,11 @@ file(GLOB SRCS *.c)
 
 
 if(UNIX)
-    file(GLOB PLATROFM_DEP_SRC unix/*.c unix/*.h)
+if (OFF_CORE_CELLFRAME_SDK_TESTS_OFF MATCHES "network-monitor")
+    file(GLOB PLATROFM_DEP_SRC unix/dap_cpu*.c unix/dap_process*.c unix/dap_cpu*.h unix/dap_process*.h)  
+  else()
+    file(GLOB PLATROFM_DEP_SRC unix/*.c unix/*.h)  
+  endif()
 endif()
 
 add_executable(${PROJECT_NAME} ${SRCS} ${PLATROFM_DEP_SRC})  
@@ -28,7 +32,7 @@ add_executable(rpmalloc_bench
   rpmalloc/test/timer.c
 )
 if(WIN32)
-	target_link_libraries(rpmalloc_bench dap_core m pthread ntdll psapi Shlwapi)
+	target_link_libraries(rpmalloc_bench dap_core m pthread ntdll psapi shlwapi)
 endif()
 if(UNIX)
 	target_link_libraries(rpmalloc_bench dap_core m pthread)
@@ -42,7 +46,7 @@ add_executable(crtmalloc_bench
   rpmalloc/test/timer.c
 )
 if(WIN32)
-	target_link_libraries(crtmalloc_bench dap_core m pthread ntdll psapi Shlwapi)
+	target_link_libraries(crtmalloc_bench dap_core m pthread ntdll psapi shlwapi)
 endif()
 if(UNIX)
 	target_link_libraries(crtmalloc_bench dap_core m pthread)
diff --git a/dap-sdk/core/test/dap_circular_test.c b/dap-sdk/core/test/dap_circular_test.c
index d3cb9f43e9aa9dd3ed3a394701a68f768b017989..6140da51615f6004d2edad21ce16d873a73d0427 100755
--- a/dap-sdk/core/test/dap_circular_test.c
+++ b/dap-sdk/core/test/dap_circular_test.c
@@ -1,6 +1,6 @@
 #ifndef _WIN32
 #include "dap_circular_test.h"
-#include "dap_circular_buffer.h"
+#include <dap_cbuf.h>
 
 #include <string.h>
 #include <sys/socket.h>
@@ -13,17 +13,17 @@ static char *chars_string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
 void dap_circular_test_simple()
 {
     const int buf_size = 8;
-    circular_buffer_t cb = circular_buffer_create(buf_size);
+    dap_cbuf_t cb = dap_cbuf_create(buf_size);
 
-    circular_buffer_push(cb, chars_string, buf_size);
+    dap_cbuf_push(cb, chars_string, buf_size);
 
     int fd[2];
     socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
 
-    int ret = circular_buffer_write_In_socket(cb, fd[0]);
+    int ret = dap_cbuf_write_in_socket(cb, fd[0]);
     dap_assert(ret == buf_size, "Check ret write in socket");
 
-    ret = circular_buffer_write_In_socket(cb, fd[0]);
+    ret = dap_cbuf_write_in_socket(cb, fd[0]);
     dap_assert(ret == 0, "Check ret write in socket");
     char result_buff[MAX_RESULT_BUF_LEN] = {0};
     ssize_t res = read(fd[1], result_buff, 44);
@@ -32,11 +32,11 @@ void dap_circular_test_simple()
 
     dap_assert(dap_strn_equals(result_buff, chars_string, buf_size),
                "Check result buf");
-    dap_assert(circular_buffer_get_data_size(cb) == 0, "Check data size");
+    dap_assert(dap_cbuf_get_size(cb) == 0, "Check data size");
 
     close(fd[0]);
     close(fd[1]);
-    circular_buffer_free(cb);
+    dap_cbuf_delete(cb);
     dap_pass_msg("Test simple");
 }
 
@@ -45,18 +45,18 @@ void dap_circular_test_double_write()
     const int buf_size = 8;
     const char* expected_string = "0123456701";
     int expected_string_len = strlen(expected_string);
-    circular_buffer_t cb = circular_buffer_create(buf_size);
+    dap_cbuf_t cb = dap_cbuf_create(buf_size);
 
-    circular_buffer_push(cb, chars_string, buf_size);
+    dap_cbuf_push(cb, chars_string, buf_size);
 
     int fd[2];
     socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
 
-    int ret = circular_buffer_write_In_socket(cb, fd[0]);
+    int ret = dap_cbuf_write_in_socket(cb, fd[0]);
 
-    circular_buffer_push(cb, chars_string, 2);
+    dap_cbuf_push(cb, chars_string, 2);
 
-    ret = circular_buffer_write_In_socket(cb, fd[0]);
+    ret = dap_cbuf_write_in_socket(cb, fd[0]);
     dap_assert(ret == 2, "Check ret write in socket");
 
     char result_buff[MAX_RESULT_BUF_LEN] = {0};
@@ -66,10 +66,10 @@ void dap_circular_test_double_write()
 
     dap_assert(dap_str_equals(result_buff, expected_string),
                "Check result buf");
-    dap_assert(circular_buffer_get_data_size(cb) == 0, "Check data size");
+    dap_assert(dap_cbuf_get_size(cb) == 0, "Check data size");
     dap_pass_msg("Double write");
 
-    circular_buffer_free(cb);
+    dap_cbuf_delete(cb);
     close(fd[0]);
     close(fd[1]);
 }
@@ -79,11 +79,11 @@ void dap_circular_test_defrag_write()
     const int buf_size = 8;
     const char* expected_string = "56701201";
     int expected_string_len = strlen(expected_string);
-    circular_buffer_t cb = circular_buffer_create(buf_size);
+    dap_cbuf_t cb = dap_cbuf_create(buf_size);
 
-    circular_buffer_push(cb, chars_string, buf_size);
-    circular_buffer_pop(cb, 5, NULL);
-    circular_buffer_push(cb, chars_string, 3);
+    dap_cbuf_push(cb, chars_string, buf_size);
+    dap_cbuf_pop(cb, 5, NULL);
+    dap_cbuf_push(cb, chars_string, 3);
     // expected string here 567012
 
 
@@ -91,14 +91,14 @@ void dap_circular_test_defrag_write()
     socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
 
     // write 567012
-    int ret = circular_buffer_write_In_socket(cb, fd[0]);
+    int ret = dap_cbuf_write_in_socket(cb, fd[0]);
     dap_assert(ret == 6, "Check ret write in socket");
 
     // push 01
-    circular_buffer_push(cb, chars_string, 2);
+    dap_cbuf_push(cb, chars_string, 2);
 
     // write 01
-    ret = circular_buffer_write_In_socket(cb, fd[0]);
+    ret = dap_cbuf_write_in_socket(cb, fd[0]);
     dap_assert(ret == 2, "Check ret write in socket");
 
     char result_buff[MAX_RESULT_BUF_LEN] = {0};
@@ -110,8 +110,8 @@ void dap_circular_test_defrag_write()
                "Check result buf");
 
     dap_pass_msg("Double write");
-    dap_assert(circular_buffer_get_data_size(cb) == 0, "Check data size");
-    circular_buffer_free(cb);
+    dap_assert(dap_cbuf_get_size(cb) == 0, "Check data size");
+    dap_cbuf_delete(cb);
     close(fd[0]);
     close(fd[1]);
 }
@@ -119,9 +119,9 @@ void dap_circular_test_defrag_write()
 void dap_circular_test_write_bad_socket()
 {
     const int buf_size = 8;
-    circular_buffer_t cb = circular_buffer_create(buf_size);
+    dap_cbuf_t cb = dap_cbuf_create(buf_size);
 
-    circular_buffer_push(cb, chars_string, buf_size);
+    dap_cbuf_push(cb, chars_string, buf_size);
 
     int fd[2];
     socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
@@ -129,10 +129,10 @@ void dap_circular_test_write_bad_socket()
     socketpair(PF_LOCAL, SOCK_STREAM, 0, fd2);
 
     close(fd[0]);
-    int ret = circular_buffer_write_In_socket(cb, fd[0]);
+    int ret = dap_cbuf_write_in_socket(cb, fd[0]);
     dap_assert(ret == -1, "Check ret write in socket");
 
-    ret = circular_buffer_write_In_socket(cb, fd2[0]);
+    ret = dap_cbuf_write_in_socket(cb, fd2[0]);
     dap_assert(ret == 8, "Check ret write in socket");
     char result_buff[MAX_RESULT_BUF_LEN] = {0};
     ssize_t res = read(fd2[1], result_buff, MAX_RESULT_BUF_LEN);
@@ -142,13 +142,13 @@ void dap_circular_test_write_bad_socket()
     dap_assert(dap_strn_equals(result_buff, chars_string, buf_size),
                "Check result buf");
 
-    ret = circular_buffer_write_In_socket(cb, fd2[0]);
+    ret = dap_cbuf_write_in_socket(cb, fd2[0]);
     dap_assert(ret == 0, "Check zero write");
-    dap_assert(circular_buffer_get_data_size(cb) == 0, "Check data size");
+    dap_assert(dap_cbuf_get_size(cb) == 0, "Check data size");
     close(fd[1]);
     close(fd2[0]);
     close(fd2[1]);
-    circular_buffer_free(cb);
+    dap_cbuf_delete(cb);
     dap_pass_msg("Test simple");
 }
 
@@ -161,7 +161,7 @@ void dap_circular_load_test()
     const char *digits = "123456789";
 
     const int buf_size = strlen(digits);
-    circular_buffer_t cb = circular_buffer_create(buf_size);
+    dap_cbuf_t cb = dap_cbuf_create(buf_size);
 
     int fd[2];
     socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
@@ -169,23 +169,23 @@ void dap_circular_load_test()
     int count_writed_bytes = 0;
 
     // defrag buffer
-    circular_buffer_push(cb, (void*)digits, strlen(digits));
-    circular_buffer_pop(cb, strlen(digits) - 1, NULL);
-    circular_buffer_push(cb, (void*)digits, 3);
+    dap_cbuf_push(cb, (void*)digits, strlen(digits));
+    dap_cbuf_pop(cb, strlen(digits) - 1, NULL);
+    dap_cbuf_push(cb, (void*)digits, 3);
     count_writed_bytes = 4;
 
     char expectedBuffer[MAX_RESULT_BUF_LEN];
     memset(expectedBuffer, 0, MAX_RESULT_BUF_LEN);
-    circular_buffer_read(cb, count_writed_bytes, expectedBuffer);
+    dap_cbuf_read(cb, count_writed_bytes, expectedBuffer);
 
     int count_write_bytes = 4;
     do {
-        int r = circular_buffer_write_In_socket(cb, fd[0]);
+        int r = dap_cbuf_write_in_socket(cb, fd[0]);
         dap_assert_PIF(r == count_write_bytes, "Check write bytes");
-        dap_assert_PIF(circular_buffer_get_data_size(cb) == 0, "buf size must be 0!");
+        dap_assert_PIF(dap_cbuf_get_size(cb) == 0, "buf size must be 0!");
 
         count_write_bytes = rand() % strlen(digits);
-        circular_buffer_push(cb, (void*)digits, count_write_bytes);
+        dap_cbuf_push(cb, (void*)digits, count_write_bytes);
         strncat(expectedBuffer, digits, count_write_bytes);
         count_writed_bytes += count_write_bytes;
     } while (--iterations);
@@ -197,7 +197,7 @@ void dap_circular_load_test()
 
     dap_assert(memcmp(expectedBuffer, result_buff, res) == 0, "Check expected and result buffer");
 
-    circular_buffer_free(cb);
+    dap_cbuf_delete(cb);
     close(fd[0]);
     close(fd[1]);
 }
diff --git a/dap-sdk/core/test/main.c b/dap-sdk/core/test/main.c
index 71b896bce01bbc74615efd4a12a71a5992908ee9..d2235436396155c2686b16acb4da487484814767 100755
--- a/dap-sdk/core/test/main.c
+++ b/dap-sdk/core/test/main.c
@@ -5,7 +5,7 @@
 #include "dap_circular_test.h"
 #include "dap_process_mem_test.h"
 #include "dap_cpu_monitor_test.h"
-#ifndef DDAP_NETWORK_MONITOR_TEST_OFF
+#ifndef DAP_NETWORK_MONITOR_TEST_OFF
 #include "dap_network_monitor.h"
 #include "dap_network_monitor_test.h"
 #endif
diff --git a/dap-sdk/crypto/src/dap_cert_file.c b/dap-sdk/crypto/src/dap_cert_file.c
index a4c25d7257c21a0ef09a88898120fe904866fd50..2371f5f2b18b47033ba6caf8bcf67d659cce83bc 100755
--- a/dap-sdk/crypto/src/dap_cert_file.c
+++ b/dap-sdk/crypto/src/dap_cert_file.c
@@ -368,10 +368,9 @@ lb_exit:
 dap_cert_t* dap_cert_mem_load(const void * a_data, size_t a_data_size)
 {
     dap_cert_t * l_ret = NULL;
-    dap_cert_file_hdr_t l_hdr={0};
     const uint8_t * l_data = (const uint8_t *) a_data;
     uint32_t l_data_offset = 0;
-    memcpy(&l_hdr,l_data, sizeof(l_hdr));
+    dap_cert_file_hdr_t l_hdr = *(dap_cert_file_hdr_t*)l_data;
     l_data_offset += sizeof(l_hdr);
     if (l_hdr.sign != dap_cert_FILE_HDR_SIGN ){
         log_it(L_ERROR, "Wrong cert signature, corrupted header!");
diff --git a/dap-sdk/crypto/src/oaes/oaes_lib.c b/dap-sdk/crypto/src/oaes/oaes_lib.c
index 326cbf8b502c299734188acb7e2b7433a04a7795..b4f3eeeec11d7d8a90bcedffde74ece443b8693c 100755
--- a/dap-sdk/crypto/src/oaes/oaes_lib.c
+++ b/dap-sdk/crypto/src/oaes/oaes_lib.c
@@ -1330,7 +1330,7 @@ OAES_RET oaes_decrypt( OAES_CTX * ctx,
 	}
 	
 	// options
-	memcpy(&_options, c + 6, sizeof(_options));
+    _options = *(OAES_OPTION*)(c + 6);
 	// validate that all options are valid
 	if( _options & ~(
 			  OAES_OPTION_ECB
@@ -1348,7 +1348,7 @@ OAES_RET oaes_decrypt( OAES_CTX * ctx,
 		return OAES_RET_HEADER;
 	
 	// flags
-	memcpy(&_flags, c + 8, sizeof(_flags));
+    _flags = *(uint8_t*)(c + 8);
 	// validate that all flags are valid
 	if( _flags & ~(
 			  OAES_FLAG_PAD
diff --git a/dap-sdk/crypto/src/salsa2012/common_salsa.h b/dap-sdk/crypto/src/salsa2012/common_salsa.h
index 11cbf003e5d66abece22c5ff11ccf4a7ee29bd56..5f261082d3cd85b91956828055be8217319a6a42 100644
--- a/dap-sdk/crypto/src/salsa2012/common_salsa.h
+++ b/dap-sdk/crypto/src/salsa2012/common_salsa.h
@@ -38,9 +38,7 @@ static inline uint64_t
 load64_le(const uint8_t src[8])
 {
 #ifdef NATIVE_LITTLE_ENDIAN
-    uint64_t w;
-    memcpy(&w, src, sizeof w);
-    return w;
+    return *(uint64_t*)src;
 #else
     uint64_t w = (uint64_t) src[0];
     w |= (uint64_t) src[1] <<  8;
diff --git a/dap-sdk/crypto/src/sig_picnic/picnic.c b/dap-sdk/crypto/src/sig_picnic/picnic.c
index a59a476141a58fed7d14841a98b4df127aac82bd..4dbcec3879f6e37193cedb6eb14c54ae4ec4d67b 100755
--- a/dap-sdk/crypto/src/sig_picnic/picnic.c
+++ b/dap-sdk/crypto/src/sig_picnic/picnic.c
@@ -435,7 +435,7 @@ int picnic_keys_gen(picnic_privatekey_t *sk, picnic_publickey_t *pk, picnic_para
              (uint32_t*)sk->data, &paramset);
 
     /* Make of copy of the public key in the private key */
-    memcpy(&(sk->pk), pk, sizeof(picnic_publickey_t));
+    sk->pk = *pk;
 
     return 0;
 }
diff --git a/dap-sdk/io/CMakeLists.txt b/dap-sdk/io/CMakeLists.txt
index fc87bf0605419e5222abfae71c2cbc18dffcfa2e..88f6d4d421f40dacb55eba2f012eb495da98f0d5 100644
--- a/dap-sdk/io/CMakeLists.txt
+++ b/dap-sdk/io/CMakeLists.txt
@@ -6,8 +6,11 @@ set(CMAKE_C_STANDARD 11)
 add_definitions ("-D_GNU_SOURCE")
 
 if(WIN32)
-    file(GLOB DAP_IO_SOURCES *.c ../../../3rdparty/wepoll/*.c)
-    file(GLOB DAP_IO_HEADERS include/*.h ../../../3rdparty/wepoll/*.h)
+    file(GLOB DAP_IO_SOURCES *.c ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/wepoll/*.c)
+    file(GLOB DAP_IO_HEADERS include/*.h ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/wepoll/*.h)
+
+    
+
 else()
     file(GLOB DAP_IO_SOURCES *.c)
     file(GLOB DAP_IO_HEADERS include/*.h)
@@ -34,10 +37,11 @@ endif()
 
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PRIVATE src)
-target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/uthash/src)
+target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/uthash/src)
+
 
 if (WIN32)
-    target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/wepoll)
+    target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/wepoll)
 endif()
 
 if (${BUILD_DAP_IO_TESTS} MATCHES ON)
diff --git a/dap-sdk/io/dap_context.c b/dap-sdk/io/dap_context.c
index 99c1329b3a4dbeac472cce51b9ae345dd3baed36..8e3625e5ca5a3e44223502ec6cfb965424c90db3 100644
--- a/dap-sdk/io/dap_context.c
+++ b/dap-sdk/io/dap_context.c
@@ -1816,7 +1816,6 @@ dap_events_socket_t * dap_context_create_event(dap_context_t * a_context, dap_ev
 dap_events_socket_t * dap_context_create_pipe(dap_context_t * a_context, dap_events_socket_callback_t a_callback, uint32_t a_flags)
 {
 #ifdef DAP_OS_WINDOWS
-    UNUSED(a_w);
     UNUSED(a_callback);
     UNUSED(a_flags);
     return NULL;
diff --git a/dap-sdk/io/dap_events_socket.c b/dap-sdk/io/dap_events_socket.c
index ea832365841712a7441e07b7ef4b665f280f65de..18a9fad12b24e3e492c61593a7ff1b9a63a2357d 100644
--- a/dap-sdk/io/dap_events_socket.c
+++ b/dap-sdk/io/dap_events_socket.c
@@ -205,7 +205,7 @@ dap_events_socket_t *dap_events_socket_wrap_no_add( int a_sock, dap_events_socke
     l_ret->socket = a_sock;
     l_ret->uuid = dap_uuid_generate_uint64();
     if (a_callbacks)
-        memcpy(&l_ret->callbacks, a_callbacks, sizeof(l_ret->callbacks) );
+        l_ret->callbacks = *a_callbacks;
     l_ret->flags = DAP_SOCK_READY_TO_READ;
 
     l_ret->buf_in_size_max = DAP_EVENTS_SOCKET_BUF;
@@ -1227,7 +1227,8 @@ dap_events_socket_t * dap_events_socket_wrap2( dap_server_t *a_server, int a_soc
     l_es->socket = a_sock;
     l_es->server = a_server;
     l_es->uuid = dap_uuid_generate_uint64();
-    memcpy(&l_es->callbacks,a_callbacks, sizeof ( l_es->callbacks) );
+    if (a_callbacks)
+        l_es->callbacks = *a_callbacks;
     l_es->buf_out_size_max = l_es->buf_in_size_max = DAP_EVENTS_SOCKET_BUF;
     l_es->buf_in = a_callbacks->timer_callback ? NULL : DAP_NEW_Z_SIZE(byte_t, l_es->buf_in_size_max+1);
     l_es->buf_out = a_callbacks->timer_callback ? NULL : DAP_NEW_Z_SIZE(byte_t, l_es->buf_out_size_max+1);
diff --git a/dap-sdk/io/dap_net.c b/dap-sdk/io/dap_net.c
index 86251669530e93ecbabde3c5e71d9cef00610e8b..c4b9fb3b9e60a4d902f320c474ddc5868bcf86de 100644
--- a/dap-sdk/io/dap_net.c
+++ b/dap-sdk/io/dap_net.c
@@ -29,6 +29,10 @@
 
 #define LOG_TAG "dap_net"
 
+#ifdef _WIN32
+  #define poll WSAPoll
+#endif
+
 /**
  * @brief dap_net_resolve_host
  * @param a_host hostname
diff --git a/dap-sdk/io/dap_server.c b/dap-sdk/io/dap_server.c
index f9d38db30e0a0cdbf5dbe4d9c775393c78e06364..497b8d062e21da160974552d7fd04178e9df849d 100644
--- a/dap-sdk/io/dap_server.c
+++ b/dap-sdk/io/dap_server.c
@@ -289,10 +289,10 @@ static int s_server_run(dap_server_t * a_server, dap_events_socket_callbacks_t *
     }
 
 #ifdef DAP_EVENTS_CAPS_EPOLL
-    for(size_t l_worker_id = 0; l_worker_id < dap_events_worker_get_count() ; l_worker_id++){
+    for(size_t l_worker_id = 0; l_worker_id < dap_events_thread_get_count() ; l_worker_id++){
         dap_worker_t *l_w = dap_events_worker_get(l_worker_id);
         assert(l_w);
-        dap_events_socket_t * l_es = dap_events_socket_wrap2( a_server, a_server->events, a_server->socket_listener, &l_callbacks);
+        dap_events_socket_t * l_es = dap_events_socket_wrap2( a_server, a_server->socket_listener, &l_callbacks);
         a_server->es_listeners = dap_list_append(a_server->es_listeners, l_es);
 
         if (l_es) {
@@ -319,6 +319,12 @@ static int s_server_run(dap_server_t * a_server, dap_events_socket_callbacks_t *
     assert(l_w);
     dap_events_socket_t * l_es = dap_events_socket_wrap2( a_server, a_server->socket_listener, &l_callbacks);
     if (l_es) {
+        #ifdef DAP_EVENTS_CAPS_EPOLL
+            l_es->ev_base_flags = EPOLLIN;
+        #ifdef EPOLLEXCLUSIVE
+            l_es->ev_base_flags |= EPOLLET | EPOLLEXCLUSIVE;
+        #endif
+        #endif
         a_server->es_listeners = dap_list_append(a_server->es_listeners, l_es);
         l_es->type = a_server->type == SERVER_TCP ? DESCRIPTOR_TYPE_SOCKET_LISTENING : DESCRIPTOR_TYPE_SOCKET_UDP;
         l_es->_inheritor = a_server;
diff --git a/dap-sdk/io/dap_timerfd.c b/dap-sdk/io/dap_timerfd.c
index b9323e8eceb519ea272754999302ed6f0871b0e4..a8c494426ca4d0db361dacbbfedb5875198490d5 100644
--- a/dap-sdk/io/dap_timerfd.c
+++ b/dap-sdk/io/dap_timerfd.c
@@ -283,7 +283,7 @@ static void s_es_callback_timer(struct dap_events_socket *a_event_sock)
         s_timerfd_reset(l_timer_fd, a_event_sock);
     } else {  
 #ifdef _WIN32
-        DeleteTimerQueueTimer(hTimerQueue, l_timerfd->th, NULL);
+        DeleteTimerQueueTimer(hTimerQueue, l_timer_fd->th, NULL);
 #endif
         l_timer_fd->events_socket->flags |= DAP_SOCK_SIGNAL_CLOSE;
     }
@@ -347,7 +347,7 @@ void dap_timerfd_delete(dap_timerfd_t *a_timerfd)
     if (!a_timerfd)
         return; 
 #ifdef _WIN32
-    DeleteTimerQueueTimer(hTimerQueue, l_timerfd->th, NULL);
+    DeleteTimerQueueTimer(hTimerQueue, a_timerfd->th, NULL);
 #endif
     if (a_timerfd->events_socket->context->worker)
         dap_events_socket_remove_and_delete_mt(a_timerfd->events_socket->context->worker, a_timerfd->esocket_uuid);
diff --git a/dap-sdk/io/dap_worker.c b/dap-sdk/io/dap_worker.c
index 0c6133276fc05fda7bdc532c32155baf076b1454..f3a116e183570aaba53cd0a355049ff3287e3824 100644
--- a/dap-sdk/io/dap_worker.c
+++ b/dap-sdk/io/dap_worker.c
@@ -305,7 +305,7 @@ static bool s_socket_all_check_activity( void * a_arg)
     //dap_ctime_r(&l_curtime, l_curtimebuf);
     //log_it(L_DEBUG,"Check sockets activity on worker #%u at %s", l_worker->id, l_curtimebuf);
     size_t l_esockets_counter = 0;
-    uint l_esockets_count = HASH_CNT(hh, l_worker->context->esockets);
+    u_int l_esockets_count = HASH_CNT(hh, l_worker->context->esockets);
     HASH_ITER(hh, l_worker->context->esockets, l_es, tmp ) {
         if (l_esockets_counter >= l_worker->context->event_sockets_count || l_esockets_counter >= l_esockets_count){
             log_it(L_ERROR, "Something wrong with context's esocket table: %u esockets in context, %u in table but we're on %zu iteration",
diff --git a/dap-sdk/net/server/cli_server/dap_cli_server.c b/dap-sdk/net/server/cli_server/dap_cli_server.c
index 0d8a22796e41a591e2ee8e54b03becaf328f5039..daa4002500a8f4a6e7fd4c06887b60380e12fbb5 100644
--- a/dap-sdk/net/server/cli_server/dap_cli_server.c
+++ b/dap-sdk/net/server/cli_server/dap_cli_server.c
@@ -84,6 +84,301 @@ static void* s_thread_main_func(void *args);
 static inline void s_cmd_add_ex(const char * a_name, dap_cli_server_cmd_callback_ex_t a_func, void *a_arg_func, const char *a_doc, const char *a_doc_ex);
 
 
+#ifdef _WIN32
+
+/**
+ * @brief p_get_next_str
+ *
+ * @param hPipe
+ * @param dwLen
+ * @param stop_str
+ * @param del_stop_str
+ * @param timeout
+ * @return char*
+ */
+char *p_get_next_str( HANDLE hPipe, int *dwLen, const char *stop_str, bool del_stop_str, int timeout )
+{
+    UNUSED(timeout);
+    bool bSuccess = false;
+    long nRecv = 0; // count of bytes received
+    size_t stop_str_len = (stop_str) ? strlen(stop_str) : 0;
+    // if there is nothing to look for
+
+    if(!stop_str_len)
+        return NULL;
+
+    size_t lpszBuffer_len = 256;
+    char *lpszBuffer = DAP_NEW_Z_SIZE(char, lpszBuffer_len);
+    // received string will not be larger than MAX_REPLY_LEN
+
+    while( 1 ) //nRecv < MAX_REPLY_LEN)
+    {
+      long ret = 0;
+        // read one byte
+//        long ret = s_recv( nSocket, (unsigned char *) (lpszBuffer + nRecv), 1, timeout);
+
+      bSuccess = ReadFile( hPipe, lpszBuffer + nRecv,
+         lpszBuffer_len - nRecv, (LPDWORD)&ret, NULL );
+
+        //int ret = recv(nSocket,lpszBuffer+nRecv,1, 0);
+        if ( ret <= 0 || !bSuccess )
+            break;
+
+        nRecv += ret;
+        //printf("**debug** socket=%d read  %d bytes '%0s'",nSocket, ret, (lpszBuffer + nRecv));
+
+        while((nRecv + 1) >= (long) lpszBuffer_len)
+        {
+            lpszBuffer_len *= 2;
+            lpszBuffer = (char*) realloc(lpszBuffer, lpszBuffer_len);
+        }
+
+        // search for the required string
+        if(nRecv >=  (long) stop_str_len) {
+            // found the required string
+            if(!strncasecmp(lpszBuffer + nRecv - stop_str_len, stop_str, stop_str_len)) {
+                bSuccess = true;
+                break;
+            }
+        }
+    };
+
+    // end reading
+
+    if(bSuccess) {
+        // delete the searched string
+        if(del_stop_str) {
+            lpszBuffer[nRecv -  (long) stop_str_len] = '\0';
+            if(dwLen)
+                *dwLen =(int) nRecv - (int) stop_str_len;
+        }
+        else {
+            lpszBuffer[nRecv] = '\0';
+            if(dwLen)
+                *dwLen = (int) nRecv;
+        }
+        lpszBuffer = DAP_REALLOC(lpszBuffer,(size_t) *dwLen + 1);
+        return lpszBuffer;
+    }
+
+    // in case of an error or missing string
+
+    if(dwLen)
+        *dwLen = 0;
+
+    free(lpszBuffer);
+
+    return NULL;
+}
+
+/**
+ * @brief thread_pipe_client_func
+ * threading function for processing a request from a client
+ * @param args
+ * @return void*
+ */
+static void *thread_pipe_client_func( void *args )
+{
+    HANDLE hPipe = (HANDLE)args;
+
+//    SOCKET newsockfd = (SOCKET) (intptr_t) args;
+    if(s_debug_cli)
+        log_it(L_INFO, "new connection pipe = %p", hPipe);
+
+    int str_len, marker = 0;
+    int timeout = 5000; // 5 sec
+    int argc = 0;
+
+    dap_list_t *cmd_param_list = NULL;
+
+    while( 1 )
+    {
+        // wait data from client
+//        int is_data = s_poll( newsockfd, timeout );
+        // timeout
+//        if(!is_data)
+//            continue;
+        // error (may be socket closed)
+//        if(is_data < 0)
+//            break;
+
+//        int is_valid = is_valid_socket(newsockfd);
+//        if(!is_valid)
+//        {
+//            break;
+//        }
+
+        // receiving http header
+        char *str_header = p_get_next_str( hPipe, &str_len, "\r\n", true, timeout );
+
+        // bad format
+        if(!str_header)
+            break;
+
+        if ( str_header && strlen(str_header) == 0) {
+            marker++;
+            if(marker == 1)
+                continue;
+        }
+
+        // filling parameters of command
+        if ( marker == 1 ) {
+            cmd_param_list = dap_list_append( cmd_param_list, str_header );
+            //printf("g_list_append argc=%d command=%s ", argc, str_header);
+            argc ++;
+        }
+        else
+            free( str_header );
+
+        if ( marker == 2 ) {
+
+            dap_list_t *list = cmd_param_list;
+            // form command
+
+            unsigned int argc = dap_list_length( list );
+            // command is found
+
+            if ( argc >= 1) {
+
+                int l_verbose = 0;
+                char *cmd_name = list->data;
+                list = dap_list_next( list );
+
+                // execute command
+                char *str_cmd = dap_strdup_printf( "%s", cmd_name );
+                dap_cli_cmd_t *l_cmd = dap_cli_server_cmd_find( cmd_name );
+                int res = -1;
+                char *str_reply = NULL;
+
+                if ( l_cmd ) {
+
+                    while( list ) {
+                        str_cmd = dap_strdup_printf( "%s;%s", str_cmd, list->data );
+                        list = dap_list_next(list);
+                    }
+
+                    log_it(L_INFO, "execute command = %s", str_cmd );
+                    // exec command
+
+                    char **l_argv = dap_strsplit( str_cmd, ";", -1 );
+                    // Call the command function
+
+                    if ( l_cmd &&  l_argv && l_cmd->func ) {
+                        if (l_cmd->arg_func) {
+                            res = l_cmd->func_ex(argc, l_argv, l_cmd->arg_func, &str_reply);
+                        } else {
+                            res = l_cmd->func(argc, l_argv, &str_reply);
+                        }
+                    }
+
+                    else if ( l_cmd ) {
+                        log_it(L_WARNING,"NULL arguments for input for command \"%s\"", str_cmd );
+                    }else {
+                        log_it(L_WARNING,"No function for command \"%s\" but it registred?!", str_cmd );
+                    }
+
+                    // find '-verbose' command
+                    l_verbose = dap_cli_server_cmd_find_option_val( l_argv, 1, argc, "-verbose", NULL );
+                    dap_strfreev( l_argv );
+
+                } else {
+                    str_reply = dap_strdup_printf("can't recognize command = %s", str_cmd );
+                    log_it( L_ERROR, str_reply );
+                }
+
+                char *reply_body;
+
+                if(l_verbose)
+                  reply_body = dap_strdup_printf("%d\r\nret_code: %d\r\n%s\r\n", res, res, (str_reply) ? str_reply : "");
+                else
+                  reply_body = dap_strdup_printf("%d\r\n%s\r\n", res, (str_reply) ? str_reply : "");
+
+                // return the result of the command function
+                char *reply_str = dap_strdup_printf( "HTTP/1.1 200 OK\r\n"
+                                                    "Content-Length: %d\r\n\r\n"
+                                                    "%s",
+                        strlen(reply_body), reply_body );
+
+                int ret;// = send( newsockfd, reply_str, strlen(reply_str) ,0 );
+
+                WriteFile( hPipe, reply_str, strlen(reply_str), (LPDWORD)&ret, NULL );
+
+                DAP_DELETE(str_reply);
+                DAP_DELETE(reply_str);
+                DAP_DELETE(reply_body);
+
+                DAP_DELETE(str_cmd);
+            }
+            dap_list_free_full(cmd_param_list, free);
+            break;
+        }
+    }
+
+    // close connection
+//    int cs = closesocket(newsockfd);
+
+    log_it( L_INFO, "close connection pipe = %p", hPipe );
+
+    FlushFileBuffers( hPipe );
+    DisconnectNamedPipe( hPipe );
+    CloseHandle( hPipe );
+
+    return NULL;
+}
+
+
+/**
+ * @brief thread_pipe_func
+ * main threading server function pipe win32
+ * @param args
+ * @return void*
+ */
+static void* thread_pipe_func( void *args )
+{
+   UNUSED(args);
+   BOOL   fConnected = FALSE;
+   pthread_t threadId;
+   HANDLE hPipe = INVALID_HANDLE_VALUE;
+   static const char *cPipeName = "\\\\.\\pipe\\node_cli.pipe";
+
+   for (;;)
+   {
+///      printf( "\nPipe Server: Main thread awaiting client connection on %s\n", lpszPipename );
+
+      hPipe = CreateNamedPipe(
+          cPipeName,                // pipe name
+          PIPE_ACCESS_DUPLEX,       // read/write access
+          PIPE_TYPE_MESSAGE |       // message type pipe
+          PIPE_READMODE_MESSAGE |   // message-read mode
+          PIPE_WAIT,                // blocking mode
+          PIPE_UNLIMITED_INSTANCES, // max. instances
+          4096,                     // output buffer size
+          4096,                     // input buffer size
+          0,                        // client time-out
+          NULL );                   // default security attribute
+
+      if ( hPipe == INVALID_HANDLE_VALUE ) {
+          log_it( L_ERROR, "CreateNamedPipe failed, GLE = %lu.\n", GetLastError() );
+          return NULL;
+      }
+
+      fConnected = ConnectNamedPipe( hPipe, NULL ) ? TRUE : ( GetLastError() == ERROR_PIPE_CONNECTED );
+
+      if ( fConnected )
+      {
+        log_it( L_INFO, "Client %p connected, creating a processing thread.\n", hPipe );
+
+        pthread_create( &threadId, NULL, thread_pipe_client_func, hPipe );
+        pthread_detach( threadId );
+      }
+      else
+         CloseHandle( hPipe );
+    }
+
+    return NULL;
+}
+#endif
+
 
 /**
  * @brief dap_cli_server_init
@@ -328,280 +623,62 @@ int res;
 
         // feature of disconnection under Unix (QNX)
         // under Windows, with socket closed res = 0, in Unix res = -1
-        char buf[2];
-        if ( 0 > (res = recv(sd, buf, 1, MSG_PEEK)) ) // MSG_PEEK  The data is treated as unread and the next recv() function shall still return this data.
-            return false;
-
-        // data in the buffer must be(count_desc>0), but read 0 bytes(res=0)
-        if(!res && (fds.revents & POLLIN))
-            return false;
-    }
-
-    return true;
-}
-
-
-/**
- * @brief s_get_next_str
- * Reading from the socket till arrival the specified string
- *
- * stop_str - string to which reading will continue
- * del_stop_str - удалять ли строку для поиска в конце
- * timeout - in ms
- * return: string (if waited for final characters) or NULL, if the string requires deletion
- * @param nSocket
- * @param dwLen
- * @param stop_str
- * @param del_stop_str
- * @param timeout
- * @return char*
- */
-char* s_get_next_str( SOCKET nSocket, int *dwLen, const char *stop_str, bool del_stop_str, int timeout )
-{
-    bool bSuccess = false;
-    long nRecv = 0; // count of bytes received
-    size_t stop_str_len = (stop_str) ? strlen(stop_str) : 0;
-    // if there is nothing to look for
-    if(!stop_str_len)
-        return NULL;
-    size_t lpszBuffer_len = 256;
-    char *lpszBuffer = DAP_NEW_Z_SIZE(char, lpszBuffer_len);
-    // received string will not be larger than MAX_REPLY_LEN
-
-    while(1) //nRecv < MAX_REPLY_LEN)
-    {
-        // read one byte
-        long ret = dap_net_recv(nSocket, (unsigned char *) (lpszBuffer + nRecv), 1, timeout);
-        //int ret = recv(nSocket,lpszBuffer+nRecv,1, 0);
-        if(ret <= 0)
-                {
-            break;
-        }
-        nRecv += ret;
-        //printf("**debug** socket=%d read  %d bytes '%0s'",nSocket, ret, (lpszBuffer + nRecv));
-        while((nRecv + 1) >= (long) lpszBuffer_len)
-        {
-            lpszBuffer_len *= 2;
-            lpszBuffer = (char*) realloc(lpszBuffer, lpszBuffer_len);
-        }
-        // search for the required string
-        if(nRecv >=  (long) stop_str_len) {
-            // found the required string
-            if(!strncasecmp(lpszBuffer + nRecv - stop_str_len, stop_str, stop_str_len)) {
-                bSuccess = true;
-                break;
-            }
-        }
-    };
-
-    // end reading
-
-    if(bSuccess) {
-        // delete the searched string
-        if(del_stop_str) {
-            lpszBuffer[nRecv -  (long) stop_str_len] = '\0';
-            if(dwLen)
-                *dwLen =(int) nRecv - (int) stop_str_len;
-        }
-        else {
-            lpszBuffer[nRecv] = '\0';
-            if(dwLen)
-                *dwLen = (int) nRecv;
-        }
-        char * l_buf_realloc = DAP_REALLOC(lpszBuffer,(size_t) *dwLen + 1);
-        if( l_buf_realloc)
-            lpszBuffer = l_buf_realloc;
-        return lpszBuffer;
-    }
-
-    // in case of an error or missing string
-
-    if(dwLen)
-        *dwLen = 0;
-
-    free(lpszBuffer);
-
-    return NULL;
-}
-
-/**
- * threading function for processing a request from a client
- */
-static void* s_thread_one_client_func(void *args)
-{
-SOCKET  newsockfd = (SOCKET) (intptr_t) args;
-int     str_len, marker = 0, timeout = 5000, argc = 0, is_data;
-dap_list_t *cmd_param_list = NULL;
-char    *str_header;
-
-    if(s_debug_cli)
-        log_it(L_DEBUG, "new connection sockfd=%"DAP_FORMAT_SOCKET, newsockfd);
-
-
-    while ( !(0 > (is_data = s_poll(newsockfd, timeout))) )                 // wait data from client
-    {
-        if ( !(is_data) )                                                   // timeout
-            continue;
-
-        if ( !is_valid_socket(newsockfd) )
-            break;
-
-        // receiving http header
-        if ( !(str_header = s_get_next_str(newsockfd, &str_len, "\r\n", true, timeout)) )
-            break;                                                          // bad format
-
-        if(str_header && !strlen(str_header) ) {
-            marker++;
-            if(marker == 1){
-                DAP_DELETE(str_header);
-                continue;
-            }
-        }
-
-        // filling parameters of command
-        if(marker == 1) {
-            cmd_param_list = dap_list_append(cmd_param_list, str_header);
-            //printf("g_list_append argc=%d command=%s ", argc, str_header);
-            argc++;
-        }
-        else
-            DAP_DEL_Z(str_header);
-
-        if(marker == 2 &&  cmd_param_list) {
-            dap_list_t *list = cmd_param_list;
-            // form command
-            argc = dap_list_length(list);
-            // command is found
-            if(argc >= 1) {
-              int l_verbose = 0;
-                char *cmd_name = list->data;
-                list = dap_list_next(list);
-                // execute command
-                char *str_cmd = dap_strdup_printf("%s", cmd_name);
-                dap_cli_cmd_t *l_cmd = dap_cli_server_cmd_find(cmd_name);
-                int res = -1;
-                char *str_reply = NULL;
-                if(l_cmd){
-                    while(list) {
-                        char *str_cmd_prev = str_cmd;
-                        str_cmd = dap_strdup_printf("%s;%s", str_cmd, list->data);
-                        list = dap_list_next(list);
-                        DAP_DELETE(str_cmd_prev);
-                    }
-                    if(l_cmd->overrides.log_cmd_call)
-                        l_cmd->overrides.log_cmd_call(str_cmd);
-                    else
-                        log_it(L_DEBUG, "execute command=%s", str_cmd);
-                    // exec command
-
-                    char **l_argv = dap_strsplit(str_cmd, ";", -1);
-                    // Call the command function
-                    if(l_cmd &&  l_argv && l_cmd->func) {
-                        if (l_cmd->arg_func) {
-                            res = l_cmd->func_ex(argc, l_argv, l_cmd->arg_func, &str_reply);
-                        } else {
-                            res = l_cmd->func(argc, l_argv, &str_reply);
-                        }
-                    } else if (l_cmd) {
-                        log_it(L_WARNING,"NULL arguments for input for command \"%s\"", str_cmd);
-                    }else {
-                        log_it(L_WARNING,"No function for command \"%s\" but it registred?!", str_cmd);
-                    }
-                    // find '-verbose' command
-                    l_verbose = dap_cli_server_cmd_find_option_val(l_argv, 1, argc, "-verbose", NULL);
-                    dap_strfreev(l_argv);
-                } else {
-                    str_reply = dap_strdup_printf("can't recognize command=%s", str_cmd);
-                    log_it(L_ERROR,"Reply string: \"%s\"", str_reply);
-                }
-                char *reply_body;
-                if(l_verbose)
-                  reply_body = dap_strdup_printf("%d\r\nret_code: %d\r\n%s\r\n", res, res, (str_reply) ? str_reply : "");
-                else
-                  reply_body = dap_strdup_printf("%d\r\n%s\r\n", res, (str_reply) ? str_reply : "");
-                // return the result of the command function
-                char *reply_str = dap_strdup_printf("HTTP/1.1 200 OK\r\n"
-                                                    "Content-Length: %d\r\n\r\n"
-                                                    "%s", strlen(reply_body), reply_body);
-                size_t l_reply_step = 32768;
-                size_t l_reply_len = strlen(reply_str);
-                size_t l_reply_rest = l_reply_len;
-
-                while(l_reply_rest) {
-                    size_t l_send_bytes = min(l_reply_step, l_reply_rest);
-                    int ret = send(newsockfd, reply_str + l_reply_len - l_reply_rest, l_send_bytes, 0);
-                    if(ret<=0)
-                        break;
-                    l_reply_rest-=l_send_bytes;
-                };
-
-                DAP_DELETE(str_reply);
-                DAP_DELETE(reply_str);
-                DAP_DELETE(reply_body);
+        char buf[2];
+        if ( 0 > (res = recv(sd, buf, 1, MSG_PEEK)) ) // MSG_PEEK  The data is treated as unread and the next recv() function shall still return this data.
+            return false;
 
-                DAP_DELETE(str_cmd);
-            }
-            dap_list_free_full(cmd_param_list, NULL);
-            break;
-        }
+        // data in the buffer must be(count_desc>0), but read 0 bytes(res=0)
+        if(!res && (fds.revents & POLLIN))
+            return false;
     }
-    // close connection
-    int cs = closesocket(newsockfd);
-    if (s_debug_cli)
-        log_it(L_DEBUG, "close connection=%d sockfd=%"DAP_FORMAT_SOCKET, cs, newsockfd);
 
-    return NULL;
+    return true;
 }
 
-#ifdef _WIN32
 
 /**
- * @brief p_get_next_str
+ * @brief s_get_next_str
+ * Reading from the socket till arrival the specified string
  *
- * @param hPipe
+ * stop_str - string to which reading will continue
+ * del_stop_str - удалять ли строку для поиска в конце
+ * timeout - in ms
+ * return: string (if waited for final characters) or NULL, if the string requires deletion
+ * @param nSocket
  * @param dwLen
  * @param stop_str
  * @param del_stop_str
  * @param timeout
  * @return char*
  */
-char *p_get_next_str( HANDLE hPipe, int *dwLen, const char *stop_str, bool del_stop_str, int timeout )
+char* s_get_next_str( SOCKET nSocket, int *dwLen, const char *stop_str, bool del_stop_str, int timeout )
 {
-    UNUSED(timeout);
     bool bSuccess = false;
     long nRecv = 0; // count of bytes received
     size_t stop_str_len = (stop_str) ? strlen(stop_str) : 0;
     // if there is nothing to look for
-
     if(!stop_str_len)
         return NULL;
-
     size_t lpszBuffer_len = 256;
     char *lpszBuffer = DAP_NEW_Z_SIZE(char, lpszBuffer_len);
     // received string will not be larger than MAX_REPLY_LEN
 
-    while( 1 ) //nRecv < MAX_REPLY_LEN)
+    while(1) //nRecv < MAX_REPLY_LEN)
     {
-      long ret = 0;
         // read one byte
-//        long ret = s_recv( nSocket, (unsigned char *) (lpszBuffer + nRecv), 1, timeout);
-
-      bSuccess = ReadFile( hPipe, lpszBuffer + nRecv,
-         lpszBuffer_len - nRecv, (LPDWORD)&ret, NULL );
-
+        long ret = dap_net_recv(nSocket, (unsigned char *) (lpszBuffer + nRecv), 1, timeout);
         //int ret = recv(nSocket,lpszBuffer+nRecv,1, 0);
-        if ( ret <= 0 || !bSuccess )
+        if(ret <= 0)
+                {
             break;
-
+        }
         nRecv += ret;
         //printf("**debug** socket=%d read  %d bytes '%0s'",nSocket, ret, (lpszBuffer + nRecv));
-
         while((nRecv + 1) >= (long) lpszBuffer_len)
         {
             lpszBuffer_len *= 2;
             lpszBuffer = (char*) realloc(lpszBuffer, lpszBuffer_len);
         }
-
         // search for the required string
         if(nRecv >=  (long) stop_str_len) {
             // found the required string
@@ -626,7 +703,9 @@ char *p_get_next_str( HANDLE hPipe, int *dwLen, const char *stop_str, bool del_s
             if(dwLen)
                 *dwLen = (int) nRecv;
         }
-        lpszBuffer = DAP_REALLOC(lpszBuffer,(size_t) *dwLen + 1);
+        char * l_buf_realloc = DAP_REALLOC(lpszBuffer,(size_t) *dwLen + 1);
+        if( l_buf_realloc)
+            lpszBuffer = l_buf_realloc;
         return lpszBuffer;
     }
 
@@ -641,136 +720,115 @@ char *p_get_next_str( HANDLE hPipe, int *dwLen, const char *stop_str, bool del_s
 }
 
 /**
- * @brief thread_pipe_client_func
  * threading function for processing a request from a client
- * @param args
- * @return void*
  */
-static void *thread_pipe_client_func( void *args )
+static void* s_thread_one_client_func(void *args)
 {
-    HANDLE hPipe = (HANDLE)args;
+SOCKET  newsockfd = (SOCKET) (intptr_t) args;
+int     str_len, marker = 0, timeout = 5000, argc = 0, is_data;
+dap_list_t *cmd_param_list = NULL;
+char    *str_header;
 
-//    SOCKET newsockfd = (SOCKET) (intptr_t) args;
     if(s_debug_cli)
-        log_it(L_INFO, "new connection pipe = %p", hPipe);
-
-    int str_len, marker = 0;
-    int timeout = 5000; // 5 sec
-    int argc = 0;
+        log_it(L_DEBUG, "new connection sockfd=%"DAP_FORMAT_SOCKET, newsockfd);
 
-    dap_list_t *cmd_param_list = NULL;
 
-    while( 1 )
+    while ( !(0 > (is_data = s_poll(newsockfd, timeout))) )                 // wait data from client
     {
-        // wait data from client
-//        int is_data = s_poll( newsockfd, timeout );
-        // timeout
-//        if(!is_data)
-//            continue;
-        // error (may be socket closed)
-//        if(is_data < 0)
-//            break;
+        if ( !(is_data) )                                                   // timeout
+            continue;
 
-//        int is_valid = is_valid_socket(newsockfd);
-//        if(!is_valid)
-//        {
-//            break;
-//        }
+        if ( !is_valid_socket(newsockfd) )
+            break;
 
         // receiving http header
-        char *str_header = p_get_next_str( hPipe, &str_len, "\r\n", true, timeout );
-
-        // bad format
-        if(!str_header)
-            break;
+        if ( !(str_header = s_get_next_str(newsockfd, &str_len, "\r\n", true, timeout)) )
+            break;                                                          // bad format
 
-        if ( str_header && strlen(str_header) == 0) {
+        if(str_header && !strlen(str_header) ) {
             marker++;
-            if(marker == 1)
+            if(marker == 1){
+                DAP_DELETE(str_header);
                 continue;
+            }
         }
 
         // filling parameters of command
-        if ( marker == 1 ) {
-            cmd_param_list = dap_list_append( cmd_param_list, str_header );
+        if(marker == 1) {
+            cmd_param_list = dap_list_append(cmd_param_list, str_header);
             //printf("g_list_append argc=%d command=%s ", argc, str_header);
-            argc ++;
+            argc++;
         }
         else
-            free( str_header );
-
-        if ( marker == 2 ) {
+            DAP_DEL_Z(str_header);
 
+        if(marker == 2 &&  cmd_param_list) {
             dap_list_t *list = cmd_param_list;
             // form command
-
-            unsigned int argc = dap_list_length( list );
+            argc = dap_list_length(list);
             // command is found
-
-            if ( argc >= 1) {
-
-                int l_verbose = 0;
+            if(argc >= 1) {
+              int l_verbose = 0;
                 char *cmd_name = list->data;
-                list = dap_list_next( list );
-
+                list = dap_list_next(list);
                 // execute command
-                char *str_cmd = dap_strdup_printf( "%s", cmd_name );
-                dap_cli_cmd_t *l_cmd = dap_cli_server_cmd_find( cmd_name );
+                char *str_cmd = dap_strdup_printf("%s", cmd_name);
+                dap_cli_cmd_t *l_cmd = dap_cli_server_cmd_find(cmd_name);
                 int res = -1;
                 char *str_reply = NULL;
-
-                if ( l_cmd ) {
-
-                    while( list ) {
-                        str_cmd = dap_strdup_printf( "%s;%s", str_cmd, list->data );
+                if(l_cmd){
+                    while(list) {
+                        char *str_cmd_prev = str_cmd;
+                        str_cmd = dap_strdup_printf("%s;%s", str_cmd, list->data);
                         list = dap_list_next(list);
+                        DAP_DELETE(str_cmd_prev);
                     }
-
-                    log_it(L_INFO, "execute command = %s", str_cmd );
+                    if(l_cmd->overrides.log_cmd_call)
+                        l_cmd->overrides.log_cmd_call(str_cmd);
+                    else
+                        log_it(L_DEBUG, "execute command=%s", str_cmd);
                     // exec command
 
-                    char **l_argv = dap_strsplit( str_cmd, ";", -1 );
+                    char **l_argv = dap_strsplit(str_cmd, ";", -1);
                     // Call the command function
-
-                    if ( l_cmd &&  l_argv && l_cmd->func ) {
+                    if(l_cmd &&  l_argv && l_cmd->func) {
                         if (l_cmd->arg_func) {
                             res = l_cmd->func_ex(argc, l_argv, l_cmd->arg_func, &str_reply);
                         } else {
                             res = l_cmd->func(argc, l_argv, &str_reply);
                         }
-                    }
-
-                    else if ( l_cmd ) {
-                        log_it(L_WARNING,"NULL arguments for input for command \"%s\"", str_cmd );
+                    } else if (l_cmd) {
+                        log_it(L_WARNING,"NULL arguments for input for command \"%s\"", str_cmd);
                     }else {
-                        log_it(L_WARNING,"No function for command \"%s\" but it registred?!", str_cmd );
+                        log_it(L_WARNING,"No function for command \"%s\" but it registred?!", str_cmd);
                     }
-
                     // find '-verbose' command
-                    l_verbose = dap_cli_server_cmd_find_option_val( l_argv, 1, argc, "-verbose", NULL );
-                    dap_strfreev( l_argv );
-
+                    l_verbose = dap_cli_server_cmd_find_option_val(l_argv, 1, argc, "-verbose", NULL);
+                    dap_strfreev(l_argv);
                 } else {
-                    str_reply = dap_strdup_printf("can't recognize command = %s", str_cmd );
-                    log_it( L_ERROR, str_reply );
+                    str_reply = dap_strdup_printf("can't recognize command=%s", str_cmd);
+                    log_it(L_ERROR,"Reply string: \"%s\"", str_reply);
                 }
-
                 char *reply_body;
-
                 if(l_verbose)
                   reply_body = dap_strdup_printf("%d\r\nret_code: %d\r\n%s\r\n", res, res, (str_reply) ? str_reply : "");
                 else
                   reply_body = dap_strdup_printf("%d\r\n%s\r\n", res, (str_reply) ? str_reply : "");
-
                 // return the result of the command function
-                char *reply_str = dap_strdup_printf( "HTTP/1.1 200 OK\r\n"
+                char *reply_str = dap_strdup_printf("HTTP/1.1 200 OK\r\n"
                                                     "Content-Length: %d\r\n\r\n"
-                                                    "%s",
-                        strlen(reply_body), reply_body );
-
-                int ret;// = send( newsockfd, reply_str, strlen(reply_str) ,0 );
+                                                    "%s", strlen(reply_body), reply_body);
+                size_t l_reply_step = 32768;
+                size_t l_reply_len = strlen(reply_str);
+                size_t l_reply_rest = l_reply_len;
 
-                WriteFile( hPipe, reply_str, strlen(reply_str), (LPDWORD)&ret, NULL );
+                while(l_reply_rest) {
+                    size_t l_send_bytes = min(l_reply_step, l_reply_rest);
+                    int ret = send(newsockfd, reply_str + l_reply_len - l_reply_rest, l_send_bytes, 0);
+                    if(ret<=0)
+                        break;
+                    l_reply_rest-=l_send_bytes;
+                };
 
                 DAP_DELETE(str_reply);
                 DAP_DELETE(reply_str);
@@ -778,76 +836,17 @@ static void *thread_pipe_client_func( void *args )
 
                 DAP_DELETE(str_cmd);
             }
-            dap_list_free_full(cmd_param_list, free);
+            dap_list_free_full(cmd_param_list, NULL);
             break;
         }
     }
-
     // close connection
-//    int cs = closesocket(newsockfd);
-
-    log_it( L_INFO, "close connection pipe = %p", hPipe );
-
-    FlushFileBuffers( hPipe );
-    DisconnectNamedPipe( hPipe );
-    CloseHandle( hPipe );
-
-    return NULL;
-}
-
-
-/**
- * @brief thread_pipe_func
- * main threading server function pipe win32
- * @param args
- * @return void*
- */
-static void* thread_pipe_func( void *args )
-{
-   UNUSED(args);
-   BOOL   fConnected = FALSE;
-   pthread_t threadId;
-   HANDLE hPipe = INVALID_HANDLE_VALUE;
-   static const char *cPipeName = "\\\\.\\pipe\\node_cli.pipe";
-
-   for (;;)
-   {
-///      printf( "\nPipe Server: Main thread awaiting client connection on %s\n", lpszPipename );
-
-      hPipe = CreateNamedPipe(
-          cPipeName,                // pipe name
-          PIPE_ACCESS_DUPLEX,       // read/write access
-          PIPE_TYPE_MESSAGE |       // message type pipe
-          PIPE_READMODE_MESSAGE |   // message-read mode
-          PIPE_WAIT,                // blocking mode
-          PIPE_UNLIMITED_INSTANCES, // max. instances
-          4096,                     // output buffer size
-          4096,                     // input buffer size
-          0,                        // client time-out
-          NULL );                   // default security attribute
-
-      if ( hPipe == INVALID_HANDLE_VALUE ) {
-          log_it( L_ERROR, "CreateNamedPipe failed, GLE = %lu.\n", GetLastError() );
-          return NULL;
-      }
-
-      fConnected = ConnectNamedPipe( hPipe, NULL ) ? TRUE : ( GetLastError() == ERROR_PIPE_CONNECTED );
-
-      if ( fConnected )
-      {
-        log_it( L_INFO, "Client %p connected, creating a processing thread.\n", hPipe );
-
-        pthread_create( &threadId, NULL, thread_pipe_client_func, hPipe );
-        pthread_detach( threadId );
-      }
-      else
-         CloseHandle( hPipe );
-    }
+    int cs = closesocket(newsockfd);
+    if (s_debug_cli)
+        log_it(L_DEBUG, "close connection=%d sockfd=%"DAP_FORMAT_SOCKET, cs, newsockfd);
 
     return NULL;
 }
-#endif
-
 
 /**
  * @brief thread_main_func
diff --git a/dap-sdk/net/server/enc_server/CMakeLists.txt b/dap-sdk/net/server/enc_server/CMakeLists.txt
index 8aaba2be3cae6e9d374e519d10c15d462df4228e..e29d8f736877a4c65fedf35b1254b4bb59a7e12a 100644
--- a/dap-sdk/net/server/enc_server/CMakeLists.txt
+++ b/dap-sdk/net/server/enc_server/CMakeLists.txt
@@ -20,23 +20,23 @@ target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..
 
 if(WIN32)
   target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_io dap_http_server json-c
-  KERNEL32
-  USER32
-  SHELL32
-  WINMM
-  GDI32
-  ADVAPI32
-  Ole32
-  Version
-  Imm32
-  OleAut32
+  kernel32
+  user32
+  shell32
+  winmm
+  gdi32
+  advapi32
+  ole32
+  version
+  imm32
+  oleaut32
   ws2_32
   ntdll
   psapi
-  Shlwapi
-  Bcrypt
-  Crypt32
-  Secur32
+  shlwapi
+  bcrypt
+  crypt32
+  secur32
 )
 endif()
 
diff --git a/dap-sdk/net/server/http_server/CMakeLists.txt b/dap-sdk/net/server/http_server/CMakeLists.txt
index 2af0aec59f1e03d422c56188ec11e02fe7aa031d..b2b3d166ac9620b4ef111cd8059c7c3556eb9ccf 100644
--- a/dap-sdk/net/server/http_server/CMakeLists.txt
+++ b/dap-sdk/net/server/http_server/CMakeLists.txt
@@ -27,23 +27,23 @@ endif()
 
 if(WIN32)
   target_link_libraries(dap_http_server dap_core dap_crypto dap_io magic regex tre intl iconv
-  KERNEL32
-  USER32
-  SHELL32
-  WINMM
-  GDI32
-  ADVAPI32
-  Ole32
-  Version
-  Imm32
-  OleAut32
+  kernel32
+  user32
+  shell32
+  winmm
+  gdi32
+  advapi32
+  ole32
+  version
+  imm32
+  oleaut32
   ws2_32
   ntdll
   psapi
-  Shlwapi
-  Bcrypt
-  Crypt32
-  Secur32
+  shlwapi
+  bcrypt
+  crypt32
+  secur32
 )
 endif()
 
diff --git a/dap-sdk/net/server/http_server/dap_http_simple.c b/dap-sdk/net/server/http_server/dap_http_simple.c
index e7f7f50e1d3c8f8e6ffe73030ebd534a938a4eda..657fabbac80ea115c0a634b650161c5ae0f8b7ad 100644
--- a/dap-sdk/net/server/http_server/dap_http_simple.c
+++ b/dap-sdk/net/server/http_server/dap_http_simple.c
@@ -221,9 +221,9 @@ static void s_esocket_worker_write_callback(dap_worker_t *a_worker, void *a_arg)
 {
     UNUSED(a_worker);
     dap_http_simple_t *l_http_simple = (dap_http_simple_t*)a_arg;
-    dap_events_socket_t *l_es = dap_context_find(a_worker->context, l_http_simple->http_client_uuid);
+    dap_events_socket_t *l_es = dap_context_find(a_worker->context, l_http_simple->esocket_uuid);
     if (!l_es) {
-        debug_if(g_debug_reactor, L_INFO, "Esocket 0x%"DAP_UINT64_FORMAT_x" is already deleted", l_http_simple->http_client_uuid);
+        debug_if(g_debug_reactor, L_INFO, "Esocket 0x%"DAP_UINT64_FORMAT_x" is already deleted", l_http_simple->esocket_uuid);
         DAP_DEL_Z(l_http_simple->request);
         DAP_DEL_Z(l_http_simple->reply);
         DAP_DEL_Z(l_http_simple->http_client);
@@ -358,6 +358,7 @@ static void s_http_client_headers_read( dap_http_client_t *a_http_client, void *
     //  Sleep(300);
 
     l_http_simple->esocket = a_http_client->esocket;
+    l_http_simple->esocket_uuid = a_http_client->esocket->uuid;
     l_http_simple->http_client = a_http_client;
     l_http_simple->worker = a_http_client->esocket->context->worker;
     l_http_simple->reply_size_max = DAP_HTTP_SIMPLE_URL_PROC( a_http_client->proc )->reply_size_max;
diff --git a/dap-sdk/net/server/http_server/include/dap_http_simple.h b/dap-sdk/net/server/http_server/include/dap_http_simple.h
index 7f38cf8c59c812841512afc22985616ad7e011c1..5406bc02b578e17ad0998ad8c2074d792698afb4 100644
--- a/dap-sdk/net/server/http_server/include/dap_http_simple.h
+++ b/dap-sdk/net/server/http_server/include/dap_http_simple.h
@@ -25,6 +25,7 @@ See more details here <http://www.gnu.org/licenses/>.
 
 #include <stddef.h>
 #include <stdint.h>
+#include "dap_events_socket.h"
 #include "dap_http.h"
 #include "dap_uuid.h"
 //#define DAP_HTTP_SIMPLE_REQUEST_MAX 100000
@@ -38,7 +39,7 @@ typedef struct dap_http_simple {
     dap_events_socket_t * esocket;
     dap_worker_t * worker;
     dap_http_client_t * http_client;
-    uint128_t http_client_uuid;
+    dap_events_socket_uuid_t esocket_uuid;
 
     union {
         void *request;
diff --git a/dap-sdk/plugin/CMakeLists.txt b/dap-sdk/plugin/CMakeLists.txt
index 1406a0fc98ad0d5a961df90365a287594a946ed3..b403250922fe019f049ffa9a9733806fe8486b6b 100644
--- a/dap-sdk/plugin/CMakeLists.txt
+++ b/dap-sdk/plugin/CMakeLists.txt
@@ -12,7 +12,11 @@ add_library(${PROJECT_NAME} STATIC ${DAP_PLUGIN_SRCS} ${DAP_PLUGIN_HEADERS})
 
 target_link_libraries(${PROJECT_NAME})
 
-target_link_libraries(${PROJECT_NAME} dap_core dap_cli_server dl)
+target_link_libraries(${PROJECT_NAME} dap_core dap_cli_server )
+
+if(NOT WIN32)
+    target_link_libraries(${PROJECT_NAME} dl )
+endif()
 
 target_include_directories(${PROJECT_NAME} PUBLIC include/ )
 
diff --git a/modules/chain/CMakeLists.txt b/modules/chain/CMakeLists.txt
index e6071d1e9ead2ab3f78edf0ac8756c90b1c4fdce..14bde14c8e5da1a61b6f26499376c10583c6cdf9 100644
--- a/modules/chain/CMakeLists.txt
+++ b/modules/chain/CMakeLists.txt
@@ -10,7 +10,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_SRCS} ${DAP_CHAIN_HEADERS})
 #find_package(PkgConfig REQUIRED)
 #pkg_search_module(GLIB REQUIRED glib-2.0)
 
-target_link_libraries(${PROJECT_NAME} dap_core dap_chain_common dap_chain_mempool dap_chain_global_db ${GLIB_LDFLAGS})
+target_link_libraries(${PROJECT_NAME} dap_chain_net_srv_xchange dap_chain_net_srv_stake_pos_delegate dap_chain_net_srv_stake_lock ${GLIB_LDFLAGS})
 target_include_directories(${PROJECT_NAME} INTERFACE . include/ ${GLIB_INCLUDE_DIRS})
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/uthash/src)
diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index de9d7fe0fbbe317b5ac712539a54129019987220..7a15202bdf797092024af67069b0096cb3283bb4 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -414,9 +414,9 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha
 			{
                 log_it (L_NOTICE, "Consensus initialized for chain id 0x%016"DAP_UINT64_FORMAT_x, l_chain_id.uint64);
 
-                if ( dap_config_get_item_str_default(l_cfg , "files","storage_dir",NULL ) )
+                if ( dap_config_get_item_path_default(l_cfg , "files","storage_dir",NULL ) )
 				{
-                    DAP_CHAIN_PVT(l_chain)->file_storage_dir = dap_strdup( dap_config_get_item_str( l_cfg , "files","storage_dir" ) );
+                    DAP_CHAIN_PVT(l_chain)->file_storage_dir = dap_strdup( dap_config_get_item_path( l_cfg , "files","storage_dir" ) );
                     if (dap_chain_load_all(l_chain) == 0)
                         log_it (L_NOTICE, "Loaded chain files");
                     else {
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 96faba554041418cd00d969afb37a88160478639..85ea2e6c9d339268e2fe786da9a9ce8b653704c5 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -64,6 +64,10 @@
 #include "json-c/json_object.h"
 #include "dap_notify_srv.h"
 #include "dap_chain_net_srv.h"
+#include "dap_chain_net_srv_xchange.h"
+#include "dap_chain_net_srv_stake_lock.h"
+#include "dap_chain_net_srv_stake_pos_delegate.h"
+
 
 #define LOG_TAG "dap_chain_ledger"
 
@@ -78,6 +82,17 @@ static dap_chain_ledger_verificator_t *s_verificators;
 static  pthread_rwlock_t s_verificators_rwlock;
 
 #define MAX_OUT_ITEMS   10
+
+typedef struct dap_chain_ledger_token_emission_for_stake_lock_item {
+    dap_chain_hash_fast_t	datum_token_emission_for_stake_lock_hash;
+    dap_chain_hash_fast_t	tx_used_out;
+//	const char 				datum_token_emission_hash[DAP_CHAIN_HASH_FAST_STR_SIZE];
+    UT_hash_handle hh;
+} dap_chain_ledger_token_emission_for_stake_lock_item_t;
+
+static dap_chain_ledger_token_emission_for_stake_lock_item_t	*s_emission_for_stake_lock;
+static  pthread_rwlock_t 										s_emission_for_stake_lock_rwlock;
+
 typedef struct dap_chain_ledger_token_emission_item {
     dap_chain_hash_fast_t datum_token_emission_hash;
     dap_chain_datum_token_emission_t *datum_token_emission;
@@ -86,14 +101,6 @@ typedef struct dap_chain_ledger_token_emission_item {
     UT_hash_handle hh;
 } dap_chain_ledger_token_emission_item_t;
 
-/*TODO: use this table when issuing for special emission-transactions is approved. needed for smart contracts in the future
-typedef struct dap_chain_ledger_token_emission_for_stake_lock_item {
-    dap_chain_hash_fast_t	datum_token_emission_for_stake_lock_hash;
-    const char 				datum_token_emission_hash[DAP_CHAIN_HASH_FAST_STR_SIZE];
-    UT_hash_handle hh;
-} dap_chain_ledger_token_emission_for_stake_lock_item_t;
-*/
-
 typedef struct dap_chain_ledger_token_item {
     char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
     uint16_t type;
@@ -266,10 +273,22 @@ static void wallet_info_notify();
 int dap_chain_ledger_init()
 {
     s_debug_more = dap_config_get_item_bool_default(g_config,"ledger","debug_more",false);
-    pthread_rwlock_init(&s_verificators_rwlock, NULL);
     return 0;
 }
 
+bool dap_chain_global_rwlocks_and_verificators_init(void)
+{
+    pthread_rwlock_init(&s_verificators_rwlock, NULL);
+    pthread_rwlock_init(&s_emission_for_stake_lock_rwlock, NULL);
+    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY, dap_chain_net_srv_pay_verificator, NULL);
+    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE, dap_chain_ledger_fee_verificator, NULL);
+    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE, dap_chain_net_srv_xchange_verificator, NULL);
+    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, dap_chain_net_srv_stake_pos_delegate_verificator, NULL);
+    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE_UPDATE, dap_chain_net_srv_stake_updater, NULL);
+    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK, s_callback_verificator, s_callback_verificator_added);
+    return true;
+}
+
 /**
  * @brief dap_chain_ledger_deinit
  * nothing do
@@ -452,8 +471,11 @@ void s_update_token_cache(dap_ledger_t *a_ledger, dap_chain_ledger_token_item_t
     uint8_t *l_cache = DAP_NEW_STACK_SIZE(uint8_t, l_cache_size);
     memcpy(l_cache, &l_token_item->current_supply, sizeof(uint256_t));
     memcpy(l_cache + sizeof(uint256_t), l_token_item->datum_token, l_token_item->datum_token_size);
-    if ( dap_global_db_set(l_gdb_group, l_token_item->ticker, l_cache, l_cache_size, false, NULL, NULL ) )
-        debug_if(s_debug_more, L_WARNING, "Ledger cache mismatch");
+    if (!dap_global_db_set(l_gdb_group, l_token_item->ticker, l_cache, l_cache_size, false, NULL, NULL)) {
+        char *l_supply = dap_chain_balance_print(l_token_item->current_supply);
+        log_it(L_WARNING, "Ledger cache mismatch, can't add token [%s] with supply %s", l_token_item->ticker, l_supply);
+        DAP_FREE(l_supply);
+    }
     DAP_DELETE(l_gdb_group);
 }
 
@@ -485,32 +507,32 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *
     dap_snprintf(l_token_item->ticker,sizeof (l_token_item->ticker), "%s", a_token->ticker);
     pthread_rwlock_init(&l_token_item->token_emissions_rwlock,NULL);
 
-    l_token_item->datum_token_size = a_token_size;
-    l_token_item->type = a_token->type;
-    l_token_item->datum_token = DAP_DUP_SIZE(a_token, a_token_size);
-    dap_chain_datum_token_t *l_token = a_token;
-    size_t l_token_size = a_token_size;
-    if (a_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE)
-        l_token = dap_chain_datum_token_read((byte_t *)a_token, &l_token_size);
-    l_token_item->total_supply = l_token->total_supply;
-    l_token_item->auth_signs_total = l_token->signs_total;
-    l_token_item->auth_signs_valid = l_token->signs_valid;
-
+    dap_chain_datum_token_t *l_token = a_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE ?
+                dap_chain_datum_token_read((byte_t *)a_token, &a_token_size) : a_token;
 
-    pthread_rwlock_wrlock(&PVT(a_ledger)->tokens_rwlock);
-    HASH_ADD_STR(PVT(a_ledger)->tokens, ticker, l_token_item);
-    pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
+    l_token_item->datum_token_size  = a_token_size;
+    l_token_item->type              = a_token->type;
+    l_token_item->datum_token       = DAP_DUP_SIZE(a_token, a_token_size);
+    l_token_item->total_supply      = l_token->total_supply;
+    l_token_item->auth_signs_total  = l_token->signs_total;
+    l_token_item->auth_signs_valid  = l_token->signs_valid;
 
     l_token_item->auth_signs = dap_chain_datum_token_signs_parse(a_token, a_token_size,
                                                                &l_token_item->auth_signs_total,
                                                                &l_token_item->auth_signs_valid);
-    if(l_token_item->auth_signs_total){
+    if(l_token_item->auth_signs_total) {
         l_token_item->auth_signs_pkey_hash = DAP_NEW_Z_SIZE(dap_chain_hash_fast_t, sizeof(dap_chain_hash_fast_t) * l_token_item->auth_signs_total);
         for(uint16_t k=0; k<l_token_item->auth_signs_total;k++){
             dap_sign_get_pkey_hash(l_token_item->auth_signs[k], &l_token_item->auth_signs_pkey_hash[k]);
         }
     }
 
+    l_token_item->current_supply = l_token_item->total_supply;
+
+    pthread_rwlock_wrlock(&PVT(a_ledger)->tokens_rwlock);
+    HASH_ADD_STR(PVT(a_ledger)->tokens, ticker, l_token_item);
+    pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
+
     switch(a_token->type) {
     case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
     case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:
@@ -522,7 +544,7 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *
             DAP_DELETE(l_balance);
         }
         break;
-    case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256
+    case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:
         if(s_debug_more) {
             char *l_balance = dap_chain_balance_to_coins(a_token->total_supply);
             log_it(L_NOTICE, "Private token %s added (total_supply = %s total_signs_valid=%hu signs_total=%hu type=DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL)",
@@ -532,7 +554,7 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *
         }
         s_token_tsd_parse(a_ledger,l_token_item, a_token, a_token_size);
         break;
-   case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL: // 256
+   case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL:
         if(s_debug_more) {
             char *l_balance = dap_chain_balance_to_coins(a_token->total_supply);
             log_it(L_NOTICE, "CF20 token %s added (total_supply = %s total_signs_valid=%hu signs_total=%hu)",
@@ -542,7 +564,7 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *
         }
         s_token_tsd_parse(a_ledger,l_token_item, a_token, a_token_size);
         break;
-    case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256
+    case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:
         if(s_debug_more)
             log_it( L_WARNING, "Private token %s type=DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE. Not processed, wait for software update", a_token->ticker);
             // TODO: Check authorithy
@@ -552,10 +574,8 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *
         if(s_debug_more)
             log_it(L_WARNING,"Unknown token declaration type 0x%04X", a_token->type );
     }
-    l_token_item->current_supply = l_token_item->total_supply;
+    s_threshold_emissions_proc(a_ledger); //TODO process thresholds only for no-consensus chains
     s_update_token_cache(a_ledger, l_token_item);
-    // Proc emissions thresholds
-    s_threshold_emissions_proc( a_ledger); //TODO process thresholds only for no-consensus chains
     if (a_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE)
         DAP_DELETE(l_token);
     return 0;
@@ -689,7 +709,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite
                             }
                         }
                         if(a_token_item->tx_recv_allow){
-                            memcpy(&a_token_item->tx_recv_allow[a_token_item->tx_recv_allow_size], l_tsd->data,l_tsd->size);
+                            a_token_item->tx_recv_allow[a_token_item->tx_recv_allow_size] = *(dap_chain_addr_t*)l_tsd->data;
                             a_token_item->tx_recv_allow_size++;
                         }
 
@@ -781,12 +801,12 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite
                             }
                         }
 
-                    if(l_addrs){
-                        memcpy(&l_addrs[a_token_item->tx_recv_block_size], l_tsd->data,l_tsd->size);
+                    if(l_addrs) {
+                        l_addrs[a_token_item->tx_recv_block_size] = *(dap_chain_addr_t*)l_tsd->data;
                         a_token_item->tx_recv_block_size++;
                         a_token_item->tx_recv_block = l_addrs;
 
-                    }else{
+                    } else {
                         log_it(L_ERROR,"Out of memory! Can't extend TX_RECEIVER_BLOCKED array");
                     }
                 }else{
@@ -868,12 +888,12 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite
                             return -11;
                         }
                     }
-                    if( l_addrs){
-                        memcpy(&l_addrs[a_token_item->tx_send_allow_size], l_tsd->data,l_tsd->size);
+                    if(l_addrs) {
+                        l_addrs[a_token_item->tx_send_allow_size] = *(dap_chain_addr_t*)l_tsd->data;
                         a_token_item->tx_send_allow_size++;
                         a_token_item->tx_send_allow = l_addrs;
 
-                    }else{
+                    } else {
                         log_it(L_ERROR,"Out of memory! Can't extend TX_SENDER_ALLOWED array");
                     }
                 }else{
@@ -955,12 +975,12 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite
                             return -11;
                         }
                     }
-                    if( l_addrs){
-                        memcpy(&l_addrs[a_token_item->tx_send_block_size], l_tsd->data,l_tsd->size);
+                    if(l_addrs) {
+                        l_addrs[a_token_item->tx_send_block_size] = *(dap_chain_addr_t*)l_tsd->data;
                         a_token_item->tx_send_block_size++;
                         a_token_item->tx_send_block = l_addrs;
 
-                    }else{
+                    } else {
                         log_it(L_ERROR,"Out of memory! Can't extend TX_SENDER_BLOCKED array");
                     }
                 }else{
@@ -1192,26 +1212,32 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger)
 
         if ((l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL)
                 || (l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_UPDATE)){
-                l_item_str = dap_strdup_printf("Token name '%s', type %s, flags: %s\n"
-                                                "\tDecimals: 18\n"
-                                                "\tAuth signs (valid/total) %zu/%zu\n"
-                                                "\tTotal emissions %u\n",
-                                                &l_token_item->ticker, l_type_str, s_flag_str_from_code(l_token_item->datum_token->header_private_decl.flags),
-                                                l_token_item->auth_signs_valid, l_token_item->auth_signs_total,
-                                                HASH_COUNT(l_token_item->token_emissions));
+            char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply);
+            char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply);
+            l_item_str = dap_strdup_printf("Token name '%s', type %s, flags: %s\n"
+                                            "\tSupply (current/total) %s/%s\n"
+                                            "\tDecimals: 18\n"
+                                            "\tAuth signs (valid/total) %zu/%zu\n"
+                                            "\tTotal emissions %u\n",
+                                            &l_token_item->ticker, l_type_str, s_flag_str_from_code(l_token_item->datum_token->header_private_decl.flags),
+                                            l_balance_cur, l_balance_total, l_token_item->auth_signs_valid, l_token_item->auth_signs_total,
+                                            HASH_COUNT(l_token_item->token_emissions));
+            DAP_DEL_Z(l_balance_cur);
+            DAP_DEL_Z(l_balance_total);
         } else {
                 char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply);
                 char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply);
                 l_item_str = dap_strdup_printf("Token name '%s', type %s, flags: %s\n"
                                                 "\tSupply (current/total) %s/%s\n"
+                                                "\tDecimals: 18\n"
                                                 "\tAuth signs (valid/total) %zu/%zu\n"
                                                 "\tTotal emissions %u\n",
                                                 &l_token_item->ticker, l_type_str, s_flag_str_from_code(l_token_item->datum_token->header_private_decl.flags),
                                                 l_balance_cur, l_balance_total,
                                                 l_token_item->auth_signs_valid, l_token_item->auth_signs_total,
                                                 HASH_COUNT(l_token_item->token_emissions));
-                DAP_DELETE(l_balance_cur);
-                DAP_DELETE(l_balance_total);
+                DAP_DEL_Z(l_balance_cur);
+                DAP_DEL_Z(l_balance_total);
         }
 
         l_ret_list = dap_list_append(l_ret_list, l_item_str);
@@ -1346,7 +1372,7 @@ static bool s_load_cache_gdb_loaded_spent_txs_callback(dap_global_db_context_t *
         size_t l_spent_time_len = 0;
         byte_t* l_spent_time_data = dap_global_db_get_sync(DAP_CHAIN_LEDGER_SPENT_TXS_TIME_STR, a_values[i].key, &l_spent_time_len, NULL, NULL);
         if (l_spent_time_data && l_spent_time_len == sizeof(dap_time_t)) {
-            memcpy(&l_tx_spent_item->spent_time, l_spent_time_data, l_spent_time_len);
+            l_tx_spent_item->spent_time = *(dap_time_t*)l_spent_time_data;
             DAP_DELETE(l_spent_time_data);
         }
         HASH_ADD(hh, l_ledger_pvt->spent_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_spent_item);
@@ -1382,8 +1408,8 @@ static bool s_load_cache_gdb_loaded_txs_callback(dap_global_db_context_t * a_glo
         dap_chain_ledger_tx_item_t *l_tx_item = DAP_NEW_Z(dap_chain_ledger_tx_item_t);
         dap_chain_hash_fast_from_str(a_values[i].key, &l_tx_item->tx_hash_fast);
         l_tx_item->tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, a_values[i].value_len - sizeof(l_tx_item->cache_data));
-        memcpy(l_tx_item->tx, a_values[i].value + sizeof(l_tx_item->cache_data), a_values[i].value_len - sizeof(l_tx_item->cache_data));
         memcpy(&l_tx_item->cache_data, a_values[i].value, sizeof(l_tx_item->cache_data));
+        memcpy(l_tx_item->tx, a_values[i].value + sizeof(l_tx_item->cache_data), a_values[i].value_len - sizeof(l_tx_item->cache_data));
         HASH_ADD(hh, l_ledger_pvt->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_item);
     }
 
@@ -1429,7 +1455,7 @@ static bool s_load_cache_gdb_loaded_emissions_callback(dap_global_db_context_t *
         }
         dap_chain_ledger_token_emission_item_t *l_emission_item = DAP_NEW_Z(dap_chain_ledger_token_emission_item_t);
         dap_chain_hash_fast_from_str(a_values[i].key, &l_emission_item->datum_token_emission_hash);
-        memcpy(&l_emission_item->tx_used_out, a_values[i].value, sizeof(dap_hash_fast_t));
+        l_emission_item->tx_used_out = *(dap_hash_fast_t*)a_values[i].value;
         l_emission_item->datum_token_emission = DAP_DUP_SIZE(a_values[i].value + sizeof(dap_hash_fast_t),
                                                              a_values[i].value_len - sizeof(dap_hash_fast_t));
         l_emission_item->datum_token_emission_size = a_values[i].value_len - sizeof(dap_hash_fast_t);
@@ -1487,7 +1513,7 @@ static bool s_load_cache_gdb_loaded_tokens_callback(dap_global_db_context_t * a_
             log_it(L_WARNING, "Can't load token with ticker [%s], need to 'ledger reload' to update cache", l_token->ticker);
             continue;
         }
-        memcpy(&l_token_item->current_supply, a_values[i].value, sizeof(uint256_t));
+        l_token_item->current_supply = *(uint256_t*)a_values[i].value;
     }
 
     char *l_gdb_group = dap_chain_ledger_get_gdb_group(l_ledger, DAP_CHAIN_LEDGER_EMISSIONS_STR);
@@ -1545,7 +1571,7 @@ dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags, char *a_net_name)
     l_ledger_priv->load_mode = true;
     l_ledger_priv->tps_timer = NULL;
     l_ledger_priv->tps_count = 0;
-    if (dap_config_get_item_bool_default(g_config, "ledger", "cached", true)) {
+    if (dap_config_get_item_bool_default(g_config, "ledger", "cache_enabled", true)) {
         // load ledger cache from GDB
         dap_chain_ledger_load_cache(l_ledger);
     }
@@ -1798,7 +1824,7 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e
     if (!l_token_emission_item) {
         l_token_emission_item = DAP_NEW_Z(dap_chain_ledger_token_emission_item_t);
         l_token_emission_item->datum_token_emission_size = a_token_emission_size;
-        memcpy(&l_token_emission_item->datum_token_emission_hash, a_emission_hash, sizeof(*a_emission_hash));
+        l_token_emission_item->datum_token_emission_hash = *a_emission_hash;
         if (l_token_item) {
             l_token_emission_item->datum_token_emission = dap_chain_datum_emission_read(a_token_emission,
                                                                                         &l_token_emission_item->datum_token_emission_size);
@@ -1897,26 +1923,41 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e
     return l_ret;
 }
 
-/*TODO: use this function when issuing for special emission-transactions is approved. needed for smart contracts in the future
-dap_chain_ledger_token_emission_for_stake_lock_item_t *s_emission_for_stake_lock_item_find(dap_ledger_t *a_ledger,
-                                                             const char *a_token_ticker, const dap_chain_hash_fast_t *a_token_emission_hash)
+dap_chain_ledger_token_emission_for_stake_lock_item_t *s_emission_for_stake_lock_item_add(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_token_emission_hash)
 {
     dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
-    dap_chain_ledger_token_item_t *l_token_item = NULL;
-    pthread_rwlock_rdlock(&l_ledger_priv->tokens_rwlock);
-    HASH_FIND_STR(l_ledger_priv->tokens, a_token_ticker, l_token_item);
-    pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock);
+    dap_chain_ledger_token_emission_for_stake_lock_item_t *l_new_stake_lock_emission;
+    pthread_rwlock_rdlock(&s_emission_for_stake_lock_rwlock);
+    HASH_FIND(hh, s_emission_for_stake_lock, a_token_emission_hash, sizeof(dap_hash_fast_t),
+              l_new_stake_lock_emission);
+    pthread_rwlock_unlock(&s_emission_for_stake_lock_rwlock);
+    if (l_new_stake_lock_emission) {
+        return l_new_stake_lock_emission;
+    }
+    l_new_stake_lock_emission = DAP_NEW(dap_chain_ledger_token_emission_for_stake_lock_item_t);
+    l_new_stake_lock_emission->datum_token_emission_for_stake_lock_hash = *a_token_emission_hash;
+    l_new_stake_lock_emission->tx_used_out = (dap_chain_hash_fast_t){ 0 };
+    pthread_rwlock_wrlock(&s_emission_for_stake_lock_rwlock);
+    HASH_ADD(hh, s_emission_for_stake_lock, datum_token_emission_for_stake_lock_hash, sizeof(dap_chain_hash_fast_t), l_new_stake_lock_emission);
+    pthread_rwlock_unlock(&s_emission_for_stake_lock_rwlock);
+
+    if (!l_new_stake_lock_emission
+    &&	s_debug_more) {
+        log_it(L_ERROR, "Error: memory allocation when adding item 'dap_chain_ledger_token_emission_for_stake_lock_item_t' to hash-table");
+    }
+    return l_new_stake_lock_emission;
+}
 
-    if (!l_token_item)
-        return NULL;
-    dap_chain_ledger_token_emission_for_stake_lock_item_t *l_token_emission_item = NULL;
-    pthread_rwlock_rdlock(&l_token_item->token_emissions_rwlock);
-    HASH_FIND(hh, l_token_item->token_emissions, a_token_emission_hash, sizeof(*a_token_emission_hash),
-              l_token_emission_item);
-    pthread_rwlock_unlock(&l_token_item->token_emissions_rwlock);
-    return l_token_emission_item;
+dap_chain_ledger_token_emission_for_stake_lock_item_t *s_emission_for_stake_lock_item_find(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_token_emission_hash)
+{
+    dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
+    dap_chain_ledger_token_emission_for_stake_lock_item_t *l_new_stake_lock_emission;
+    pthread_rwlock_rdlock(&s_emission_for_stake_lock_rwlock);
+    HASH_FIND(hh, s_emission_for_stake_lock, a_token_emission_hash, sizeof(dap_chain_hash_fast_t),
+              l_new_stake_lock_emission);
+    pthread_rwlock_unlock(&s_emission_for_stake_lock_rwlock);
+    return l_new_stake_lock_emission;
 }
-*/
 
 int dap_chain_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size)
 {
@@ -2424,7 +2465,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             l_tx_prev_hash = l_tx_in_cond->header.tx_prev_hash;
             bound_item->in.tx_cur_in_cond = l_tx_in_cond;
         }
-        memcpy(&bound_item->tx_prev_hash_fast, &l_tx_prev_hash, sizeof(dap_chain_hash_fast_t));
+        bound_item->tx_prev_hash_fast = l_tx_prev_hash;
 
         bool l_is_blank = dap_hash_fast_is_blank(&l_tx_prev_hash);
         char l_tx_prev_hash_str[70]={[0]='\0'};
@@ -2452,7 +2493,16 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             l_token = l_tx_token->header.ticker;
             l_emission_hash = &l_tx_token->header.token_emission_hash;
             dap_chain_ledger_token_emission_item_t *l_emission_item = s_emission_item_find(a_ledger, l_token, l_emission_hash);
-            if (!l_emission_item) {//check emission for STAKE_LOCK
+            dap_chain_ledger_token_emission_for_stake_lock_item_t *stake_lock_emission = s_emission_for_stake_lock_item_find(a_ledger, l_emission_hash);
+            if (!l_emission_item && stake_lock_emission) {//check emission for STAKE_LOCK
+                dap_hash_fast_t cur_tx_hash;
+                dap_hash_fast(a_tx, dap_chain_datum_tx_get_size(a_tx), &cur_tx_hash);
+                if (!dap_hash_fast_is_blank(&stake_lock_emission->tx_used_out)
+                && 	!dap_hash_fast_compare(&cur_tx_hash, &stake_lock_emission->tx_used_out)) {
+                    debug_if(s_debug_more, L_WARNING, "stake_lock_emission is used out for tx_token [%s]", l_token);
+                    l_err_num = -22;
+                    break;
+                }
                 dap_tsd_t *l_tsd;
                 dap_chain_datum_token_t *l_datum_token = dap_chain_ledger_token_ticker_check(a_ledger, l_token);
                 if (l_datum_token
@@ -2491,10 +2541,10 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                             char * l_locked_value_str = dap_chain_balance_print(l_tx_stake_lock_out_cond->header.value);
                             log_it( L_WARNING, "Multiplication overflow for %s emission: locked value %s emission rate %s"
                             , l_tx_token->header.ticker, l_locked_value_str, l_emission_rate_str);
-                            DAP_DELETE(l_emission_rate_str);
-                            DAP_DELETE(l_locked_value_str);
+                            DAP_DEL_Z(l_emission_rate_str);
+                            DAP_DEL_Z(l_locked_value_str);
                         }
-                        l_err_num = -25;
+                        l_err_num = -26;
                         break;
                     }
 
@@ -2505,8 +2555,8 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                         debug_if(s_debug_more, L_WARNING, "Value %s not thats expected %s for [%s]",l_locked_value_str, l_value_expected_str,
                                  l_tx_token->header.ticker);
 
-                        DAP_DELETE(l_value_expected_str);
-                        DAP_DELETE(l_locked_value_str);
+                        DAP_DEL_Z(l_value_expected_str);
+                        DAP_DEL_Z(l_locked_value_str);
                         l_err_num = -34;
                         break;
                     }
@@ -2519,17 +2569,60 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                     }
                     if (strcmp(tx_tiker, l_tsd_section.ticker_token_from)) {
                         debug_if(s_debug_more, L_WARNING, "Tikers not equal for [%s]", l_tx_token->header.ticker);
-                        l_err_num = -34;
+                        l_err_num = -35;
                         break;
                     }
+
+                    //Update value in ledger memory object
+                    if (dap_hash_fast_is_blank(&stake_lock_emission->tx_used_out)) {
+                        l_token_item = NULL;
+                        pthread_rwlock_rdlock(&l_ledger_priv->tokens_rwlock);
+                        HASH_FIND_STR(l_ledger_priv->tokens, l_token, l_token_item);
+                        pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock);
+                        if (!l_token_item){
+                            if(s_debug_more)
+                                log_it(L_WARNING, "No token item found for token %s", l_token);
+                            l_err_num = -15;
+                            break;
+                        }
+                        if (!IS_ZERO_256(l_token_item->total_supply)) {
+                            if (compare256(l_token_item->current_supply, l_tx_out->header.value) >= 0){
+                                SUBTRACT_256_256(l_token_item->current_supply, l_tx_out->header.value, &l_token_item->current_supply);
+                                char *l_balance = dap_chain_balance_print(l_token_item->current_supply);
+                                log_it(L_DEBUG, "New current supply %s for token %s", l_balance, l_token_item->ticker);
+                                DAP_DEL_Z(l_balance);
+                            } else {
+                                char *l_balance = dap_chain_balance_print(l_token_item->current_supply);
+                                char *l_value = dap_chain_balance_print(l_tx_out->header.value);
+                                log_it(L_WARNING, "Token current supply %s lower, than emission value = %s",
+                                       l_balance, l_value);
+                                DAP_DEL_Z(l_balance);
+                                DAP_DEL_Z(l_value);
+                                l_err_num = -30;
+                                break;
+                            }
+                            stake_lock_emission->tx_used_out = cur_tx_hash;
+                            //update current_supply in ledger cache and ledger memory object
+                            s_update_token_cache(a_ledger, l_token_item);
+                        } else {
+                            log_it(L_DEBUG, "Total supply for token %s not found", l_token_item->ticker);
+                            l_err_num = -32;
+                            break;
+                        }
+                    }
                     debug_if(s_debug_more, L_NOTICE, "Check emission passed for tx_token [%s]", l_tx_token->header.ticker);
                     break;
                 } else {
-                    debug_if(s_debug_more, L_WARNING, "Emission for tx_token [%s] wasn't found", l_tx_token->header.ticker);
-                    l_err_num = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION;
+                    debug_if(s_debug_more, L_WARNING, "tx_token [%s] not valid for stake_lock transaction", l_token);
+                    l_err_num = -31;
                     break;
                 }
             }
+            if (!l_emission_item) {
+                debug_if(s_debug_more, L_WARNING, "Emission for tx_token [%s] wasn't found", l_tx_token->header.ticker);
+                l_err_num = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION;
+                break;
+            }
             if (!dap_hash_fast_is_blank(&l_emission_item->tx_used_out)) {
                 debug_if(s_debug_more, L_WARNING, "Emission for tx_token [%s] is already used", l_tx_token->header.ticker);
                 l_err_num = -22;
@@ -2619,15 +2712,15 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             switch (l_type) {
             case TX_ITEM_TYPE_OUT_OLD:
                 bound_item->out.tx_prev_out = l_tx_prev_out;
-                memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out->addr,sizeof (bound_item->out.tx_prev_out->addr));
+                l_tx_in_from = bound_item->out.tx_prev_out->addr;
                 break;
             case TX_ITEM_TYPE_OUT: // 256
                 bound_item->out.tx_prev_out_256 = l_tx_prev_out;
-                memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out_256->addr,sizeof (bound_item->out.tx_prev_out_256->addr));
+                l_tx_in_from = bound_item->out.tx_prev_out_256->addr;
                 break;
             case TX_ITEM_TYPE_OUT_EXT: // 256
                 bound_item->out.tx_prev_out_ext_256 = l_tx_prev_out;
-                memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out_ext_256->addr,sizeof (bound_item->out.tx_prev_out_ext_256->addr));
+                l_tx_in_from = bound_item->out.tx_prev_out_ext_256->addr;
                 break;
             default:
                 l_err_num = -8;
@@ -2822,7 +2915,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                 break;
             }
             l_value = dap_chain_uint256_from(l_tx_out->header.value);
-            memcpy(&l_tx_out_to , &l_tx_out->addr, sizeof (l_tx_out_to));
+            l_tx_out_to = l_tx_out->addr;
             l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
         } break;
         case TX_ITEM_TYPE_OUT: { // 256
@@ -2832,7 +2925,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                 break;
             }
             l_value = l_tx_out->header.value;
-            memcpy(&l_tx_out_to , &l_tx_out->addr, sizeof (l_tx_out_to));
+            l_tx_out_to = l_tx_out->addr;
             l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
         } break;
         case TX_ITEM_TYPE_OUT_EXT: { // 256
@@ -2843,7 +2936,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             }
             l_value = l_tx_out->header.value;
             l_token = l_tx_out->token;
-            memcpy(&l_tx_out_to , &l_tx_out->addr, sizeof (l_tx_out_to));
+            l_tx_out_to = l_tx_out->addr;
             l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
         } break;
         case TX_ITEM_TYPE_OUT_COND: {
@@ -3108,7 +3201,7 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d
                                        s_threshold_txs_max);
                     } else {
                         l_item_tmp = DAP_NEW_Z(dap_chain_ledger_tx_item_t);
-                        memcpy(&l_item_tmp->tx_hash_fast, a_tx_hash, sizeof(dap_chain_hash_fast_t));
+                        l_item_tmp->tx_hash_fast = *a_tx_hash;
                         l_item_tmp->tx = DAP_DUP_SIZE(a_tx, dap_chain_datum_tx_get_size(a_tx));
                         HASH_ADD_BYHASHVALUE(hh, l_ledger_priv->threshold_txs, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_hash_value, l_item_tmp);
                         if(s_debug_more)
@@ -3150,7 +3243,7 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d
             dap_chain_tx_in_t *l_tx_in = bound_item->in.tx_cur_in;
             if (dap_hash_fast_is_blank(&l_tx_in->header.tx_prev_hash)) { // It's the emission behind
                 // Mark it as used with base tx hash
-                memcpy(&bound_item->item_emission->tx_used_out, a_tx_hash, sizeof(dap_chain_hash_fast_t));
+                bound_item->item_emission->tx_used_out = *a_tx_hash;
                 // Mirror it in cache
                 char *l_hash_str = dap_chain_hash_fast_to_str_new(&bound_item->item_emission->datum_token_emission_hash);
                 size_t l_emission_size = bound_item->item_emission->datum_token_emission_size;
@@ -3251,7 +3344,7 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d
             }
         }
         // add a used output
-        memcpy(&(l_prev_item_out->cache_data.tx_hash_spent_fast[l_tx_prev_out_used_idx]), a_tx_hash, sizeof(dap_chain_hash_fast_t));
+        l_prev_item_out->cache_data.tx_hash_spent_fast[l_tx_prev_out_used_idx] = *a_tx_hash;
         l_prev_item_out->cache_data.n_outs_used++;
         // mirror it in the cache
         size_t l_tx_size = dap_chain_datum_tx_get_size(l_prev_item_out->tx);
@@ -3402,7 +3495,7 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d
 
     // add transaction to the cache list
     dap_chain_ledger_tx_item_t *l_tx_item = DAP_NEW_Z(dap_chain_ledger_tx_item_t);
-    memcpy(&l_tx_item->tx_hash_fast, a_tx_hash, sizeof(dap_chain_hash_fast_t));
+    l_tx_item->tx_hash_fast = *a_tx_hash;
     size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx);
     l_tx_item->tx = DAP_DUP_SIZE(a_tx, l_tx_size);
     l_tx_item->cache_data.ts_created = dap_time_now(); // Time of transasction added to ledger
@@ -3547,7 +3640,7 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_
         HASH_FIND_BYHASHVALUE(hh, l_ledger_priv->spent_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_hash_value, l_item_used);
         if (!l_item_used) {   // Add it to spent items
             l_item_used = DAP_NEW_Z(dap_chain_ledger_tx_spent_item_t);
-            memcpy(&l_item_used->tx_hash_fast, a_tx_hash, sizeof(dap_chain_hash_fast_t));
+            l_item_used->tx_hash_fast = *a_tx_hash;
             int l_len = strnlen(l_item_tmp->cache_data.token_ticker, DAP_CHAIN_TICKER_SIZE_MAX);
             strncpy(l_item_used->token_ticker, l_item_tmp->cache_data.token_ticker, l_len);
             HASH_ADD_BYHASHVALUE(hh, l_ledger_priv->spent_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_hash_value, l_item_used);
@@ -3586,14 +3679,13 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db)
     pthread_rwlock_wrlock(&l_ledger_priv->threshold_txs_rwlock);
     pthread_rwlock_wrlock(&l_ledger_priv->balance_accounts_rwlock);
 
-    // delete transactions
+    /* Delete regular transactions */
     dap_chain_ledger_tx_item_t *l_item_current, *l_item_tmp;
     char *l_gdb_group;
     HASH_ITER(hh, l_ledger_priv->ledger_items , l_item_current, l_item_tmp) {
-        // Clang bug at this, l_item_current should change at every loop cycle
         HASH_DEL(l_ledger_priv->ledger_items, l_item_current);
         DAP_DELETE(l_item_current->tx);
-        DAP_DELETE(l_item_current);
+        DAP_DEL_Z(l_item_current);
     }
     if (!a_preserve_db) {
         l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR);
@@ -3601,12 +3693,11 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db)
         DAP_DELETE(l_gdb_group);
     }
 
-    // delete spent transactions
+    /* Delete spent transactions */
     dap_chain_ledger_tx_spent_item_t *l_spent_item_current, *l_spent_item_tmp;
     HASH_ITER(hh, l_ledger_priv->spent_items, l_spent_item_current, l_spent_item_tmp) {
-        // Clang bug at this, l_item_current should change at every loop cycle
         HASH_DEL(l_ledger_priv->spent_items, l_spent_item_current);
-        DAP_DELETE(l_item_current);
+        DAP_DEL_Z(l_item_current);
     }
     if (!a_preserve_db) {
         l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_SPENT_TXS_STR);
@@ -3614,11 +3705,11 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db)
         DAP_DELETE(l_gdb_group);
     }
 
-    // delete balances
+    /* Delete balances */
     dap_ledger_wallet_balance_t *l_balance_current, *l_balance_tmp;
     HASH_ITER(hh, l_ledger_priv->balance_accounts, l_balance_current, l_balance_tmp) {
-        // Clang bug at this, l_balance_current should change at every loop cycle
         HASH_DEL(l_ledger_priv->balance_accounts, l_balance_current);
+        DAP_DELETE(l_balance_current->key);
         DAP_DELETE(l_balance_current);
     }
     if (!a_preserve_db) {
@@ -3627,21 +3718,25 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db)
         DAP_DELETE(l_gdb_group);
     }
 
-    // delete tokens & its emissions
+    /* Delete tokens and their emissions */
     dap_chain_ledger_token_item_t *l_token_current, *l_token_tmp;
     dap_chain_ledger_token_emission_item_t *l_emission_current, *l_emission_tmp;
     HASH_ITER(hh, l_ledger_priv->tokens, l_token_current, l_token_tmp) {
         HASH_DEL(l_ledger_priv->tokens, l_token_current);
-        // Clang bug at this, l_token_current should change at every loop cycle
         pthread_rwlock_wrlock(&l_token_current->token_emissions_rwlock);
         HASH_ITER(hh, l_token_current->token_emissions, l_emission_current, l_emission_tmp) {
             HASH_DEL(l_token_current->token_emissions, l_emission_current);
-            // Clang bug at this, l_emission_current should change at every loop cycle
             DAP_DELETE(l_emission_current->datum_token_emission);
-            DAP_DELETE(l_emission_current);
+            DAP_DEL_Z(l_emission_current);
         }
         pthread_rwlock_unlock(&l_token_current->token_emissions_rwlock);
         DAP_DELETE(l_token_current->datum_token);
+        DAP_DELETE(l_token_current->auth_signs);
+        DAP_DELETE(l_token_current->auth_signs_pkey_hash);
+        DAP_DEL_Z(l_token_current->tx_recv_allow);
+        DAP_DEL_Z(l_token_current->tx_recv_block);
+        DAP_DEL_Z(l_token_current->tx_send_allow);
+        DAP_DEL_Z(l_token_current->tx_send_block);
         pthread_rwlock_destroy(&l_token_current->token_emissions_rwlock);
         DAP_DELETE(l_token_current);
     }
@@ -3654,29 +3749,25 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db)
         DAP_DELETE(l_gdb_group);
     }
 
-
-
-    // delete threshold emissions
+    /* Delete threshold emissions */
     HASH_ITER(hh, l_ledger_priv->threshold_emissions, l_emission_current, l_emission_tmp) {
         HASH_DEL(l_ledger_priv->threshold_emissions, l_emission_current);
-        // Clang bug at this, l_emission_current should change at every loop cycle
         DAP_DELETE(l_emission_current->datum_token_emission);
-        DAP_DELETE(l_emission_current);
+        DAP_DEL_Z(l_emission_current);
     }
-    // delete threshold transactions
+    /* Delete threshold transactions */
     HASH_ITER(hh, l_ledger_priv->threshold_txs, l_item_current, l_item_tmp) {
         HASH_DEL(l_ledger_priv->threshold_txs, l_item_current);
-        // Clang bug at this, l_item_current should change at every loop cycle
         DAP_DELETE(l_item_current->tx);
-        DAP_DELETE(l_item_current);
+        DAP_DEL_Z(l_item_current);
     }
 
-    l_ledger_priv->ledger_items = NULL;
-    l_ledger_priv->spent_items = NULL;
-    l_ledger_priv->balance_accounts = NULL;
-    l_ledger_priv->tokens = NULL;
-    l_ledger_priv->threshold_emissions = NULL;
-    l_ledger_priv->threshold_txs = NULL;
+    l_ledger_priv->ledger_items         = NULL;
+    l_ledger_priv->spent_items          = NULL;
+    l_ledger_priv->balance_accounts     = NULL;
+    l_ledger_priv->tokens               = NULL;
+    l_ledger_priv->threshold_emissions  = NULL;
+    l_ledger_priv->threshold_txs        = NULL;
 
     pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock);
     pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock);
@@ -4125,7 +4216,6 @@ uint256_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, d
 
     dap_chain_datum_tx_t *l_tx_tmp;
     dap_chain_hash_fast_t l_tx_first_hash = { 0 }; // start hash
-    //memcpy(&l_tx_first_hash, 0, sizeof(dap_chain_hash_fast_t));
     /* size_t l_pub_key_size = a_key_from->pub_key_data_size;
      uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key_from, &l_pub_key_size);*/
     dap_chain_tx_out_cond_t *l_tx_out_cond;
@@ -4208,8 +4298,8 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c
             }
             // Check whether used 'out' items
             if (!dap_chain_ledger_tx_hash_is_used_out_item (a_ledger, &l_tx_cur_hash, l_out_idx_tmp)) {
-                list_used_item_t *l_item = DAP_NEW(list_used_item_t);
-                memcpy(&l_item->tx_hash_fast, &l_tx_cur_hash, sizeof(dap_chain_hash_fast_t));
+                list_used_item_t *l_item = DAP_NEW_Z(list_used_item_t);
+                l_item->tx_hash_fast = l_tx_cur_hash;
                 l_item->num_idx_out = l_out_idx_tmp;
                 l_item->value = l_value;
                 l_list_used_out = dap_list_append(l_list_used_out, l_item);
@@ -4284,6 +4374,75 @@ dap_list_t * dap_chain_ledger_get_txs(dap_ledger_t *a_ledger, size_t a_count, si
     return l_list;
 }
 
+/**
+ * @brief dap_chain_ledger_get_list_tx_cond_outs_with_val
+ * @param a_ledger
+ * @param a_token_ticker
+ * @param a_addr_from
+ * @param a_subtype
+ * @param a_value_need
+ * @param a_value_transfer
+ * @return
+ */
+dap_list_t *dap_chain_ledger_get_list_tx_cond_outs_with_val(dap_ledger_t *a_ledger, const char *a_token_ticker,  const dap_chain_addr_t *a_addr_from,
+        dap_chain_tx_out_cond_subtype_t a_subtype, uint256_t a_value_need, uint256_t *a_value_transfer)
+{
+    dap_list_t *l_list_used_out = NULL; // list of transaction with 'out' items
+    dap_chain_hash_fast_t l_tx_cur_hash = { 0 };
+    uint256_t l_value_transfer = { };
+    while(compare256(l_value_transfer, a_value_need) == -1)
+    {
+        // Get the transaction in the cache by the addr in out item
+        dap_chain_datum_tx_t *l_tx = dap_chain_ledger_tx_find_by_addr(a_ledger, a_token_ticker, a_addr_from, &l_tx_cur_hash);
+        if(!l_tx)
+            break;
+        // Get all item from transaction by type
+        dap_list_t *l_list_out_cond_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_COND, NULL);
+
+        uint32_t l_out_idx_tmp = 0; // current index of 'out' item
+        for(dap_list_t *l_list_tmp = l_list_out_cond_items; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_out_idx_tmp++) {
+            dap_chain_tx_item_type_t l_type = *(uint8_t*) l_list_tmp->data;
+            uint256_t l_value = { };
+            switch (l_type) {
+            case TX_ITEM_TYPE_OUT_COND: {
+                dap_chain_tx_out_cond_t *l_out_cond = (dap_chain_tx_out_cond_t*) l_list_tmp->data;
+                if(IS_ZERO_256(l_out_cond->header.value) || a_subtype != l_out_cond->header.subtype) {
+                    continue;
+                }
+                l_value = l_out_cond->header.value;
+            }
+                break;
+            default:
+                continue;
+            }
+            if (!IS_ZERO_256(l_value)) {
+                list_used_item_t *l_item = DAP_NEW(list_used_item_t);
+                l_item->tx_hash_fast = l_tx_cur_hash;
+                l_item->num_idx_out = l_out_idx_tmp;
+                l_item->value = l_value;
+                l_list_used_out = dap_list_append(l_list_used_out, l_item);
+                SUM_256_256(l_value_transfer, l_item->value, &l_value_transfer);
+                // already accumulated the required value, finish the search for 'out' items
+                if (compare256(l_value_transfer, a_value_need) != -1) {
+                    break;
+                }
+            }
+        }
+        dap_list_free(l_list_out_cond_items);
+    }
+
+    // nothing to tranfer (not enough funds)
+    if(!l_list_used_out || compare256(l_value_transfer, a_value_need) == -1) {
+        dap_list_free_full(l_list_used_out, free);
+        return NULL;
+    }
+
+    if (a_value_transfer) {
+        *a_value_transfer = l_value_transfer;
+    }
+    return l_list_used_out;
+}
+
 bool dap_chain_ledger_fee_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond_t* a_cond, dap_chain_datum_tx_t* a_tx, bool a_owner)
 {
     return false;
diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h
index c3db43b1ad7409041d458f247e362030d320267e..a77164a96de9ca51c6f50b2e861dc0f88250adde 100644
--- a/modules/chain/include/dap_chain_ledger.h
+++ b/modules/chain/include/dap_chain_ledger.h
@@ -72,6 +72,7 @@ typedef struct dap_chain_net dap_chain_net_t;
 
 int dap_chain_ledger_init();
 void dap_chain_ledger_deinit();
+bool dap_chain_global_rwlocks_and_verificators_init(void);
 
 dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags, char *a_net_name);
 
@@ -231,6 +232,9 @@ uint256_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, d
 // Put this summary value to a_value_transfer
 dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, const char *a_token_ticker, const dap_chain_addr_t *a_addr_from,
                                                        uint256_t a_value_need, uint256_t *a_value_transfer);
+// Get the list of 'out_cond' items with summary value >= than a_value_need
+dap_list_t *dap_chain_ledger_get_list_tx_cond_outs_with_val(dap_ledger_t *a_ledger, const char *a_token_ticker,  const dap_chain_addr_t *a_addr_from,
+        dap_chain_tx_out_cond_subtype_t a_subtype, uint256_t a_value_need, uint256_t *a_value_transfer);
 // Add new verificator callback with associated subtype. Returns 1 if callback replaced, overwise returns 0
 int dap_chain_ledger_verificator_add(dap_chain_tx_out_cond_subtype_t a_subtype, dap_chain_ledger_verificator_callback_t a_callback, 
                                      dap_chain_ledger_verificator_callback_out_t a_callback_added);
diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
index 9b4a3b43b570106b39113cf9943e007d8ba69661..84f871bda12662f93f62c2d3084736dfbfc0877e 100644
--- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
+++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
@@ -25,6 +25,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include <sys/time.h>
 #include <time.h>
 #include "dap_global_db.h"
+#include "dap_time.h"
 #include "dap_timerfd.h"
 #include "dap_hash.h"
 #include "rand/dap_rand.h"
@@ -222,7 +223,7 @@ static bool s_grace_period_control(dap_chain_net_srv_grace_t *a_grace)
         l_usage->client->session_id = l_ch->stream->session->id;
         l_usage->client->ts_created = time(NULL);
         l_usage->tx_cond = l_tx;
-        memcpy(&l_usage->tx_cond_hash, &l_request->hdr.tx_cond,sizeof (l_usage->tx_cond_hash));
+        l_usage->tx_cond_hash = l_request->hdr.tx_cond;
         l_usage->ts_created = time(NULL);
     } else {
         l_usage = a_grace->usage;
@@ -321,7 +322,7 @@ free_exit:
                 pthread_mutex_unlock(&l_srv->banlist_mutex);
             else {
                 l_item = DAP_NEW_Z(dap_chain_net_srv_banlist_item_t);
-                memcpy(&l_item->client_pkey_hash, &a_grace->usage->client_pkey_hash, sizeof(dap_chain_hash_fast_t));
+                l_item->client_pkey_hash = a_grace->usage->client_pkey_hash;
                 l_item->ht_mutex = &l_srv->banlist_mutex;
                 l_item->ht_head = &l_srv->ban_list;
                 HASH_ADD(hh, l_srv->ban_list, client_pkey_hash, sizeof(dap_chain_hash_fast_t), l_item);
@@ -369,7 +370,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
         pkt_test_t *l_request = (pkt_test_t*)l_ch_pkt->data;
         size_t l_request_size = l_request->data_size + sizeof(pkt_test_t);
         if (l_ch_pkt->hdr.size != l_request_size) {
-            log_it(L_WARNING, "Wrong request size %u, must be %zu [pkt seq %lu]", l_ch_pkt->hdr.size, l_request_size, l_ch_pkt->hdr.seq_id);
+            log_it(L_WARNING, "Wrong request size %u, must be %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_ch_pkt->hdr.size, l_request_size, l_ch_pkt->hdr.seq_id);
             l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_SIZE;
             dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err));
             break;
@@ -377,13 +378,13 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
         dap_chain_hash_fast_t l_data_hash;
         dap_hash_fast(l_request->data, l_request->data_size, &l_data_hash);
         if (l_request->data_size > 0 && !dap_hash_fast_compare(&l_data_hash, &l_request->data_hash)) {
-            log_it(L_WARNING, "Wrong hash [pkt seq %lu]", l_ch_pkt->hdr.seq_id);
+            log_it(L_WARNING, "Wrong hash [pkt seq %"DAP_UINT64_FORMAT_U"]", l_ch_pkt->hdr.seq_id);
             l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_HASH;
             dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err));
             break;
         }
         if(l_request->data_size_recv > UINT_MAX) {
-            log_it(L_WARNING, "Too large payload %zu [pkt seq %lu]", l_request->data_size_recv, l_ch_pkt->hdr.seq_id);
+            log_it(L_WARNING, "Too large payload %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_request->data_size_recv, l_ch_pkt->hdr.seq_id);
             l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_BIG_SIZE;
             dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err));
             break;
@@ -396,9 +397,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
         }
         l_request->err_code = 0;
         strncpy(l_request->ip_send, a_ch->stream->esocket->hostaddr, INET_ADDRSTRLEN);
-        struct timespec l_recvtime2;
-        clock_gettime(CLOCK_REALTIME, &l_recvtime2);
-        l_request->recv_time2 = l_recvtime2;
+        l_request->recv_time2 = dap_nanotime_now();
 
         dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_RESPONSE, l_request,
                                        l_request->data_size + sizeof(pkt_test_t));
@@ -536,7 +535,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
         dap_hash_fast(l_receipt,l_receipt_size,&l_receipt_hash);
 
         char *l_receipt_hash_str = dap_chain_hash_fast_to_str_new(&l_receipt_hash);
-        dap_global_db_set("local.receipts",l_receipt_hash_str,  l_receipt, l_receipt_size,false, NULL, NULL);
+        dap_global_db_set("local.receipts", l_receipt_hash_str, l_receipt, l_receipt_size, false, NULL, NULL);
         DAP_DELETE(l_receipt_hash_str);
 
         size_t l_success_size;
@@ -548,7 +547,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg)
                                                                   dap_chain_wallet_get_key(l_usage->price->wallet, 0),
                                                                   l_receipt);
             if (l_tx_in_hash) {
-                memcpy(&l_usage->tx_cond_hash, l_tx_in_hash, sizeof(dap_chain_hash_fast_t));
+                l_usage->tx_cond_hash = *l_tx_in_hash;
                 char *l_tx_in_hash_str = dap_chain_hash_fast_to_str_new(l_tx_in_hash);
                 log_it(L_NOTICE, "Formed tx %s for input with active receipt", l_tx_in_hash_str);
                 DAP_DELETE(l_tx_in_hash_str);
diff --git a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
index 4b829261f23d0c348f62e100d8b35a82f74f5e96..ab49b11f39f2216463c69d232bdbce76c6191ba1 100644
--- a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
+++ b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c
@@ -1,5 +1,3 @@
-
-
 #include "dap_stream.h"
 #include "dap_stream_worker.h"
 #include "dap_stream_ch_pkt.h"
@@ -16,27 +14,27 @@
 #define LOG_TAG "dap_stream_ch_chain_voting"
 
 typedef struct voting_pkt_in_callback{
-	void * arg;
+    void * arg;
     voting_ch_callback_t packet_in_callback;
 } voting_pkt_in_callback_t;
 
 typedef struct voting_pkt_addr
 {
-	//dap_client_t *client;
-	dap_chain_node_addr_t node_addr;
-	//dap_chain_node_client_t *node_client;
-	dap_stream_ch_chain_voting_pkt_t *voting_pkt;
+    //dap_client_t *client;
+    dap_chain_node_addr_t node_addr;
+    //dap_chain_node_client_t *node_client;
+    dap_stream_ch_chain_voting_pkt_t *voting_pkt;
 } voting_pkt_addr_t;
 
 typedef struct voting_pkt_items
 {
-	//size_t count;
-	// dap_stream_ch_chain_voting_pkt_t * pkts_out[];
-	pthread_rwlock_t rwlock_out;
-	pthread_rwlock_t rwlock_in;
-	dap_list_t * pkts_out; // voting_pkt_addr_t
-	dap_list_t * pkts_in; // dap_stream_ch_chain_voting_pkt_t
-	// dap_timerfd_t * timer_in;
+    //size_t count;
+    // dap_stream_ch_chain_voting_pkt_t * pkts_out[];
+    pthread_rwlock_t rwlock_out;
+    pthread_rwlock_t rwlock_in;
+    dap_list_t * pkts_out; // voting_pkt_addr_t
+    dap_list_t * pkts_in; // dap_stream_ch_chain_voting_pkt_t
+    // dap_timerfd_t * timer_in;
 } voting_pkt_items_t;
 
 typedef struct voting_node_client_list {
@@ -49,12 +47,10 @@ typedef struct voting_node_client_list {
 static size_t s_pkt_in_callback_count = 0;
 static voting_pkt_in_callback_t s_pkt_in_callback[256]={{0}};
 static voting_pkt_items_t *s_pkt_items = NULL;
-
 static voting_node_client_list_t *s_node_client_list = NULL;
-static pthread_rwlock_t s_node_client_list_rwlock = PTHREAD_RWLOCK_INITIALIZER;
 
 static void s_callback_send_all_loopback(uint64_t a_node_addr);
-static void s_callback_pkt_items_send_all(dap_client_t *a_client, void *a_arg);
+static void s_callback_send_all_unsafe(dap_client_t *a_client, void *a_arg);
 
 static void s_callback_send_all_unsafe(dap_client_t *a_client, void *a_arg);
 static void s_stream_ch_new(dap_stream_ch_t* a_ch, void* a_arg);
@@ -64,49 +60,49 @@ static bool s_packet_in_callback_handler(void * a_arg);
 static void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg);
 static void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg);
 
-static dap_timerfd_t * s_packet_in_callback_timer = NULL; 
+static dap_timerfd_t * s_packet_in_callback_timer = NULL;
 static bool s_is_inited = false;
 
 //static int s_cli_voting(int argc, char ** argv, char **a_str_reply);
 
 int dap_stream_ch_chain_voting_init() {
-	log_it(L_NOTICE, "Chains voting channel initialized");
-	if (s_is_inited) {
-		return 0;
-	}
+    log_it(L_NOTICE, "Chains voting channel initialized");
+    if (s_is_inited) {
+        return 0;
+    }
 
     if (!s_pkt_items) {
-		s_pkt_items = DAP_NEW_Z(voting_pkt_items_t);
-		s_pkt_items->pkts_out = NULL;
-		s_pkt_items->pkts_in = NULL;
-		pthread_rwlock_init(&s_pkt_items->rwlock_out, NULL);
-		pthread_rwlock_init(&s_pkt_items->rwlock_in, NULL);
+        s_pkt_items = DAP_NEW_Z(voting_pkt_items_t);
+        s_pkt_items->pkts_out = NULL;
+        s_pkt_items->pkts_in = NULL;
+        pthread_rwlock_init(&s_pkt_items->rwlock_out, NULL);
+        pthread_rwlock_init(&s_pkt_items->rwlock_in, NULL);
     }
 
-    dap_stream_ch_proc_add(dap_stream_ch_chain_voting_get_id(), 
-    		s_stream_ch_new, 
-    		s_stream_ch_delete,
-    		s_stream_ch_packet_in,
-            s_stream_ch_packet_out);
-
-	if (!s_packet_in_callback_timer) {
-		s_packet_in_callback_timer = dap_timerfd_start(1*1000, 
-                        (dap_timerfd_callback_t)s_packet_in_callback_handler, 
-                        NULL);
-	}
-	s_is_inited = true;
-	// s_packet_in_callback_handler();
-	return 0;
+    dap_stream_ch_proc_add(dap_stream_ch_chain_voting_get_id(),
+                           s_stream_ch_new,
+                           s_stream_ch_delete,
+                           s_stream_ch_packet_in,
+                           s_stream_ch_packet_out);
+
+    if (!s_packet_in_callback_timer) {
+        s_packet_in_callback_timer = dap_timerfd_start(1*1000,
+                                                       (dap_timerfd_callback_t)s_packet_in_callback_handler,
+                                                       NULL);
+    }
+    s_is_inited = true;
+    // s_packet_in_callback_handler();
+    return 0;
 }
 
 void dap_stream_ch_chain_voting_in_callback_add(void* a_arg, voting_ch_callback_t packet_in_callback) {
-	size_t i = s_pkt_in_callback_count;
-	s_pkt_in_callback[i].arg = a_arg;
-	s_pkt_in_callback[i].packet_in_callback = packet_in_callback;
-	s_pkt_in_callback_count++;
+    size_t i = s_pkt_in_callback_count;
+    s_pkt_in_callback[i].arg = a_arg;
+    s_pkt_in_callback[i].packet_in_callback = packet_in_callback;
+    s_pkt_in_callback_count++;
 }
 
-void dap_stream_ch_chain_voting_message_write(dap_chain_net_t * a_net, dap_list_t *a_sendto_nodes, 
+void dap_stream_ch_chain_voting_message_write(dap_chain_net_t * a_net, dap_list_t *a_sendto_nodes,
                                               dap_chain_hash_fast_t * a_data_hash,
                                               const void * a_data, size_t a_data_size)
 {
@@ -125,206 +121,111 @@ void dap_stream_ch_chain_voting_message_write(dap_chain_net_t * a_net, dap_list_
     l_pkt_addr->node_addr.uint64 = 0;
     l_pkt_addr->voting_pkt = l_voting_pkt;
     pthread_rwlock_wrlock(&s_pkt_items->rwlock_out);
-        s_pkt_items->pkts_out = dap_list_append(s_pkt_items->pkts_out, l_pkt_addr);
+    s_pkt_items->pkts_out = dap_list_append(s_pkt_items->pkts_out, l_pkt_addr);
     pthread_rwlock_unlock(&s_pkt_items->rwlock_out);
-    
+
     dap_stream_ch_chain_voting_pkt_broadcast(a_net, a_sendto_nodes);
 }
 
-
 static void s_callback_send_all_unsafe_on_worker(dap_worker_t *a_worker, void *a_arg)
 {
     UNUSED(a_worker);
     s_callback_send_all_unsafe((dap_client_t *)a_arg, NULL);
 }
 
-
-static void s_pkt_items_proc(dap_chain_net_t * a_net, dap_chain_node_addr_t *a_remote_node_addr, voting_node_client_list_t * a_node_item)
-{
-    pthread_rwlock_rdlock(&s_pkt_items->rwlock_out);
-
-    dap_list_t* l_pkts_list_temp = dap_list_first(s_pkt_items->pkts_out);
-    while(l_pkts_list_temp) {
-        dap_list_t *l_pkts_list = l_pkts_list_temp;
-        l_pkts_list_temp = l_pkts_list_temp->next;
-        voting_pkt_addr_t * l_pkt_addr = (voting_pkt_addr_t *)l_pkts_list->data;
-        if (!l_pkt_addr->node_addr.uint64) {
-            voting_pkt_addr_t * l_pkt_addr_new = DAP_NEW_Z(voting_pkt_addr_t);
-            l_pkt_addr_new->node_addr.uint64 = a_remote_node_addr->uint64;
-            l_pkt_addr_new->voting_pkt = DAP_DUP_SIZE(l_pkt_addr->voting_pkt,
-                                                    l_pkt_addr->voting_pkt->hdr.data_size+sizeof(dap_stream_ch_chain_voting_pkt_hdr_t));
-            memcpy(&l_pkt_addr_new->voting_pkt->hdr.sender_node_addr,
-                        dap_chain_net_get_cur_addr(a_net), sizeof(dap_chain_node_addr_t));
-            memcpy(&l_pkt_addr_new->voting_pkt->hdr.recipient_node_addr,
-                        a_remote_node_addr, sizeof(dap_chain_node_addr_t));
-            s_pkt_items->pkts_out = dap_list_append(s_pkt_items->pkts_out, l_pkt_addr_new);
-            // s_callback_channel_pkt_buf_limit(l_remote_node_addr->uint64);
-        }
-    }
-    pthread_rwlock_unlock(&s_pkt_items->rwlock_out);
-
-    if ( a_remote_node_addr->uint64 != dap_chain_net_get_cur_addr_int(a_net) ) {
-        if (dap_client_get_stage(a_node_item->node_client->client) != STAGE_STREAM_STREAMING)
-            dap_client_go_stage(a_node_item->node_client->client, STAGE_STREAM_STREAMING, s_callback_pkt_items_send_all);
-        else
-            s_callback_pkt_items_send_all(a_node_item->node_client->client, NULL);
-    } else {
-        s_callback_send_all_loopback(a_remote_node_addr);
-    }
-
-}
-
-struct create_new_client_item{
-    dap_chain_net_t * net;
-    dap_chain_node_addr_t remote_addr;
-};
-
-/**
- * @brief s_pkt_broadcast_callback_get_n_create_new_node_client_item
- * @param a_global_db_context
- * @param a_rc
- * @param a_group
- * @param a_key
- * @param a_value
- * @param a_value_size
- * @param a_value_ts
- * @param a_is_pinned
- * @param a_arg
- */
-static void s_pkt_broadcast_callback_get_n_create_new_node_client_item( dap_global_db_context_t * a_global_db_context,int a_rc,
-                                                    const char * a_group, const char * a_key, const void * a_value, const size_t a_value_size,
-                                                    dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg)
-{
-    struct create_new_client_item *l_args = (struct create_new_client_item *) a_arg;
-    dap_chain_net_t * l_net = l_args->net;
-    dap_chain_node_addr_t l_remote_node_addr = l_args->remote_addr;
-    DAP_DELETE(l_args);
-    if( a_value ){
-        dap_chain_node_info_t *l_node_info = (dap_chain_node_info_t *) a_value;
-        char l_channels[] = {dap_stream_ch_chain_voting_get_id(),0};
-        dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect_channels(l_net, l_node_info, l_channels);
-        if (!l_node_client) {
-            log_it(L_ERROR, "Can't create new node client in s_pkt_broadcast_callback_get_n_create_new_node_client_item()");
-            return;
-        }
-
-        voting_node_client_list_t *l_node_client_item = DAP_NEW_Z(voting_node_client_list_t);
-        if(! l_node_client_item){
-            log_it(L_ERROR, "Can't create new voting node client item in s_pkt_broadcast_callback_get_n_create_new_node_client_item()");
-            return;
-
-        }
-
-        memcpy(&l_node_client_item->node_addr, &l_remote_node_addr, sizeof(dap_chain_node_addr_t));
-        l_node_client_item->node_info = l_node_info;
-        l_node_client_item->node_client = l_node_client;
-        pthread_rwlock_wrlock(&s_node_client_list_rwlock);
-        HASH_ADD(hh, s_node_client_list, node_addr, sizeof(dap_chain_node_addr_t), l_node_client_item);
-        pthread_rwlock_unlock(&s_node_client_list_rwlock);
-
-        if ( !l_node_client_item || !l_node_client_item->node_client ) {
-            return;
-        }
-        dap_client_pvt_t * l_client_pvt = dap_client_pvt_find(l_node_client_item->node_client->client->pvt_uuid);
-        if (NULL == l_client_pvt) {
-            return;
-        }
-
-        s_pkt_items_proc(l_net,&l_remote_node_addr, l_node_client_item);
-    }else
-        log_it(L_WARNING, "Haven't found node info about address %s", a_key);
-}
-
-struct pkt_broadcast_args
-{
-    dap_chain_net_t *net;
-    dap_list_t *sendto_nodes;
-};
-
-/**
- * @brief s_pkt_broadcast
- * @param a_thread
- * @param a_arg
- * @return
- */
-static bool s_pkt_broadcast(dap_proc_thread_t * a_thread, void * a_arg)
+void dap_stream_ch_chain_voting_pkt_broadcast(dap_chain_net_t *a_net, dap_list_t *a_sendto_nodes)
 {
-    struct pkt_broadcast_args * l_args =(struct pkt_broadcast_args*) a_arg;
-    dap_chain_net_t * l_net = l_args->net;
-    dap_list_t *l_sendto_nodes = l_args->sendto_nodes;
-    DAP_DELETE(l_args);
-
-    //if (dap_chain_net_get_state(a_net) == NET_STATE_ONLINE) {
-
-        dap_list_t *l_nodes_list_temp = dap_list_first(l_sendto_nodes);
-        while(l_nodes_list_temp) {
-            dap_list_t *l_nodes_list = l_nodes_list_temp;
-            l_nodes_list_temp = l_nodes_list_temp->next;
-            dap_chain_node_addr_t *l_remote_node_addr = (dap_chain_node_addr_t *)l_nodes_list->data;
-
-            voting_node_client_list_t *l_node_item = NULL;
-            if ( l_remote_node_addr->uint64 != dap_chain_net_get_cur_addr_int(l_net) ) {
-                pthread_rwlock_rdlock(&s_node_client_list_rwlock);
-                HASH_FIND(hh, s_node_client_list, l_remote_node_addr, sizeof(dap_chain_node_addr_t), l_node_item);
-                pthread_rwlock_unlock(&s_node_client_list_rwlock);
-                if ( l_node_item
-                        && l_node_item->node_client
-                            && !dap_client_get_stream(l_node_item->node_client->client) ) {
-                    dap_chain_node_client_close(l_node_item->node_client);
-                    // DAP_DELETE(l_node_item->node_client);
-                    char l_channels[] = {dap_stream_ch_chain_voting_get_id(),0};
-                    l_node_item->node_client = dap_chain_node_client_connect_channels(l_net, l_node_item->node_info, l_channels);
-                }
+    bool l_send_loop = false;
+    dap_list_t *l_nodes_list_temp = dap_list_first(a_sendto_nodes);
+    while(l_nodes_list_temp) {
+        dap_list_t *l_nodes_list = l_nodes_list_temp;
+        l_nodes_list_temp = l_nodes_list_temp->next;
+        dap_chain_node_addr_t *l_remote_node_addr = (dap_chain_node_addr_t *)l_nodes_list->data;
+
+        voting_node_client_list_t *l_node_item = NULL;
+        if ( l_remote_node_addr->uint64 != dap_chain_net_get_cur_addr_int(a_net) ) {
+            HASH_FIND(hh, s_node_client_list, l_remote_node_addr, sizeof(dap_chain_node_addr_t), l_node_item);
+            if ( l_node_item
+                 && l_node_item->node_client
+                 && !dap_client_get_stream(l_node_item->node_client->client) ) {
+                dap_chain_node_client_close(l_node_item->node_client);
+                // DAP_DELETE(l_node_item->node_client);
+                char l_channels[] = {dap_stream_ch_chain_voting_get_id(),0};
+                l_node_item->node_client = dap_chain_node_client_connect_channels(a_net, l_node_item->node_info, l_channels);
+            }
 
-                if (!l_node_item) {
-                    size_t node_info_size = 0;
-                    char *l_key = dap_chain_node_addr_to_hash_str(l_remote_node_addr);
-                    struct create_new_client_item * l_args = DAP_NEW_Z(struct create_new_client_item);
-                    l_args->net = l_net;
-                    l_args->remote_addr = *l_remote_node_addr;
-                    dap_global_db_get(l_net->pub.gdb_nodes, l_key, s_pkt_broadcast_callback_get_n_create_new_node_client_item, l_args);
-                    continue; // All the functions below are duplicated in s_pkt_broadcast_callback_get_n_create_new_node_client_item()
-                }
-                if ( !l_node_item || !l_node_item->node_client ) {
+            if (!l_node_item) {
+                size_t node_info_size = 0;
+                char *l_key = dap_chain_node_addr_to_hash_str(l_remote_node_addr);
+                dap_chain_node_info_t *l_node_info =
+                        (dap_chain_node_info_t *)dap_global_db_get_sync(a_net->pub.gdb_nodes, l_key,
+                                                                            &node_info_size, NULL, NULL);
+                DAP_DELETE(l_key);
+                if (!l_node_info) {
                     continue;
                 }
-                dap_client_pvt_t * l_client_pvt = dap_client_pvt_find(l_node_item->node_client->client->pvt_uuid);
-                if (NULL == l_client_pvt) {
+                char l_channels[] = {dap_stream_ch_chain_voting_get_id(),0};
+                dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect_channels(a_net, l_node_info, l_channels);
+                if (!l_node_client) {
                     continue;
                 }
+                voting_node_client_list_t *l_node_client_item = DAP_NEW_Z(voting_node_client_list_t);
+                l_node_client_item->node_addr = *l_remote_node_addr;
+                l_node_client_item->node_info = l_node_info;
+                l_node_client_item->node_client = l_node_client;
+                HASH_ADD(hh, s_node_client_list, node_addr, sizeof(dap_chain_node_addr_t), l_node_client_item);
+                l_node_item = l_node_client_item;
             }
+            if ( !l_node_item || !l_node_item->node_client ) {
+                continue;
+            }
+            dap_client_pvt_t * l_client_pvt = dap_client_pvt_find(l_node_item->node_client->client->pvt_uuid);
+            if (NULL == l_client_pvt) {
+                continue;
+            }
+            pthread_rwlock_wrlock(&s_pkt_items->rwlock_out);
+            dap_list_t* l_pkts_list_temp = s_pkt_items->pkts_out;
+            while(l_pkts_list_temp) {
+                dap_list_t *l_pkts_list = l_pkts_list_temp;
+                l_pkts_list_temp = l_pkts_list_temp->next;
+                voting_pkt_addr_t * l_pkt_addr = (voting_pkt_addr_t *)l_pkts_list->data;
+                if (!l_pkt_addr->node_addr.uint64) {
+                    voting_pkt_addr_t * l_pkt_addr_new = DAP_NEW(voting_pkt_addr_t);
+                    l_pkt_addr_new->node_addr.uint64 = l_remote_node_addr->uint64;
+                    l_pkt_addr_new->voting_pkt = DAP_DUP_SIZE(l_pkt_addr->voting_pkt,
+                                                              l_pkt_addr->voting_pkt->hdr.data_size+sizeof(dap_stream_ch_chain_voting_pkt_hdr_t));
+                    l_pkt_addr_new->voting_pkt->hdr.sender_node_addr.uint64 = dap_chain_net_get_cur_addr_int(a_net);
+                    l_pkt_addr_new->voting_pkt->hdr.recipient_node_addr.uint64 = l_remote_node_addr->uint64;
+                    s_pkt_items->pkts_out = dap_list_append(s_pkt_items->pkts_out, l_pkt_addr_new);
+                }
+            }
+            pthread_rwlock_unlock(&s_pkt_items->rwlock_out);
 
-            //s_callback_channel_pkt_free_unsafe(l_remote_node_addr->uint64);
-            s_pkt_items_proc(l_net,l_remote_node_addr, l_node_item);
-
-        }
-
-        //s_callback_channel_pkt_free(0);
-    return true;
+            if (dap_client_get_stage(l_node_item->node_client->client) != STAGE_STREAM_STREAMING)
+                dap_client_go_stage(l_node_item->node_client->client, STAGE_STREAM_STREAMING, s_callback_send_all_unsafe);
+            else {
+                dap_stream_t *l_stream = dap_client_get_stream(l_node_item->node_client->client);
+                dap_worker_exec_callback_on(l_stream->stream_worker->worker, s_callback_send_all_unsafe_on_worker,
+                                            l_node_item->node_client->client);
+            }
+        } else
+            l_send_loop = true;
+    }
+    s_callback_send_all_loopback(l_send_loop ? dap_chain_net_get_cur_addr_int(a_net) : 0);
 }
 
-void dap_stream_ch_chain_voting_pkt_broadcast(dap_chain_net_t *a_net, dap_list_t *a_sendto_nodes)
+static void s_callback_send_all_loopback(uint64_t a_node_addr)
 {
-    struct pkt_broadcast_args * l_args = DAP_NEW_Z(struct pkt_broadcast_args);
-    l_args->net = a_net;
-    l_args->sendto_nodes = a_sendto_nodes;
-
-    if (dap_proc_thread_add_callback_mt(dap_proc_thread_get_auto(), s_pkt_broadcast,l_args,0)!= 0 ){
-        log_it(L_CRITICAL, "Can't call proc thread callback in dap_stream_ch_chain_voting_pkt_broadcast()");
-        DAP_DELETE(l_args);
-    }
-}
-static void s_callback_send_all_loopback(uint64_t a_node_addr) {
-    pthread_rwlock_rdlock(&s_pkt_items->rwlock_out);
-	dap_list_t* l_pkts_list = dap_list_first(s_pkt_items->pkts_out);
-	while(l_pkts_list) {
-		dap_list_t *l_pkts_list_next = l_pkts_list->next;
-		voting_pkt_addr_t *l_pkt_addr = (voting_pkt_addr_t *)l_pkts_list->data;
+    pthread_rwlock_wrlock(&s_pkt_items->rwlock_out);
+    dap_list_t* l_pkts_list = s_pkt_items->pkts_out;
+    while (l_pkts_list) {
+        dap_list_t *l_pkts_list_next = l_pkts_list->next;
+        voting_pkt_addr_t *l_pkt_addr = (voting_pkt_addr_t *)l_pkts_list->data;
         if (l_pkt_addr->node_addr.uint64 == 0) {
             if (a_node_addr) {
                 l_pkt_addr->voting_pkt->hdr.sender_node_addr.uint64 =
                 l_pkt_addr->voting_pkt->hdr.recipient_node_addr.uint64 =
-                            a_node_addr;
+                        a_node_addr;
                 pthread_rwlock_wrlock(&s_pkt_items->rwlock_in);
                 s_pkt_items->pkts_in = dap_list_append(s_pkt_items->pkts_in, l_pkt_addr->voting_pkt);
                 pthread_rwlock_unlock(&s_pkt_items->rwlock_in);
@@ -338,11 +239,6 @@ static void s_callback_send_all_loopback(uint64_t a_node_addr) {
     pthread_rwlock_unlock(&s_pkt_items->rwlock_out);
 }
 
-/**
- * @brief s_callback_send_all_unsafe
- * @param a_client
- * @param a_arg
- */
 static void s_callback_send_all_unsafe(dap_client_t *a_client, void *a_arg)
 {
     UNUSED(a_arg);
@@ -360,9 +256,9 @@ static void s_callback_send_all_unsafe(dap_client_t *a_client, void *a_arg)
                 if ( l_pkt_addr->node_addr.uint64 == l_node_client->remote_node_addr.uint64 ) {
                     if (l_ch) {
                         dap_stream_ch_pkt_write_unsafe(l_ch,
-                                        l_voting_pkt->hdr.pkt_type, l_voting_pkt, l_voting_pkt_size);
+                                                       l_voting_pkt->hdr.pkt_type, l_voting_pkt, l_voting_pkt_size);
                         log_it(L_DEBUG, "Sent pkt size %zu to addr "NODE_ADDR_FP_STR, l_voting_pkt_size,
-                                                                    NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr));
+                               NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr));
                     }
                     DAP_DELETE(l_voting_pkt);
                     DAP_DELETE(l_pkt_addr);
@@ -375,53 +271,15 @@ static void s_callback_send_all_unsafe(dap_client_t *a_client, void *a_arg)
     pthread_rwlock_unlock(&s_pkt_items->rwlock_out);
 }
 
-/**
- * @brief s_callback_pkt_items_send_all
- * @param a_client
- * @param a_arg
- */
-static void s_callback_pkt_items_send_all(dap_client_t *a_client, void *a_arg)
-{
-	UNUSED(a_arg);
-    dap_chain_node_client_t *l_node_client = DAP_CHAIN_NODE_CLIENT(a_client);
-    if (l_node_client) {
-	    dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(a_client, dap_stream_ch_chain_voting_get_id() );
-	    if (l_ch_chain) {
-            pthread_rwlock_rdlock(&s_pkt_items->rwlock_out);
-            dap_list_t* l_pkts_list = dap_list_first(s_pkt_items->pkts_out);
-            while(l_pkts_list) {
-				dap_list_t *l_pkts_list_next = l_pkts_list->next;
-				voting_pkt_addr_t *l_pkt_addr = (voting_pkt_addr_t *)l_pkts_list->data;
-				dap_stream_ch_chain_voting_pkt_t * l_voting_pkt = l_pkt_addr->voting_pkt;
-			    size_t l_voting_pkt_size = sizeof(l_voting_pkt->hdr) + l_voting_pkt->hdr.data_size;
-				if ( l_pkt_addr->node_addr.uint64 == l_node_client->remote_node_addr.uint64 ) {
-					if (l_ch_chain) {
-			    		dap_stream_ch_pkt_write_unsafe(l_ch_chain, 
-			    						l_voting_pkt->hdr.pkt_type, l_voting_pkt, l_voting_pkt_size);
-			    	}
-			    	else {
-						//printf("---!!! s_callback_send_all_unsafe() l_ch_chain in null \n");
-			    	}
-		    	}
-		    	l_pkts_list = l_pkts_list_next;
-		    }
-            pthread_rwlock_unlock(&s_pkt_items->rwlock_out);
-           // s_callback_channel_pkt_free(l_node_client->remote_node_addr.uint64);
-	    }
-	}
-}
-
 
 void dap_stream_ch_chain_voting_deinit() {
-	voting_node_client_list_t *l_node_info_item=NULL, *l_node_info_tmp=NULL;
-    pthread_rwlock_wrlock(&s_node_client_list_rwlock);
+    voting_node_client_list_t *l_node_info_item=NULL, *l_node_info_tmp=NULL;
     HASH_ITER(hh, s_node_client_list, l_node_info_item, l_node_info_tmp) {
         // Clang bug at this, l_node_info_item should change at every loop cycle
         HASH_DEL(s_node_client_list, l_node_info_item);
         DAP_DELETE(l_node_info_item->node_client);
         DAP_DELETE(l_node_info_item);
     }
-    pthread_rwlock_unlock(&s_node_client_list_rwlock);
 }
 
 static void s_stream_ch_new(dap_stream_ch_t* a_ch, void* a_arg) {
@@ -440,48 +298,48 @@ static bool s_packet_in_callback_handler(void *a_arg)
     UNUSED(a_arg);
     pthread_rwlock_wrlock(&s_pkt_items->rwlock_in);
     if (s_pkt_items->pkts_in) {
-		dap_list_t* l_list_pkts = dap_list_copy(s_pkt_items->pkts_in);
-	    dap_list_free(s_pkt_items->pkts_in);
-	    s_pkt_items->pkts_in = NULL;
+        dap_list_t* l_list_pkts = dap_list_copy(s_pkt_items->pkts_in);
+        dap_list_free(s_pkt_items->pkts_in);
+        s_pkt_items->pkts_in = NULL;
         pthread_rwlock_unlock(&s_pkt_items->rwlock_in);
         while(l_list_pkts) {
             dap_list_t *l_list_next = l_list_pkts->next;
             dap_stream_ch_chain_voting_pkt_t * l_voting_pkt = (dap_stream_ch_chain_voting_pkt_t *)l_list_pkts->data;
             for (size_t i=0; i<s_pkt_in_callback_count; i++) {
-				voting_pkt_in_callback_t * l_callback = s_pkt_in_callback+i;
-				if (l_callback->packet_in_callback) {
+                voting_pkt_in_callback_t * l_callback = s_pkt_in_callback+i;
+                if (l_callback->packet_in_callback) {
                     l_callback->packet_in_callback(l_callback->arg, &l_voting_pkt->hdr.sender_node_addr,
                                                    &l_voting_pkt->hdr.data_hash, l_voting_pkt->data, l_voting_pkt->hdr.data_size);
-				}
+                }
             }
-			DAP_DELETE(l_voting_pkt);
+            DAP_DELETE(l_voting_pkt);
             l_list_pkts = l_list_next;
-		}
-		dap_list_free(l_list_pkts);
+        }
+        dap_list_free(l_list_pkts);
     } else {
         pthread_rwlock_unlock(&s_pkt_items->rwlock_in);
     }
-	return true;
+    return true;
 }
 
 
 static void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) {
-	dap_stream_ch_pkt_t * l_ch_pkt = (dap_stream_ch_pkt_t *) a_arg;
-	pthread_rwlock_rdlock(&s_pkt_items->rwlock_in);
-	uint32_t l_voting_pkt_size = l_ch_pkt->hdr.size;
-	dap_stream_ch_chain_voting_pkt_t * l_voting_pkt = DAP_NEW_SIZE(dap_stream_ch_chain_voting_pkt_t, l_voting_pkt_size);
-	memcpy(l_voting_pkt, &l_ch_pkt->data, l_voting_pkt_size);
-	s_pkt_items->pkts_in = dap_list_append(s_pkt_items->pkts_in, l_voting_pkt);
-	pthread_rwlock_unlock(&s_pkt_items->rwlock_in);
+    dap_stream_ch_pkt_t * l_ch_pkt = (dap_stream_ch_pkt_t *) a_arg;
+    pthread_rwlock_wrlock(&s_pkt_items->rwlock_in);
+    uint32_t l_voting_pkt_size = l_ch_pkt->hdr.size;
+    dap_stream_ch_chain_voting_pkt_t * l_voting_pkt = DAP_NEW_SIZE(dap_stream_ch_chain_voting_pkt_t, l_voting_pkt_size);
+    memcpy(l_voting_pkt, &l_ch_pkt->data, l_voting_pkt_size);
+    s_pkt_items->pkts_in = dap_list_append(s_pkt_items->pkts_in, l_voting_pkt);
+    pthread_rwlock_unlock(&s_pkt_items->rwlock_in);
 }
 
 static void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) {
-	UNUSED(a_arg);
+    UNUSED(a_arg);
 }
 
 
 size_t dap_stream_ch_chain_voting_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint64_t a_net_id,
-                                            const void * a_data, size_t a_data_size)
+                                                   const void * a_data, size_t a_data_size)
 {
     dap_stream_ch_chain_voting_pkt_t * l_chain_pkt;
     size_t l_chain_pkt_size = sizeof (l_chain_pkt->hdr) + a_data_size;
@@ -497,7 +355,4 @@ size_t dap_stream_ch_chain_voting_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_
     size_t l_ret  = dap_stream_ch_pkt_write_unsafe(a_ch, a_type , l_chain_pkt, l_chain_pkt_size);
     DAP_DELETE(l_chain_pkt);
     return l_ret;
-}
-
-
-
+}
\ No newline at end of file
diff --git a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h b/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h
index e9d2aeb57700982fab33122c355501922c5db2f5..acb4cd61391cfc997f85e819375bf0de95d8bbe5 100644
--- a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h
+++ b/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h
@@ -1,5 +1,3 @@
-
-
 #pragma once
 
 #include <pthread.h>
@@ -56,8 +54,8 @@ typedef struct dap_stream_ch_chain_voting_pkt {
 
 typedef struct dap_stream_ch_chain_voting dap_stream_ch_chain_voting_t;
 typedef void (*dap_stream_ch_chain_voting_callback_packet_t)(dap_stream_ch_chain_voting_t*, uint8_t a_pkt_type,
-                                                      dap_stream_ch_chain_voting_pkt_t *a_pkt, size_t a_pkt_data_size,
-                                                      void * a_arg);
+                                                             dap_stream_ch_chain_voting_pkt_t *a_pkt, size_t a_pkt_data_size,
+                                                             void * a_arg);
 
 typedef struct dap_stream_ch_chain_voting {
     //void *_inheritor;
@@ -83,9 +81,9 @@ inline static uint8_t dap_stream_ch_chain_voting_get_id(void) { return (uint8_t)
 
 void dap_stream_ch_chain_voting_in_callback_add(void* a_arg, voting_ch_callback_t packet_in_callback);
 
-void dap_stream_ch_chain_voting_message_write(dap_chain_net_t * a_net, dap_list_t *a_sendto_nodes, 
-                                                dap_chain_hash_fast_t * a_data_hash,
-                                                    const void * a_data, size_t a_data_size);
+void dap_stream_ch_chain_voting_message_write(dap_chain_net_t * a_net, dap_list_t *a_sendto_nodes,
+                                              dap_chain_hash_fast_t * a_data_hash,
+                                              const void * a_data, size_t a_data_size);
 void dap_stream_ch_chain_voting_pkt_broadcast(dap_chain_net_t * a_net, dap_list_t *a_sendto_nodes);
 
 // size_t dap_stream_ch_chain_voting_pkt_write_mt(dap_stream_worker_t *a_worker, dap_stream_ch_uuid_t a_ch_uuid,
@@ -93,7 +91,7 @@ void dap_stream_ch_chain_voting_pkt_broadcast(dap_chain_net_t * a_net, dap_list_
 //                                         const void * a_data, size_t a_data_size);
 
 size_t dap_stream_ch_chain_voting_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint64_t a_net_id,
-                                                    const void * a_data, size_t a_data_size);
+                                                   const void * a_data, size_t a_data_size);
 
 int dap_stream_ch_chain_voting_init();
 void dap_stream_ch_chain_voting_deinit();
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index cfe5e391974526e10d9b33c7b28111c2c6a7afb5..e7896660424c9f87b3189b67694a9bc735dced50 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -315,9 +315,10 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a
     dap_chain_atom_ptr_t l_iter = l_chain->callback_atom_iter_get_first(l_sync_request->chain.request_atom_iter, &l_first_size);
     if (l_iter && l_first_size) {
         // first packet
-        if (!dap_hash_fast_is_blank(&l_sync_request->request.hash_from)) {
+        dap_chain_hash_fast_t l_hash_from = l_sync_request->request.hash_from;
+        if (!dap_hash_fast_is_blank(&l_hash_from)) {
             (void ) l_chain->callback_atom_find_by_hash(l_sync_request->chain.request_atom_iter,
-                                                          &l_sync_request->request.hash_from, &l_first_size);
+                                                          &l_hash_from, &l_first_size);
         }
 
 
@@ -902,14 +903,13 @@ static bool s_gdb_in_pkt_proc_set_raw_callback(dap_global_db_context_t * a_globa
 struct sync_request *dap_stream_ch_chain_create_sync_request(dap_stream_ch_chain_pkt_t *a_chain_pkt, dap_stream_ch_t* a_ch)
 {
     dap_stream_ch_chain_t * l_ch_chain = DAP_STREAM_CH_CHAIN(a_ch);
-    memcpy(&l_ch_chain->request_hdr, &a_chain_pkt->hdr, sizeof(l_ch_chain->request_hdr));
     struct sync_request *l_sync_request = DAP_NEW_Z(struct sync_request);
     l_sync_request->ch_uuid = a_ch->uuid;
     l_sync_request->worker = a_ch->stream_worker->worker;
     l_sync_request->remote_gdbs = l_ch_chain->remote_gdbs;
     l_sync_request->remote_atoms = l_ch_chain->remote_atoms;
-    memcpy(&l_sync_request->request, &l_ch_chain->request, sizeof(l_ch_chain->request));
-    memcpy(&l_sync_request->request_hdr, &l_ch_chain->request_hdr, sizeof(l_ch_chain->request_hdr));
+    l_sync_request->request_hdr = l_ch_chain->request_hdr = a_chain_pkt->hdr;
+    l_sync_request->request = l_ch_chain->request;
     return l_sync_request;
 }
 
@@ -1028,7 +1028,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         }
         return;
     }
-    if (a_ch->stream->session->acl && !a_ch->stream->session->acl[l_acl_idx]) {
+    uint8_t l_acl = a_ch->stream->session->acl ? a_ch->stream->session->acl[l_acl_idx] : 1;
+    if (!l_acl) {
         log_it(L_WARNING, "Unauthorized request attempt from %s to network %s", a_ch->stream->esocket->remote_addr_str?
                    a_ch->stream->esocket->remote_addr_str: "<unknown>",
                dap_chain_net_by_id(l_chain_pkt->hdr.net_id)->pub.name);
@@ -1051,7 +1052,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
             log_it(L_INFO, "In:  UPDATE_GLOBAL_DB_REQ pkt: net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x,
                             l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64);
             if (l_chain_pkt_data_size == (size_t)sizeof(dap_stream_ch_chain_sync_request_t))
-                memcpy(&l_ch_chain->request, l_chain_pkt->data, sizeof(dap_stream_ch_chain_sync_request_t));
+                l_ch_chain->request = *(dap_stream_ch_chain_sync_request_t*)l_chain_pkt->data;
             dap_chain_node_client_t *l_client = (dap_chain_node_client_t *)l_ch_chain->callback_notify_arg;
             if (l_client && l_client->resync_gdb)
                 l_ch_chain->request.id_start = 0;
@@ -1099,7 +1100,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                         "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS");
                 break;
             }
-            memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_t));
+            l_ch_chain->request_hdr = l_chain_pkt->hdr;
             l_ch_chain->state = CHAIN_STATE_UPDATE_GLOBAL_DB_REMOTE;
         } break;
         // Response with gdb element hashes and sizes
@@ -1123,8 +1124,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 HASH_FIND_BYHASHVALUE(hh, l_ch_chain->remote_gdbs, &l_element->hash, sizeof(l_element->hash),
                                       l_hash_item_hashv, l_hash_item);
                 if (!l_hash_item) {
-                    l_hash_item = DAP_NEW(dap_stream_ch_chain_hash_item_t);
-                    memcpy(&l_hash_item->hash, &l_element->hash, sizeof (l_element->hash));
+                    l_hash_item = DAP_NEW_Z(dap_stream_ch_chain_hash_item_t);
+                    l_hash_item->hash = l_element->hash;
                     l_hash_item->size = l_element->size;
                     HASH_ADD_BYHASHVALUE(hh, l_ch_chain->remote_gdbs, hash, sizeof(l_hash_item->hash),
                                          l_hash_item_hashv, l_hash_item);
@@ -1165,7 +1166,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                         log_it(L_INFO, "In: SYNC_GLOBAL_DB pkt");
                 }
                 if (l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t))
-                    memcpy(&l_ch_chain->request, l_chain_pkt->data, sizeof(dap_stream_ch_chain_sync_request_t));
+                    l_ch_chain->request = *(dap_stream_ch_chain_sync_request_t*)l_chain_pkt->data;
                 struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
                 dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_gdb_proc_callback, l_sync_request);
             }else{
@@ -1178,7 +1179,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         // first packet of data with source node address
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB: {
             if(l_chain_pkt_data_size == (size_t)sizeof(dap_chain_node_addr_t)){
-               memcpy(&l_ch_chain->request.node_addr, l_chain_pkt->data, l_chain_pkt_data_size);
+               l_ch_chain->request.node_addr = *(dap_chain_node_addr_t*)l_chain_pkt->data;
                l_ch_chain->stats_request_gdb_processed = 0;
                log_it(L_INFO, "In: FIRST_GLOBAL_DB data_size=%zu net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x
                               " from address "NODE_ADDR_FP_STR, l_chain_pkt_data_size,   l_chain_pkt->hdr.net_id.uint64 ,
@@ -1198,8 +1199,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
             if(l_chain_pkt_data_size > 0) {
                 struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
                 dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt;
-                l_pkt_item->pkt_data = DAP_NEW_SIZE(byte_t, l_chain_pkt_data_size);
-                memcpy(l_pkt_item->pkt_data, l_chain_pkt->data, l_chain_pkt_data_size);
+                l_pkt_item->pkt_data = DAP_DUP_SIZE(l_chain_pkt->data, l_chain_pkt_data_size);
                 l_pkt_item->pkt_data_size = l_chain_pkt_data_size;
                 dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_gdb_in_pkt_proc_callback, l_sync_request);
             } else {
@@ -1266,7 +1266,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                                         l_chain->net_name, l_chain_pkt->hdr.cell_id.uint64);
                 l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_chain_pkt->hdr.cell_id, 1);
                 l_chain->callback_atom_iter_get_first(l_ch_chain->request_atom_iter, NULL);
-                memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_hdr_t));
+                l_ch_chain->request_hdr = l_chain_pkt->hdr;
                 dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START,
                                                      l_chain_pkt->hdr.net_id.uint64,l_chain_pkt->hdr.chain_id.uint64,
                                                      l_chain_pkt->hdr.cell_id.uint64, NULL, 0);
@@ -1301,7 +1301,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 break;
             }
             l_ch_chain->state = CHAIN_STATE_UPDATE_CHAINS_REMOTE;
-            memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_hdr_t));
+            l_ch_chain->request_hdr = l_chain_pkt->hdr;
             if(s_debug_more)
                 log_it(L_INFO,"In: UPDATE_CHAINS_START pkt");
         } break;
@@ -1333,8 +1333,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 HASH_FIND_BYHASHVALUE(hh, l_ch_chain->remote_atoms, &l_element->hash, sizeof(dap_hash_fast_t),
                                       l_hash_item_hashv, l_hash_item);
                 if( ! l_hash_item ){
-                    l_hash_item = DAP_NEW(dap_stream_ch_chain_hash_item_t);
-                    memcpy(&l_hash_item->hash, &l_element->hash, sizeof(dap_hash_fast_t));
+                    l_hash_item = DAP_NEW_Z(dap_stream_ch_chain_hash_item_t);
+                    l_hash_item->hash = l_element->hash;
                     l_hash_item->size = l_element->size;
                     HASH_ADD_BYHASHVALUE(hh, l_ch_chain->remote_atoms, hash, sizeof(dap_hash_fast_t),
                                          l_hash_item_hashv, l_hash_item);
@@ -1393,13 +1393,14 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
                 l_ch_chain->stats_request_atoms_processed = 0;
                 if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS) {
-                    char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_from);
-                    char *l_hash_to_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_to);
+                    char l_hash_from_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }, l_hash_to_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' };
+                    dap_chain_hash_fast_t l_hash_from = l_ch_chain->request.hash_from,
+                            l_hash_to = l_ch_chain->request.hash_to;
+                    dap_chain_hash_fast_to_str(&l_hash_from, l_hash_from_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
+                    dap_chain_hash_fast_to_str(&l_hash_to, l_hash_to_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
                     log_it(L_INFO, "In:  SYNC_CHAINS pkt: net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x
                                    " between %s and %s", l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64,
-                                    l_hash_from_str ? l_hash_from_str : "(null)", l_hash_to_str ? l_hash_to_str : "(null)");
-                    DAP_DELETE(l_hash_from_str);
-                    DAP_DELETE(l_hash_to_str);
+                                    l_hash_from_str[0] ? l_hash_from_str : "(null)", l_hash_to_str[0] ? l_hash_to_str : "(null)");
                 }
                 dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_chains_proc_callback, l_sync_request);
             } else {
@@ -1413,8 +1414,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         // first packet of data with source node address
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_CHAIN: {
             if(l_chain_pkt_data_size == (size_t)sizeof(dap_chain_node_addr_t)){
-                memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_hdr_t));
-                memcpy(&l_ch_chain->request.node_addr, l_chain_pkt->data, sizeof(dap_chain_node_addr_t));
+                l_ch_chain->request_hdr = l_chain_pkt->hdr;
+                l_ch_chain->request.node_addr = *(dap_chain_node_addr_t*)l_chain_pkt->data;
                 log_it(L_INFO, "From "NODE_ADDR_FP_STR": FIRST_CHAIN data_size=%zu net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x,
                                NODE_ADDR_FP_ARGS_S(l_ch_chain->request.node_addr),
                                l_chain_pkt_data_size, l_ch_chain->request_hdr.net_id.uint64 ,
@@ -1435,20 +1436,19 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                     if(l_chain_pkt_data_size > 0) {
                         struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch);
                         dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt;
-                        l_pkt_item->pkt_data = DAP_NEW_SIZE(byte_t, l_chain_pkt_data_size);
+                        l_pkt_item->pkt_data = DAP_DUP_SIZE(l_chain_pkt->data, l_chain_pkt_data_size);
                         if (!l_pkt_item->pkt_data) {
                             log_it(L_ERROR, "Not enough memory!");
                             DAP_DELETE(l_sync_request);
                             break;
                         }
-                        memcpy(l_pkt_item->pkt_data, l_chain_pkt->data, l_chain_pkt_data_size);
                         l_pkt_item->pkt_data_size = l_chain_pkt_data_size;
                         if (s_debug_more){
                             dap_chain_hash_fast_t l_atom_hash={0};
                             dap_hash_fast(l_chain_pkt->data, l_chain_pkt_data_size ,&l_atom_hash);
-                            char *l_atom_hash_str= dap_chain_hash_fast_to_str_new(&l_atom_hash);
+                            char l_atom_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' };
+                            dap_chain_hash_fast_to_str(&l_atom_hash, l_atom_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
                             log_it(L_INFO, "In: CHAIN pkt: atom hash %s (size %zd)", l_atom_hash_str, l_chain_pkt_data_size);
-                            DAP_DELETE(l_atom_hash_str);
                         }
                         dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_in_chains_callback, l_sync_request);
                     } else {
@@ -1463,14 +1463,14 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
 
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS: {
             if (dap_log_level_get() <= L_INFO) {
-                char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_from);
-                char *l_hash_to_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_to);
-                log_it(L_INFO, "In:  SYNCED_CHAINS: between %s and %s",l_hash_from_str?l_hash_from_str:"(null)",
-                       l_hash_to_str? l_hash_to_str: "(null)");
-                if(l_hash_from_str)
-                    DAP_DELETE(l_hash_from_str);
-                if(l_hash_to_str)
-                    DAP_DELETE(l_hash_to_str);
+                dap_chain_hash_fast_t l_hash_from = l_ch_chain->request.hash_from,
+                        l_hash_to = l_ch_chain->request.hash_to;
+                char l_hash_from_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }, l_hash_to_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' };
+                dap_chain_hash_fast_to_str(&l_hash_from, l_hash_from_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
+                dap_chain_hash_fast_to_str(&l_hash_to, l_hash_to_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
+                log_it(L_INFO, "In:  SYNCED_CHAINS: between %s and %s",l_hash_from_str[0] ? l_hash_from_str : "(null)",
+                       l_hash_to_str[0] ? l_hash_to_str: "(null)");
+
             }
             if (!l_ch_chain->callback_notify_packet_in) { // we haven't node client waitng, so reply to other side
                 dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
@@ -1495,13 +1495,15 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
 
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS_RVRS: {
             if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) {
-                dap_stream_ch_chain_sync_request_t l_request={};
+                dap_stream_ch_chain_sync_request_t l_request = { };
                 dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
-                if( l_chain){
-                    dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from, l_chain_pkt->hdr.cell_id); // Move away from i/o reactor to callback processor
+                if (l_chain) {
+                    dap_chain_hash_fast_t l_hash;
+                    dap_chain_get_atom_last_hash(l_chain, &l_hash, l_chain_pkt->hdr.cell_id); // Move away from i/o reactor to callback processor
+                    l_request.hash_from = l_hash;
                     if( dap_log_level_get()<= L_INFO){
-                        char l_hash_from_str[70]={[0]='\0'};
-                        dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_from_str,sizeof (l_hash_from_str)-1);
+                        char l_hash_from_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = {'\0'};
+                        dap_chain_hash_fast_to_str(&l_hash, l_hash_from_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
                         log_it(L_INFO, "In:  SYNC_CHAINS_RVRS pkt: net 0x%016"DAP_UINT64_FORMAT_x" chain 0x%016"DAP_UINT64_FORMAT_x" cell 0x%016"DAP_UINT64_FORMAT_x
                                        "request chains sync from %s", l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
                                         l_hash_from_str[0] ? l_hash_from_str : "(null)");
@@ -1647,7 +1649,7 @@ static void s_stream_ch_chain_pkt_write(dap_stream_ch_t *a_ch, uint8_t a_type, u
                                 sizeof(dap_stream_ch_chain_pkt_t) - sizeof(dap_stream_ch_pkt_t) -
                                 sizeof(dap_stream_pkt_t) - DAP_STREAM_PKT_ENCRYPTION_OVERHEAD;
     if (l_free_buf_size < a_data_size) {
-        struct chain_io_complete *l_arg = DAP_NEW_SIZE(struct chain_io_complete, sizeof(struct chain_io_complete) + a_data_size);
+        struct chain_io_complete *l_arg = DAP_NEW_Z_SIZE(struct chain_io_complete, sizeof(struct chain_io_complete) + a_data_size);
         l_arg->ch_uuid = a_ch->uuid;
         l_arg->state = DAP_STREAM_CH_CHAIN(a_ch)->state;
         DAP_STREAM_CH_CHAIN(a_ch)->state = CHAIN_STATE_WAITING;
@@ -1684,7 +1686,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
                 l_obj = dap_db_log_list_get(l_ch_chain->request_db_log);
                 if (!l_obj || DAP_POINTER_TO_SIZE(l_obj) == 1)
                     break;
-                memcpy(&l_data[i].hash, &l_obj->hash, sizeof(dap_chain_hash_fast_t));
+                l_data[i].hash = l_obj->hash;
                 l_data[i].size = l_obj->pkt->data_size;
             }
             if (i) {
@@ -1738,8 +1740,8 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
                     l_skip_count++;
                     l_ch_chain->timer_shots = -1;
                 } else {
-                    l_hash_item = DAP_NEW(dap_stream_ch_chain_hash_item_t);
-                    memcpy(&l_hash_item->hash, &l_obj->hash, sizeof(dap_chain_hash_fast_t));
+                    l_hash_item = DAP_NEW_Z(dap_stream_ch_chain_hash_item_t);
+                    l_hash_item->hash = l_obj->hash;
                     l_hash_item->size = l_obj->pkt->data_size;
                     HASH_ADD_BYHASHVALUE(hh, l_ch_chain->remote_gdbs, hash, sizeof(dap_chain_hash_fast_t),
                                          l_hash_item_hashv, l_hash_item);
@@ -1783,7 +1785,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
                                                                           sizeof(dap_stream_ch_chain_update_element_t) * s_update_pack_size);
             size_t l_data_size=0;
             for(uint_fast16_t n=0; n<s_update_pack_size && (l_ch_chain->request_atom_iter && l_ch_chain->request_atom_iter->cur);n++){
-                memcpy(&l_data[n].hash, l_ch_chain->request_atom_iter->cur_hash, sizeof (l_data[n].hash));
+                l_data[n].hash = *l_ch_chain->request_atom_iter->cur_hash;
                 // Shift offset counter
                 l_data_size += sizeof(dap_stream_ch_chain_update_element_t);
                 // Then get next atom
@@ -1836,8 +1838,8 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
                                         l_request_atom_hash_str);
                     }*/
                 }else{
-                    l_hash_item = DAP_NEW(dap_stream_ch_chain_hash_item_t);
-                    memcpy(&l_hash_item->hash, l_ch_chain->request_atom_iter->cur_hash, sizeof(dap_chain_hash_fast_t));
+                    l_hash_item = DAP_NEW_Z(dap_stream_ch_chain_hash_item_t);
+                    l_hash_item->hash = *l_ch_chain->request_atom_iter->cur_hash;
                     if(s_debug_more){
                         char *l_atom_hash_str= dap_chain_hash_fast_to_str_new(&l_hash_item->hash);
                         log_it(L_INFO, "Out CHAIN pkt: atom hash %s (size %zd) ", l_atom_hash_str, l_ch_chain->request_atom_iter->cur_size);
diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c
index e1ce522736cbc0a18258a02dae573d53f421d29d..6a1c6449869d0c69a817f2f585b833b5d929b7e7 100644
--- a/modules/common/dap_chain_common.c
+++ b/modules/common/dap_chain_common.c
@@ -274,7 +274,7 @@ uint128_t dap_chain_uint128_from_uint256(uint256_t a_from)
 
 char *dap_chain_balance_print128(uint128_t a_balance)
 {
-    char *l_buf = DAP_NEW_Z_SIZE(char, DATOSHI_POW + 3);
+    char *l_buf = DAP_NEW_Z_SIZE(char, DATOSHI_POW + 2);
     int l_pos = 0;
     uint128_t l_value = a_balance;
 #ifdef DAP_GLOBAL_IS_INT128
@@ -394,7 +394,7 @@ char *dap_chain_balance_to_coins256(uint256_t a_balance)
 const union __c_pow10__ {
     uint64_t u64[2];
     uint32_t u32[4];
-} DAP_ALIGN_PACKED c_pow10[DATOSHI_POW + 1] = {
+} DAP_ALIGN_PACKED c_pow10[DATOSHI_POW] = {
         { .u64 = {0,                         1ULL} },                          // 0
         { .u64 = {0,                         10ULL} },                         // 1
         { .u64 = {0,                         100ULL} },                        // 2
@@ -440,7 +440,7 @@ uint128_t dap_chain_balance_scan128(const char *a_balance)
 {
     int l_strlen = strlen(a_balance);
     uint128_t l_ret = uint128_0, l_nul = uint128_0;
-    if (l_strlen > DATOSHI_POW + 1)
+    if (l_strlen > DATOSHI_POW)
         return l_nul;
     for (int i = 0; i < l_strlen ; i++) {
         char c = a_balance[l_strlen - i - 1];
@@ -503,10 +503,10 @@ uint256_t dap_chain_balance_scan(const char *a_balance)
 
 uint128_t dap_chain_coins_to_balance128(const char *a_coins)
 {
-    char l_buf [DATOSHI_POW + 3] = {0};
+    char l_buf [DATOSHI_POW + 2] = {0};
     uint128_t l_ret = uint128_0, l_nul = uint128_0;
 
-    if (strlen(a_coins) > DATOSHI_POW + 2) {
+    if (strlen(a_coins) > DATOSHI_POW + 1) {
         log_it(L_WARNING, "Incorrect balance format - too long");
         return l_nul;
     }
@@ -569,9 +569,9 @@ uint256_t dap_chain_coins_to_balance256(const char *a_coins)
     uint256_t l_nul = {0};
 
     /* "12300000000.0000456" */
-    if ( (l_len = strnlen(a_coins, DATOSHI_POW256 + 3)) > DATOSHI_POW256 + 2)/* Check for legal length */ /* 1 symbol for \0, one for '.', if more, there is an error */
+    if ( (l_len = strnlen(a_coins, DATOSHI_POW256 + 1)) > DATOSHI_POW256)/* Check for legal length */ /* 1 symbol for \0, one for '.', if more, there is an error */
         return  log_it(L_WARNING, "Incorrect balance format of '%s' - too long (%d > %d)", a_coins,
-                       l_len, DATOSHI_POW256 + 2), l_nul;
+                       l_len, DATOSHI_POW256), l_nul;
 
     /* Find , check and remove 'precision' dot symbol */
     memcpy (l_buf, a_coins, l_len);                                         /* Make local copy */
@@ -605,7 +605,7 @@ uint256_t dap_chain_coins_to_balance256(const char *a_coins)
 
 
 char *dap_cvt_uint256_to_str(uint256_t a_uint256) {
-    char *l_buf = DAP_NEW_Z_SIZE(char, DATOSHI_POW256 + 3);
+    char *l_buf = DAP_NEW_Z_SIZE(char, DATOSHI_POW256 + 1);
 #ifdef DAP_GLOBAL_IS_INT128
     int l_pos = 0;
     uint256_t l_value = a_uint256;
@@ -631,7 +631,7 @@ char *dap_cvt_uint256_to_str(uint256_t a_uint256) {
 const union __c_pow10_double__ {
     uint64_t u64[4];
     uint32_t u32[8];
-} DAP_ALIGN_PACKED c_pow10_double[DATOSHI_POW * 2 + 1] = {
+} DAP_ALIGN_PACKED c_pow10_double[DATOSHI_POW256] = {
         { .u64 = {0,                            0,                           0,                         1ULL} },                          // 0
         { .u64 = {0,                            0,                           0,                         10ULL} },                         // 1
         { .u64 = {0,                            0,                           0,                         100ULL} },                        // 2
@@ -709,6 +709,7 @@ const union __c_pow10_double__ {
         { .u64 = {15930919111324522ULL,         14209320429820033867ULL,     8387114520361296896ULL,    0ULL} },                            // 74
         { .u64 = {159309191113245227ULL,        12965995782233477362ULL,     10084168908774762496ULL,   0ULL} },                            // 75
         { .u64 = {1593091911132452277ULL,       532749306367912313ULL,       8607968719199866880ULL,    0ULL} },                            // 76
+        { .u64 = {15930919111324522770ULL,       5327493063679123134ULL,       12292710897160462336ULL,    0ULL} },                         // 77
 };
 
 
@@ -731,7 +732,7 @@ uint256_t dap_cvt_str_to_uint256(const char *a_256bit_num)
 {
     uint256_t l_ret = uint256_0, l_nul = uint256_0;
     int  l_strlen;
-    char l_256bit_num[DAP_CHAIN$SZ_MAX256DEC];
+    char l_256bit_num[DAP_CHAIN$SZ_MAX256DEC + 1];
 
     /* Compute & check length */
     if ( (l_strlen = strnlen(a_256bit_num, DAP_CHAIN$SZ_MAX256DEC + 1) ) > DAP_CHAIN$SZ_MAX256DEC)
@@ -786,9 +787,9 @@ uint256_t dap_cvt_str_to_uint256(const char *a_256bit_num)
         l_tmp.hi = 0;
         l_tmp.lo = (uint128_t)c_pow10_double[i].u64[3] * (uint128_t) l_digit;
         SUM_256_256(l_ret, l_tmp, &l_ret);
-        if (l_ret.hi == 0 && l_ret.lo == 0) {
-            return l_nul;
-        }
+//        if (l_ret.hi == 0 && l_ret.lo == 0) {
+//            return l_nul;
+//        }
         uint128_t l_mul = (uint128_t) c_pow10_double[i].u64[2] * (uint128_t) l_digit;
         l_tmp.lo = l_mul << 64;
         l_tmp.hi = l_mul >> 64;
@@ -805,7 +806,7 @@ uint256_t dap_cvt_str_to_uint256(const char *a_256bit_num)
             return l_nul;
         }
 
-        l_mul = (uint128_t) c_pow10_double->u64[0] * (uint128_t) l_digit;
+        l_mul = (uint128_t) c_pow10_double[i].u64[0] * (uint128_t) l_digit;
         if (l_mul >> 64) {
             log_it(L_WARNING, "Input number is too big");
             return l_nul;
diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c
index 2ebd5f444d0b354ba00082bd04e423c2dcad5ea6..68eb357f2dff9b129fcaef22cd45443d0912a274 100644
--- a/modules/common/dap_chain_datum.c
+++ b/modules/common/dap_chain_datum.c
@@ -27,6 +27,7 @@
 #include "dap_time.h"
 #include "dap_chain_datum.h"
 #include "dap_chain_datum_tx.h"
+#include "dap_chain_datum_token.h"
 #include "dap_chain_datum_tx_items.h"
 #include "dap_chain_datum_hashtree_roots.h"
 #include "dap_chain_datum_token.h"
@@ -129,6 +130,13 @@ void s_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_
                 }else
                     dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %u>\n", l_tsd->size);
             break;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK: {
+                char *balance = NULL;
+                dap_chain_datum_token_tsd_delegate_from_stake_lock_t l_tsd_section = dap_tsd_get_scalar(l_tsd, dap_chain_datum_token_tsd_delegate_from_stake_lock_t);
+                dap_string_append_printf(a_str_out, "ticker_token_from: %s\nemission_rate: %s\n",
+                                         l_tsd_section.ticker_token_from, (balance = dap_chain_balance_to_coins(l_tsd_section.emission_rate)));
+                DAP_DEL_Z(balance);
+            }break;
             case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD  :
                 dap_string_append_printf(a_str_out,"datum_type_allowed_add: %s\n",
                                          dap_tsd_get_string_const(l_tsd) );
@@ -526,41 +534,50 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{
                     char *l_value_str = dap_chain_balance_print(l_token->total_supply);
                     dap_string_append(a_str_out, "type: SIMPLE\n");
+                           dap_string_append(a_str_out, "decimals: 18\n");
                     dap_string_append_printf(a_str_out, "sign_total: %hu\n", l_token->signs_total );
                     dap_string_append_printf(a_str_out, "sign_valid: %hu\n", l_token->signs_valid );
                     dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str);
                     size_t l_certs_field_size = l_token_size - sizeof(*l_token);
                     dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd,
                                                      l_certs_field_size, a_hash_out_type);
-                    DAP_DELETE(l_value_str);
+                    DAP_DEL_Z(l_value_str);
                 }break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{
                     dap_string_append(a_str_out,"type: PRIVATE_UPDATE\n");
                     s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
                 }break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:{
+                    char *l_value_str = dap_chain_balance_print(l_token->total_supply);
                     dap_string_append(a_str_out,"type: PRIVATE\n");
+                    dap_string_append(a_str_out, "decimals: 18\n");
+                    dap_string_append_printf(a_str_out, "auth signs (valid/total) %u/%u\n", l_token->signs_valid, l_token->signs_total);
+                    dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str);
                     dap_string_append(a_str_out,"flags: ");
                     dap_chain_datum_token_flags_dump(a_str_out, l_token->header_private_decl.flags);
                     s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
                     size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_decl.tsd_total_size;
                     dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_private_decl.tsd_total_size,
                                                      l_certs_field_size, a_hash_out_type);
+                    DAP_DEL_Z(l_value_str);
                 }break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_UPDATE:{
                     dap_string_append_printf(a_str_out,"type: CF20_UPDATE\n");
                     s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
                 }break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL:{
+                    char *l_value_str = dap_chain_balance_print(l_token->total_supply);
                     dap_string_append(a_str_out, "type: CF20\n");
                     dap_string_append(a_str_out, "decimals: 18\n");
                     dap_string_append_printf(a_str_out, "auth signs (valid/total) %u/%u\n", l_token->signs_valid, l_token->signs_total);
+                    dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str);
                     dap_string_append(a_str_out, "flags: ");
                     dap_chain_datum_token_flags_dump(a_str_out, l_token->header_native_decl.flags);
                     s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type);
                     size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_native_decl.tsd_total_size;
                     dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_native_decl.tsd_total_size,
                                                      l_certs_field_size, a_hash_out_type);
+                    DAP_DEL_Z(l_value_str);
                 }break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC:{
                     dap_string_append(a_str_out,"type: PUBLIC\n");
diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c
index 2a04de6c2acc3277fb1d5145fd8778f20517720b..0f6488a88fb7c5a1d11cca1b050a350db4e05b59 100644
--- a/modules/common/dap_chain_datum_token.c
+++ b/modules/common/dap_chain_datum_token.c
@@ -76,33 +76,29 @@ dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t *a_token, size_
 }
 
 dap_chain_datum_token_t *dap_chain_datum_token_read(byte_t *a_token_serial, size_t *a_token_size) {
-
-    uint16_t l_token_type = ((dap_chain_datum_token_t *)a_token_serial)->type;
-    if ( dap_chain_datum_token_is_old(l_token_type) ) {
-        dap_chain_datum_token_old_t *l_token_old = (dap_chain_datum_token_old_t *)a_token_serial;
-        size_t l_token_size = (*a_token_size) - sizeof(*l_token_old) + sizeof(dap_chain_datum_token_t);
-        dap_chain_datum_token_t * l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size);
+    switch (((dap_chain_datum_token_t*)a_token_serial)->type) {
+    case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: {
+            /* Transform obsolete token to modern */
+            dap_chain_datum_token_old_t *l_token_old = (dap_chain_datum_token_old_t*)a_token_serial;
+            size_t l_token_tsd_size = *a_token_size - sizeof(dap_chain_datum_token_old_t);
+            size_t l_token_size     = l_token_tsd_size + sizeof(dap_chain_datum_token_t);
+
+            dap_chain_datum_token_t *l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size);
         memcpy(l_token->ticker, l_token_old->ticker, sizeof(l_token_old->ticker));
-        l_token->ticker[sizeof(l_token_old->ticker) - 1] = '\0';
-        size_t l_token_tsd_size = (*a_token_size) - sizeof(*l_token_old);
         memcpy(l_token->data_n_tsd, l_token_old->data_n_tsd, l_token_tsd_size);
 
-        switch( l_token_type ){
-            case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: {
-                l_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; // 256
-                l_token->total_supply = GET_256_FROM_64(l_token_old->header_simple.total_supply);
-                l_token->signs_valid = l_token_old->header_simple.signs_valid;
-                l_token->signs_total = l_token_old->header_simple.signs_total;
-                break;
-            }
-            default:
-                return NULL;
-        }
+        l_token->type           = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE;
+        l_token->total_supply   = GET_256_FROM_64(l_token_old->header_simple.total_supply);
+        l_token->signs_valid    = l_token_old->header_simple.signs_valid;
+        l_token->signs_total    = l_token_old->header_simple.signs_total;
+        l_token->header_native_decl.tsd_total_size = l_token_tsd_size;
         return l_token;
-    } else {
-        return DAP_DUP_SIZE(a_token_serial, *a_token_size);
     }
-    return NULL;
+    case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC:
+        return NULL;
+    default:
+        return DAP_DUP_SIZE(a_token_serial, *a_token_size);
+    };
 }
 
 /**
@@ -181,41 +177,38 @@ dap_sign_t ** dap_chain_datum_token_signs_parse(dap_chain_datum_token_t * a_datu
     assert(a_signs_total);
     assert(a_signs_valid);
     assert(a_datum_token_size >= sizeof(dap_chain_datum_token_old_t));
-    dap_sign_t ** l_ret = DAP_NEW_Z_SIZE(dap_sign_t*, sizeof (dap_sign_t*)*a_datum_token->signs_total);
     *a_signs_total = 0;
     *a_signs_valid = a_datum_token->signs_valid;
     size_t l_offset = 0;
-    uint16_t n = 0;
-    size_t l_signs_offset = a_datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE
-                                                 ? sizeof(dap_chain_datum_token_old_t)
-                                                 : sizeof(dap_chain_datum_token_t);
-    if ((a_datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL)
-        ||  (a_datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL)) {
-        l_signs_offset += a_datum_token->header_native_decl.tsd_total_size;
+    size_t l_signs_offset = 0;
+    switch (a_datum_token->type) {
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
+            l_signs_offset = sizeof(dap_chain_datum_token_old_t);
+            break;
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL:
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:
+            l_signs_offset = sizeof(dap_chain_datum_token_t) + a_datum_token->header_native_decl.tsd_total_size;
+            break;
+        default:
+            break;
     }
-    while( l_offset < (a_datum_token_size - l_signs_offset) && n < a_datum_token->signs_total ) {
-        dap_sign_t *l_sign = (dap_sign_t *)((byte_t *)a_datum_token + l_signs_offset + l_offset);
-        size_t l_sign_size = dap_sign_get_size(l_sign);
-        if(!l_sign_size ){
-            log_it(L_WARNING,"Corrupted signature: size is zero");
-            goto err;
-        }
-        if(l_sign_size> (a_datum_token_size-l_offset ) ){
-            log_it(L_WARNING,"Corrupted signature: size %zd is too big", l_sign_size);
-            goto err;
+    dap_sign_t **l_ret = DAP_NEW_Z_SIZE(dap_sign_t*, sizeof(dap_sign_t*) * a_datum_token->signs_total);
+    if (!l_ret) {
+        log_it(L_CRITICAL, "Out of memory!");
+        return NULL;
+    }
+    for (uint16_t i = 0; i < a_datum_token->signs_total && l_offset <= a_datum_token_size - l_signs_offset; ++i) {
+        l_ret[i] = (dap_sign_t*)((byte_t*)a_datum_token + l_signs_offset + l_offset);
+        size_t l_sign_size = dap_sign_get_size(l_ret[i]);
+        if (l_sign_size == 0 || l_sign_size > a_datum_token_size - l_offset) {
+            *a_signs_total = 0;
+            DAP_FREE(l_ret);
+            return NULL;
         }
-        l_ret[n] = l_sign;
-        n++;
         (*a_signs_total)++;
         l_offset += l_sign_size;
     }
     return l_ret;
-err:
-    *a_signs_total = 0;
-    if(l_ret)
-        DAP_DELETE(l_ret);
-    return NULL;
-
 }
 
 dap_chain_datum_token_emission_t *dap_chain_datum_emission_create(uint256_t a_value, const char *a_ticker, dap_chain_addr_t *a_addr)
@@ -226,7 +219,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_create(uint256_t a_va
     strncpy(l_emission->hdr.ticker, a_ticker, DAP_CHAIN_TICKER_SIZE_MAX - 1);
     l_emission->hdr.ticker[DAP_CHAIN_TICKER_SIZE_MAX - 1] = '\0';
     l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH;
-    memcpy(&l_emission->hdr.address, a_addr, sizeof(l_emission->hdr.address));
+    l_emission->hdr.address = *a_addr;
     dap_uuid_generate_nonce(&l_emission->hdr.nonce, DAP_CHAIN_DATUM_NONCE_SIZE);
     return l_emission;
 }
@@ -352,11 +345,6 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_
 
 // 256 TYPE
 bool dap_chain_datum_token_is_old(uint8_t a_type) {
-    switch(a_type) {
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC:
-            return true;
-        default:
-            return false;
-    }
+    return a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE
+            || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC;
 }
diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c
index a29db28644c679c4a91160b90816e3916e530363..ddf05b010414d73285fed2a3962e011dc283fb51 100644
--- a/modules/common/dap_chain_datum_tx_items.c
+++ b/modules/common/dap_chain_datum_tx_items.c
@@ -245,7 +245,7 @@ dap_chain_tx_in_t* dap_chain_datum_tx_item_in_create(dap_chain_hash_fast_t *a_tx
     dap_chain_tx_in_t *l_item = DAP_NEW_Z(dap_chain_tx_in_t);
     l_item->header.type = TX_ITEM_TYPE_IN;
     l_item->header.tx_out_prev_idx = a_tx_out_prev_idx;
-    memcpy(&l_item->header.tx_prev_hash, a_tx_prev_hash, sizeof(dap_chain_hash_fast_t));
+    l_item->header.tx_prev_hash = *a_tx_prev_hash;
     return l_item;
 }
 
@@ -265,7 +265,7 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa
     l_item->header.type = TX_ITEM_TYPE_IN_COND;
     l_item->header.receipt_idx = a_receipt_idx;
     l_item->header.tx_out_prev_idx = a_tx_out_prev_idx;
-    memcpy(&l_item->header.tx_prev_hash, a_tx_prev_hash,sizeof(l_item->header.tx_prev_hash) );
+    l_item->header.tx_prev_hash = *a_tx_prev_hash;
     return l_item;
 }
 
@@ -279,11 +279,7 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a
     if (IS_ZERO_256(a_value))
         return NULL;
     dap_chain_tx_out_t *l_item = DAP_NEW_Z(dap_chain_tx_out_t);
-    if (!a_addr) {
-        memset(&l_item->addr, 0, sizeof(dap_chain_addr_t));
-    }
-    else
-        memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t));
+    l_item->addr = a_addr ? *a_addr : (dap_chain_addr_t) { 0 };
     l_item->header.type = TX_ITEM_TYPE_OUT;
     l_item->header.value = a_value;
     return l_item;
@@ -298,7 +294,7 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a
     dap_chain_tx_out_ext_t *l_item = DAP_NEW_Z(dap_chain_tx_out_ext_t);
     l_item->header.type = TX_ITEM_TYPE_OUT_EXT;
     l_item->header.value = a_value;
-    memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t));
+    l_item->addr = *a_addr;
     strcpy(l_item->token, a_token);
     return l_item;
 }
@@ -399,10 +395,10 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c
     l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE;
     l_item->header.srv_uid = a_srv_uid;
     l_item->subtype.srv_stake.fee_value = a_fee_value;
-    memcpy(&l_item->subtype.srv_stake.fee_addr, a_fee_addr, sizeof(dap_chain_addr_t));
-    memcpy(&l_item->subtype.srv_stake.hldr_addr, a_hldr_addr, sizeof(dap_chain_addr_t));
-    memcpy(&l_item->subtype.srv_stake.signing_addr, a_signing_addr, sizeof(dap_chain_addr_t));
-    memcpy(&l_item->subtype.srv_stake.signer_node_addr, a_signer_node_addr, sizeof(dap_chain_node_addr_t));
+    l_item->subtype.srv_stake.fee_addr = *a_fee_addr;
+    l_item->subtype.srv_stake.hldr_addr = *a_hldr_addr;
+    l_item->subtype.srv_stake.signing_addr = *a_signing_addr;
+    l_item->subtype.srv_stake.signer_node_addr = *a_signer_node_addr;
     return l_item;
 }
 
diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h
index 6362a96e6949f2dc996b9a0125dccac96c6ba65a..a983ced719baedbb99a3c44145e705a34b5e35f5 100644
--- a/modules/common/include/dap_chain_common.h
+++ b/modules/common/include/dap_chain_common.h
@@ -45,7 +45,7 @@
 
 #define DATOSHI_LD 1000000000.0L    // Deprecated
 #define DATOSHI_DEGREE 18
-#define DATOSHI_POW 38
+#define DATOSHI_POW 39
 #define DATOSHI_POW256 (DATOSHI_POW * 2)
 
 // Chain ID of the whole system
diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h
index 1ca8bdd5551cd410e16b80de247f5bf3c24b41d1..cf3c2cc8b296524b59654e2eee8013b7363b6ada 100644
--- a/modules/common/include/dap_chain_datum_token.h
+++ b/modules/common/include/dap_chain_datum_token.h
@@ -224,7 +224,7 @@ extern const char *c_dap_chain_datum_token_flag_str[];
 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_ADD                      0x0006
 
 // Emission for delegated token
-#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK	0x0026
+#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK	0x0027
 
 
 
diff --git a/modules/consensus/block-poa/dap_chain_cs_block_poa.c b/modules/consensus/block-poa/dap_chain_cs_block_poa.c
index 7cf5f83d0d318207b1bd3f7b10364770a58bd07a..5b105ac6608d646825a5cb4128b8cd5e71e4a19d 100644
--- a/modules/consensus/block-poa/dap_chain_cs_block_poa.c
+++ b/modules/consensus/block-poa/dap_chain_cs_block_poa.c
@@ -75,8 +75,8 @@ int dap_chain_cs_block_poa_init(void)
     dap_chain_cs_add ("block_poa", s_callback_new );
     s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false);
     dap_cli_server_cmd_add ("block_poa", s_cli_block_poa, "Blockchain PoA commands",
-        "block_poa -net <chain net name> -chain <chain name> block sign [-cert <cert name>] \n"
-            "\tSign new block with certificate <cert name> or withs own PoA certificate\n\n");
+        "block_poa -net <net_name> -chain <chain_name> block sign [-cert <priv_cert_name>] \n"
+            "\tSign new block with certificate <chain_name> or withs own PoA certificate\n\n");
 
     return 0;
 }
diff --git a/modules/consensus/block-ton/dap_chain_cs_block_ton.c b/modules/consensus/block-ton/dap_chain_cs_block_ton.c
index f56df5a9889b1981566cdde43498dd7a3f340472..9d69a9a92d0908f784385b44980392843a06e278 100644
--- a/modules/consensus/block-ton/dap_chain_cs_block_ton.c
+++ b/modules/consensus/block-ton/dap_chain_cs_block_ton.c
@@ -526,12 +526,10 @@ static bool s_session_round_start_callback_load_session_store_coordinator_state_
                                     DAP_NEW_Z(dap_chain_cs_block_ton_message_votefor_t);
     if (l_list_candidate) {
         dap_chain_hash_fast_t *l_candidate_hash = dap_list_nth_data(l_list_candidate, (rand()%l_list_candidate_size));
-        memcpy(&l_votefor->candidate_hash, l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+        l_votefor->candidate_hash = *l_candidate_hash;
         dap_list_free_full(l_list_candidate, NULL);
-    }
-    else {
-        dap_chain_hash_fast_t l_candidate_hash_null={0};
-        memcpy(&l_votefor->candidate_hash, &l_candidate_hash_null, sizeof(dap_chain_hash_fast_t));
+    } else {
+        l_votefor->candidate_hash = (dap_chain_hash_fast_t){ };
     }
     l_votefor->attempt_number = l_session->attempt_current_number;
     s_session_send_votefor_data_t *l_data = DAP_NEW_Z(s_session_send_votefor_data_t);
@@ -877,7 +875,7 @@ static void s_callback_block_new_add_datums_op_results (dap_chain_cs_blocks_t *
         if ( !l_session->old_round.my_candidate_hash
                         || memcmp(&l_candidate_hash, l_session->old_round.my_candidate_hash,
                                         sizeof(dap_chain_hash_fast_t)) != 0 ) {
-            memcpy(&l_submit->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+            l_submit->candidate_hash = l_candidate_hash;
             l_session->cur_round.my_candidate_hash =
                     (dap_chain_hash_fast_t*)DAP_DUP_SIZE(&l_candidate_hash, sizeof(dap_chain_hash_fast_t));
             memcpy(l_submit->candidate, l_session->my_candidate, l_session->my_candidate_size);
@@ -894,9 +892,8 @@ static void s_callback_block_new_add_datums_op_results (dap_chain_cs_blocks_t *
     }
 
     if (!l_candidate_exists) { // no my candidate, send null hash
-        dap_chain_hash_fast_t l_candidate_hash_null={0};
+        l_submit->candidate_hash = (dap_chain_hash_fast_t) { };
         l_session->cur_round.my_candidate_hash = NULL;
-        memcpy(&l_submit->candidate_hash, &l_candidate_hash_null, sizeof(dap_chain_hash_fast_t));
         if (PVT(l_session->ton)->debug)
             log_it(L_MSG, "TON: net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hu I don't have a candidate. I submit a null candidate.",
                         l_session->chain->net_name, l_session->chain->name,
@@ -1264,7 +1261,7 @@ static bool s_session_packet_in_callback_vote_for_load_store (dap_global_db_cont
             // candidate found, gen event Vote
             dap_chain_cs_block_ton_message_vote_t *l_vote =
                                                 DAP_NEW_Z(dap_chain_cs_block_ton_message_vote_t);
-            memcpy(&l_vote->candidate_hash, &l_found_candidate->hdr.candidate_hash, sizeof(dap_chain_hash_fast_t));
+            l_vote->candidate_hash = l_found_candidate->hdr.candidate_hash;
             l_vote->round_id.uint64 = l_session->cur_round.id.uint64;
             l_vote->attempt_number = l_session->attempt_current_number;
 
@@ -1450,7 +1447,8 @@ static void s_callback_get_candidate_block_and_pre_commit (dap_global_db_context
                 dap_chain_cs_block_ton_message_commitsign_t *l_commitsign =
                                         DAP_NEW_SIZE(dap_chain_cs_block_ton_message_commitsign_t, l_commitsign_size);
                 l_commitsign->round_id.uint64 = l_session->cur_round.id.uint64;
-                memcpy(&l_commitsign->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+//                memcpy(&l_commitsign->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+                l_commitsign->candidate_hash = l_candidate_hash;
                 memcpy(l_commitsign->candidate_sign, l_candidate_sign, l_candidate_sign_size);
                 s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_COMMIT_SIGN, (uint8_t*)l_commitsign,
                                     l_commitsign_size, l_session->cur_round.validators_start);
@@ -1518,7 +1516,8 @@ static void s_callback_get_candidate_block_and_vote (dap_global_db_context_t * a
             dap_chain_cs_block_ton_message_precommit_t *l_precommit =
                                         DAP_NEW_Z(dap_chain_cs_block_ton_message_precommit_t);
             l_precommit->round_id.uint64 = l_session->cur_round.id.uint64;
-            memcpy(&l_precommit->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+//            memcpy(&l_precommit->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+            l_precommit->candidate_hash = l_candidate_hash;
             l_precommit->attempt_number = l_session->attempt_current_number;
             s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_PRE_COMMIT, (uint8_t*)l_precommit,
                             sizeof(dap_chain_cs_block_ton_message_precommit_t), l_session->cur_round.validators_start);
@@ -1586,7 +1585,8 @@ static void s_callback_get_candidate_block_and_approve (dap_global_db_context_t
         dap_chain_cs_block_ton_message_vote_t *l_vote =
                                             DAP_NEW_Z(dap_chain_cs_block_ton_message_vote_t);
         l_vote->round_id.uint64 = l_session->cur_round.id.uint64;
-        memcpy(&l_vote->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+//        memcpy(&l_vote->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+        l_vote->candidate_hash = l_candidate_hash;
         l_vote->attempt_number = l_session->attempt_current_number;
         s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_VOTE, (uint8_t*)l_vote,
             sizeof(dap_chain_cs_block_ton_message_vote_t), l_session->cur_round.validators_start);
@@ -1681,7 +1681,7 @@ static void s_callback_check_and_save_candidate_block  (dap_global_db_context_t
                 dap_chain_cs_block_ton_message_approve_t *l_approve =
                                         DAP_NEW_SIZE(dap_chain_cs_block_ton_message_approve_t, l_approve_size);
                 l_approve->round_id.uint64 = l_session->cur_round.id.uint64;
-                memcpy(&l_approve->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+                l_approve->candidate_hash = l_candidate_hash;
                 memcpy(l_approve->candidate_hash_sign, l_hash_sign, l_hash_sign_size);
 
                 s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_APPROVE,
@@ -1701,7 +1701,7 @@ static void s_callback_check_and_save_candidate_block  (dap_global_db_context_t
             dap_chain_cs_block_ton_message_reject_t *l_reject =
                                                     DAP_NEW_Z(dap_chain_cs_block_ton_message_reject_t);
             l_reject->round_id.uint64 = l_session->cur_round.id.uint64;
-            memcpy(&l_reject->candidate_hash, &l_candidate_hash, sizeof(dap_chain_hash_fast_t));
+            l_reject->candidate_hash = l_candidate_hash;
             s_message_send(l_session, DAP_STREAM_CH_CHAIN_MESSAGE_TYPE_REJECT, (uint8_t*)l_reject,
                         sizeof(dap_chain_cs_block_ton_message_reject_t), l_session->cur_round.validators_start);
             DAP_DELETE(l_reject);
@@ -2498,8 +2498,7 @@ static void s_message_send(dap_chain_cs_block_ton_session_t *a_session, uint8_t
 	l_message->hdr.chain_id.uint64 = a_session->chain->id.uint64;
 	l_message->hdr.ts_created = dap_time_now();
 	l_message->hdr.type = a_message_type;
-	memcpy(&l_message->hdr.sender_node_addr,
-				dap_chain_net_get_cur_addr(l_net), sizeof(dap_chain_node_addr_t));
+    l_message->hdr.sender_node_addr = *dap_chain_net_get_cur_addr(l_net);
 
 	size_t l_sign_size = 0;
 	if ( !PVT(a_session->ton)->validators_list_by_stake ) { 
@@ -2542,7 +2541,7 @@ static void s_message_chain_add(dap_chain_cs_block_ton_session_t *a_session, dap
 
 	l_message->hdr.is_genesis = !l_round->last_message_hash ? true : false;
 	if (!l_message->hdr.is_genesis) {
-		memcpy(&l_message->hdr.prev_message_hash, l_round->last_message_hash, sizeof(dap_hash_fast_t));
+        l_message->hdr.prev_message_hash = *l_round->last_message_hash;
 	}
 
 	dap_chain_hash_fast_t l_message_hash;
diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
index df3b1b55c8f668581b82861b2f2b410bbb8c89a9..fd64efc4f3fdab214e06139939751a6833bb4a56 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -114,7 +114,7 @@ int dap_chain_cs_dag_poa_init(void)
     dap_chain_cs_add ("dag_poa", s_callback_new );
     s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false);
     dap_cli_server_cmd_add ("dag_poa", s_cli_dag_poa, "DAG PoA commands",
-        "dag_poa event sign -net <chain net name> -chain <chain name> -event <event hash> [-H {hex | base58(default)}]\n"
+        "dag_poa event sign -net <net_name> -chain <chain_name> -event <event_hash> [-H {hex | base58(default)}]\n"
             "\tSign event <event hash> in the new round pool with its authorize certificate\n\n");
 
     return 0;
@@ -266,14 +266,12 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply)
                     bool l_event_is_ready = s_round_event_ready_minimum_check(l_dag, l_event, l_event_size_new,
                                                                         l_event_new_hash_hex_str);
 
-                    if (dap_chain_cs_dag_event_gdb_set(l_dag, l_event_new_hash_hex_str, l_event,
-                                                    l_event_size_new, l_round_item)) {
+                    if (dap_chain_cs_dag_event_gdb_set(l_dag, l_event_new_hash_hex_str, l_event, l_event_size_new, l_round_item)) {
                         if(!dap_strcmp(l_hash_out_type, "hex")) {
                             dap_cli_server_cmd_set_reply_text(a_str_reply,
                                     "Added new sign with cert \"%s\", event %s placed back in round.new\n",
                                     l_poa_pvt->events_sign_cert->name, l_event_new_hash_hex_str);
-                        }
-                        else {
+                        } else {
                             dap_cli_server_cmd_set_reply_text(a_str_reply,
                                     "Added new sign with cert \"%s\", event %s placed back in round.new\n",
                                     l_poa_pvt->events_sign_cert->name, l_event_new_hash_base58_str);
@@ -484,7 +482,7 @@ static dap_chain_cs_dag_event_round_item_t *s_round_event_choose_dup(dap_list_t
                     dap_chain_cs_dag_event_calc_hash((dap_chain_cs_dag_event_t *)l_round_item->event_n_signs,
                                                      l_round_item->event_size, &l_event_hash);
                     if (memcmp(&l_winner_hash, &l_event_hash, sizeof(dap_hash_fast_t)) < 0)
-                        memcpy(&l_winner_hash, &l_event_hash, sizeof(dap_hash_fast_t));
+                        l_winner_hash = l_event_hash;
                 }
                 break;
             case DAP_CHAIN_POA_ROUND_FILTER_STAGE_HASH:
diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
index 348c61c5d87f02a0a92b60fbe6e62be6370f0cee..22312893f841d051ce10e0dfc4fccb3bf8d7918f 100644
--- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
+++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
@@ -198,7 +198,6 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
                                                           size_t *a_dag_event_size)
 {
     dap_return_val_if_fail(a_dag && a_dag->chain && DAP_CHAIN_CS_DAG_POS(a_dag) && a_datum, NULL);
-    dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name );
     dap_chain_cs_dag_pos_t * l_pos = DAP_CHAIN_CS_DAG_POS(a_dag);
 
     if( PVT(l_pos)->events_sign_key == NULL) {
diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c
index 55f2ed281ef33b8cd87ca6d22d8c16cc88f1d693..7351eacc48eb32fa195fcf2ed94f9bd349a04f68 100644
--- a/modules/global-db/dap_chain_global_db_remote.c
+++ b/modules/global-db/dap_chain_global_db_remote.c
@@ -547,8 +547,7 @@ dap_global_db_pkt_t *dap_store_packet_multiple(dap_global_db_pkt_t *a_old_pkt, d
  */
 void dap_store_packet_change_id(dap_global_db_pkt_t *a_pkt, uint64_t a_id)
 {
-    uint16_t l_gr_len;
-    memcpy(&l_gr_len, a_pkt->data + sizeof(uint32_t), sizeof(uint16_t));
+    uint16_t l_gr_len = *(uint16_t*)(a_pkt->data + sizeof(uint32_t));
     size_t l_id_offset = sizeof(uint32_t) + sizeof(uint16_t) + l_gr_len;
     memcpy(a_pkt->data + l_id_offset, &a_id, sizeof(uint64_t));
 }
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index 36dcb793663513f50118c7ab3958870673a0adae..af666267f5ede774dbc1e13459b8d7b037b610dc 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -332,8 +332,8 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
                     continue;
                 }
                 if ( memcmp(&l_out->addr, a_addr_from, sizeof (*a_addr_from))==0 ){
-                    list_used_item_t *l_item_back = DAP_NEW(list_used_item_t);
-                    memcpy(&l_item_back->tx_hash_fast, &l_tx_new_hash, sizeof(dap_chain_hash_fast_t));
+                    list_used_item_t *l_item_back = DAP_NEW_Z(list_used_item_t);
+                    l_item_back->tx_hash_fast = l_tx_new_hash;
                     l_item_back->num_idx_out = l_out_idx_tmp;
                     l_item_back->value = l_value_back;
                     l_list_used_out = dap_list_prepend(l_list_used_out, l_item_back);
@@ -785,17 +785,15 @@ dap_datum_mempool_t * dap_datum_mempool_deserialize(uint8_t *a_datum_mempool_ser
     //uint8_t *a_datum_mempool_ser = DAP_NEW_Z_SIZE(uint8_t, datum_mempool_size / 2 + 1);
     //datum_mempool_size = hex2bin(a_datum_mempool_ser, datum_mempool_str_in, datum_mempool_size) / 2;
     dap_datum_mempool_t *datum_mempool = DAP_NEW_Z(dap_datum_mempool_t);
-    memcpy(&(datum_mempool->version), a_datum_mempool_ser + shift_size, sizeof(uint16_t));
+    datum_mempool->version = *(uint16_t*)(a_datum_mempool_ser + shift_size);
     shift_size += sizeof(uint16_t);
-    memcpy(&(datum_mempool->datum_count), a_datum_mempool_ser + shift_size, sizeof(uint16_t));
+    datum_mempool->datum_count = *(uint16_t*)(a_datum_mempool_ser + shift_size);
     shift_size += sizeof(uint16_t);
     datum_mempool->data = DAP_NEW_Z_SIZE(dap_chain_datum_t*, datum_mempool->datum_count * sizeof(dap_chain_datum_t*));
     for(int i = 0; i < datum_mempool->datum_count; i++) {
-        size_t size_one = 0;
-        memcpy(&size_one, a_datum_mempool_ser + shift_size, sizeof(uint16_t));
+        uint16_t size_one = *(uint16_t*)(a_datum_mempool_ser + shift_size);
         shift_size += sizeof(uint16_t);
-        datum_mempool->data[i] = (dap_chain_datum_t*) DAP_NEW_Z_SIZE(uint8_t, size_one);
-        memcpy(datum_mempool->data[i], a_datum_mempool_ser + shift_size, size_one);
+        datum_mempool->data[i] = DAP_DUP((dap_chain_datum_t*)(a_datum_mempool_ser + shift_size));
         shift_size += size_one;
     }
     assert(shift_size == a_datum_mempool_ser_size);
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 1cf9b8cb9ed0aa5fc7a95e1437303d9c5ce7a1f3..0aed37c104696e4d58758baaec2e4bb8b6398219 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -955,11 +955,17 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie
 
 }
 
-static void s_node_link_remove(dap_chain_net_pvt_t *a_net_pvt, dap_chain_node_client_t *a_node_client)
+static void s_node_link_remove(dap_chain_net_pvt_t *a_net_pvt, dap_chain_node_client_t *a_node_client, bool a_rebase)
 {
     for (dap_list_t *it = a_net_pvt->net_links; it; it = it->next) {
         if (((struct net_link *)it->data)->link == a_node_client) {
-            DAP_DELETE(((struct net_link *)it->data)->link_info);
+            if (a_rebase) {
+                ((struct net_link *)it->data)->link = NULL;
+                a_net_pvt->net_links = dap_list_append(a_net_pvt->net_links, it->data);
+            } else {
+                DAP_DELETE(((struct net_link *)it->data)->link_info);
+                DAP_DELETE(it->data);
+            }
             a_net_pvt->net_links = dap_list_delete_link(a_net_pvt->net_links, it);
             break;
         }
@@ -991,7 +997,7 @@ static void s_node_link_callback_disconnected(dap_chain_node_client_t *a_node_cl
         a_node_client->keep_connection = true;
         for (dap_list_t *it = l_net_pvt->net_links; it; it = it->next) {
             if (((struct net_link *)it->data)->link == NULL) {  // We have a free prepared link
-                s_node_link_remove(l_net_pvt, a_node_client);
+                s_node_link_remove(l_net_pvt, a_node_client, true);
                 a_node_client->keep_connection = false;
                 ((struct net_link *)it->data)->link = dap_chain_net_client_create_n_connect(l_net,
                                                         ((struct net_link *)it->data)->link_info);
@@ -1029,7 +1035,7 @@ static void s_node_link_callback_disconnected(dap_chain_node_client_t *a_node_cl
                 log_it(L_ERROR, "Can't process node info dns request");
                 DAP_DELETE(l_link_node_info);
             } else {
-                s_node_link_remove(l_net_pvt, a_node_client);
+                s_node_link_remove(l_net_pvt, a_node_client, false);
                 a_node_client->keep_connection = false;
             }
         }
@@ -1772,28 +1778,32 @@ void s_chain_net_ledger_cache_reload(dap_chain_net_t *l_net)
 {
     dap_chain_ledger_purge(l_net->pub.ledger, false);
     dap_chain_t *l_chain = NULL;
-    DL_FOREACH(l_net->pub.chains, l_chain)
-    {
+    DL_FOREACH(l_net->pub.chains, l_chain) {
         if (l_chain->callback_purge)
             l_chain->callback_purge(l_chain);
-
         if (!strcmp(DAP_CHAIN_PVT(l_chain)->cs_name, "none"))
             dap_chain_gdb_ledger_load((char *)dap_chain_gdb_get_group(l_chain), l_chain);
         else
             dap_chain_load_all(l_chain);
+    }
+    DL_FOREACH(l_net->pub.chains, l_chain) {
+        if (l_chain->callback_atom_add_from_treshold) {
+            while (l_chain->callback_atom_add_from_treshold(l_chain, NULL))
+                debug_if(s_debug_more, L_DEBUG, "Added atom from treshold");
         }
-    bool l_processed;
-        do {
-            l_processed = false;
-            DL_FOREACH(l_net->pub.chains, l_chain) {
-               if (l_chain->callback_atom_add_from_treshold) {
-                    while (l_chain->callback_atom_add_from_treshold(l_chain, NULL)) {
-                        log_it(L_DEBUG, "Added atom from treshold");
-                        l_processed = true;
-                    }
+    }
+    /*bool l_processed;
+    do {
+        l_processed = false;
+        DL_FOREACH(l_net->pub.chains, l_chain) {
+           if (l_chain->callback_atom_add_from_treshold) {
+                while (l_chain->callback_atom_add_from_treshold(l_chain, NULL)) {
+                    log_it(L_DEBUG, "Added atom from treshold");
+                    l_processed = true;
                 }
             }
-        } while (l_processed);
+        }
+    } while (l_processed); */ //TODO: Commented out in branch master and flagged as obscure code.
 }
 
 /**
@@ -1850,8 +1860,7 @@ bool s_chain_net_reload_ledger_cache_once(dap_chain_net_t *l_net)
  * @param a_type - dap_chain_type_t a_type [CHAIN_TYPE_TOKEN, CHAIN_TYPE_EMISSION, CHAIN_TYPE_TX]
  * @return uint16_t
  */
-static const char *s_chain_type_convert_to_string(dap_chain_type_t a_type)
-{
+static const char *s_chain_type_convert_to_string(dap_chain_type_t a_type) {
 	switch (a_type) {
 		case CHAIN_TYPE_TOKEN:
 			return ("token");
@@ -2679,7 +2688,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                     l_net_pvt->node_info = dap_chain_node_info_read (l_net, l_node_addr);
                     if ( !l_net_pvt->node_info ) { // If not present - create it
                         l_net_pvt->node_info = DAP_NEW_Z(dap_chain_node_info_t);
-                        memcpy(&l_net_pvt->node_info->hdr.address, l_node_addr,sizeof (*l_node_addr));
+                        l_net_pvt->node_info->hdr.address = *l_node_addr;
                         if (dap_config_get_item_bool_default(g_config,"server","enabled",false) ){
                             const char * l_ext_addr_v4 = dap_config_get_item_str_default(g_config,"server","ext_address",NULL);
                             const char * l_ext_addr_v6 = dap_config_get_item_str_default(g_config,"server","ext_address6",NULL);
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index f32a41b886d54866115d0884bfd8d92aeae28f7b..ffc0aeb2d7c4ad9ebfe63410a50ad0bcbf35b1b8 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -462,7 +462,7 @@ static int link_add_or_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_in
             l_node_info_read->hdr.links_number++;
             l_node_info_read_size = dap_chain_node_info_get_size(l_node_info_read);
             l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size);
-            memcpy(&(l_node_info_read->links[l_node_info_read->hdr.links_number-1]), link, sizeof(dap_chain_node_addr_t));
+            l_node_info_read->links[l_node_info_read->hdr.links_number-1] = *link;
             res_successful = true;
         }
     }
@@ -471,7 +471,7 @@ static int link_add_or_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_in
         // move link list to one item prev
         if(index_link >= 0) {
             for(unsigned int j = (unsigned int) index_link; j < (l_node_info_read->hdr.links_number - 1); j++) {
-                memcpy(&(l_node_info_read->links[j]), &(l_node_info_read->links[j + 1]), sizeof(dap_chain_node_addr_t));
+                l_node_info_read->links[j] = l_node_info_read->links[j + 1];
             }
             l_node_info_read->hdr.links_number--;
             res_successful = true;
@@ -1002,7 +1002,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             dap_digit_from_string(l_addr_str, l_node_addr.raw, sizeof(l_node_addr.raw));
         }
         if(l_node_info)
-            memcpy(&l_node_info->hdr.address, &l_node_addr, sizeof(dap_chain_node_addr_t));
+            l_node_info->hdr.address = l_node_addr;
     }
     if(l_port_str) {
         uint16_t l_node_port = 0;
@@ -1094,7 +1094,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         if(alias_str && !l_node_addr.uint64) {
             dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(l_net, alias_str);
             if(address_tmp) {
-                memcpy(&l_node_addr, address_tmp, sizeof(*address_tmp));
+                l_node_addr = *address_tmp;
                 DAP_DELETE(address_tmp);
             }
             else {
@@ -1319,7 +1319,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             dap_stream_ch_chain_sync_request_t l_sync_request = {};
             dap_chain_hash_fast_t *l_hash = dap_db_get_last_hash_remote(l_node_client->remote_node_addr.uint64, l_chain);
             if (l_hash) {
-                memcpy(&l_sync_request.hash_from, l_hash, sizeof(*l_hash));
+                l_sync_request.hash_from = *l_hash;
                 DAP_DELETE(l_hash);
             }
             if(0 == dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS,
@@ -1358,7 +1358,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         if(alias_str && !l_node_addr.uint64) {
             dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(l_net, alias_str);
             if(address_tmp) {
-                memcpy(&l_node_addr, address_tmp, sizeof(*address_tmp));
+                l_node_addr = *address_tmp;
                 DAP_DELETE(address_tmp);
             }
             else {
@@ -2034,7 +2034,7 @@ int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index, int argc, ch
                 dap_cli_server_cmd_set_reply_text(a_str_reply,
                                                   "%s requires parameter '-chain' or set default datum type in chain configuration file",
                                                   argv[0]);
-                return -104;
+                return -105;
             }
         } else {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter '-chain'", argv[0]);
@@ -2574,7 +2574,7 @@ int com_mempool_proc(int argc, char ** argv, char ** a_str_reply)
  * @param arg_func
  * @param str_reply
  * @return
- * @details token_update -net <net name> -chain <chain name> -token <token ticker> [-type private] -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...  [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n"
+ * @details token_update -net <net_name> -chain <chain_name> -token <token_ticker> [-type private] -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...  [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n"
  *  \t   Update token for <netname>:<chain name> with ticker <token ticker>, flags <Flag 1>,<Flag2>...<Flag N>"
  *  \t   and custom parameters list <Param 1>, <Param 2>...<Param N>."
  *  \n"
@@ -3083,6 +3083,27 @@ int s_token_decl_check_params(int a_argc, char ** a_argv, char ** a_str_reply, d
 
     //DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL uses decimals parameter
     if (l_params->l_type == DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE || l_params->l_type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL){
+        if(!l_params->l_decimals_str) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "token_decl requires parameter '-decimals'");
+            return -3;
+        } else if (dap_strcmp(l_params->l_decimals_str, "18")) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply,
+                                              "token_decl support '-decimals' to be 18 only");
+            return -4;
+        }
+        if(IS_ZERO_256(l_params->l_total_supply)) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "token_decl requires parameter '-total_supply'");
+            return -3;
+        }
+    } else if (l_params->l_type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL){ //// check l_decimals in CF20 token TODO: At the moment the checks are the same.
+        if(!l_params->l_decimals_str) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "token_decl requires parameter '-decimals'");
+            return -3;
+        } else if (dap_strcmp(l_params->l_decimals_str, "18")) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply,
+                                              "token_decl support '-decimals' to be 18 only");
+            return -4;
+        }
         if(IS_ZERO_256(l_params->l_total_supply)) {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "token_decl requires parameter '-total_supply'");
             return -3;
@@ -3104,18 +3125,6 @@ int s_token_decl_check_params(int a_argc, char ** a_argv, char ** a_str_reply, d
         return -2;
     }
 
-    // check l_decimals in CF20 token
-    if (l_params->l_type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL){
-        if(!l_params->l_decimals_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "token_decl requires parameter '-decimals'");
-            return -3;
-        } else if (dap_strcmp(l_params->l_decimals_str, "18")) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply,
-                    "token_decl support '-decimals' to be 18 only");
-            return -4;
-        }
-    }
-
     // Check certs list
     if(!l_params->l_certs_str){
         dap_cli_server_cmd_set_reply_text(a_str_reply, "token_decl requires parameter 'certs'");
@@ -3291,10 +3300,12 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
                 l_datum_token->total_supply = l_total_supply;
                 l_datum_token->signs_valid = l_signs_emission;
                 l_datum_token->header_private_decl.tsd_total_size = l_tsd_total_size;
+                l_datum_token->header_native_decl.decimals = atoi(l_params->l_decimals_str);
             } else { //DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL
                 log_it(L_DEBUG,"Prepared TSD sections for CF20 token on %zd total size", l_tsd_total_size);
                 dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker);
                 l_datum_token->header_native_decl.flags = l_flags;
+                l_datum_token->total_supply = l_total_supply;
                 l_datum_token->signs_valid = l_signs_emission;
                 l_datum_token->header_native_decl.tsd_total_size = l_tsd_total_size;
                 l_datum_token->header_native_decl.decimals = atoi(l_params->l_decimals_str);
@@ -3342,6 +3353,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
             dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker);
             l_datum_token->total_supply = l_total_supply;
             l_datum_token->signs_valid = l_signs_emission;
+            l_datum_token->header_native_decl.decimals = atoi(l_params->l_decimals_str);
         }break;
         default:
             dap_cli_server_cmd_set_reply_text(a_str_reply,
@@ -4608,10 +4620,14 @@ int com_tx_create(int argc, char ** argv, char **str_reply)
                                                          "to be valid string containing hash in hex or base58 format");
             return -3;
         }
-        if (!l_emission_chain_name ||
-                (l_emission_chain = dap_chain_net_get_chain_by_name(l_net, l_emission_chain_name)) == NULL) {
+        if (l_emission_chain_name) {
+            l_emission_chain = dap_chain_net_get_chain_by_name(l_net, l_emission_chain_name);
+        } else {
+            l_emission_chain = dap_chain_net_get_default_chain_by_chain_type(l_net,CHAIN_TYPE_EMISSION);
+        }
+        if (!l_emission_chain) {
             dap_cli_server_cmd_set_reply_text(str_reply, "tx_create requires parameter '-emission_chain' "
-                                                         "to be a valid chain name");
+                                                         "to be a valid chain name or set default datum type in chain configuration file");
             return -9;
         }
         if(!l_certs_str) {
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index 5837cd4897b0cec8a0dd3c92b8e77321c95f166a..b266e418d6cb6f1c0256465617813cb289c0094e 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -175,12 +175,8 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
                     l_tx_data = DAP_NEW_Z(dap_tx_data_t);
                     dap_chain_hash_fast_t l_tx_hash;
                     dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash);
-                    memcpy(&l_tx_data->tx_hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t));
-                    if ( l_type_256 ) // 256
-                        memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t));
-                    else
-                        memcpy(&l_tx_data->addr, &l_tx_out_256->addr, sizeof(dap_chain_addr_t));
-
+                    l_tx_data->tx_hash = l_tx_hash;
+                    l_tx_data->addr = l_type_256 ? l_tx_out_256->addr : l_tx_out->addr;
                     dap_chain_hash_fast_to_str(&l_tx_data->tx_hash, l_tx_data->tx_hash_str,
                             sizeof(l_tx_data->tx_hash_str));
                     //l_tx_data->pos_num = l_count;
@@ -331,10 +327,10 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
                         dap_chain_tx_out_t *l_tx_prev_out =
                                 l_list_out_prev_item ? (dap_chain_tx_out_t*)l_list_out_prev_item->data : NULL;
                         // print value from prev out item
-                        char *l_balance = dap_chain_balance_print(l_tx_prev_out->header.value);
+                        char *l_balance = l_tx_prev_out ? dap_chain_balance_print(l_tx_prev_out->header.value) : NULL;
                         dap_string_append_printf(l_str_out, "  prev OUT 256bit item value=%s",
-                                l_tx_prev_out ? l_balance : "0");
-                        DAP_DELETE(l_balance);
+                                l_balance ? l_balance : "0");
+                        DAP_DEL_Z(l_balance);
                     } else {
                         dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev,
                                 TX_ITEM_TYPE_OUT_OLD, NULL);
@@ -707,7 +703,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                         break;
                     }
                     l_sht = DAP_NEW_Z(dap_chain_tx_hash_processed_ht_t);
-                    memcpy(&l_sht->hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t));
+                    l_sht->hash = l_tx_hash;
                     HASH_ADD(hh, a_tx_hash_processed, hash, sizeof(dap_chain_hash_fast_t), l_sht);
                     l_tx_num++;
                 } break;
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 911dd035f443dd7811d5d06fe99b9b78c0d1c06e..056da9cba38412bfe56a29478016856fe4a7e92d 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -20,6 +20,7 @@
  along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include "dap_time.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <time.h>
@@ -378,8 +379,7 @@ static void s_ch_chain_callback_notify_packet_in2(dap_stream_ch_chain_net_t* a_c
     // get new generated current node address
     case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE: {
         if(a_pkt_net_data_size == sizeof(dap_chain_node_addr_t)) {
-            dap_chain_node_addr_t *l_addr = (dap_chain_node_addr_t *) a_pkt_net->data;
-            memcpy(&l_node_client->cur_node_addr, l_addr, sizeof(dap_chain_node_addr_t));
+            l_node_client->cur_node_addr = *(dap_chain_node_addr_t*)a_pkt_net->data;
         }
         l_node_client->state = NODE_CLIENT_STATE_NODE_ADDR_LEASED;
 #ifndef _WIN32
@@ -393,8 +393,7 @@ static void s_ch_chain_callback_notify_packet_in2(dap_stream_ch_chain_net_t* a_c
     case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR: {
 
         if(a_pkt_net_data_size == sizeof(dap_chain_node_addr_t)) {
-            dap_chain_node_addr_t *l_addr = (dap_chain_node_addr_t *) a_pkt_net->data;
-            memcpy(&l_node_client->remote_node_addr, l_addr, sizeof(dap_chain_node_addr_t));
+            l_node_client->remote_node_addr = *(dap_chain_node_addr_t*)a_pkt_net->data;
         }
         l_node_client->state = NODE_CLIENT_STATE_GET_NODE_ADDR;
 #ifndef _WIN32
@@ -650,8 +649,8 @@ static int s_save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_req
     int l_ret = 0;
     if(!a_request)
         return -1;
-    long l_t1_ms = a_request->send_time1.tv_sec * 1000 + a_request->send_time1.tv_nsec / 1e6;
-    long l_t2_ms = a_request->recv_time1.tv_sec * 1000 + a_request->recv_time1.tv_nsec / 1e6;
+    long l_t1_ms = a_request->send_time1 / 1e6;
+    long l_t2_ms = a_request->recv_time1 / 1e6;
     struct json_object *jobj = json_object_new_object();
     time_t l_cur_t = time(NULL);
     char buf[1024];
@@ -756,7 +755,7 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t
     l_node_client->state = NODE_CLIENT_STATE_DISCONNECTED;
     l_node_client->callbacks_arg = a_callback_arg;
     if(a_callbacks)
-        memcpy(&l_node_client->callbacks,a_callbacks,sizeof (*a_callbacks));
+        l_node_client->callbacks = *a_callbacks;
     l_node_client->info = DAP_DUP(a_node_info);
     l_node_client->uuid = dap_uuid_generate_uint64();
     l_node_client->net = a_net;
@@ -1044,7 +1043,7 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
                 l_ch_chain->callback_notify_packet_in = s_ch_chain_callback_notify_packet_in;
                 l_ch_chain->callback_notify_arg = l_node_client;
                 l_node_client->ch_chain = l_ch;
-                memcpy(&l_node_client->ch_chain_uuid, &l_ch->uuid, sizeof(dap_stream_ch_uuid_t));
+                l_node_client->ch_chain_uuid = l_ch->uuid;
             }
             // N
             if(a_ch_id == dap_stream_ch_chain_net_get_id()) {
@@ -1052,7 +1051,7 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
                 l_ch_chain->notify_callback = s_ch_chain_callback_notify_packet_in2;
                 l_ch_chain->notify_callback_arg = l_node_client;
                 l_node_client->ch_chain_net = l_ch;
-                memcpy(&l_node_client->ch_chain_net_uuid, &l_ch->uuid, sizeof(dap_stream_ch_uuid_t));
+                l_node_client->ch_chain_net_uuid = l_ch->uuid;
             }
             // R
             if(a_ch_id == dap_stream_ch_chain_net_srv_get_id()) {
@@ -1066,7 +1065,7 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
                     l_ch_chain->notify_callback_arg = l_node_client;
                 }
                 l_node_client->ch_chain_net_srv = l_ch;
-                memcpy(&l_node_client->ch_chain_net_srv_uuid, &l_ch->uuid, sizeof(dap_stream_ch_uuid_t));
+                l_node_client->ch_chain_net_srv_uuid = l_ch->uuid;
             }
             // V
             if ( a_ch_id == dap_stream_ch_chain_voting_get_id() ) {
@@ -1074,7 +1073,7 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id)
                 // l_ch_chain->callback_notify = s_ch_chain_callback_notify_voting_packet_in;
                 l_ch_chain->callback_notify_arg = l_node_client;
                 l_node_client->ch_chain_net = l_ch;
-                memcpy(&l_node_client->ch_chain_net_uuid, &l_ch->uuid, sizeof(dap_stream_ch_uuid_t));    
+                l_node_client->ch_chain_net_uuid = l_ch->uuid;
             }
             l_ret = 0;
         } else {
diff --git a/modules/net/dap_chain_node_ping.c b/modules/net/dap_chain_node_ping.c
index f37d61452ea1e36eaf9a38e8ce300288bf81920c..6a54f4ac2c8c5e0df7bad85236db1c0852138e9e 100644
--- a/modules/net/dap_chain_node_ping.c
+++ b/modules/net/dap_chain_node_ping.c
@@ -79,14 +79,11 @@
 
 static void* node_ping_proc(void *a_arg)
 {
-    struct in_addr l_addr = {};
-    int l_port = 0;
-    int l_count;
     if(!a_arg)
-        return NULL ;
-    memcpy(&l_count, a_arg, sizeof(int));
-    memcpy(&l_port, (a_arg + sizeof(int)), sizeof(int));
-    memcpy(&l_addr, (a_arg + 2 * sizeof(int)), sizeof(struct in_addr));
+        return NULL;
+    int l_count = *(int*)a_arg,
+        l_port  = *(int*)(a_arg + sizeof(int));
+    struct in_addr l_addr  = *(struct in_addr*)(a_arg + sizeof(int) * 2);
     DAP_DELETE(a_arg);
 
     char *host4 = DAP_NEW_SIZE(char, INET_ADDRSTRLEN);
diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index 51c9092bcfffeeede04b39693fe04d45a837451c..321120b7cf724a979f329d660cf4a7d9281693db 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -101,31 +101,28 @@ int dap_chain_net_srv_init()
         return -1;
 
     dap_cli_server_cmd_add ("net_srv", s_cli_net_srv, "Network services managment",
-        "net_srv -net <chain net name> order find [-direction {sell | buy}] [-srv_uid <Service UID>] [-price_unit <price unit>]\n"
-        "                                         [-price_token <Token ticker>] [-price_min <Price minimum>] [-price_max <Price maximum>]\n"
+        "net_srv -net <net_name> order find [-direction {sell | buy}] [-srv_uid <Service UID>] [-price_unit <price unit>]\n"
+        " [-price_token <Token ticker>] [-price_min <Price minimum>] [-price_max <Price maximum>]\n"
         "\tOrders list, all or by UID and/or class\n"
-        "net_srv -net <chain net name> order delete -hash <Order hash>\n"
+        "net_srv -net <net_name> order delete -hash <Order hash>\n"
         "\tOrder delete\n"
-        "net_srv -net <chain net name> order dump -hash <Order hash>\n"
+        "net_srv -net <net_name> order dump -hash <Order hash>\n"
         "\tOrder dump info\n"
-        "net_srv -net <chain net name> order create -direction {sell | buy} -srv_uid <Service UID> -price <Price>\n"
-        "        -price_unit <Price Unit> -price_token <Token ticker> [-node_addr <Node Address>] [-tx_cond <TX Cond Hash>]\n"
-        "        [-expires <Unix time when expires>] [-cert <cert name to sign order>]\n"
-        "        [{-ext <Extension with params> | -region <Region name> -continent <Continent name>}]\n"
+        "net_srv -net <net_name> order create -direction {sell | buy} -srv_uid <Service UID> -price <Price>\n"
+        " -price_unit <Price Unit> -price_token <token_ticker> [-node_addr <Node Address>] [-tx_cond <TX Cond Hash>]\n"
+        " [-expires <Unix time when expires>] [-cert <cert name to sign order>]\n"
+        " [{-ext <Extension with params> | -region <Region name> -continent <Continent name>}]\n"
 #ifdef DAP_MODULES_DYNAMIC
         "\tOrder create\n"
-            "net_srv -net <chain net name> order static [save | delete]\n"
+            "net_srv -net <net_name> order static [save | delete]\n"
             "\tStatic nodelist create/delete\n"
-            "net_srv -net <chain net name> order recheck\n"
+            "net_srv -net <net_name> order recheck\n"
             "\tCheck the availability of orders\n"
 #endif
         );
 
     s_load_all();
 
-    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY, dap_chain_net_srv_pay_verificator, NULL);
-    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE, dap_chain_ledger_fee_verificator, NULL);
-
     return 0;
 }
 
@@ -308,7 +305,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                     if(l_ext) {
                         l_order->ext_size = strlen(l_ext) + 1;
                         l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size);
-                        strncpy((char *)l_order->ext_n_sign, l_ext, l_order->ext_size);
+                        memcpy(l_order->ext_n_sign, l_ext, l_order->ext_size);
                     }
                     else
                         dap_chain_net_srv_order_set_continent_region(&l_order, l_continent_num, l_region_str);
@@ -727,10 +724,10 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,
         l_srv = DAP_NEW_Z(dap_chain_net_srv_t);
         l_srv->uid.uint64 = a_uid.uint64;
         if (a_callbacks)
-            memcpy(&l_srv->callbacks, a_callbacks, sizeof(*a_callbacks));
+            l_srv->callbacks = *a_callbacks;
         pthread_mutex_init(&l_srv->banlist_mutex, NULL);
         l_sdata = DAP_NEW_Z(service_list_t);
-        memcpy(&l_sdata->uid, &l_uid, sizeof(l_uid));
+        l_sdata->uid = l_uid;
         strncpy(l_sdata->name, a_config_section, sizeof(l_sdata->name));
         l_sdata->srv = l_srv;
         dap_chain_net_srv_parse_pricelist(l_srv, a_config_section);
diff --git a/modules/net/srv/dap_chain_net_srv_client.c b/modules/net/srv/dap_chain_net_srv_client.c
index ace4bf6002ab4d0348d8a94865426775edf9d597..6084e6895177ba0f05129d6f4977469e61ec3eb2 100644
--- a/modules/net/srv/dap_chain_net_srv_client.c
+++ b/modules/net/srv/dap_chain_net_srv_client.c
@@ -27,6 +27,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_chain_net_srv.h"
 #include "dap_chain_net_srv_client.h"
 #include "dap_common.h"
+#include "dap_time.h"
 
 #define LOG_TAG "dap_chain_net_srv_client"
 
@@ -41,7 +42,7 @@ dap_chain_net_srv_client_t *dap_chain_net_srv_client_create_n_connect(dap_chain_
 {
     dap_chain_net_srv_client_t *l_ret = DAP_NEW_Z(dap_chain_net_srv_client_t);
     if (a_callbacks)
-        memcpy(&l_ret->callbacks, a_callbacks, sizeof(*a_callbacks));
+        l_ret->callbacks = *a_callbacks;
     l_ret->callbacks_arg = a_callbacks_arg;
     dap_chain_node_client_callbacks_t l_callbacks = {
         .connected = s_srv_client_callback_connected,
@@ -79,7 +80,7 @@ static void s_srv_client_callback_connected(dap_chain_node_client_t *a_node_clie
 {
     log_it(L_INFO, "Service client connected well");
     dap_chain_net_srv_client_t *l_srv_client = (dap_chain_net_srv_client_t *)a_arg;
-    memcpy(&l_srv_client->ch_uuid, &a_node_client->ch_chain_net_srv_uuid, sizeof(l_srv_client->ch_uuid));
+    l_srv_client->ch_uuid = a_node_client->ch_chain_net_srv_uuid;
     l_srv_client->net_client = a_node_client->client;
     if (l_srv_client->callbacks.connected)
         l_srv_client->callbacks.connected(l_srv_client, l_srv_client->callbacks_arg);
@@ -119,9 +120,7 @@ static void s_srv_client_pkt_in(dap_stream_ch_chain_net_srv_t *a_ch_chain, uint8
                                               l_srv_client->callbacks_arg);
             break;
         }
-        struct timespec l_recv_time;
-        clock_gettime(CLOCK_REALTIME, &l_recv_time);
-        l_response->recv_time1 = l_recv_time;
+        l_response->recv_time1 = dap_nanotime_now();
         dap_chain_hash_fast_t l_data_hash;
         dap_hash_fast(l_response->data, l_response->data_size, &l_data_hash);
         if (!dap_hash_fast_compare(&l_data_hash, &l_response->data_hash)) {
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index f40ce0b7535191cf4aada0dc42ec4b553b4bd200..8619797b6a0175093e82d93ad1029c3c6c651942 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -96,7 +96,7 @@ size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order)
         return 0;
     size_t l_sign_size = 0;
     if (a_order->version == 3) {
-        dap_sign_t *l_sign = (dap_sign_t *)&a_order->ext_n_sign[a_order->ext_size];
+        dap_sign_t *l_sign = (dap_sign_t *)(a_order->ext_n_sign + a_order->ext_size);
         if (l_sign->header.type.type == SIG_TYPE_NULL)
             l_sign_size = sizeof(dap_sign_type_t);
         else
@@ -314,7 +314,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(dap_chain_net_t *a_ne
     if ( a_node_addr.uint64)
         l_order->node_addr.uint64 = a_node_addr.uint64;
 
-    memcpy(&l_order->tx_cond_hash, &a_tx_cond_hash, DAP_CHAIN_HASH_FAST_SIZE);
+    l_order->tx_cond_hash = a_tx_cond_hash;
     l_order->price = *a_price;
     l_order->price_unit.uint32 = a_price_unit.uint32;
 
@@ -327,7 +327,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(dap_chain_net_t *a_ne
     }
     size_t l_sign_size = dap_sign_get_size(l_sign); // sign data
     l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size + l_sign_size);
-    memcpy(&l_order->ext_n_sign[l_order->ext_size], l_sign, l_sign_size);
+    memcpy(l_order->ext_n_sign + l_order->ext_size, l_sign, l_sign_size);
     return l_order;
 }
 
@@ -376,20 +376,20 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order, size_t
 #endif
     l_ret->direction = l_old->direction;
     l_ret->node_addr.uint64 = l_old->node_addr.uint64;
-    memcpy(&l_ret->tx_cond_hash, &l_old->tx_cond_hash, sizeof(dap_chain_hash_fast_t));
+    l_ret->tx_cond_hash = l_old->tx_cond_hash;
     l_ret->price_unit.uint32 = l_old->price_unit.uint32;
     l_ret->ts_created = l_old->ts_created;
     l_ret->ts_expires = l_old->ts_expires;
     l_ret->price = dap_chain_uint256_from(l_old->price);
     strncpy(l_ret->price_ticker, l_old->price_ticker, DAP_CHAIN_TICKER_SIZE_MAX);
     l_ret->ext_size = l_old->ext_size;
-    memcpy(&l_ret->ext_n_sign, &l_old->ext, l_old->ext_size);
+    memcpy(l_ret->ext_n_sign, l_old->ext, l_old->ext_size);
     dap_sign_t *l_sign = (dap_sign_t *)&l_old->ext[l_old->ext_size];
     size_t l_sign_size = l_old->version == 1 ? 0 : dap_sign_get_size(l_sign);
     if (l_sign_size)
-        memcpy(&l_ret->ext_n_sign[l_ret->ext_size], l_sign, l_sign_size);
+        memcpy(l_ret->ext_n_sign + l_ret->ext_size, l_sign, l_sign_size);
     else
-        ((dap_sign_type_t *)&l_ret->ext_n_sign[l_ret->ext_size])->type = SIG_TYPE_NULL;
+        ((dap_sign_type_t *)(l_ret->ext_n_sign + l_ret->ext_size))->type = SIG_TYPE_NULL;
     return l_ret;
 }
 
@@ -615,7 +615,7 @@ static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const
             if (l_order->version != 2) {
                 dap_global_db_del_unsafe(l_gdb_context, a_group, a_key);
             } else {
-                dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext_n_sign[l_order->ext_size];
+                dap_sign_t *l_sign = (dap_sign_t *)(l_order->ext_n_sign + l_order->ext_size);
                 if (!dap_sign_verify_size(l_sign, a_value_len) ||
                         dap_sign_verify(l_sign, l_order,
                                         sizeof(dap_chain_net_srv_order_t) + l_order->ext_size) != 1) {
diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h
index e42da15fa07f4eb2493ff6046702cee35b52ea39..b747dc4e6a696969aa2e602faaae9d4b544d03ae 100755
--- a/modules/net/srv/include/dap_chain_net_srv.h
+++ b/modules/net/srv/include/dap_chain_net_srv.h
@@ -32,6 +32,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_common.h"
 #include "dap_config.h"
 #include "dap_stream_ch.h"
+#include "dap_time.h"
 
 //Service direction
 enum dap_chain_net_srv_order_direction{
@@ -169,8 +170,8 @@ typedef struct dap_stream_ch_chain_net_srv_pkt_test {
     dap_chain_net_id_t      net_id;
     dap_chain_net_srv_uid_t srv_uid;
     int32_t                 time_connect_ms;
-    struct timespec         recv_time1, recv_time2, send_time1, send_time2;
-    byte_t                  ip_send[INET_ADDRSTRLEN], ip_recv[INET_ADDRSTRLEN];
+    dap_nanotime_t          recv_time1, recv_time2, send_time1, send_time2;
+    char                  ip_send[INET_ADDRSTRLEN], ip_recv[INET_ADDRSTRLEN];
     int32_t                 err_code;
     uint64_t                data_size_send, data_size_recv, data_size;
     dap_chain_hash_fast_t   data_hash;
diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c
index 9362ed3f250cd9d97573d994ef9ac6e1bdd9afb6..2f406f452f7bddec553d79d96aa8b154602bfcf6 100644
--- a/modules/service/datum/dap_chain_net_srv_datum.c
+++ b/modules/service/datum/dap_chain_net_srv_datum.c
@@ -257,7 +257,7 @@ void s_order_notficator(void *a_arg, const char a_op_code, const char *a_group,
         log_it(L_DEBUG, "Condition with required subtype SRV_PAY not found in requested tx");
     }
     dap_hash_fast_t l_sign_hash;
-    if (!dap_sign_get_pkey_hash((dap_sign_t *)&l_order->ext_n_sign[l_order->ext_size], &l_sign_hash)) {
+    if (!dap_sign_get_pkey_hash((dap_sign_t *)(l_order->ext_n_sign + l_order->ext_size), &l_sign_hash)) {
          log_it(L_DEBUG, "Wrong order sign");
          return;
     }
diff --git a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c
index 2f4ec0b8804c6b00d64ea5527bb4f2ee89c78c45..c665c87c831adfbb6b56583f98a6cda1847392e4 100644
--- a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c
+++ b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c
@@ -32,46 +32,49 @@
 #include "dap_hash.h"
 #include "dap_time.h"
 
+static bool s_debug_more = false;
+
 enum error_code {
-	STAKE_NO_ERROR = 0,
-	NET_ARG_ERROR = 1,
-	NET_ERROR = 2,
-	TOKEN_ARG_ERROR = 3,
-	TOKEN_ERROR = 4,
-	COINS_ARG_ERROR = 5,
-	COINS_FORMAT_ERROR = 6,
-	ADDR_ARG_ERROR = 7,
-	ADDR_FORMAT_ERROR = 8,
-	CERT_ARG_ERROR = 9,
-	CERT_LOAD_ERROR = 10,
-	CHAIN_ERROR = 11,
-	CHAIN_EMISSION_ERROR = 12,
-	TIME_ERROR = 13,
-	NO_MONEY_ERROR = 14,
-	WALLET_ARG_ERROR = 15,
-	WALLET_OPEN_ERROR = 16,
-	CERT_KEY_ERROR = 17,
-	WALLET_ADDR_ERROR = 18,
-	STAKE_ERROR = 19,
-	TX_ARG_ERROR = 20,
-	HASH_IS_BLANK_ERROR = 21,
-	NO_TX_ERROR = 22,
-	CREATE_LOCK_TX_ERROR = 23,
-	TX_TIKET_ERROR = 24,
-	NO_DELEGATE_TOKEN_ERROR = 25,
-	NO_VALID_SUBTYPE_ERROR = 26,
-	IS_USED_OUT_ERROR = 27,
-	OWNER_KEY_ERROR = 28,
-	CREATE_TX_ERROR = 29,
-	CREATE_BURNING_TX_ERROR = 31,
-	CREATE_RECEIPT_ERROR = 32,
-	SIGN_ERROR = 33,
-	CREATE_DATUM_ERROR = 34,
-	ADD_DATUM_BURNING_TX_ERROR = 35,
-	ADD_DATUM_TX_TAKE_ERROR = 36,
-	BASE_TX_CREATE_ERROR = 37,
-	WRONG_PARAM_SIZE = 38,
-	NOT_ENOUGH_TIME = 39
+    STAKE_NO_ERROR              = 0,
+    NET_ARG_ERROR               = 1,
+    NET_ERROR                   = 2,
+    TOKEN_ARG_ERROR             = 3,
+    TOKEN_ERROR                 = 4,
+    COINS_ARG_ERROR             = 5,
+    COINS_FORMAT_ERROR          = 6,
+    ADDR_ARG_ERROR              = 7,
+    ADDR_FORMAT_ERROR           = 8,
+    CERT_ARG_ERROR              = 9,
+    CERT_LOAD_ERROR             = 10,
+    CHAIN_ERROR                 = 11,
+    CHAIN_EMISSION_ERROR        = 12,
+    TIME_ERROR                  = 13,
+    NO_MONEY_ERROR              = 14,
+    WALLET_ARG_ERROR            = 15,
+    WALLET_OPEN_ERROR           = 16,
+    CERT_KEY_ERROR              = 17,
+    WALLET_ADDR_ERROR           = 18,
+    STAKE_ERROR                 = 19,
+    TX_ARG_ERROR                = 20,
+    HASH_IS_BLANK_ERROR         = 21,
+    NO_TX_ERROR                 = 22,
+    CREATE_LOCK_TX_ERROR        = 23,
+    TX_TICKER_ERROR             = 24,
+    NO_DELEGATE_TOKEN_ERROR     = 25,
+    NO_VALID_SUBTYPE_ERROR      = 26,
+    IS_USED_OUT_ERROR           = 27,
+    OWNER_KEY_ERROR             = 28,
+    CREATE_TX_ERROR             = 29,
+    CREATE_BURNING_TX_ERROR     = 31,
+    CREATE_RECEIPT_ERROR        = 32,
+    SIGN_ERROR                  = 33,
+    CREATE_DATUM_ERROR          = 34,
+    ADD_DATUM_BURNING_TX_ERROR  = 35,
+    ADD_DATUM_TX_TAKE_ERROR     = 36,
+    BASE_TX_CREATE_ERROR        = 37,
+    WRONG_PARAM_SIZE            = 38,
+    NOT_ENOUGH_TIME             = 39,
+    REINVEST_ARG_ERROR          = 40
 };
 
 /**
@@ -80,20 +83,27 @@ enum error_code {
 typedef struct cond_params {
 	dap_time_t		time_unlock;
 	uint32_t		flags;
-	uint8_t			padding[8];
+    uint8_t			reinvest;
+    uint8_t			padding[7];
 	dap_hash_fast_t	token_delegated; // Delegate token
 	dap_hash_fast_t	pkey_delegated; // Delegate public key
 } DAP_ALIGN_PACKED	cond_params_t;
 
+typedef struct dap_chain_ledger_token_emission_for_stake_lock_item {
+    dap_chain_hash_fast_t	datum_token_emission_for_stake_lock_hash;
+    dap_chain_hash_fast_t	tx_used_out;
+//	const char 				datum_token_emission_hash[DAP_CHAIN_HASH_FAST_STR_SIZE];
+    UT_hash_handle hh;
+} dap_chain_ledger_token_emission_for_stake_lock_item_t;
+
 #define LOG_TAG		"dap_chain_net_stake_lock"
 #define MONTH_INDEX	8
 #define YEAR_INDEX	12
 
 static int s_cli_stake_lock(int a_argc, char** a_argv, char** a_str_reply);
 // Verificator callbacks
-static bool	s_callback_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond_t* a_cond, dap_chain_datum_tx_t* a_tx, bool a_owner);
-static bool	s_callback_verificator_added(dap_ledger_t* a_ledger, dap_chain_datum_tx_t* a_tx, dap_chain_tx_out_cond_t* a_tx_item);
 static void s_callback_decree(dap_chain_net_srv_t* a_srv, dap_chain_net_t* a_net, dap_chain_t* a_chain, dap_chain_datum_decree_t* a_decree, size_t a_decree_size);
+dap_chain_ledger_token_emission_for_stake_lock_item_t *s_emission_for_stake_lock_item_add(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_token_emission_hash);
 
 /**
  * @brief dap_chain_net_srv_external_stake_init
@@ -102,17 +112,17 @@ static void s_callback_decree(dap_chain_net_srv_t* a_srv, dap_chain_net_t* a_net
 int dap_chain_net_srv_stake_lock_init()
 {
 	dap_cli_server_cmd_add("stake_lock", s_cli_stake_lock, "Stake lock service commands",
-		"stake_lock hold -net <net name> -wallet <wallet name> -time_staking <in rfc822>\n"
-		"-token <ticker> -coins <value> -cert <name> -chain <chain (not necessary)> -chain_emission <chain (not necessary)>\n"
-		"stake_lock take -net <net name> -tx <transaction hash> -wallet <wallet name>\n"
-		"-chain <chain (not necessary)>\n"
+        "stake_lock hold -net <net_name> -wallet <wallet_name> -time_staking <in YYMMDD>\n"
+        "\t-token <token_ticker> -coins <value> -reinvest <percentage from 1 to 100 (not necessary)>\n"
+        "\t-cert <priv_cert_name> -chain <chain (not necessary)> -chain_emission <chain (not necessary)>\n"
+        "stake_lock take -net <net_name> -tx <transaction_hash> -wallet <wallet_name>\n"
+        "\t-chain <chain (not necessary)>\n"
 	);
-	dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK,
-		s_callback_verificator, s_callback_verificator_added);
+    s_debug_more = dap_config_get_item_bool_default(g_config,"ledger","debug_more",false);
 
-	dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_LOCK_ID };
-	dap_chain_net_srv_callbacks_t l_srv_callbacks = {};
-	l_srv_callbacks.decree = s_callback_decree;
+    dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_LOCK_ID };
+    dap_chain_net_srv_callbacks_t l_srv_callbacks = {};
+    l_srv_callbacks.decree = s_callback_decree;
 
 	dap_chain_net_srv_t* l_srv = dap_chain_net_srv_add(l_uid, "stake_lock", &l_srv_callbacks);
 	return 0;
@@ -171,24 +181,30 @@ static dap_chain_datum_tx_receipt_t* s_receipt_create(dap_hash_fast_t* hash_burn
  */
 static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, dap_string_t* output_line)
 {
-	const char* l_net_str, * l_token_str, * l_coins_str, * l_wallet_str, * l_cert_str, * l_chain_str, * l_chain_emission_str, * l_time_staking_str;
-	l_net_str = l_token_str = l_coins_str = l_wallet_str = l_cert_str = l_chain_str = l_chain_emission_str = l_time_staking_str = NULL;
-	const char* l_wallets_path = dap_chain_wallet_get_path(g_config);
-	char 					delegate_token_str[DAP_CHAIN_TICKER_SIZE_MAX] = { [0] = 'm' };
-	dap_chain_net_t* l_net = NULL;
-	dap_chain_t* l_chain = NULL;
-	dap_chain_t* l_chain_emission = NULL;
-	dap_chain_net_srv_uid_t	l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_LOCK_ID };
-	dap_time_t              l_time_staking = 0;
-	char* l_hash_str;
-	dap_hash_fast_t* l_tx_cond_hash;
-	dap_hash_fast_t* l_base_tx_hash;
-	dap_enc_key_t* l_key_from;
-	dap_pkey_t* l_key_cond;
-	uint256_t 				l_value;
-	dap_chain_wallet_t* l_wallet;
-	dap_chain_addr_t* l_addr_holder;
-	dap_cert_t* l_cert;
+    const char *l_net_str, *l_ticker_str, *l_coins_str, *l_wallet_str, *l_cert_str, *l_chain_str, *l_chain_emission_str, *l_time_staking_str, *l_reinvest_percent_str;
+    l_net_str = l_ticker_str = l_coins_str = l_wallet_str = l_cert_str = l_chain_str = l_chain_emission_str = l_time_staking_str = l_reinvest_percent_str = NULL;
+    const char *l_wallets_path								=	dap_chain_wallet_get_path(g_config);
+    char 	delegate_ticker_str[DAP_CHAIN_TICKER_SIZE_MAX] 	=	{[0] = 'm'};
+    dap_chain_net_t						*l_net				=	NULL;
+    dap_chain_t							*l_chain			=	NULL;
+    dap_chain_t							*l_chain_emission	=	NULL;
+    dap_chain_net_srv_uid_t				l_uid				=	{ .uint64 = DAP_CHAIN_NET_SRV_STAKE_LOCK_ID };
+    dap_time_t              			l_time_staking		=	0;
+    uint8_t								l_reinvest_percent	=	0;
+    uint256_t							l_value_delegated	=	{};
+    uint256_t 							l_value;
+    dap_ledger_t						*l_ledger;
+    char								*l_hash_str;
+    dap_hash_fast_t						*l_tx_cond_hash;
+    dap_hash_fast_t 					*l_base_tx_hash;
+    dap_enc_key_t						*l_key_from;
+    dap_pkey_t							*l_key_cond;
+    dap_chain_wallet_t					*l_wallet;
+    dap_chain_addr_t					*l_addr_holder;
+    dap_cert_t							*l_cert;
+    dap_chain_datum_token_t 			*delegate_token;
+    dap_tsd_t							*l_tsd;
+    dap_chain_datum_token_tsd_delegate_from_stake_lock_t l_tsd_section;
 
 	dap_string_append_printf(output_line, "---> HOLD <---\n");
 
@@ -201,25 +217,46 @@ static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, da
 		return NET_ERROR;
 	}
 
-	if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-token", &l_token_str)
-		|| NULL == l_token_str
-		|| dap_strlen(l_token_str) > 8) // for 'm' delegated
+    if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-token", &l_ticker_str)
+        || NULL == l_ticker_str
+        || dap_strlen(l_ticker_str) > 8) // for 'm' delegated
 		return TOKEN_ARG_ERROR;
 
-	if (NULL == dap_chain_ledger_token_ticker_check(l_net->pub.ledger, l_token_str)) {
-		dap_string_append_printf(output_line, "'%s'", l_token_str);
+    l_ledger = l_net->pub.ledger;
+    if (NULL == dap_chain_ledger_token_ticker_check(l_ledger, l_ticker_str)) {
+        dap_string_append_printf(output_line, "'%s'", l_ticker_str);
 		return TOKEN_ERROR;
 	}
 
-	strcpy(delegate_token_str + 1, l_token_str);
+    strcpy(delegate_ticker_str + 1, l_ticker_str);
+
+    if (NULL == (delegate_token = dap_chain_ledger_token_ticker_check(l_ledger, delegate_ticker_str))
+    ||	delegate_token->type != DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL
+    ||	!delegate_token->header_native_decl.tsd_total_size
+    ||	NULL == (l_tsd = dap_tsd_find(delegate_token->data_n_tsd, delegate_token->header_native_decl.tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK))) {
+        dap_string_append_printf(output_line, "'%s'", delegate_ticker_str);
+        return NO_DELEGATE_TOKEN_ERROR;
+    }
 
-	if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-coins", &l_coins_str)
+    l_tsd_section = dap_tsd_get_scalar(l_tsd, dap_chain_datum_token_tsd_delegate_from_stake_lock_t);
+    if (strcmp(l_ticker_str, l_tsd_section.ticker_token_from))
+        return TOKEN_ERROR;
+
+    if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-coins", &l_coins_str)
 		|| NULL == l_coins_str)
 		return COINS_ARG_ERROR;
 
 	if (IS_ZERO_256((l_value = dap_chain_balance_scan(l_coins_str))))
 		return COINS_FORMAT_ERROR;
 
+    if (!IS_ZERO_256(l_tsd_section.emission_rate)) {
+        MULT_256_COIN(l_value, l_tsd_section.emission_rate, &l_value_delegated);
+        if (IS_ZERO_256(l_value_delegated))
+            return COINS_FORMAT_ERROR;
+    } else {
+        l_value_delegated = l_value;
+    }
+
 	if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-cert", &l_cert_str)
 		|| NULL == l_cert_str)
 		return CERT_ARG_ERROR;
@@ -254,18 +291,27 @@ static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, da
 		|| NULL == l_time_staking_str)
 		return TIME_ERROR;
 
-	if (0 == (l_time_staking = dap_time_from_str_rfc822(l_time_staking_str))
+    if (0 == (l_time_staking = dap_time_from_str_simplified(l_time_staking_str))
 		|| (time_t)(l_time_staking - dap_time_now()) <= 0)
 		return TIME_ERROR;
 
 	l_time_staking -= dap_time_now();
 
+    if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-l_reinvest_percent", &l_reinvest_percent_str)
+    &&	NULL != l_reinvest_percent_str) {
+        if ((l_reinvest_percent  = atoi(l_reinvest_percent_str)) > 100
+        ||	l_reinvest_percent <= 0)
+            return REINVEST_ARG_ERROR;
+    }
+
+    /*________________________________________________________________________________________________________________*/
+
 	if (NULL == (l_wallet = dap_chain_wallet_open(l_wallet_str, l_wallets_path))) {
 		dap_string_append_printf(output_line, "'%s'", l_wallet_str);
 		return WALLET_OPEN_ERROR;
 	}
 
-	if (compare256(dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_token_str), l_value) == -1) {
+    if (compare256(dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_ticker_str), l_value) == -1) {
 		dap_chain_wallet_close(l_wallet);
 		return NO_MONEY_ERROR;
 	}
@@ -284,8 +330,9 @@ static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, da
 		return CERT_KEY_ERROR;
 	}
 
-	l_tx_cond_hash = dap_chain_net_srv_stake_lock_mempool_create(l_net, l_key_from, l_key_cond, l_token_str,
-		l_value, l_uid, l_addr_holder, l_time_staking);
+    l_tx_cond_hash = dap_chain_net_srv_stake_lock_mempool_create(l_net, l_key_from, l_key_cond,
+                                                                 l_ticker_str, l_value, l_uid,
+                                                                 l_addr_holder, l_time_staking, l_reinvest_percent);
 
 	dap_chain_wallet_close(l_wallet);
 	DAP_DEL_Z(l_key_cond);
@@ -302,8 +349,9 @@ static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, da
 	DAP_DEL_Z(l_hash_str);
 
 	l_base_tx_hash = dap_chain_mempool_base_tx_create(l_chain_emission, l_tx_cond_hash, l_chain_emission->id,
-		l_value, delegate_token_str, l_addr_holder,
-		&l_cert, 1);
+                                                      l_value_delegated, delegate_ticker_str, l_addr_holder,
+                                                      &l_cert, 1);
+
 
 	l_hash_str = (l_base_tx_hash) ? dap_chain_hash_fast_to_str_new(l_base_tx_hash) : NULL;
 
@@ -325,31 +373,32 @@ static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, da
 
 static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, dap_string_t* output_line)
 {
-	const char* l_net_str, * l_token_str, * l_wallet_str, * l_tx_str, * l_tx_burning_str, * l_chain_str;
-	l_net_str = l_token_str = l_wallet_str = l_tx_str = l_tx_burning_str = l_chain_str = NULL;
+    const char *l_net_str, *l_ticker_str, *l_wallet_str, *l_tx_str, *l_tx_burning_str, *l_chain_str;
+    l_net_str = l_ticker_str = l_wallet_str = l_tx_str = l_tx_burning_str = l_chain_str = NULL;
 	dap_chain_net_t* l_net = NULL;
 	const char* l_wallets_path = dap_chain_wallet_get_path(g_config);
-	dap_chain_net_srv_price_unit_uid_t	l_unit = { .uint32 = SERV_UNIT_UNDEFINED };
-	dap_chain_net_srv_uid_t				l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_LOCK_ID };
-	char 	delegate_token_str[DAP_CHAIN_TICKER_SIZE_MAX] = { [0] = 'm' };
-	int									l_prev_cond_idx = 0;
-	cond_params_t* l_params;
-	char* l_datum_hash_str;
-	//	uint256_t 							l_value;
-	dap_ledger_t* l_ledger;
-	dap_chain_wallet_t* l_wallet;
+    char 	delegate_ticker_str[DAP_CHAIN_TICKER_SIZE_MAX] 	=	{[0] = 'm'};
+    int									l_prev_cond_idx     =   0;
+    uint256_t							l_value_delegated	= 	{};
+    cond_params_t                       *l_params;
+    char                                *l_datum_hash_str;
+    dap_ledger_t                        *l_ledger;
+    dap_chain_wallet_t                  *l_wallet;
 	dap_hash_fast_t						l_tx_hash;
 	dap_hash_fast_t 					l_tx_burning_hash;
-	dap_chain_datum_t* l_datum_burning_tx;
-	dap_chain_datum_tx_receipt_t* l_receipt;
-	dap_chain_datum_tx_t* l_tx;
-	dap_chain_datum_tx_t* l_cond_tx;
-	dap_chain_tx_out_cond_t* l_tx_out_cond;
-	dap_chain_addr_t* l_owner_addr;
-	dap_enc_key_t* l_owner_key;
+    dap_chain_datum_t                   *l_datum_burning_tx;
+    dap_chain_datum_tx_receipt_t        *l_receipt;
+    dap_chain_datum_tx_t                *l_tx;
+    dap_chain_datum_tx_t                *l_cond_tx;
+    dap_chain_tx_out_cond_t             *l_tx_out_cond;
+    dap_chain_addr_t                    *l_owner_addr;
+    dap_enc_key_t                       *l_owner_key;
 	size_t								l_tx_size;
-	dap_chain_datum_t* l_datum;
-	dap_chain_t* l_chain;
+    dap_chain_datum_t                   *l_datum;
+    dap_chain_t                         *l_chain;
+    dap_chain_datum_token_t				*delegate_token;
+    dap_tsd_t							*l_tsd;
+    dap_chain_datum_token_tsd_delegate_from_stake_lock_t l_tsd_section;
 
 	dap_string_append_printf(output_line, "---> TAKE <---\n");
 
@@ -379,15 +428,25 @@ static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, da
 	if (dap_hash_fast_is_blank(&l_tx_hash))
 		return HASH_IS_BLANK_ERROR;
 
-	l_ledger = dap_chain_ledger_by_net_name(l_net->pub.name);
+    l_ledger = l_net->pub.ledger;
 
-	if (NULL == (l_token_str = dap_chain_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_tx_hash)))
-		return TX_TIKET_ERROR;
+    if (NULL == (l_ticker_str = dap_chain_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_tx_hash)))
+        return TX_TICKER_ERROR;
 
-	strcpy(delegate_token_str + 1, l_token_str);
 
-	if (!dap_chain_ledger_token_ticker_check(l_ledger, delegate_token_str))
+    strcpy(delegate_ticker_str  + 1, l_ticker_str);
+
+    if (NULL == (delegate_token = dap_chain_ledger_token_ticker_check(l_ledger, delegate_ticker_str))
+        ||	delegate_token->type != DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL
+        ||	!delegate_token->header_native_decl.tsd_total_size
+        ||	NULL == (l_tsd = dap_tsd_find(delegate_token->data_n_tsd, delegate_token->header_native_decl.tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK))) {
+        dap_string_append_printf(output_line, "'%s'", delegate_ticker_str);
 		return NO_DELEGATE_TOKEN_ERROR;
+    }
+
+    l_tsd_section = dap_tsd_get_scalar(l_tsd, dap_chain_datum_token_tsd_delegate_from_stake_lock_t);
+    if (strcmp(l_ticker_str, l_tsd_section.ticker_token_from))
+        return TOKEN_ERROR;
 
 	l_cond_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, &l_tx_hash);
 
@@ -410,6 +469,14 @@ static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, da
 			return NOT_ENOUGH_TIME;
 	}
 
+    if (!IS_ZERO_256(l_tsd_section.emission_rate)) {
+        MULT_256_COIN(l_tx_out_cond->header.value, l_tsd_section.emission_rate, &l_value_delegated);
+        if (IS_ZERO_256(l_value_delegated))
+            return COINS_FORMAT_ERROR;
+    } else {
+        l_value_delegated = l_tx_out_cond->header.value;
+    }
+
 	if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-wallet", &l_wallet_str)
 		|| NULL == l_wallet_str)
 		return WALLET_ARG_ERROR;
@@ -443,7 +510,7 @@ static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, da
 
 	//add burning tx
 	if (NULL == (l_datum_burning_tx = dap_chain_burning_tx_create(l_chain, l_owner_key, l_owner_addr, NULL,
-		delegate_token_str, l_tx_out_cond->header.value))) {//malloc
+        delegate_ticker_str, l_value_delegated))) {//malloc
 		dap_chain_wallet_close(l_wallet);
 		DAP_DEL_Z(l_owner_addr);
 		dap_chain_datum_tx_delete(l_tx);
@@ -453,7 +520,7 @@ static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, da
 	//get tx hash
 	dap_hash_fast(l_datum_burning_tx->data, l_datum_burning_tx->header.data_size, &l_tx_burning_hash);
 
-	if (NULL == (l_receipt = s_receipt_create(&l_tx_burning_hash, delegate_token_str, l_tx_out_cond->header.value))) {
+    if (NULL == (l_receipt = s_receipt_create(&l_tx_burning_hash, delegate_ticker_str, l_value_delegated))) {
 		dap_chain_wallet_close(l_wallet);
 		DAP_DEL_Z(l_owner_addr);
 		dap_chain_datum_tx_delete(l_tx);
@@ -524,7 +591,7 @@ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line
 	} break;
 
 	case NET_ERROR: {
-		dap_string_append_printf(output_line, " - network not found");
+        dap_string_append_printf(output_line, "^^^ network not found");
 	} break;
 
 	case TOKEN_ARG_ERROR: {
@@ -532,7 +599,7 @@ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line
 	} break;
 
 	case TOKEN_ERROR: {
-		dap_string_append_printf(output_line, " - token ticker not found");
+        dap_string_append_printf(output_line, "^^^ token ticker not found");
 	} break;
 
 	case COINS_ARG_ERROR: {
@@ -556,7 +623,7 @@ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line
 	} break;
 
 	case CERT_LOAD_ERROR: {
-		dap_string_append_printf(output_line, " - can't load cert");
+        dap_string_append_printf(output_line, "^^^ can't load cert");
 	} break;
 
 	case CHAIN_ERROR: {
@@ -570,8 +637,8 @@ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line
 	} break;
 
 	case TIME_ERROR: {
-		dap_string_append_printf(output_line, "stake_ext command requires parameter '-time_staking' in rfc822 format\n"
-			"Example: \"Tue, 02 Aug 22 19:50:41 +0300\"");
+        dap_string_append_printf(output_line, "stake_ext command requires parameter '-time_staking' in simplified format YYMMDD\n"
+                                                                        "Example: \"220610\" == \"10 june 2022 00:00\"");
 	} break;
 
 	case NO_MONEY_ERROR: {
@@ -583,15 +650,15 @@ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line
 	} break;
 
 	case WALLET_OPEN_ERROR: {
-		dap_string_append_printf(output_line, " - can't open wallet");
+        dap_string_append_printf(output_line, "^^^ can't open wallet");
 	} break;
 
 	case CERT_KEY_ERROR: {
-		dap_string_append_printf(output_line, " - cert doesn't contain a valid public key");
+        dap_string_append_printf(output_line, "^^^ cert doesn't contain a valid public key");
 	} break;
 
 	case WALLET_ADDR_ERROR: {
-		dap_string_append_printf(output_line, " - failed to get wallet address");
+        dap_string_append_printf(output_line, "^^^ failed to get wallet address");
 	} break;
 
 	case TX_ARG_ERROR: {
@@ -603,7 +670,7 @@ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line
 	} break;
 
 	case NO_TX_ERROR: {
-		dap_string_append_printf(output_line, " - could not find transaction");
+        dap_string_append_printf(output_line, "^^^ could not find transaction");
 	} break;
 
 	case STAKE_ERROR: {
@@ -614,12 +681,12 @@ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line
 		dap_string_append_printf(output_line, "Not enough time has passed");
 	} break;
 
-	case TX_TIKET_ERROR: {
-		dap_string_append_printf(output_line, "ticket not found");
+    case TX_TICKER_ERROR: {
+        dap_string_append_printf(output_line, "ticker not found");
 	} break;
 
 	case NO_DELEGATE_TOKEN_ERROR: {
-		dap_string_append_printf(output_line, "delegated token not found");
+        dap_string_append_printf(output_line, " ^^^ delegated token not found");
 	} break;
 
 	case NO_VALID_SUBTYPE_ERROR: {
@@ -674,6 +741,10 @@ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line
 		dap_string_append_printf(output_line, "error while creating datum from transaction");
 	} break;
 
+    case REINVEST_ARG_ERROR: {
+        dap_string_append_printf(output_line, "reinvestment is set as a percentage from 1 to 100");
+    } break;
+
 	default: {
 		dap_string_append_printf(output_line, "STAKE_LOCK: Unrecognized error");
 	} break;
@@ -875,12 +946,24 @@ static char* s_update_date_by_using_month_count(char* time, uint8_t month_count)
  * @param a_owner
  * @return
  */
-static bool s_callback_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond_t* a_cond, dap_chain_datum_tx_t* a_tx, bool a_owner)
+bool s_callback_verificator(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner)
 {
+    dap_chain_datum_tx_t									*burning_tx					= NULL;
+    dap_chain_tx_out_t										*burning_transaction_out	= NULL;
+    uint256_t												l_value_delegated			= {};
+    dap_hash_fast_t											hash_burning_transaction;
+    dap_chain_datum_token_tsd_delegate_from_stake_lock_t	l_tsd_section;
+    dap_tsd_t												*l_tsd;
+    cond_params_t 											*l_params;
+    dap_chain_datum_tx_receipt_t							*l_receipt;
+    dap_chain_tx_out_t										*l_tx_out;
+    dap_chain_tx_in_cond_t									*l_tx_in_cond;
+    const char												*l_tx_ticker;
+    dap_chain_datum_token_t									*delegate_token;
 
 	/*if (!a_owner) TODO: ???
-		return false;*/
-	cond_params_t* l_params;
+    return false;*/
+
 	if (a_cond->params_size != sizeof(*l_params))// Wrong params size
 		return false;
 	l_params = (cond_params_t*)a_cond->params;
@@ -890,7 +973,7 @@ static bool s_callback_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond
 			return false;
 	}
 
-	dap_chain_datum_tx_receipt_t* l_receipt = (dap_chain_datum_tx_receipt_t*)dap_chain_datum_tx_item_get(a_tx, 0, TX_ITEM_TYPE_RECEIPT, 0);
+    l_receipt = (dap_chain_datum_tx_receipt_t *)dap_chain_datum_tx_item_get(a_tx, 0, TX_ITEM_TYPE_RECEIPT, 0);
 	if (!l_receipt)
 		return false;
 
@@ -902,26 +985,46 @@ static bool s_callback_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond
 		return false;
 #endif
 
-	dap_hash_fast_t hash_burning_transaction;
-	char ticker[DAP_CHAIN_TICKER_SIZE_MAX + 1];//not used TODO: check ticker?
-	if (l_receipt->exts_size) {
-		memcpy(&hash_burning_transaction, l_receipt->exts_n_signs, sizeof(dap_hash_fast_t));
-		strcpy(ticker, (char*)&l_receipt->exts_n_signs[sizeof(dap_hash_fast_t)]);
-	}
+    char delegated_ticker[DAP_CHAIN_TICKER_SIZE_MAX];
+    if (l_receipt->exts_size) {
+        hash_burning_transaction = *(dap_hash_fast_t*)l_receipt->exts_n_signs;
+        strcpy(delegated_ticker, (char *)&l_receipt->exts_n_signs[sizeof(dap_hash_fast_t)]);
+    } else {
+        return false;
+    }
 
 	if (dap_hash_fast_is_blank(&hash_burning_transaction))
 		return false;
 
-	dap_chain_datum_tx_t* burning_tx = NULL;
-	dap_chain_tx_out_t* burning_transaction_out = NULL;
-
-	dap_chain_tx_out_t* l_tx_out = (dap_chain_tx_out_t*)dap_chain_datum_tx_item_get(a_tx, 0, TX_ITEM_TYPE_OUT, 0);
+    l_tx_out = (dap_chain_tx_out_t *)dap_chain_datum_tx_item_get(a_tx, 0, TX_ITEM_TYPE_OUT,0);
 
 	if (!l_tx_out)
 		return false;
 
-	//	dap_chain_net_t *l_net = dap_chain_net_by_id(l_tx_out->addr.net_id);
-	//	dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(l_net->pub.name);
+    if (!EQUAL_256(a_cond->header.value, l_tx_out->header.value))
+        return false;
+
+    if (NULL == (delegate_token = dap_chain_ledger_token_ticker_check(a_ledger, delegated_ticker))
+        ||	delegate_token->type != DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL
+        ||	!delegate_token->header_native_decl.tsd_total_size
+        ||	NULL == (l_tsd = dap_tsd_find(delegate_token->data_n_tsd, delegate_token->header_native_decl.tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK))) {
+        return false;
+    }
+
+    l_tsd_section = dap_tsd_get_scalar(l_tsd, dap_chain_datum_token_tsd_delegate_from_stake_lock_t);
+
+    if (NULL == (l_tx_in_cond = (dap_chain_tx_in_cond_t *)dap_chain_datum_tx_item_get(a_tx, 0, TX_ITEM_TYPE_IN_COND, 0)))
+        return false;
+    if (dap_hash_fast_is_blank(&l_tx_in_cond->header.tx_prev_hash))
+        return false;
+    if (NULL == (l_tx_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, &l_tx_in_cond->header.tx_prev_hash)))
+        return false;
+    if (strcmp(l_tx_ticker, l_tsd_section.ticker_token_from))
+        return false;
+    if (NULL == (l_tx_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, &hash_burning_transaction)))
+        return false;
+    if (strcmp(l_tx_ticker, delegated_ticker))
+        return false;
 
 	burning_tx = dap_chain_ledger_tx_find_by_hash(a_ledger, &hash_burning_transaction);
 	burning_transaction_out = (dap_chain_tx_out_t*)dap_chain_datum_tx_item_get(burning_tx, 0, TX_ITEM_TYPE_OUT, 0);
@@ -929,17 +1032,35 @@ static bool s_callback_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond
 	if (!burning_transaction_out)
 		return false;
 
-	const char* addr_srt = dap_chain_hash_fast_to_str_new(&burning_transaction_out->addr.data.hash_fast);
-	log_it(L_INFO, "ADDR from burning TX: %s", addr_srt);
-	if (!dap_hash_fast_is_blank(&burning_transaction_out->addr.data.hash_fast))
+    if (!dap_hash_fast_is_blank(&burning_transaction_out->addr.data.hash_fast)) {
+        if (s_debug_more) {
+            const char *addr_srt = dap_chain_hash_fast_to_str_new(&burning_transaction_out->addr.data.hash_fast);
+            log_it(L_ERROR, "ADDR from burning NOT BLANK: %s", addr_srt);
+            DAP_DEL_Z(addr_srt);
+        }
 		return false;
-	DAP_DEL_Z(addr_srt);
-
-	char* str1 = dap_chain_balance_print(burning_transaction_out->header.value);
-	char* str2 = dap_chain_balance_print(l_tx_out->header.value);
-	log_it(L_INFO, "burning: |%s| value: |%s|", str1, str2);
-
-	if (!EQUAL_256(burning_transaction_out->header.value, l_tx_out->header.value))
+    }
+
+    if (!IS_ZERO_256(l_tsd_section.emission_rate)) {
+        MULT_256_COIN(l_tx_out->header.value, l_tsd_section.emission_rate, &l_value_delegated);
+        if (IS_ZERO_256(l_value_delegated))
+            return COINS_FORMAT_ERROR;
+    } else
+        l_value_delegated = l_tx_out->header.value;
+
+    if (s_debug_more) {
+        char *str1 = dap_chain_balance_print(burning_transaction_out->header.value);
+        char *str2 = dap_chain_balance_print(l_tx_out->header.value);
+        char *str3 = dap_chain_balance_print(l_value_delegated);
+        log_it(L_INFO, "burning_value: |%s|",	str1);
+        log_it(L_INFO, "hold/take_value: |%s|",	str2);
+        log_it(L_INFO, "delegated_value |%s|",	str3);
+        DAP_DEL_Z(str1);
+        DAP_DEL_Z(str2);
+        DAP_DEL_Z(str3);
+    }
+
+    if (!EQUAL_256(burning_transaction_out->header.value, l_value_delegated))//MULT
 		return false;
 
 	return true;
@@ -952,7 +1073,7 @@ static bool s_callback_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond
  * @param a_tx_item_idx
  * @return
  */
-static bool	s_callback_verificator_added(dap_ledger_t* a_ledger, dap_chain_datum_tx_t* a_tx, dap_chain_tx_out_cond_t* a_tx_item)
+bool	s_callback_verificator_added(dap_ledger_t * a_ledger,dap_chain_datum_tx_t* a_tx, dap_chain_tx_out_cond_t *a_tx_item)
 {
 	dap_chain_hash_fast_t* l_key_hash = DAP_NEW_Z(dap_chain_hash_fast_t);
 	if (!l_key_hash)
@@ -964,6 +1085,8 @@ static bool	s_callback_verificator_added(dap_ledger_t* a_ledger, dap_chain_datum
 		return false;
 	}
 
+    s_emission_for_stake_lock_item_add(a_ledger, l_key_hash);
+
 	DAP_DEL_Z(l_key_hash);
 
 	return true;
@@ -985,7 +1108,7 @@ static dap_chain_datum_t* s_mempool_create(dap_chain_net_t* a_net,
 	dap_enc_key_t* a_key_from, dap_pkey_t* a_key_cond,
 	const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
 	uint256_t a_value, dap_chain_net_srv_uid_t a_srv_uid,
-	dap_chain_addr_t* a_addr_holder, dap_time_t a_time_staking)
+    dap_chain_addr_t* a_addr_holder, dap_time_t a_time_staking, uint8_t reinvest)
 {
 	dap_ledger_t* l_ledger = a_net ? dap_chain_ledger_by_net_name(a_net->pub.name) : NULL;
 	// check valid param
@@ -1019,7 +1142,7 @@ static dap_chain_datum_t* s_mempool_create(dap_chain_net_t* a_net,
 	// add 'out_cond' and 'out' items
 	{
 		uint256_t l_value_pack = {}; // how much coin add to 'out' items
-		dap_chain_tx_out_cond_t* l_tx_out_cond = dap_chain_net_srv_stake_lock_create_cond_out(a_key_cond, a_srv_uid, a_value, a_time_staking);
+        dap_chain_tx_out_cond_t* l_tx_out_cond = dap_chain_net_srv_stake_lock_create_cond_out(a_key_cond, a_srv_uid, a_value, a_time_staking, reinvest);
 		if (l_tx_out_cond) {
 			SUM_256_256(l_value_pack, a_value, &l_value_pack);
 			dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*)l_tx_out_cond);
@@ -1064,7 +1187,7 @@ static dap_chain_datum_t* s_mempool_create(dap_chain_net_t* a_net,
  * @return
  */
 dap_chain_tx_out_cond_t* dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t* a_key, dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value,
-	uint64_t a_time_staking)
+    uint64_t a_time_staking, uint8_t reinvest)
 {
 	if (IS_ZERO_256(a_value))
 		return NULL;
@@ -1075,6 +1198,7 @@ dap_chain_tx_out_cond_t* dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t
 	l_item->header.srv_uid = a_srv_uid;
 	l_item->params_size = sizeof(cond_params_t);
 	cond_params_t* l_params = (cond_params_t*)l_item->params;
+    l_params->reinvest = reinvest;
 	if (a_time_staking) {
 		l_params->time_unlock = dap_time_now() + a_time_staking;
 		l_params->flags |= DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME;
@@ -1102,11 +1226,11 @@ dap_chain_hash_fast_t* dap_chain_net_srv_stake_lock_mempool_create(dap_chain_net
 	dap_enc_key_t* a_key_from, dap_pkey_t* a_key_cond,
 	const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
 	uint256_t a_value, dap_chain_net_srv_uid_t a_srv_uid,
-	dap_chain_addr_t* a_addr_holder, uint64_t a_time_staking)
+    dap_chain_addr_t* a_addr_holder, uint64_t a_time_staking, uint8_t reinvest)
 {
 	// Make transfer transaction
 	dap_chain_datum_t* l_datum = s_mempool_create(a_net, a_key_from, a_key_cond, a_token_ticker, a_value, a_srv_uid,
-		a_addr_holder, a_time_staking);
+        a_addr_holder, a_time_staking, reinvest);
 
 	if (!l_datum)
 		return NULL;
diff --git a/modules/service/stake_lock/include/dap_chain_net_srv_stake_lock.h b/modules/service/stake_lock/include/dap_chain_net_srv_stake_lock.h
index 896cbcf6b4e07e4671640221c070fa4ea0db3bd3..6018736c6dea95a89ea3b9f8d836a27a5cc7cb74 100644
--- a/modules/service/stake_lock/include/dap_chain_net_srv_stake_lock.h
+++ b/modules/service/stake_lock/include/dap_chain_net_srv_stake_lock.h
@@ -41,22 +41,25 @@
 #define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME                  0x00000008
 
 
-int 	dap_chain_net_srv_stake_lock_init(void);
-void	dap_chain_net_srv_stake_lock_deinit(void);
+int 					dap_chain_net_srv_stake_lock_init(void);
+void					dap_chain_net_srv_stake_lock_deinit(void);
+bool					s_callback_verificator(dap_ledger_t *a_ledger,dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner);
+bool					s_callback_verificator_added(dap_ledger_t *a_ledger,dap_chain_datum_tx_t * a_tx, dap_chain_tx_out_cond_t *a_tx_item);
+
 
 // Create cond out
-dap_chain_tx_out_cond_t* dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t* a_key, dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value,
-    uint64_t a_time_staking);
+dap_chain_tx_out_cond_t	*dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value,
+    uint64_t a_time_staking, uint8_t reinvest);
 
 // Create mempool
-dap_chain_hash_fast_t* dap_chain_net_srv_stake_lock_mempool_create(dap_chain_net_t* a_net,
+dap_chain_hash_fast_t	*dap_chain_net_srv_stake_lock_mempool_create(dap_chain_net_t *a_net,
     dap_enc_key_t* a_key_from, dap_pkey_t* a_key_cond,
     const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
     uint256_t a_value, dap_chain_net_srv_uid_t a_srv_uid,
-    dap_chain_addr_t* a_addr_holder, uint64_t a_time_staking);
+    dap_chain_addr_t* a_addr_holder, uint64_t a_time_staking, uint8_t reinvest);
 
 // Burning_tx_create
-dap_chain_datum_t* dap_chain_burning_tx_create(dap_chain_t* a_chain, dap_enc_key_t* a_key_from,
+dap_chain_datum_t*      dap_chain_burning_tx_create(dap_chain_t* a_chain, dap_enc_key_t* a_key_from,
     const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to,
     const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
     uint256_t a_value);
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 04631f3073f4b2d5cb6b05368447b205328b202f..3eb577a03dc3a3c5c9ebe7b20fe37a8070a252f5 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
@@ -53,26 +53,26 @@ static dap_chain_net_srv_stake_t *s_srv_stake = NULL;
 int dap_chain_net_srv_stake_pos_delegate_init()
 {
     dap_cli_server_cmd_add("srv_stake", s_cli_srv_stake, "Delegated stake service commands",
-    "srv_stake order create -net <net name> -addr_hldr <addr> -token <ticker> -coins <value> -cert <name> -fee_percent <value>\n"
+    "srv_stake order create -net <net_name> -addr_hldr <addr> -token <token_ticker> -coins <value> -cert <priv_cert_name> -fee_percent <value>\n"
         "\tCreate a new order with specified amount of datoshi to delegate specified cert from the specified address.\n"
         "\tThe fee with specified percent with this delagation will be returned to the fee address pointed by delegator\n"
-    "srv_stake order declare -net <net name> -wallet <name> -token <ticker> -coins <value> -fee_percent <value>"
+    "srv_stake order declare -net <net_name> -wallet <wallet_name> -token <token_ticker> -coins <value> -fee_percent <value>"
         "\tCreate a new order with specified amount of datoshi and fee which holder is ready to stake.\n"
-    "srv_stake order remove -net <net name> -order <order hash> [-H {hex | base58(default)}]\n"
+    "srv_stake order remove -net <net_name> -order <order_hash> [-H {hex | base58(default)}]\n"
          "\tRemove order with specified hash\n"
-    "srv_stake order update -net <net name> -order <order hash> {-cert <name> | -wallet <name>} [-H {hex | base58(default)}]{[-addr_hldr <addr>] [-token <ticker>] [-coins <value>] [-fee_percent <value>] | [-token <ticker>] [-coins <value>] -fee_percent <value>]}\n"
+    "srv_stake order update -net <net_name> -order <order_hash> {-cert <priv_cert_name> | -wallet <wallet_name>} [-H {hex | base58(default)}] {[-addr_hldr <addr>] [-token <token_ticker>] [-coins <value>] [-fee_percent <value>] | [-token <token_ticker>] [-coins <value>] -fee_percent <value>]}\n"
          "\tUpdate order with specified hash\n"
-    "srv_stake order list -net <net name>\n"
+    "srv_stake order list -net <net_name>\n"
          "\tGet the stake orders list within specified net name\n"
-    "srv_stake delegate -order <order hash> -net <net name> -wallet <name> -fee_addr <addr>\n"
+    "srv_stake delegate -order <order_hash> -net <net_name> -wallet <wallet_name> -fee_addr <addr>\n"
          "\tDelegate tokens with specified order within specified net name. Specify fee address\n"
-    "srv_stake approve -net <net name> -tx <transaction hash> -cert <root cert name>\n"
+    "srv_stake approve -net <net_name> -tx <transaction_hash> -cert <priv_cert_name>\n"
          "\tApprove stake transaction by root node certificate within specified net name.\n"
-    "srv_stake transactions -net <net name> [-addr <addr from>]\n"
+    "srv_stake transactions -net <net_name> [-addr <addr_from>]\n"
          "\tShow the list of requested, active and canceled stake transactions (optional delegated from addr)\n"
-    "srv_stake invalidate -net <net name> -tx <transaction hash> -wallet <wallet name>\n"
+    "srv_stake invalidate -net <net_name> -tx <transaction_hash> -wallet <wallet_name>\n"
          "\tInvalidate requested stake transaction by hash within net name and return stake to specified wallet\n"
-    "srv_stake commit -net <net name> [-block <block hash> | [-tx <transaction hash>]\n"
+    "srv_stake commit -net <net_name> [-block <block_hash> | [-tx <transaction_hash>]\n"
          "\tSend a staker fee from the block or transaction to the holder\n"
     );
 
@@ -136,12 +136,12 @@ int dap_chain_net_srv_stake_pos_delegate_init()
                     break;
                 }
             }
-            memcpy(&l_stake->signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t));
-            memcpy(&l_stake->addr_hldr, &l_out_cond->subtype.srv_stake.hldr_addr, sizeof(dap_chain_addr_t));
-            memcpy(&l_stake->addr_fee, &l_out_cond->subtype.srv_stake.fee_addr, sizeof(dap_chain_addr_t));
-            l_stake->fee_value = l_out_cond->subtype.srv_stake.fee_value;
-            memcpy(&l_stake->node_addr, &l_out_cond->subtype.srv_stake.signer_node_addr, sizeof(dap_chain_node_addr_t));
-            memcpy(&l_stake->tx_hash, &l_tx_cur_hash, sizeof(dap_chain_hash_fast_t));
+            l_stake->signing_addr   = l_out_cond->subtype.srv_stake.signing_addr;
+            l_stake->addr_hldr      = l_out_cond->subtype.srv_stake.hldr_addr;
+            l_stake->addr_fee       = l_out_cond->subtype.srv_stake.fee_addr;
+            l_stake->fee_value      = l_out_cond->subtype.srv_stake.fee_value;
+            l_stake->node_addr      = l_out_cond->subtype.srv_stake.signer_node_addr;
+            l_stake->tx_hash        = l_tx_cur_hash;
             if (l_is_new)
                 HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake);
         } while (l_tx_tmp);
@@ -149,9 +149,6 @@ int dap_chain_net_srv_stake_pos_delegate_init()
     DAP_DELETE(l_net_list);
     s_srv_stake->initialized = true;
 
-    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, dap_chain_net_srv_stake_pos_delegate_verificator, NULL);
-    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE_UPDATE, dap_chain_net_srv_stake_updater, NULL);
-
     return 0;
 }
 
@@ -189,7 +186,7 @@ static void s_stake_update(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t
     // Update stake parameters
     if (!a_cond) {
         // New stake transaction
-        memcpy(&l_stake->signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t));
+        l_stake->signing_addr = l_out_cond->subtype.srv_stake.signing_addr;
         HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake);
     }
     else if (memcmp(&a_cond->subtype.srv_stake.signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t))) {
@@ -200,17 +197,17 @@ static void s_stake_update(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t
             DAP_DELETE(l_stake);
             l_stake = l_stake_cur;
         }
-        memcpy(&l_stake->signing_addr, &l_out_cond->subtype.srv_stake.signing_addr, sizeof(dap_chain_addr_t));
+        l_stake->signing_addr = l_out_cond->subtype.srv_stake.signing_addr;
         if (l_stake_cur)
             HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake);
     }
     if (a_authorized) {
         l_stake->is_active = true;
     }
-    memcpy(&l_stake->addr_hldr, &l_out_cond->subtype.srv_stake.hldr_addr, sizeof(dap_chain_addr_t));
-    memcpy(&l_stake->addr_fee, &l_out_cond->subtype.srv_stake.fee_addr, sizeof(dap_chain_addr_t));
-    l_stake->fee_value = l_out_cond->subtype.srv_stake.fee_value;
-    memcpy(&l_stake->node_addr, &l_out_cond->subtype.srv_stake.fee_addr, sizeof(dap_chain_node_addr_t));
+    l_stake->addr_hldr  = l_out_cond->subtype.srv_stake.hldr_addr;
+    l_stake->addr_fee   = l_out_cond->subtype.srv_stake.fee_addr;
+    l_stake->fee_value  = l_out_cond->subtype.srv_stake.fee_value;
+    l_stake->node_addr  = l_out_cond->subtype.srv_stake.signer_node_addr;
     dap_hash_fast(a_tx, dap_chain_datum_tx_get_size(a_tx), &l_stake->tx_hash);
 }
 
@@ -577,12 +574,12 @@ char *s_stake_order_create(dap_chain_net_srv_stake_item_t *a_item, dap_enc_key_t
 {
     dap_chain_hash_fast_t l_tx_hash = {};
     dap_srv_stake_order_ext_t l_ext = {};
-    memcpy(&l_ext.addr_hldr, &a_item->addr_hldr, sizeof(dap_chain_addr_t));
+    l_ext.addr_hldr = a_item->addr_hldr;
     dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_SELL;
     if (memcmp(&a_item->signing_addr, &l_ext.signing_addr, sizeof(dap_chain_addr_t))) {
         // Signing addr is not empty
         l_dir = SERV_DIR_BUY;
-        memcpy(&l_ext.signing_addr, &a_item->signing_addr, sizeof(dap_chain_addr_t));
+        l_ext.signing_addr = a_item->signing_addr;
     }
     l_ext.fee_value = a_item->fee_value;
     uint32_t l_ext_size = sizeof(dap_srv_stake_order_ext_t);
@@ -602,7 +599,7 @@ dap_chain_net_srv_stake_item_t *s_stake_item_from_order(dap_chain_net_t *a_net,
         return NULL;
     }
     dap_srv_stake_order_ext_t *l_ext = (dap_srv_stake_order_ext_t *)a_order->ext_n_sign;
-    dap_sign_t *l_sign = (dap_sign_t *)(&a_order->ext_n_sign[a_order->ext_size]);
+    dap_sign_t *l_sign = (dap_sign_t *)(a_order->ext_n_sign + a_order->ext_size);
     if (!dap_sign_verify_size(l_sign, dap_chain_net_srv_order_get_size(a_order)) ||
             dap_sign_verify(l_sign, a_order, sizeof(dap_chain_net_srv_order_t) + a_order->ext_size) != 1) {
         log_it(L_WARNING, "Order sign is invalid");
@@ -622,13 +619,13 @@ dap_chain_net_srv_stake_item_t *s_stake_item_from_order(dap_chain_net_t *a_net,
         DAP_DELETE(l_item);
         return NULL;
     }
-    memcpy(&l_item->addr_hldr, &l_ext->addr_hldr, sizeof(dap_chain_addr_t));
-    memcpy(&l_item->signing_addr, &l_ext->signing_addr, sizeof(dap_chain_addr_t));
+    l_item->addr_hldr = l_ext->addr_hldr;
+    l_item->signing_addr = l_ext->signing_addr;
     l_item->fee_value = l_ext->fee_value;
     l_item->net = a_net;
     l_item->value = a_order->price;
     strcpy(l_item->token, a_order->price_ticker);
-    memcpy(&l_item->node_addr, &a_order->node_addr, sizeof(dap_chain_node_addr_t));
+    l_item->node_addr = a_order->node_addr;
     return l_item;
 }
 
@@ -860,9 +857,9 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
             l_stake->net = l_net;
             dap_stpcpy(l_stake->token, l_token_str);
             l_stake->value = l_value;
-            memcpy(&l_stake->addr_hldr, l_addr_hldr, sizeof(dap_chain_addr_t));
+            l_stake->addr_hldr = *l_addr_hldr;
             dap_chain_addr_t *l_signing_addr = dap_cert_to_addr(l_cert, l_net->pub.id);
-            memcpy(&l_stake->signing_addr, l_signing_addr, sizeof(dap_chain_addr_t));
+            l_stake->signing_addr = *l_signing_addr;
             DAP_DELETE(l_addr_hldr);
             DAP_DELETE(l_signing_addr);
             l_stake->fee_value = l_fee;
@@ -942,7 +939,7 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
             dap_stpcpy(l_stake->token, l_token_str);
             l_stake->value = l_value;
             dap_chain_addr_t *l_addr_hldr = dap_chain_wallet_get_addr(l_wallet, l_net->pub.id);
-            memcpy(&l_stake->addr_hldr, l_addr_hldr, sizeof(dap_chain_addr_t));
+            l_stake->addr_hldr = *l_addr_hldr;
             DAP_DELETE(l_addr_hldr);
             l_stake->fee_value = l_fee;
             // Create the order & put it to GDB
@@ -1091,7 +1088,7 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
                         DAP_DELETE(l_stake);
                         return -14;
                     }
-                    memcpy(&l_stake->addr_hldr, l_addr_hldr, sizeof(dap_chain_addr_t));
+                    l_stake->addr_hldr = *l_addr_hldr;
                     DAP_DELETE(l_addr_hldr);
                 }
             } else {    // It's a selling order
@@ -1275,10 +1272,10 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply)
                     dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order is invalid");
                     return -22;
                 }
-                memcpy(&l_stake->addr_fee, l_addr_fee, sizeof(dap_chain_addr_t));
+                l_stake->addr_fee = *l_addr_fee;
                 DAP_DELETE(l_addr_fee);
                 dap_chain_addr_t *l_hldr_addr = dap_chain_wallet_get_addr(l_wallet, l_net->pub.id);
-                memcpy(&l_stake->addr_hldr, l_hldr_addr, sizeof(dap_chain_addr_t));
+                l_stake->addr_hldr = *l_hldr_addr;
                 DAP_DELETE(l_hldr_addr);
                 // Create conditional transaction
                 dap_chain_datum_tx_t *l_tx = s_stake_tx_create(l_stake, l_wallet);
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index 0bf67e60ae6df339f77fdae3ed00c97b1e860c7f..0007cce71c3e7b75ccce30c89607740c85e362f7 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -235,12 +235,12 @@ static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn,
 
 static bool s_tun_client_send_data_unsafe(dap_chain_net_srv_ch_vpn_t * l_ch_vpn, ch_vpn_pkt_t * l_pkt_out)
 {
-    dap_chain_net_srv_stream_session_t* l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session);
-    dap_chain_net_srv_usage_t* l_usage = dap_chain_net_srv_usage_find_unsafe(l_srv_session, l_ch_vpn->usage_id);
+    dap_chain_net_srv_stream_session_t *l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session);
+    dap_chain_net_srv_usage_t *l_usage = dap_chain_net_srv_usage_find_unsafe(l_srv_session, l_ch_vpn->usage_id);
     size_t l_data_to_send = (l_pkt_out->header.op_data.data_size + sizeof(l_pkt_out->header));
     debug_if(s_debug_more, L_DEBUG, "Sent stream pkt size %zu on worker #%u", l_data_to_send, l_ch_vpn->ch->stream_worker->worker->id);
     size_t l_data_sent = dap_stream_ch_pkt_write_unsafe(l_ch_vpn->ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, l_pkt_out, l_data_to_send);
-    s_update_limits(l_ch_vpn->ch,l_srv_session,l_usage, l_data_sent );
+    s_update_limits(l_ch_vpn->ch,l_srv_session,l_usage, l_data_sent);
     l_srv_session->stats.bytes_recv += l_data_sent;
     if ( l_data_sent < l_data_to_send){
         log_it(L_WARNING, "Wasn't sent all the data in tunnel (%zd was sent from %zd): probably buffer overflow", l_data_sent, l_data_to_send);
@@ -284,10 +284,10 @@ static bool s_tun_client_send_data_inter(dap_events_socket_t * a_es_input, dap_c
 static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_info, const void * a_data, size_t a_data_size)
 {
     assert(a_data_size > sizeof (dap_os_iphdr_t));
-    ch_vpn_pkt_t *l_pkt_out = DAP_NEW_Z_SIZE(ch_vpn_pkt_t, sizeof(l_pkt_out->header) + a_data_size);
-    l_pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_RECV;
-    l_pkt_out->header.sock_id = s_raw_server->tun_fd;
-    l_pkt_out->header.usage_id = l_ch_vpn_info->usage_id;
+    ch_vpn_pkt_t *l_pkt_out             = DAP_NEW_Z_SIZE(ch_vpn_pkt_t, sizeof(l_pkt_out->header) + a_data_size);
+    l_pkt_out->header.op_code           = VPN_PACKET_OP_CODE_VPN_RECV;
+    l_pkt_out->header.sock_id           = s_raw_server->tun_fd;
+    l_pkt_out->header.usage_id          = l_ch_vpn_info->usage_id;
     l_pkt_out->header.op_data.data_size = a_data_size;
     memcpy(l_pkt_out->data, a_data, a_data_size);
 
@@ -323,15 +323,14 @@ static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_in
             log_it(L_INFO, "Sent packet (%zd bytes) to desitnation %s in own context", a_data_size, l_str_daddr);
         }
         s_tun_client_send_data_unsafe(l_ch_vpn_info->ch_vpn, l_pkt_out);
-    }
-    else {
+    } else {
         /* Shift it to other worker context */
         tun_socket_msg_t* l_msg = DAP_NEW_Z(tun_socket_msg_t);
-        l_msg->type = TUN_SOCKET_MSG_CH_VPN_SEND;
-        l_msg->ch_vpn = l_ch_vpn_info->ch_vpn;
-        l_msg->esocket = l_ch_vpn_info->esocket;
-        l_msg->esocket_uuid = l_ch_vpn_info->esocket_uuid;
-        l_msg->ch_vpn_send.pkt = DAP_DUP_SIZE(l_pkt_out, sizeof(l_pkt_out->header) + a_data_size);
+        l_msg->type             = TUN_SOCKET_MSG_CH_VPN_SEND;
+        l_msg->ch_vpn           = l_ch_vpn_info->ch_vpn;
+        l_msg->esocket          = l_ch_vpn_info->esocket;
+        l_msg->esocket_uuid     = l_ch_vpn_info->esocket_uuid;
+        l_msg->ch_vpn_send.pkt  = DAP_DUP_SIZE(l_pkt_out, sizeof(l_pkt_out->header) + a_data_size);
 
         if (dap_events_socket_queue_ptr_send(l_ch_vpn_info->queue_msg, l_msg) != 0) {
             log_it(L_WARNING, "Error on sending packet to foreign context queue, lost %zd bytes", a_data_size);
@@ -361,7 +360,7 @@ static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_in
  */
 static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void * a_msg )
 {
-    tun_socket_msg_t* l_msg = (tun_socket_msg_t*)a_msg;
+    tun_socket_msg_t *l_msg = (tun_socket_msg_t*)a_msg;
     switch (l_msg->type) {
         case TUN_SOCKET_MSG_ESOCKET_REASSIGNED: {
             assert(l_msg->esocket_reassigment.worker_id < s_tun_sockets_count);
@@ -401,16 +400,16 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
                 inet_ntop(AF_INET,&l_msg->ip_assigment.addr, l_addrbuf, sizeof (l_addrbuf));
                 log_it(L_WARNING, "Already assigned address %s on tun sock #%u", l_addrbuf, l_tun_sock->worker_id);
             }else{
-                l_new_info = DAP_NEW_Z(dap_chain_net_srv_ch_vpn_info_t);
-                l_new_info->ch_vpn = l_msg->ch_vpn;
-                l_new_info->addr_ipv4 = l_msg->ip_assigment.addr;
-                l_new_info->queue_msg = s_tun_sockets_queue_msg[l_msg->ip_assigment.worker_id];
-                l_new_info->usage_id = l_msg->ip_assigment.usage_id;
-                l_new_info->is_reassigned_once = l_msg->is_reassigned_once;
-                l_new_info->is_on_this_worker = (l_msg->ip_assigment.worker_id == a_esocket_queue->context->worker->id);
-                l_new_info->esocket = l_msg->esocket;
-                l_new_info->esocket_uuid = l_msg->esocket_uuid;
-                l_new_info->worker = dap_events_worker_get(l_msg->ip_assigment.worker_id);
+                l_new_info                      = DAP_NEW_Z(dap_chain_net_srv_ch_vpn_info_t);
+                l_new_info->ch_vpn              = l_msg->ch_vpn;
+                l_new_info->addr_ipv4           = l_msg->ip_assigment.addr;
+                l_new_info->queue_msg           = s_tun_sockets_queue_msg[l_msg->ip_assigment.worker_id];
+                l_new_info->usage_id            = l_msg->ip_assigment.usage_id;
+                l_new_info->is_reassigned_once  = l_msg->is_reassigned_once;
+                l_new_info->is_on_this_worker   = (l_msg->ip_assigment.worker_id == a_esocket_queue->context->worker->id);
+                l_new_info->esocket             = l_msg->esocket;
+                l_new_info->esocket_uuid        = l_msg->esocket_uuid;
+                l_new_info->worker              = dap_events_worker_get(l_msg->ip_assigment.worker_id);
                 HASH_ADD(hh,l_tun_sock->clients, addr_ipv4, sizeof (l_new_info->addr_ipv4), l_new_info);
                 if (dap_log_level_get() <= L_INFO) {
                     char l_addrbuf[INET_ADDRSTRLEN];
@@ -423,22 +422,22 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
 
         case TUN_SOCKET_MSG_IP_UNASSIGNED:{
             assert(l_msg->ip_unassigment.worker_id < s_tun_sockets_count);
-            dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id];
+            dap_chain_net_srv_vpn_tun_socket_t *l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id];
             assert(l_tun_sock);
 
-            dap_chain_net_srv_ch_vpn_info_t * l_new_info = NULL;
-            HASH_FIND(hh,l_tun_sock->clients,&l_msg->ip_unassigment.addr, sizeof (l_msg->ip_unassigment.addr), l_new_info);
+            dap_chain_net_srv_ch_vpn_info_t *l_new_info = NULL;
+            HASH_FIND(hh, l_tun_sock->clients, &l_msg->ip_unassigment.addr, sizeof(l_msg->ip_unassigment.addr), l_new_info);
             if( l_new_info){
                 HASH_DELETE(hh, l_tun_sock->clients, l_new_info);
                 DAP_DELETE(l_new_info);
                 if( dap_log_level_get() <= L_INFO){
                     char l_addrbuf[INET_ADDRSTRLEN];
-                    inet_ntop(AF_INET,&l_msg->ip_unassigment.addr, l_addrbuf, sizeof (l_addrbuf));
+                    inet_ntop(AF_INET, &l_msg->ip_unassigment.addr, l_addrbuf, sizeof(l_addrbuf));
                     log_it(L_INFO, "Unassigned %s address from tun sock #%u", l_addrbuf, l_tun_sock->worker_id);
                 }
             }else{
                 char l_addrbuf[INET_ADDRSTRLEN];
-                inet_ntop(AF_INET,&l_msg->ip_unassigment.addr, l_addrbuf, sizeof (l_addrbuf));
+                inet_ntop(AF_INET, &l_msg->ip_unassigment.addr, l_addrbuf, sizeof(l_addrbuf));
                 log_it(L_ERROR, "Can't find address %s on tun sock #%u to unassign it", l_addrbuf, l_tun_sock->worker_id);
             }
         }break; /* l_msg->type == TUN_SOCKET_MSG_IP_UNASSIGNED */
@@ -600,11 +599,11 @@ static dap_events_socket_t * s_tun_event_stream_create(dap_worker_t * a_worker,
 {
     assert(a_worker);
     dap_events_socket_callbacks_t l_s_callbacks = {
-        .new_callback = s_es_tun_new,
-        .read_callback = s_es_tun_read,
-        .write_callback = s_es_tun_write,
-        .error_callback = s_es_tun_error,
-        .delete_callback = s_es_tun_delete,
+        .new_callback            = s_es_tun_new,
+        .read_callback           = s_es_tun_read,
+        .write_callback          = s_es_tun_write,
+        .error_callback          = s_es_tun_error,
+        .delete_callback         = s_es_tun_delete,
         .write_finished_callback = s_es_tun_write_finished
     };
 
@@ -634,7 +633,7 @@ static int s_vpn_tun_create(dap_config_t * g_config)
 
     inet_aton(c_addr, &s_raw_server->ipv4_network_addr );
     inet_aton(c_mask, &s_raw_server->ipv4_network_mask );
-    s_raw_server->ipv4_gw.s_addr= (s_raw_server->ipv4_network_addr.s_addr | 0x01000000); // grow up some shit here!
+    s_raw_server->ipv4_gw.s_addr= (s_raw_server->ipv4_network_addr.s_addr | 0x01000000);
     s_raw_server->ipv4_lease_last.s_addr = s_raw_server->ipv4_gw.s_addr;
 
 #ifdef DAP_OS_DARWIN
@@ -644,7 +643,7 @@ static int s_vpn_tun_create(dap_config_t * g_config)
     s_tun_sockets_count = dap_get_cpu_count();
     memset(&s_raw_server->ifr, 0, sizeof(s_raw_server->ifr));
     s_raw_server->ifr.ifr_flags = IFF_TUN | IFF_MULTI_QUEUE| IFF_NO_PI;
-    s_raw_server->auto_cpu_reassignment = dap_config_get_item_bool_default(g_config, "srv_vpn", "auto_cpu_reassignment", true);
+    s_raw_server->auto_cpu_reassignment = dap_config_get_item_bool_default(g_config, "srv_vpn", "auto_cpu_reassignment", false);
 #else
 #error "Undefined tun create for your platform"
 #endif
@@ -780,12 +779,15 @@ static int s_vpn_tun_create(dap_config_t * g_config)
         }
     }
 
-    char buf[256];
-    log_it(L_NOTICE,"Bringed up %s virtual network interface (%s/%s)", s_raw_server->tun_device_name,inet_ntoa(s_raw_server->ipv4_gw),c_mask);
+    char buf[256], l_str_ipv4_gw[INET_ADDRSTRLEN], l_str_ipv4_netmask[INET_ADDRSTRLEN];
+    inet_ntop(AF_INET, &s_raw_server->ipv4_gw, l_str_ipv4_gw, INET_ADDRSTRLEN);
+    inet_ntop(AF_INET, &s_raw_server->ipv4_network_mask, l_str_ipv4_netmask, INET_ADDRSTRLEN);
+    log_it(L_NOTICE, "Brought up %s virtual network interface (%s/%s)", s_raw_server->tun_device_name, l_str_ipv4_gw, l_str_ipv4_netmask);
 #if defined (DAP_OS_ANDROID) || defined (DAP_OS_LINUX)
-    snprintf(buf,sizeof(buf),"ip link set %s up",s_raw_server->tun_device_name);
+    snprintf(buf,sizeof(buf),"ip link set %s up", s_raw_server->tun_device_name);
     system(buf);
-    snprintf(buf,sizeof(buf),"ip addr add %s/%s dev %s ",inet_ntoa(s_raw_server->ipv4_gw),c_mask, s_raw_server->tun_device_name );
+    snprintf(buf,sizeof(buf),"ip addr add %s/%s dev %s ", 
+        l_str_ipv4_gw, l_str_ipv4_netmask, s_raw_server->tun_device_name);
     system(buf);
 #elif defined (DAP_OS_DARWIN)
     snprintf(buf,sizeof(buf),"ifconfig %s %s %s up",s_raw_server->tun_device_name,
@@ -1236,19 +1238,19 @@ static void send_pong_pkt(dap_stream_ch_t* a_ch)
  * @param a_usage
  */
 static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_net_srv_usage_t * a_usage){
-    dap_chain_net_srv_ch_vpn_t*         l_ch_vpn = CH_VPN(a_ch);
-    dap_chain_net_srv_vpn_t*            l_srv_vpn = (dap_chain_net_srv_vpn_t*)a_usage->service->_internal;
-    dap_chain_net_srv_stream_session_t* l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session);
+    dap_chain_net_srv_ch_vpn_t         *l_ch_vpn = CH_VPN(a_ch);
+    dap_chain_net_srv_vpn_t            *l_srv_vpn = (dap_chain_net_srv_vpn_t*)a_usage->service->_internal;
+    dap_chain_net_srv_stream_session_t *l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session);
 
     if (! s_raw_server)
         return;
 
     if ( l_ch_vpn->addr_ipv4.s_addr ) {
         log_it(L_WARNING, "IP address is already leased");
-        ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header));
-        pkt_out->header.op_code = VPN_PACKET_OP_CODE_PROBLEM;
-        pkt_out->header.sock_id = s_raw_server->tun_fd;
-        pkt_out->header.usage_id = a_usage->id;
+        ch_vpn_pkt_t* pkt_out           = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header));
+        pkt_out->header.op_code         = VPN_PACKET_OP_CODE_PROBLEM;
+        pkt_out->header.sock_id         = s_raw_server->tun_fd;
+        pkt_out->header.usage_id        = a_usage->id;
         pkt_out->header.op_problem.code = VPN_PROBLEM_CODE_ALREADY_ASSIGNED_ADDR;
 
         size_t l_data_to_write = /*pkt_out->header.op_data.data_size +*/ sizeof(pkt_out->header);
@@ -1275,9 +1277,9 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_
 
         ch_vpn_pkt_t *l_pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t,
                 sizeof(l_pkt_out->header) + sizeof(l_ch_vpn->addr_ipv4) + sizeof(s_raw_server->ipv4_network_addr));
-        l_pkt_out->header.sock_id = s_raw_server->tun_fd;
-        l_pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY;
-        l_pkt_out->header.usage_id = a_usage->id;
+        l_pkt_out->header.sock_id           = s_raw_server->tun_fd;
+        l_pkt_out->header.op_code           = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY;
+        l_pkt_out->header.usage_id          = a_usage->id;
         l_pkt_out->header.op_data.data_size = sizeof(l_ch_vpn->addr_ipv4) + sizeof(s_raw_server->ipv4_gw);
 
         memcpy(l_pkt_out->data, &l_ch_vpn->addr_ipv4, sizeof(l_ch_vpn->addr_ipv4));
@@ -1291,21 +1293,32 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_
         if (l_data_wrote < l_data_to_write){
             log_it(L_WARNING, "Buffer overflow: can't send packet with VPN_PACKET_OP_CODE_VPN_ADDR_REPLY: sent only %zd from %zd",
                     l_data_wrote,l_data_to_write );
-            dap_chain_net_srv_stream_session_t * l_srv_session= DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session);
-            assert(l_srv_session);
             l_srv_session->stats.bytes_sent_lost += l_data_to_write - l_data_wrote;
             l_srv_session->stats.packets_sent_lost++;
         } else {
+            char    l_str_ipv4addr[INET_ADDRSTRLEN],
+                    l_str_ipv4gw[INET_ADDRSTRLEN],
+                    l_str_ipv4mask[INET_ADDRSTRLEN],
+                    l_str_ipv4netaddr[INET_ADDRSTRLEN],
+                    l_str_ipv4last[INET_ADDRSTRLEN];
+
+            inet_ntop(AF_INET, &l_ch_vpn->addr_ipv4, l_str_ipv4addr, INET_ADDRSTRLEN);
+            inet_ntop(AF_INET, &s_raw_server->ipv4_gw, l_str_ipv4gw, INET_ADDRSTRLEN);
+            inet_ntop(AF_INET, &s_raw_server->ipv4_network_mask, l_str_ipv4mask, INET_ADDRSTRLEN);
+            inet_ntop(AF_INET, &s_raw_server->ipv4_network_addr, l_str_ipv4netaddr, INET_ADDRSTRLEN);
+            inet_ntop(AF_INET, &s_raw_server->ipv4_lease_last, l_str_ipv4last, INET_ADDRSTRLEN);
+
             log_it(L_INFO, "VPN client IP address %s leased"
-                "\r\n\tnet gateway %s"
-                "\r\n\tnet mask %s"
-                "\r\n\tgw %s"
-                "\r\n\tlast_addr %s"
-                , inet_ntoa(l_ch_vpn->addr_ipv4)
-                , inet_ntoa(s_raw_server->ipv4_network_addr)
-                , inet_ntoa(s_raw_server->ipv4_network_mask)
-                , inet_ntoa(s_raw_server->ipv4_gw)
-                , inet_ntoa(s_raw_server->ipv4_lease_last));
+                    "\r\n\tnet gateway %s"
+                    "\r\n\tnet mask %s"
+                    "\r\n\tgw %s"
+                    "\r\n\tlast_addr %s"
+                    , l_str_ipv4addr
+                    , l_str_ipv4gw
+                    , l_str_ipv4mask
+                    , l_str_ipv4netaddr
+                    , l_str_ipv4last);
+
             l_srv_vpn->ipv4_unleased = l_item_ipv4->next;
             DAP_DEL_Z(l_item_ipv4);
             l_srv_session->stats.packets_sent++;
@@ -1321,13 +1334,18 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_
         //  Just for log output we revert it back and forward
         n_addr.s_addr = htonl(n_addr.s_addr);
         n_addr_max.s_addr = htonl(n_addr_max.s_addr);
+
+        char l_str_naddr[INET_ADDRSTRLEN], l_str_naddr_max[INET_ADDRSTRLEN];
+        inet_ntop(AF_INET, &n_addr, l_str_naddr, INET_ADDRSTRLEN);
+        inet_ntop(AF_INET, &n_addr_max, l_str_naddr_max, INET_ADDRSTRLEN);
+
         log_it(L_DEBUG, "\tnew_address         = %s"
-            "\r\n\tnew_address_max = %s"
-            , inet_ntoa(n_addr), inet_ntoa(n_addr_max));
+                        "\r\n\tnew_address_max = %s"
+               , l_str_naddr, l_str_naddr_max);
 
         n_addr.s_addr = ntohl(n_addr.s_addr);
         n_addr_max.s_addr = ntohl(n_addr_max.s_addr);
-        if(n_addr.s_addr <= n_addr_max.s_addr ) {
+        if(n_addr.s_addr <= n_addr_max.s_addr) {
             n_addr.s_addr = htonl(n_addr.s_addr);
             n_addr_max.s_addr = htonl(n_addr_max.s_addr);
 
@@ -1335,16 +1353,26 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_
             a_ch->stream->session->tun_client_addr.s_addr = n_addr.s_addr;
             l_ch_vpn->addr_ipv4.s_addr = n_addr.s_addr;
 
+            char    l_str_ipv4gw[INET_ADDRSTRLEN],
+                    l_str_ipv4mask[INET_ADDRSTRLEN],
+                    l_str_ipv4netaddr[INET_ADDRSTRLEN],
+                    l_str_ipv4last[INET_ADDRSTRLEN];
+
+            inet_ntop(AF_INET, &s_raw_server->ipv4_gw, l_str_ipv4gw, INET_ADDRSTRLEN);
+            inet_ntop(AF_INET, &s_raw_server->ipv4_network_mask, l_str_ipv4mask, INET_ADDRSTRLEN);
+            inet_ntop(AF_INET, &s_raw_server->ipv4_network_addr, l_str_ipv4netaddr, INET_ADDRSTRLEN);
+            inet_ntop(AF_INET, &s_raw_server->ipv4_lease_last, l_str_ipv4last, INET_ADDRSTRLEN);
+
             log_it(L_INFO, "VPN client new IP address %s leased"
-                "\r\n\tgateway %s"
-                "\r\n\tnet mask %s"
-                "\r\n\tnet addr %s"
-                "\r\n\tlast_addr %s"
-                , inet_ntoa(n_addr)
-                , inet_ntoa(s_raw_server->ipv4_gw)
-                , inet_ntoa(s_raw_server->ipv4_network_mask)
-                , inet_ntoa(s_raw_server->ipv4_network_addr)
-                , inet_ntoa(s_raw_server->ipv4_lease_last));
+                    "\r\n\tgateway %s"
+                    "\r\n\tnet mask %s"
+                    "\r\n\tnet addr %s"
+                    "\r\n\tlast_addr %s"
+                    , l_str_naddr
+                    , l_str_ipv4gw
+                    , l_str_ipv4mask
+                    , l_str_ipv4netaddr
+                    , l_str_ipv4last);
 
             pthread_rwlock_wrlock( &s_clients_rwlock );
             HASH_ADD(hh, s_ch_vpn_addrs, addr_ipv4, sizeof (l_ch_vpn->addr_ipv4), l_ch_vpn);
@@ -1352,10 +1380,10 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_
 
             ch_vpn_pkt_t *pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t,
                     sizeof(pkt_out->header) + sizeof(l_ch_vpn->addr_ipv4) + sizeof(s_raw_server->ipv4_gw));
-            pkt_out->header.sock_id = s_raw_server->tun_fd;
-            pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY;
-            pkt_out->header.op_data.data_size = sizeof(l_ch_vpn->addr_ipv4) + sizeof(s_raw_server->ipv4_gw);
-            pkt_out->header.usage_id = a_usage->id;
+            pkt_out->header.sock_id             = s_raw_server->tun_fd;
+            pkt_out->header.op_code             = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY;
+            pkt_out->header.op_data.data_size   = sizeof(l_ch_vpn->addr_ipv4) + sizeof(s_raw_server->ipv4_gw);
+            pkt_out->header.usage_id            = a_usage->id;
 
             memcpy(pkt_out->data, &l_ch_vpn->addr_ipv4, sizeof(l_ch_vpn->addr_ipv4));
             memcpy(pkt_out->data + sizeof(l_ch_vpn->addr_ipv4), &s_raw_server->ipv4_gw,
@@ -1376,10 +1404,10 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_
             }
         } else { // All the network is filled with clients, can't lease a new address
             log_it(L_ERROR, "No free IP address left, can't lease one...");
-            ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header));
-            pkt_out->header.sock_id = s_raw_server->tun_fd;
-            pkt_out->header.op_code = VPN_PACKET_OP_CODE_PROBLEM;
-            pkt_out->header.usage_id = a_usage->id;
+            ch_vpn_pkt_t* pkt_out           = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header));
+            pkt_out->header.sock_id         = s_raw_server->tun_fd;
+            pkt_out->header.op_code         = VPN_PACKET_OP_CODE_PROBLEM;
+            pkt_out->header.usage_id        = a_usage->id;
             pkt_out->header.op_problem.code = VPN_PROBLEM_CODE_NO_FREE_ADDR;
             size_t l_data_to_write = /*pkt_out->header.op_data.data_size +*/ sizeof(pkt_out->header);
             size_t l_data_wrote = dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out, l_data_to_write);
@@ -1680,9 +1708,8 @@ static void s_es_tun_read(dap_events_socket_t * a_es, void * arg)
         if ( l_tun_socket->clients){
             HASH_FIND_INT( l_tun_socket->clients,&l_in_daddr.s_addr,l_vpn_info );
         }
-        // We found in local table, sending data (if possible)
-        if (l_vpn_info){
-            if ( !l_vpn_info->is_on_this_worker && !l_vpn_info->is_reassigned_once && s_raw_server->auto_cpu_reassignment ){
+        if (l_vpn_info) {
+            if ( !l_vpn_info->is_on_this_worker && !l_vpn_info->is_reassigned_once && s_raw_server->auto_cpu_reassignment) {
                 log_it(L_NOTICE, "Reassigning from worker %u to %u", l_vpn_info->worker->id, a_es->context->worker->id);
                 l_vpn_info->is_reassigned_once = true;
                 s_tun_send_msg_esocket_reassigned_all_inter(a_es->worker->id, l_vpn_info->ch_vpn, l_vpn_info->esocket, l_vpn_info->esocket_uuid,
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index ecac0fa8833a4c4374ea4bcb68c51676fb5510d6..2daa2932d9cd147aa6c2ad9ebe768dfeb5fe6e93 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -41,6 +41,7 @@
 #include "dap_common.h"
 #include "dap_config.h"
 #include "dap_strfuncs.h"
+#include "dap_time.h"
 #include "rand/dap_rand.h"
 
 #ifdef DAP_OS_LINUX
@@ -537,14 +538,12 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st
     long l_t2 = l_t.tv_sec * 1000 + l_t.tv_nsec / 1e6;
     int l_dtime_connect_ms = l_t2 - l_t1;
 
-    //l_ret = dap_chain_net_vpn_client_tun_init(a_ipv4_str);
-
-    // send first packet to server
     {
         uint8_t l_ch_id = dap_stream_ch_chain_net_srv_get_id(); // Channel id for chain net request = 'R'
         dap_stream_ch_t *l_ch = dap_client_get_stream_ch_unsafe(s_vpn_client->client, l_ch_id);
         if(l_ch) {
-            dap_stream_ch_chain_net_srv_pkt_test_t *l_request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_test_t, sizeof(dap_stream_ch_chain_net_srv_pkt_test_t) + a_data_size_to_send);
+            typedef dap_stream_ch_chain_net_srv_pkt_test_t pkt_t;
+            pkt_t* l_request = DAP_NEW_STACK_SIZE(pkt_t, sizeof(pkt_t) + a_data_size_to_send);
             l_request->net_id.uint64 = a_net->pub.id.uint64;
             l_request->srv_uid.uint64 = DAP_CHAIN_NET_SRV_VPN_ID;
             l_request->data_size_send = a_data_size_to_send;
@@ -555,12 +554,10 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st
             if(a_ipv4_str)
                 memcpy(l_request->ip_recv, a_ipv4_str, min(sizeof(l_request->ip_recv), strlen(a_ipv4_str)));
             l_request->time_connect_ms = l_dtime_connect_ms;
-            clock_gettime(CLOCK_REALTIME, &l_t);
-            l_request->send_time1 = l_t;
+            l_request->send_time1 = dap_nanotime_now();
             size_t l_request_size = l_request->data_size + sizeof(dap_stream_ch_chain_net_srv_pkt_test_t);
             dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_REQUEST, l_request, l_request_size);
             dap_stream_ch_set_ready_to_write_unsafe(l_ch, true);
-            DAP_DELETE(l_request);
         }
     }
     // wait testing
@@ -640,7 +637,7 @@ int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_ipv4_st
             l_request.hdr.srv_uid.uint64 = DAP_CHAIN_NET_SRV_VPN_ID;
             dap_chain_hash_fast_t *l_tx_cond = dap_chain_net_vpn_client_tx_cond_hash(a_net, NULL, NULL, 0);
             if(l_tx_cond) {
-                memcpy(&l_request.hdr.tx_cond, l_tx_cond, sizeof(dap_chain_hash_fast_t));
+                l_request.hdr.tx_cond = *l_tx_cond;
                 DAP_DELETE(l_tx_cond);
             }
             // set srv id
diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c
index 66f3a6e0f1b6a27adeac92daac5f81c5bb479ea4..070ab4c8b45d57015b6c51c85a8f3cd8ec7e4e79 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c
@@ -710,24 +710,15 @@ void ch_sf_tun_client_send(dap_chain_net_srv_ch_vpn_t * ch_sf, void * pkt_data,
  */
 int ch_sf_tun_addr_leased(dap_chain_net_srv_ch_vpn_t * a_sf, ch_vpn_pkt_t * a_pkt, size_t a_pkt_data_size)
 {
-    // we'd receive address assigment from server
-    struct in_addr l_addr = { 0 };
-    struct in_addr l_netmask = { 0 };
-    struct in_addr l_netaddr = { 0 };
-    struct in_addr l_gw = { 0 };
-
-    size_t l_route_net_count = 0;
-
-    if(a_pkt_data_size < (sizeof(l_addr) + sizeof(l_gw))) {
-        log_it(L_ERROR, "Too small ADDR_REPLY packet (%zu bytes, need at least %zu", a_pkt_data_size, sizeof(l_addr));
+    if(a_pkt_data_size < (2 * sizeof(struct in_addr))) {
+        log_it(L_ERROR, "Too small ADDR_REPLY packet (%zu bytes, need at least %zu", a_pkt_data_size, 2 * sizeof(struct in_addr));
         return -1;
     }
 
-    l_route_net_count = (a_pkt_data_size - 3 * sizeof(struct in_addr)) / (2 * sizeof(struct in_addr));
-    memcpy(&l_addr, a_pkt->data, sizeof(l_addr));
-    memcpy(&l_gw, a_pkt->data + sizeof(l_addr), sizeof(l_gw));
-    memcpy(&l_netmask, a_pkt->data + sizeof(l_addr) + sizeof(l_gw), sizeof(l_netmask));
-    l_netaddr.s_addr = l_addr.s_addr & l_netmask.s_addr;
+    struct in_addr  l_addr      = *(struct in_addr*)a_pkt->data,
+                    l_gw        = *(struct in_addr*)(a_pkt->data + sizeof(struct in_addr)),
+                    l_netmask   = *(struct in_addr*)(a_pkt->data + sizeof(struct in_addr) * 2),
+                    l_netaddr   = { .s_addr = l_addr.s_addr & l_netmask.s_addr };
 
     char l_addr_buf[INET_ADDRSTRLEN];
     char l_gw_buf[INET_ADDRSTRLEN];
diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c
index 3ce2df5d29b9eca818b349b0e44c43d85c91dcdc..a689548c521220803efb6a8a953a010c4727647a 100644
--- a/modules/service/xchange/dap_chain_net_srv_xchange.c
+++ b/modules/service/xchange/dap_chain_net_srv_xchange.c
@@ -45,7 +45,7 @@
 #define LOG_TAG "dap_chain_net_srv_xchange"
 
 //
-enum tsd_type {
+enum tsd_type{
     TSD_FEE_PERCENT = 0x0001,
     TSD_FEE_FIXED = 0x0002,
     TSD_FEE_ADDR = 0x0003,
@@ -64,24 +64,24 @@ struct net_fee
 } *s_net_fees = NULL; // Governance statements for networks
 pthread_rwlock_t s_net_fees_rwlock = PTHREAD_RWLOCK_INITIALIZER;
 
-static void s_callback_decree(dap_chain_net_srv_t* a_srv, dap_chain_net_t* a_net, dap_chain_t* a_chain, dap_chain_datum_decree_t* a_decree, size_t a_decree_size);
+static void s_callback_decree (dap_chain_net_srv_t * a_srv, dap_chain_net_t *a_net, dap_chain_t * a_chain, dap_chain_datum_decree_t * a_decree, size_t a_decree_size);
 
 
-const dap_chain_net_srv_uid_t c_dap_chain_net_srv_xchange_uid = { .uint64 = DAP_CHAIN_NET_SRV_XCHANGE_ID };
+const dap_chain_net_srv_uid_t c_dap_chain_net_srv_xchange_uid = {.uint64= DAP_CHAIN_NET_SRV_XCHANGE_ID};
 
 
-static int s_cli_srv_xchange(int a_argc, char** a_argv, char** a_str_reply);
-static int s_callback_requested(dap_chain_net_srv_t* a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t* a_srv_client, const void* a_data, size_t a_data_size);
-static int s_callback_response_success(dap_chain_net_srv_t* a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t* a_srv_client, const void* a_data, size_t a_data_size);
-static int s_callback_response_error(dap_chain_net_srv_t* a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t* a_srv_client, const void* a_data, size_t a_data_size);
-static int s_callback_receipt_next_success(dap_chain_net_srv_t* a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t* a_srv_client, const void* a_data, size_t a_data_size);
-static dap_chain_net_srv_xchange_price_t* s_xchange_db_load(char* a_key, uint8_t* a_item);
+static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply);
+static int s_callback_requested(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size);
+static int s_callback_response_success(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size);
+static int s_callback_response_error(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size);
+static int s_callback_receipt_next_success(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size);
+static dap_chain_net_srv_xchange_price_t *s_xchange_db_load(char *a_key, uint8_t *a_item);
 
-static int s_tx_check_for_open_close(dap_chain_net_t* a_net, dap_chain_datum_tx_t* a_tx);
-static void s_string_append_tx_info(dap_string_t* a_reply_str, dap_chain_net_t* a_net, dap_chain_datum_tx_t* a_tx);
+static int s_tx_check_for_open_close(dap_chain_net_t * a_net, dap_chain_datum_tx_t * a_tx);
+static void s_string_append_tx_info( dap_string_t * a_reply_str, dap_chain_net_t * a_net, dap_chain_datum_tx_t * a_tx );
 
 
-static dap_chain_net_srv_xchange_t* s_srv_xchange;
+static dap_chain_net_srv_xchange_t *s_srv_xchange;
 
 
 /**
@@ -93,38 +93,40 @@ static dap_chain_net_srv_xchange_t* s_srv_xchange;
 int dap_chain_net_srv_xchange_init()
 {
     dap_cli_server_cmd_add("srv_xchange", s_cli_srv_xchange, "eXchange service commands",
-        "srv_xchange order create -net <net_name> -token_sell <token ticker> -token_buy <token_ticker> -wallet <name> -coins <value> -rate <value>\n"
+
+    "srv_xchange order create -net <net_name> -token_sell <token_ticker> -token_buy <token_ticker> -wallet <wallet_name> -coins <value> -rate <value>\n"
         "\tCreate a new order and tx with specified amount of datoshi to exchange with specified rate (buy / sell)\n"
-        "srv_xchange order remove -net <net_name> -order <order_hash> -wallet <wallet_name>\n"
-        "\tRemove order with specified order hash in specified net name\n"
-        "srv_xchange order update -net <net_name> -order <order_hash> -wallet <wallet_name> [-token_sell <token ticker>] "
-        "[-net_buy <net_name>] [-token_buy <token ticker>] [-coins <value>] [-rate <value>]\n"
-        "\tUpdate order with specified order hash in specified net name\n"
-        "srv_xchange orders -net <net_name>\n"
-        "\tGet the exchange orders list within specified net name\n"
-        "srv_xchange purchase -order <order hash> -net <net_name> -wallet <wallet_name> -coins <value>\n"
-        "\tExchange tokens with specified order within specified net name. Specify how many datoshies to sell with rate specified by order\n"
-
-        "srv_xchange tx_list -net <net name> [-time_from <yymmdd> -time_to <yymmdd>]"
+    "srv_xchange order remove -net <net_name> -order <order_hash> -wallet <wallet_name>\n"
+         "\tRemove order with specified order hash in specified net name\n"
+    "srv_xchange order update -net <net_name> -order <order_hash> -wallet <wallet_name> [-token_sell <token_ticker>] "
+                            "[-net_buy <net_name>] [-token_buy <token_ticker>] [-coins <value>] [-rate <value>]\n"
+         "\tUpdate order with specified order hash in specified net name\n"
+    "srv_xchange orders -net <net_name>\n"
+         "\tGet the exchange orders list within specified net name\n"
+    "srv_xchange purchase -order <order hash> -net <net_name> -wallet <wallet_name> -coins <value>\n"
+         "\tExchange tokens with specified order within specified net name. Specify how many datoshies to sell with rate specified by order\n"
+
+    "srv_xchange tx_list -net <net_name> [-time_from <yymmdd> -time_to <yymmdd>]"
         "[[-addr <wallet_addr>  [-status closed | open] ]\n"                /* @RRL:  #6294  */
         "\tList of exchange transactions\n"
 
-        "srv_xchange token_pair -net <net name> list all\n"
+    "srv_xchange token_pair -net <net_name> list all\n"
         "\tList of all token pairs\n"
-        "srv_xchange token_pair -net <net name> price average -token_from <token from> -token_to <token to> [-time_from <From time>] [-time_to <To time>]  \n"
+
+    "srv_xchange token_pair -net <net_name> price average -token_from <token_ticker> -token_to <token_ticker> [-time_from <From time>] [-time_to <To time>]  \n"
         "\tGet average rate for token pair <token from>:<token to> from <From time> to <To time> \n"
         "\tAll times are in RFC822\n"
-        "srv_xchange token_pair -net <net name> price last -token_from <token from> -token_to <token to> [-time_from <From time>] [-time_to <To time>]  \n"
+    "srv_xchange token_pair -net <net_name> price last -token_from <token_ticker> -token_to <token_ticker> [-time_from <From time>] [-time_to <To time>]  \n"
         "\tGet average rate for token pair <token from>:<token to> from <From time> to <To time> \n"
         "\tAll times are in RFC822\n"
-        "srv_xchange token_pair -net <net name> price history -token_from <token from> -token2 <token to> [-time_from <From time>] [-time_to <To time>] \n"
+    "srv_xchange token_pair -net <net_name> price history -token_from <token_ticker> -token2 <token_ticker> [-time_from <From time>] [-time_to <To time>] \n"
         "\tPrint rate history for token pair <token from>:<token to> from <From time> to <To time>\n"
         "\tAll times are in RFC822\n"
 
-        "srv_xchange enable\n"
-        "\tEnable eXchange service\n"
-        "srv_xchange disable\n"
-        "\tDisable eXchange service\n"
+    "srv_xchange enable\n"
+         "\tEnable eXchange service\n"
+    "srv_xchange disable\n"
+         "\tDisable eXchange service\n"
     );
     dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_XCHANGE_ID };
     dap_chain_net_srv_callbacks_t l_srv_callbacks = {};
@@ -141,41 +143,39 @@ int dap_chain_net_srv_xchange_init()
     s_srv_xchange->parent = l_srv;
     s_srv_xchange->enabled = false;
 
-    dap_chain_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE, dap_chain_net_srv_xchange_verificator, NULL);
-
     return 0;
 }
 
 void dap_chain_net_srv_xchange_deinit()
 {
-    if (!s_srv_xchange)
+    if(!s_srv_xchange)
         return;
     dap_chain_net_srv_del(s_srv_xchange->parent);
     DAP_DELETE(s_srv_xchange);
 }
 
-bool dap_chain_net_srv_xchange_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond_t* a_cond, dap_chain_datum_tx_t* a_tx, bool a_owner)
+bool dap_chain_net_srv_xchange_verificator(dap_ledger_t * a_ledger, dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner)
 {
     if (a_owner)
         return true;
 
     pthread_rwlock_rdlock(&s_net_fees_rwlock);
-    struct net_fee* l_fee = NULL;
-    dap_chain_net_t* l_net = dap_chain_ledger_get_net(a_ledger);
-    HASH_FIND(hh, s_net_fees, &l_net->pub.id, sizeof(l_net->pub.id), l_fee);
-    if (l_fee == NULL)
+    struct net_fee * l_fee = NULL;
+    dap_chain_net_t * l_net = dap_chain_ledger_get_net(a_ledger);
+    HASH_FIND(hh,s_net_fees, &l_net->pub.id, sizeof(l_net->pub.id),l_fee);
+    if(l_fee == NULL)
         pthread_rwlock_unlock(&s_net_fees_rwlock);
 
     /* Check the condition for verification success
      * a_cond.srv_xchange.rate (a_cond->header.value / a_cond->subtype.srv_xchange.buy_value) >=
      * a_tx.out.rate ((a_cond->header.value - l_back_val) / l_out_val)
      */
-    dap_list_t* l_list_out = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT_EXT, NULL);
+    dap_list_t *l_list_out = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT_EXT, NULL);
     uint256_t l_out_val = {}, l_back_val = {}, l_fee_val = {};
-    char* l_ticker_ctrl = NULL;
-    for (dap_list_t* l_list_tmp = l_list_out; l_list_tmp; l_list_tmp = l_list_tmp->next) {
-        dap_chain_tx_out_ext_t* l_tx_out = (dap_chain_tx_out_ext_t*)l_list_tmp->data;
-        if (memcmp(&l_tx_out->addr, &l_fee->fee_addr, sizeof(l_fee->fee_addr) == 0)) {
+    char *l_ticker_ctrl = NULL;
+    for (dap_list_t *l_list_tmp = l_list_out; l_list_tmp;  l_list_tmp = l_list_tmp->next) {
+        dap_chain_tx_out_ext_t *l_tx_out = (dap_chain_tx_out_ext_t *)l_list_tmp->data;
+        if (memcmp(&l_tx_out->addr, &l_fee->fee_addr, sizeof(l_fee->fee_addr) == 0 ) ){
             SUM_256_256(l_fee_val, l_tx_out->header.value, &l_fee_val);
         }
 
@@ -189,13 +189,12 @@ bool dap_chain_net_srv_xchange_verificator(dap_ledger_t* a_ledger, dap_chain_tx_
 
             // If we alredy have buy token out
             if (l_ticker_ctrl && strcmp(l_ticker_ctrl, l_tx_out->token)) {
-                if (l_fee) pthread_rwlock_unlock(&s_net_fees_rwlock);
+                if(l_fee) pthread_rwlock_unlock(&s_net_fees_rwlock);
                 return false;   // too many tokens
             }
             l_ticker_ctrl = l_tx_out->token;
             SUM_256_256(l_back_val, l_tx_out->header.value, &l_back_val);
-        }
-        else {                // buying token
+        } else {                // buying token
             SUM_256_256(l_out_val, l_tx_out->header.value, &l_out_val);
         }
     }
@@ -206,10 +205,10 @@ bool dap_chain_net_srv_xchange_verificator(dap_ledger_t* a_ledger, dap_chain_tx_
     MULT_256_256(l_buyer_val, a_cond->subtype.srv_xchange.buy_value, &l_buyer_mul);
     MULT_256_256(l_out_val, a_cond->header.value, &l_seller_mul);
     if (compare256(l_seller_mul, l_buyer_mul) == -1) {
-        if (l_fee) pthread_rwlock_unlock(&s_net_fees_rwlock);
+        if(l_fee) pthread_rwlock_unlock(&s_net_fees_rwlock);
         return false;           // wrong changing rate
     }
-    if (l_fee) pthread_rwlock_unlock(&s_net_fees_rwlock);
+    if(l_fee) pthread_rwlock_unlock(&s_net_fees_rwlock);
     return true;
 }
 
@@ -221,38 +220,38 @@ bool dap_chain_net_srv_xchange_verificator(dap_ledger_t* a_ledger, dap_chain_tx_
  * @param a_decree
  * @param a_decree_size
  */
-static void s_callback_decree(dap_chain_net_srv_t* a_srv, dap_chain_net_t* a_net, dap_chain_t* a_chain, dap_chain_datum_decree_t* a_decree, size_t a_decree_size)
+static void s_callback_decree (dap_chain_net_srv_t * a_srv, dap_chain_net_t *a_net, dap_chain_t * a_chain, dap_chain_datum_decree_t * a_decree, size_t a_decree_size)
 {
     pthread_rwlock_wrlock(&s_net_fees_rwlock);
-    struct net_fee* l_fee = NULL;
-    switch (a_decree->header.action) {
-    case DAP_CHAIN_DATUM_DECREE_ACTION_UPDATE: {
-        HASH_FIND(hh, s_net_fees, &a_net->pub.id, sizeof(a_net->pub.id), l_fee);
-        if (l_fee == NULL) {
-            log_it(L_WARNING, "Decree update for net id 0x%016" DAP_UINT64_FORMAT_X" when such id can't find in hash table", a_net->pub.id.uint64);
-            return;
-        }
-    }break;
-    case DAP_CHAIN_DATUM_DECREE_ACTION_CREATE: {
-        l_fee = DAP_NEW_Z(struct net_fee);
-        l_fee->net_id = a_net->pub.id;
-        HASH_ADD(hh, s_net_fees, net_id, sizeof(l_fee->net_id), l_fee);
-    } break;
+    struct net_fee * l_fee = NULL;
+    switch(a_decree->header.action){
+        case DAP_CHAIN_DATUM_DECREE_ACTION_UPDATE:{
+            HASH_FIND(hh,s_net_fees,&a_net->pub.id, sizeof(a_net->pub.id), l_fee);
+            if(l_fee == NULL){
+                log_it(L_WARNING,"Decree update for net id 0x%016" DAP_UINT64_FORMAT_X" when such id can't find in hash table", a_net->pub.id.uint64);
+                return;
+            }
+        }break;
+        case DAP_CHAIN_DATUM_DECREE_ACTION_CREATE:{
+            l_fee = DAP_NEW_Z(struct net_fee);
+            l_fee->net_id = a_net->pub.id;
+            HASH_ADD(hh, s_net_fees, net_id, sizeof(l_fee->net_id), l_fee);
+        } break;
     }
     size_t l_tsd_offset = 0;
 
-    while (l_tsd_offset < (a_decree_size - sizeof(a_decree->header))) {
-        dap_tsd_t* l_tsd = (dap_tsd_t*)(a_decree->tsd_sections + l_tsd_offset);
-        switch ((enum tsd_type)l_tsd->type) {
-        case TSD_FEE_ADDR: {
-            l_fee->fee_addr = dap_tsd_get_scalar(l_tsd, dap_chain_addr_t);
-        } break;
-        case TSD_FEE_PERCENT: {
-            l_fee->fee_percents = dap_tsd_get_scalar(l_tsd, uint256_t);
-        } break;
-        case TSD_FEE_FIXED: {
-            l_fee->fee_fixed = dap_tsd_get_scalar(l_tsd, uint256_t);
-        } break;
+    while(l_tsd_offset < (a_decree_size - sizeof(a_decree->header)) ){
+        dap_tsd_t *l_tsd = (dap_tsd_t*) (a_decree->tsd_sections + l_tsd_offset);
+        switch( (enum tsd_type) l_tsd->type){
+            case TSD_FEE_ADDR:{
+                l_fee->fee_addr = dap_tsd_get_scalar(l_tsd, dap_chain_addr_t);
+            } break;
+            case TSD_FEE_PERCENT:{
+                l_fee->fee_percents = dap_tsd_get_scalar(l_tsd, uint256_t);
+            } break;
+            case TSD_FEE_FIXED:{
+                l_fee->fee_fixed = dap_tsd_get_scalar(l_tsd, uint256_t);
+            } break;
         }
         l_tsd_offset += dap_tsd_size(l_tsd);
     }
@@ -261,44 +260,43 @@ static void s_callback_decree(dap_chain_net_srv_t* a_srv, dap_chain_net_t* a_net
 
 
 
-static dap_chain_datum_tx_receipt_t* s_xchage_receipt_create(dap_chain_net_srv_xchange_price_t* a_price, uint256_t a_datoshi_buy)
+static dap_chain_datum_tx_receipt_t *s_xchage_receipt_create(dap_chain_net_srv_xchange_price_t *a_price, uint256_t a_datoshi_buy)
 {
     uint32_t l_ext_size = sizeof(uint256_t) + DAP_CHAIN_TICKER_SIZE_MAX;
-    uint8_t* l_ext = DAP_NEW_STACK_SIZE(uint8_t, l_ext_size);
+    uint8_t *l_ext = DAP_NEW_STACK_SIZE(uint8_t, l_ext_size);
     memcpy(l_ext, &a_datoshi_buy, sizeof(uint256_t));
-    strcpy((char*)&l_ext[sizeof(uint256_t)], a_price->token_buy);
-    dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_UNDEFINED };
+    strcpy((char *)&l_ext[sizeof(uint256_t)], a_price->token_buy);
+    dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_UNDEFINED};
     dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_XCHANGE_ID };
     uint256_t l_datoshi_sell = {};
-    if (compare256(a_price->rate, uint256_0) != 0) {
+    if (compare256(a_price->rate, uint256_0)!=0){
         DIV_256_COIN(a_datoshi_buy, a_price->rate, &l_datoshi_sell);
-        dap_chain_datum_tx_receipt_t* l_receipt = dap_chain_datum_tx_receipt_create(l_uid, l_unit, 0, l_datoshi_sell,
-            l_ext, l_ext_size);
+        dap_chain_datum_tx_receipt_t *l_receipt =  dap_chain_datum_tx_receipt_create(l_uid, l_unit, 0, l_datoshi_sell,
+                                                                                 l_ext, l_ext_size);
         return l_receipt;
-    }
-    else {
+    }else{
         DAP_DELETE(l_ext);
         return NULL;
     }
 }
 
-static dap_chain_datum_tx_t* s_xchange_tx_create_request(dap_chain_net_srv_xchange_price_t* a_price, dap_chain_wallet_t* a_wallet)
+static dap_chain_datum_tx_t *s_xchange_tx_create_request(dap_chain_net_srv_xchange_price_t *a_price, dap_chain_wallet_t *a_wallet)
 {
     if (!a_price || !a_price->net || !*a_price->token_sell || !*a_price->token_buy || !a_wallet) {
         return NULL;
     }
 
     // create empty transaction
-    dap_chain_datum_tx_t* l_tx = dap_chain_datum_tx_create();
+    dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create();
 
-    dap_ledger_t* l_ledger = dap_chain_ledger_by_net_name(a_price->net->pub.name);
-    dap_chain_addr_t* l_seller_addr = (dap_chain_addr_t*)dap_chain_wallet_get_addr(a_wallet, a_price->net->pub.id);
-    dap_enc_key_t* l_seller_key = dap_chain_wallet_get_key(a_wallet, 0);
+    dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(a_price->net->pub.name);
+    dap_chain_addr_t *l_seller_addr = (dap_chain_addr_t *)dap_chain_wallet_get_addr(a_wallet, a_price->net->pub.id);
+    dap_enc_key_t *l_seller_key = dap_chain_wallet_get_key(a_wallet, 0);
     uint256_t l_value_sell = {}; // how many coins to transfer
     // list of transaction with 'out' items to sell
-    dap_list_t* l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_price->token_sell,
-        l_seller_addr, a_price->datoshi_sell, &l_value_sell);
-    if (!l_list_used_out) {
+    dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_price->token_sell,
+                                                                             l_seller_addr, a_price->datoshi_sell, &l_value_sell);
+    if(!l_list_used_out) {
         dap_chain_datum_tx_delete(l_tx);
         DAP_DELETE(l_seller_addr);
         log_it(L_WARNING, "Nothing to change (not enough funds)");
@@ -320,16 +318,16 @@ static dap_chain_datum_tx_t* s_xchange_tx_create_request(dap_chain_net_srv_xchan
         uint256_t l_datoshi_buy = uint256_0;
         MULT_256_COIN(a_price->datoshi_sell, a_price->rate, &l_datoshi_buy);
         dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_XCHANGE_ID };
-        dap_chain_tx_out_cond_t* l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_xchange(l_uid, a_price->net->pub.id, a_price->datoshi_sell,
-            a_price->net->pub.id, a_price->token_buy, l_datoshi_buy,
-            (void*)l_seller_addr, sizeof(dap_chain_addr_t));
+        dap_chain_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_xchange(l_uid, a_price->net->pub.id, a_price->datoshi_sell,
+                                                                                                a_price->net->pub.id, a_price->token_buy, l_datoshi_buy,
+                                                                                                (void *)l_seller_addr, sizeof(dap_chain_addr_t));
         if (!l_tx_out) {
             dap_chain_datum_tx_delete(l_tx);
             DAP_DELETE(l_seller_addr);
             log_it(L_ERROR, "Can't compose the transaction conditional output");
             return NULL;
         }
-        dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*)l_tx_out);
+        dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *)l_tx_out);
         DAP_DELETE(l_tx_out);
         // coin back
         uint256_t l_value_back = {};
@@ -346,7 +344,7 @@ static dap_chain_datum_tx_t* s_xchange_tx_create_request(dap_chain_net_srv_xchan
     DAP_DELETE(l_seller_addr);
 
     // add 'sign' item
-    if (dap_chain_datum_tx_add_sign_item(&l_tx, l_seller_key) != 1) {
+    if(dap_chain_datum_tx_add_sign_item(&l_tx, l_seller_key) != 1) {
         dap_chain_datum_tx_delete(l_tx);
         log_it(L_ERROR, "Can't add sign output");
         return NULL;
@@ -355,37 +353,37 @@ static dap_chain_datum_tx_t* s_xchange_tx_create_request(dap_chain_net_srv_xchan
     return l_tx;
 }
 
-static dap_chain_datum_tx_t* s_xchange_tx_create_exchange(dap_chain_net_srv_xchange_price_t* a_price,
-    dap_chain_wallet_t* a_wallet, uint256_t a_datoshi_buy)
+static dap_chain_datum_tx_t *s_xchange_tx_create_exchange(dap_chain_net_srv_xchange_price_t *a_price,
+                                                          dap_chain_wallet_t *a_wallet, uint256_t a_datoshi_buy)
 {
     if (!a_price || !a_price->net || !*a_price->token_sell || !*a_price->token_buy || !a_wallet) {
         return NULL;
     }
 
     // create empty transaction
-    dap_chain_datum_tx_t* l_tx = dap_chain_datum_tx_create();
+    dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create();
 
-    dap_ledger_t* l_ledger = dap_chain_ledger_by_net_name(a_price->net->pub.name);
-    dap_chain_addr_t* l_buyer_addr = (dap_chain_addr_t*)dap_chain_wallet_get_addr(a_wallet, a_price->net->pub.id);
-    dap_enc_key_t* l_seller_key = dap_chain_wallet_get_key(a_wallet, 0);
+    dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(a_price->net->pub.name);
+    dap_chain_addr_t *l_buyer_addr = (dap_chain_addr_t *)dap_chain_wallet_get_addr(a_wallet, a_price->net->pub.id);
+    dap_enc_key_t *l_seller_key = dap_chain_wallet_get_key(a_wallet, 0);
     uint256_t l_value_buy = {}; // how many coins to transfer
     // list of transaction with 'out' items to sell
-    dap_list_t* l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_price->token_buy,
-        l_buyer_addr, a_datoshi_buy, &l_value_buy);
-    if (!l_list_used_out) {
+    dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_price->token_buy,
+                                                                             l_buyer_addr, a_datoshi_buy, &l_value_buy);
+    if(!l_list_used_out) {
         dap_chain_datum_tx_delete(l_tx);
         log_it(L_WARNING, "Nothing to change (not enough funds)");
         return NULL;
     }
 
     // create and add reciept
-    dap_chain_datum_tx_receipt_t* l_receipt = s_xchage_receipt_create(a_price, a_datoshi_buy);
-    if (l_receipt == NULL) {
+    dap_chain_datum_tx_receipt_t *l_receipt = s_xchage_receipt_create(a_price, a_datoshi_buy);
+    if( l_receipt == NULL){
         DAP_DELETE(l_buyer_addr);
         log_it(L_ERROR, "Can't compose the receipt");
         return NULL;
     }
-    dap_chain_datum_tx_add_item(&l_tx, (byte_t*)l_receipt);
+    dap_chain_datum_tx_add_item(&l_tx, (byte_t *)l_receipt);
     DAP_DELETE(l_receipt);
     // add 'in' items to sell
     uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
@@ -397,13 +395,13 @@ static dap_chain_datum_tx_t* s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
         return NULL;
     }
     // add 'in' item to buy from conditional transaction
-    dap_chain_datum_tx_t* l_cond_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, &a_price->tx_hash);
+    dap_chain_datum_tx_t *l_cond_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, &a_price->tx_hash);
     if (!l_cond_tx) {
         log_it(L_WARNING, "Requested conditional transaction not found");
         return NULL;
     }
     int l_prev_cond_idx = 0;
-    dap_chain_tx_out_cond_t* l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_cond_tx, &l_prev_cond_idx);
+    dap_chain_tx_out_cond_t *l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_cond_tx, &l_prev_cond_idx);
     if (dap_chain_ledger_tx_hash_is_used_out_item(l_ledger, &a_price->tx_hash, l_prev_cond_idx)) {
         log_it(L_WARNING, "Requested conditional transaction is already used out");
         return false;
@@ -412,7 +410,7 @@ static dap_chain_datum_tx_t* s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
     // add 'out' items
     {
         // transfer buying coins
-        const dap_chain_addr_t* l_seller_addr = (dap_chain_addr_t*)l_tx_out_cond->params;
+        const dap_chain_addr_t *l_seller_addr = (dap_chain_addr_t *)l_tx_out_cond->params;
         if (dap_chain_datum_tx_add_out_ext_item(&l_tx, l_seller_addr, a_datoshi_buy, a_price->token_buy) == -1) {
             dap_chain_datum_tx_delete(l_tx);
             DAP_DELETE(l_buyer_addr);
@@ -432,7 +430,7 @@ static dap_chain_datum_tx_t* s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
         }
         //transfer selling coins
         uint256_t l_datoshi_sell = {};
-        if (compare256(a_price->rate, uint256_0) != 0) {
+        if (compare256(a_price->rate, uint256_0)!=0){
             DIV_256_COIN(a_datoshi_buy, a_price->rate, &l_datoshi_sell);
 
             if (dap_chain_datum_tx_add_out_ext_item(&l_tx, l_buyer_addr, l_datoshi_sell, a_price->token_sell) == -1) {
@@ -441,8 +439,7 @@ static dap_chain_datum_tx_t* s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
                 log_it(L_ERROR, "Can't add selling coins output");
                 return NULL;
             }
-        }
-        else {
+        }else{
             DAP_DELETE(l_buyer_addr);
             log_it(L_ERROR, "Can't add selling coins output because price rate is 0");
             return NULL;
@@ -460,9 +457,9 @@ static dap_chain_datum_tx_t* s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
     }
 
     // add 'sign' items
-    if (dap_chain_datum_tx_add_sign_item(&l_tx, l_seller_key) != 1) {
+    if(dap_chain_datum_tx_add_sign_item(&l_tx, l_seller_key) != 1) {
         dap_chain_datum_tx_delete(l_tx);
-        log_it(L_ERROR, "Can't add sign output");
+        log_it( L_ERROR, "Can't add sign output");
         return NULL;
     }
 
@@ -472,23 +469,23 @@ static dap_chain_datum_tx_t* s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
 
 
 // Put the transaction to mempool or directly to chains & write transaction's hash to the price
-static bool s_xchange_tx_put(dap_chain_datum_tx_t* a_tx, dap_chain_net_t* a_net)
+static bool s_xchange_tx_put(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_net)
 {
     // Put the transaction to mempool or directly to chains
     size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx);
-    dap_chain_datum_t* l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, a_tx, l_tx_size);
+    dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, a_tx, l_tx_size);
     DAP_DELETE(a_tx);
-    dap_chain_t* l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX);
+    dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX);
     if (!l_chain) {
         DAP_DELETE(l_datum);
         return false;
     }
     // Processing will be made according to autoprocess policy
-    char* l_ret = dap_chain_mempool_datum_add(l_datum, l_chain);
+    char *l_ret = dap_chain_mempool_datum_add(l_datum, l_chain);
 
     DAP_DELETE(l_datum);
 
-    if (!l_ret)
+    if (  !l_ret )
         return false;
 
     DAP_DELETE(l_ret);
@@ -496,32 +493,32 @@ static bool s_xchange_tx_put(dap_chain_datum_tx_t* a_tx, dap_chain_net_t* a_net)
     return true;
 }
 
-static bool s_xchage_tx_invalidate(dap_chain_net_srv_xchange_price_t* a_price, dap_chain_wallet_t* a_wallet)
+static bool s_xchage_tx_invalidate(dap_chain_net_srv_xchange_price_t *a_price, dap_chain_wallet_t *a_wallet)
 {
     // create empty transaction
-    dap_chain_datum_tx_t* l_tx = dap_chain_datum_tx_create();
+    dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create();
 
-    dap_ledger_t* l_ledger = dap_chain_ledger_by_net_name(a_price->net->pub.name);
-    dap_chain_addr_t* l_seller_addr = (dap_chain_addr_t*)dap_chain_wallet_get_addr(a_wallet, a_price->net->pub.id);
-    dap_enc_key_t* l_seller_key = dap_chain_wallet_get_key(a_wallet, 0);
+    dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(a_price->net->pub.name);
+    dap_chain_addr_t *l_seller_addr = (dap_chain_addr_t *)dap_chain_wallet_get_addr(a_wallet, a_price->net->pub.id);
+    dap_enc_key_t *l_seller_key = dap_chain_wallet_get_key(a_wallet, 0);
 
     // create and add reciept
-    dap_chain_datum_tx_receipt_t* l_receipt = s_xchage_receipt_create(a_price, uint256_0);
+    dap_chain_datum_tx_receipt_t *l_receipt = s_xchage_receipt_create(a_price, uint256_0);
     if (!l_receipt) {
         log_it(L_WARNING, "Can't create receipt");
         return false;
     }
-    dap_chain_datum_tx_add_item(&l_tx, (byte_t*)l_receipt);
+    dap_chain_datum_tx_add_item(&l_tx, (byte_t *)l_receipt);
     DAP_DELETE(l_receipt);
 
     // add 'in' item to buy from conditional transaction
-    dap_chain_datum_tx_t* l_cond_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, &a_price->tx_hash);
+    dap_chain_datum_tx_t *l_cond_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, &a_price->tx_hash);
     if (!l_cond_tx) {
         log_it(L_WARNING, "Requested conditional transaction not found");
         return false;
     }
     int l_prev_cond_idx;
-    dap_chain_tx_out_cond_t* l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_cond_tx, &l_prev_cond_idx);
+    dap_chain_tx_out_cond_t *l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_cond_tx, &l_prev_cond_idx);
     if (dap_chain_ledger_tx_hash_is_used_out_item(l_ledger, &a_price->tx_hash, l_prev_cond_idx)) {
         log_it(L_WARNING, "Requested conditional transaction is already used out");
         return false;
@@ -529,7 +526,7 @@ static bool s_xchage_tx_invalidate(dap_chain_net_srv_xchange_price_t* a_price, d
     dap_chain_datum_tx_add_in_cond_item(&l_tx, &a_price->tx_hash, l_prev_cond_idx, 0);
 
     // add 'out' item
-    const dap_chain_addr_t* l_buyer_addr = (dap_chain_addr_t*)l_tx_out_cond->params;
+    const dap_chain_addr_t *l_buyer_addr = (dap_chain_addr_t *)l_tx_out_cond->params;
     if (memcmp(l_seller_addr->data.hash, l_buyer_addr->data.hash, sizeof(dap_chain_hash_fast_t))) {
         log_it(L_WARNING, "Only owner can invalidate exchange transaction");
         return false;
@@ -543,9 +540,9 @@ static bool s_xchage_tx_invalidate(dap_chain_net_srv_xchange_price_t* a_price, d
     DAP_DELETE(l_seller_addr);
 
     // add 'sign' items
-    if (dap_chain_datum_tx_add_sign_item(&l_tx, l_seller_key) != 1) {
+    if(dap_chain_datum_tx_add_sign_item(&l_tx, l_seller_key) != 1) {
         dap_chain_datum_tx_delete(l_tx);
-        log_it(L_ERROR, "Can't add sign output");
+        log_it( L_ERROR, "Can't add sign output");
         return false;
     }
     if (!s_xchange_tx_put(l_tx, a_price->net)) {
@@ -560,24 +557,24 @@ static bool s_xchage_tx_invalidate(dap_chain_net_srv_xchange_price_t* a_price, d
  * @param a_tx
  * @return
  */
-char* s_xchange_order_create(dap_chain_net_srv_xchange_price_t* a_price, dap_chain_datum_tx_t* a_tx)
+char *s_xchange_order_create(dap_chain_net_srv_xchange_price_t *a_price, dap_chain_datum_tx_t *a_tx)
 {
     dap_chain_hash_fast_t l_tx_hash = {};
     dap_hash_fast(a_tx, dap_chain_datum_tx_get_size(a_tx), &l_tx_hash);
-    memcpy(&a_price->tx_hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t));
-    dap_srv_xchange_order_ext_t l_ext = { 0 };
+    a_price->tx_hash = l_tx_hash;
+    dap_srv_xchange_order_ext_t l_ext={0};
     l_ext.datoshi_sell = a_price->datoshi_sell;
     strncpy(l_ext.token_sell, a_price->token_sell, DAP_CHAIN_TICKER_SIZE_MAX);
     uint32_t l_ext_size = sizeof(dap_srv_xchange_order_ext_t);
-    dap_chain_node_addr_t* l_node_addr = dap_chain_net_get_cur_addr(a_price->net);
-    dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_UNDEFINED };
+    dap_chain_node_addr_t *l_node_addr = dap_chain_net_get_cur_addr(a_price->net);
+    dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 =  SERV_UNIT_UNDEFINED};
     dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_XCHANGE_ID };
     uint256_t l_datoshi_buy = uint256_0;
     MULT_256_COIN(a_price->datoshi_sell, a_price->rate, &l_datoshi_buy);
 
-    char* l_order_hash_str = dap_chain_net_srv_order_create(a_price->net, SERV_DIR_BUY, l_uid, *l_node_addr,
-        l_tx_hash, &l_datoshi_buy, l_unit, a_price->token_buy, 0,
-        (uint8_t*)&l_ext, l_ext_size, NULL, 0, a_price->wallet_key);
+    char *l_order_hash_str = dap_chain_net_srv_order_create(a_price->net, SERV_DIR_BUY, l_uid, *l_node_addr,
+                                                            l_tx_hash, &l_datoshi_buy, l_unit, a_price->token_buy, 0,
+                                                            (uint8_t *)&l_ext, l_ext_size, NULL, 0, a_price->wallet_key);
     return l_order_hash_str;
 }
 
@@ -587,20 +584,19 @@ char* s_xchange_order_create(dap_chain_net_srv_xchange_price_t* a_price, dap_cha
  * @param a_order
  * @return
  */
-dap_chain_net_srv_xchange_price_t* s_xchange_price_from_order(dap_chain_net_t* a_net, dap_chain_net_srv_order_t* a_order)
+dap_chain_net_srv_xchange_price_t *s_xchange_price_from_order(dap_chain_net_t *a_net, dap_chain_net_srv_order_t *a_order)
 {
-    dap_chain_net_srv_xchange_price_t* l_price = DAP_NEW_Z(dap_chain_net_srv_xchange_price_t);
-    dap_srv_xchange_order_ext_t* l_ext = (dap_srv_xchange_order_ext_t*)a_order->ext_n_sign;
+    dap_chain_net_srv_xchange_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_xchange_price_t);
+    dap_srv_xchange_order_ext_t *l_ext = (dap_srv_xchange_order_ext_t *)a_order->ext_n_sign;
     l_price->datoshi_sell = l_ext->datoshi_sell;
     strcpy(l_price->token_sell, l_ext->token_sell);
     l_price->net = a_net;
     strcpy(l_price->token_buy, a_order->price_ticker);
-    if (compare256(l_price->datoshi_sell, uint256_0) != 0) {
+    if( compare256(l_price->datoshi_sell, uint256_0) !=0 ){
         DIV_256_COIN(a_order->price, l_price->datoshi_sell, &l_price->rate);
-        memcpy(&l_price->tx_hash, &a_order->tx_cond_hash, sizeof(dap_chain_hash_fast_t));
+        l_price->tx_hash = a_order->tx_cond_hash;
         return l_price;
-    }
-    else {
+    }else{
         DAP_DELETE(l_price);
         return NULL;
     }
@@ -614,382 +610,376 @@ dap_chain_net_srv_xchange_price_t* s_xchange_price_from_order(dap_chain_net_t* a
  * @param a_str_reply
  * @return
  */
-static int s_cli_srv_xchange_order(int a_argc, char** a_argv, int a_arg_index, char** a_str_reply)
+static int s_cli_srv_xchange_order(int a_argc, char **a_argv, int a_arg_index, char **a_str_reply)
 {
     enum {
         CMD_NONE, CMD_CREATE, CMD_REMOVE, CMD_UPDATE, CMD_HISTORY
     };
     int l_cmd_num = CMD_NONE;
-    if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, min(a_argc, a_arg_index + 1), "create", NULL)) {
+    if(dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, min(a_argc, a_arg_index + 1), "create", NULL)) {
         l_cmd_num = CMD_CREATE;
     }
-    else if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, min(a_argc, a_arg_index + 1), "remove", NULL)) {
+    else if(dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, min(a_argc, a_arg_index + 1), "remove", NULL)) {
         l_cmd_num = CMD_REMOVE;
     }
-    else if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, min(a_argc, a_arg_index + 1), "update", NULL)) {
+    else if(dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, min(a_argc, a_arg_index + 1), "update", NULL)) {
         l_cmd_num = CMD_UPDATE;
     }
-    else if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, min(a_argc, a_arg_index + 1), "history", NULL)) {
+    else if(dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, min(a_argc, a_arg_index + 1), "history", NULL)) {
         l_cmd_num = CMD_HISTORY;
     }
     int l_arg_index = a_arg_index + 1;
-    const char* l_net_str = NULL;
-    const char* l_token_sell_str = NULL, * l_token_buy_str = NULL;
-    const char* l_wallet_str = NULL;
-    dap_chain_net_t* l_net = NULL;
+    const char *l_net_str = NULL;
+    const char *l_token_sell_str = NULL, *l_token_buy_str = NULL;
+    const char *l_wallet_str = NULL;
+    dap_chain_net_t *l_net = NULL;
     switch (l_cmd_num) {
-    case CMD_CREATE: {
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
-        if (!l_net_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'order create' required parameter -net");
-            return -2;
-        }
-        l_net = dap_chain_net_by_name(l_net_str);
-        if (!l_net) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
-            return -3;
-        }
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-token_sell", &l_token_sell_str);
-        if (!l_token_sell_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -token_sell");
-            return -5;
-        }
-        if (!dap_chain_ledger_token_ticker_check(l_net->pub.ledger, l_token_sell_str)) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Token ticker %s not found", l_token_sell_str);
-            return -6;
-        }
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-token_buy", &l_token_buy_str);
-        if (!l_token_buy_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -token_buy");
-            return -5;
-        }
-        if (!dap_chain_ledger_token_ticker_check(l_net->pub.ledger, l_token_buy_str)) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Token ticker %s not found", l_token_buy_str);
-            return -6;
-        }
-        const char* l_val_sell_str = NULL, * l_val_rate_str = NULL;
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-coins", &l_val_sell_str);
-        if (!l_val_sell_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -coins");
-            return -8;
-        }
-        uint256_t l_datoshi_sell = dap_chain_balance_scan(l_val_sell_str);
-        if (IS_ZERO_256(l_datoshi_sell)) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
-            return -9;
-        }
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-rate", &l_val_rate_str);
-        if (!l_val_rate_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -rate");
-            return -8;
-        }
-        uint256_t l_rate = dap_chain_coins_to_balance(l_val_rate_str);
-        if (!compare256(l_rate, uint256_0)) { // if (l_rate == 0)
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -rate n.n = buy / sell (eg: 1.0, 1.135)");
-            return -9;
-        }
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_wallet_str);
-        if (!l_wallet_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -wallet");
-            return -10;
-        }
-        dap_chain_wallet_t* l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));
-        if (!l_wallet) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found");
-            return -11;
-        }
-        uint256_t l_value = dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_token_sell_str);
-        if (compare256(l_value, l_datoshi_sell) == -1) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Not enough cash in specified wallet");
-            dap_chain_wallet_close(l_wallet);
-            return -12;
-        }
-        // Create the price
-        dap_chain_net_srv_xchange_price_t* l_price = DAP_NEW_Z(dap_chain_net_srv_xchange_price_t);
-        l_price->wallet_str = dap_strdup(l_wallet_str);
-        dap_stpcpy(l_price->token_sell, l_token_sell_str);
-        l_price->net = l_net;
-        dap_stpcpy(l_price->token_buy, l_token_buy_str);
-        l_price->datoshi_sell = l_datoshi_sell;
-        l_price->rate = l_rate;
-        // Create conditional transaction
-        dap_chain_datum_tx_t* l_tx = s_xchange_tx_create_request(l_price, l_wallet);
-        if (!l_tx) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose the conditional transaction");
-            DAP_DELETE(l_price->wallet_str);
-            DAP_DELETE(l_price);
-            dap_chain_wallet_close(l_wallet);
-            return -14;
-        }
-        // Create the order & put it to GDB
-        l_price->wallet_key = dap_chain_wallet_get_key(l_wallet, 0);
-        char* l_order_hash_str = s_xchange_order_create(l_price, l_tx);
-        dap_chain_wallet_close(l_wallet);
-        if (l_order_hash_str) {
-            dap_chain_hash_fast_from_str(l_order_hash_str, &l_price->order_hash);
-            if (!s_xchange_tx_put(l_tx, l_net)) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't put transaction to mempool");
-                dap_chain_net_srv_order_delete_by_hash_str_sync(l_net, l_order_hash_str);
-                DAP_DELETE(l_order_hash_str);
-                DAP_DELETE(l_price->wallet_str);
-                DAP_DELETE(l_price);
-                return -15;
+        case CMD_CREATE: {
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
+            if (!l_net_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'order create' required parameter -net");
+                return -2;
             }
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str);
-            DAP_DELETE(l_order_hash_str);
-        }
-        else {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose the order");
-            DAP_DELETE(l_price->wallet_str);
-            DAP_DELETE(l_price);
-            return -18;
-        }
-    } break;
-    case CMD_HISTORY: {
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
-        if (!l_net_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'order create' required parameter -net");
-            return -2;
-        }
-        l_net = dap_chain_net_by_name(l_net_str);
-        if (!l_net) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
-            return -3;
-        }
-
-    } break;
-
-        const char* l_order_hash_str = NULL;
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-order", &l_order_hash_str);
-        if (!l_order_hash_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price %s' required parameter -order",
-                l_cmd_num == CMD_REMOVE ? "remove" : "update");
-            return -12;
-        }
-        dap_chain_net_srv_order_t* l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str);
-        if (!l_order) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order not found");
-            return -13;
-        }
-
-        dap_chain_datum_tx_t* l_tx = dap_chain_net_get_tx_by_hash(l_net, &l_order->tx_cond_hash, TX_SEARCH_TYPE_NET);
-        if (l_tx) {
-            int l_rc = s_tx_check_for_open_close(l_net, l_tx);
-            char* l_tx_hash = dap_chain_hash_fast_to_str_new(&l_order->tx_cond_hash);
-            if (l_rc == 0) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "WRONG TX %s", l_tx_hash);
-            }
-            else if (l_rc == 1) {
-                dap_string_t* l_str_reply = dap_string_new("");
-                s_string_append_tx_info(l_str_reply, l_net, l_tx);
-                *a_str_reply = dap_string_free(l_str_reply, false);
-            }
-            else if (l_rc == 2) {
-                dap_string_t* l_str_reply = dap_string_new("");
-                while (l_tx) {
-                    s_string_append_tx_info(l_str_reply, l_net, l_tx);
-
-                }
-                *a_str_reply = dap_string_free(l_str_reply, false);
+            l_net = dap_chain_net_by_name(l_net_str);
+            if (!l_net) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
+                return -3;
             }
-            else {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Internal error!");
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-token_sell", &l_token_sell_str);
+            if (!l_token_sell_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -token_sell");
+                return -5;
             }
-        }
-        else {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "No history");
-        }
-
-    case CMD_REMOVE:
-    case CMD_UPDATE: {
-        const char* l_order_hash_str = NULL;
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
-        if (!l_net_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price %s' required parameter -net",
-                l_cmd_num == CMD_REMOVE ? "remove" : "update");
-            return -2;
-        }
-        dap_chain_net_t* l_net = dap_chain_net_by_name(l_net_str);
-        if (!l_net) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
-            return -3;
-        }
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_wallet_str);
-        if (!l_wallet_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price %s' required parameter -wallet",
-                l_cmd_num == CMD_REMOVE ? "remove" : "update");
-            return -10;
-        }
-        dap_chain_wallet_t* l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));
-        if (!l_wallet) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found");
-            return -11;
-        }
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-order", &l_order_hash_str);
-        if (!l_order_hash_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price %s' required parameter -order",
-                l_cmd_num == CMD_REMOVE ? "remove" : "update");
-            return -12;
-        }
-        dap_chain_net_srv_order_t* l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str);
-        if (!l_order) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order not found");
-            return -13;
-        }
-        dap_chain_net_srv_xchange_price_t* l_price = s_xchange_price_from_order(l_net, l_order);
-        if (!l_order) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't create price object from order");
-            return -13;
-        }
-
-        if (l_cmd_num == CMD_REMOVE) {
-            dap_string_t* l_str_reply = dap_string_new("");
-            bool l_ret = s_xchage_tx_invalidate(l_price, l_wallet);
-            dap_chain_wallet_close(l_wallet);
-            if (!l_ret) {
-                char* l_tx_hash_str = dap_chain_hash_fast_to_str_new(&l_price->tx_hash);
-                dap_string_append_printf(l_str_reply, "Can't invalidate transaction %s\n", l_tx_hash_str);
-                DAP_DELETE(l_tx_hash_str);
+            if (!dap_chain_ledger_token_ticker_check(l_net->pub.ledger, l_token_sell_str)) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Token ticker %s not found", l_token_sell_str);
+                return -6;
             }
-            char* l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_price->order_hash);
-            if (dap_chain_net_srv_order_delete_by_hash_str_sync(l_price->net, l_order_hash_str)) {
-                dap_string_append_printf(l_str_reply, "Can't remove order %s\n", l_order_hash_str);
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-token_buy", &l_token_buy_str);
+            if (!l_token_buy_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -token_buy");
+                return -5;
             }
-            DAP_DELETE(l_order_hash_str);
-            DAP_DELETE(l_price);
-            if (!l_str_reply->len) {
-                dap_string_append(l_str_reply, "Price successfully removed");
+            if (!dap_chain_ledger_token_ticker_check(l_net->pub.ledger, l_token_buy_str)) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Token ticker %s not found", l_token_buy_str);
+                return -6;
             }
-            *a_str_reply = dap_string_free(l_str_reply, false);
-        }
-        else {    // CMD_UPDATE
-            const char* l_val_sell_str = NULL, * l_val_rate_str = NULL, * l_wallet_str = NULL, * l_new_wallet_str = NULL;
-            uint256_t l_datoshi_sell = {};
-            uint256_t l_rate = uint256_0;
-            dap_chain_wallet_t* l_wallet = NULL;
+            const char *l_val_sell_str = NULL, *l_val_rate_str = NULL;
             dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-coins", &l_val_sell_str);
-            if (l_val_sell_str) {
-                l_datoshi_sell = dap_chain_balance_scan(l_val_sell_str);
-                if (IS_ZERO_256(l_datoshi_sell)) {
-                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
-                    return -9;
-                }
+            if (!l_val_sell_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -coins");
+                return -8;
+            }
+            uint256_t l_datoshi_sell = dap_chain_balance_scan(l_val_sell_str);
+            if (IS_ZERO_256(l_datoshi_sell)) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
+                return -9;
             }
             dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-rate", &l_val_rate_str);
-            if (l_val_rate_str) {
-                l_rate = dap_chain_coins_to_balance(l_val_rate_str);
-                if (!compare256(l_rate, uint256_0)) { // if (l_rate == 0)
-                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -rate <long double> = sell / buy");
-                    return -9;
-                }
+            if (!l_val_rate_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -rate");
+                return -8;
+            }
+            uint256_t l_rate = dap_chain_coins_to_balance(l_val_rate_str);
+            if (!compare256(l_rate, uint256_0)) { // if (l_rate == 0)
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -rate n.n = buy / sell (eg: 1.0, 1.135)");
+                return -9;
+            }
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_wallet_str);
+            if (!l_wallet_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price create' required parameter -wallet");
+                return -10;
             }
-            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_new_wallet_str);
-            l_wallet_str = l_new_wallet_str ? l_new_wallet_str : l_price->wallet_str;
-            l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));
+            dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));
             if (!l_wallet) {
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found");
                 return -11;
             }
-            if (!l_val_sell_str && !l_val_rate_str && !l_wallet_str) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "At least one of updating parameters is mandatory");
-                return -13;
-            }
             uint256_t l_value = dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_token_sell_str);
-            if (!IS_ZERO_256(l_datoshi_sell) && compare256(l_value, l_datoshi_sell) == -1) {
+            if (compare256(l_value, l_datoshi_sell) == -1) {
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "Not enough cash in specified wallet");
                 dap_chain_wallet_close(l_wallet);
                 return -12;
             }
-            if (l_val_sell_str) {
-                l_price->datoshi_sell = l_datoshi_sell;
-            }
-            if (l_val_rate_str) {
-                l_price->rate = l_rate;
-            }
-            // Update the transaction
-            dap_chain_datum_tx_t* l_tx = s_xchange_tx_create_request(l_price, l_wallet);
-            if (l_new_wallet_str) {
-                dap_chain_wallet_close(l_wallet);
-                l_wallet = dap_chain_wallet_open(l_price->wallet_str, dap_chain_wallet_get_path(g_config));
-                DAP_DELETE(l_price->wallet_str);
-                l_price->wallet_str = dap_strdup(l_new_wallet_str);
-            }
+            // Create the price
+            dap_chain_net_srv_xchange_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_xchange_price_t);
+            l_price->wallet_str = dap_strdup(l_wallet_str);
+            dap_stpcpy(l_price->token_sell, l_token_sell_str);
+            l_price->net = l_net;
+            dap_stpcpy(l_price->token_buy, l_token_buy_str);
+            l_price->datoshi_sell = l_datoshi_sell;
+            l_price->rate = l_rate;
+            // Create conditional transaction
+            dap_chain_datum_tx_t *l_tx = s_xchange_tx_create_request(l_price, l_wallet);
             if (!l_tx) {
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose the conditional transaction");
+                DAP_DELETE(l_price->wallet_str);
+                DAP_DELETE(l_price);
+                dap_chain_wallet_close(l_wallet);
                 return -14;
             }
-            bool l_ret = s_xchage_tx_invalidate(l_price, l_wallet); // may be changed to old price later
+            // Create the order & put it to GDB
+            l_price->wallet_key = dap_chain_wallet_get_key(l_wallet, 0);
+            char *l_order_hash_str = s_xchange_order_create(l_price, l_tx);
             dap_chain_wallet_close(l_wallet);
-            if (!l_ret) {
-                char* l_tx_hash_str = dap_chain_hash_fast_to_str_new(&l_price->tx_hash);
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't invalidate transaction %s\n", l_tx_hash_str);
-                DAP_DELETE(l_tx_hash_str);
-                return -17;
-            }
-            // Update the order
-            char* l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_price->order_hash);
-            dap_chain_net_srv_order_delete_by_hash_str_sync(l_price->net, l_order_hash_str);
-            DAP_DELETE(l_order_hash_str);
-            l_order_hash_str = s_xchange_order_create(l_price, l_tx);
             if (l_order_hash_str) {
                 dap_chain_hash_fast_from_str(l_order_hash_str, &l_price->order_hash);
-                if (!s_xchange_tx_put(l_tx, l_net)) {
+                if(!s_xchange_tx_put(l_tx, l_net)) {
                     dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't put transaction to mempool");
                     dap_chain_net_srv_order_delete_by_hash_str_sync(l_net, l_order_hash_str);
                     DAP_DELETE(l_order_hash_str);
+                    DAP_DELETE(l_price->wallet_str);
+                    DAP_DELETE(l_price);
                     return -15;
                 }
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str);
                 DAP_DELETE(l_order_hash_str);
-            }
-            else {
+            } else {
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose the order");
                 DAP_DELETE(l_price->wallet_str);
                 DAP_DELETE(l_price);
                 return -18;
             }
+        } break;
+        case CMD_HISTORY:{
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
+            if (!l_net_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'order create' required parameter -net");
+                return -2;
+            }
+            l_net = dap_chain_net_by_name(l_net_str);
+            if (!l_net) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
+                return -3;
+            }
+
+            } break;
+
+            const char * l_order_hash_str = NULL;
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-order", &l_order_hash_str);
+            if (!l_order_hash_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price %s' required parameter -order",
+                                                                l_cmd_num == CMD_REMOVE ? "remove" : "update");
+                return -12;
+            }
+            dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str);
+            if (!l_order) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order not found");
+                return -13;
+            }
+
+            dap_chain_datum_tx_t * l_tx = dap_chain_net_get_tx_by_hash(l_net,&l_order->tx_cond_hash, TX_SEARCH_TYPE_NET);
+            if( l_tx){
+                int l_rc = s_tx_check_for_open_close(l_net,l_tx);
+                char *l_tx_hash = dap_chain_hash_fast_to_str_new(&l_order->tx_cond_hash);
+                if(l_rc == 0){
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "WRONG TX %s", l_tx_hash);
+                }else if(l_rc == 1){
+                    dap_string_t * l_str_reply = dap_string_new("");
+                    s_string_append_tx_info(l_str_reply, l_net, l_tx);
+                    *a_str_reply = dap_string_free(l_str_reply, false);
+                }else if(l_rc == 2){
+                    dap_string_t * l_str_reply = dap_string_new("");
+                    while(l_tx){
+                        s_string_append_tx_info(l_str_reply, l_net, l_tx);
+
+                    }
+                    *a_str_reply = dap_string_free(l_str_reply, false);
+                }else{
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Internal error!");
+                }
+            }else{
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "No history");
+            }
+
+        case CMD_REMOVE:
+        case CMD_UPDATE: {
+            const char * l_order_hash_str = NULL;
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
+            if (!l_net_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price %s' required parameter -net",
+                                                                l_cmd_num == CMD_REMOVE ? "remove" : "update");
+                return -2;
+            }
+            dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str);
+            if (!l_net) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
+                return -3;
+            }
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_wallet_str);
+            if (!l_wallet_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price %s' required parameter -wallet",
+                                                                l_cmd_num == CMD_REMOVE ? "remove" : "update");
+                return -10;
+            }
+            dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));
+            if (!l_wallet) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found");
+                return -11;
+            }
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-order", &l_order_hash_str);
+            if (!l_order_hash_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'price %s' required parameter -order",
+                                                                l_cmd_num == CMD_REMOVE ? "remove" : "update");
+                return -12;
+            }
+            dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str);
+            if (!l_order) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order not found");
+                return -13;
+            }
+            dap_chain_net_srv_xchange_price_t *l_price = s_xchange_price_from_order(l_net, l_order);
+            if (!l_order) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't create price object from order");
+                return -13;
+            }
+
+            if (l_cmd_num == CMD_REMOVE) {
+                dap_string_t *l_str_reply = dap_string_new("");
+                bool l_ret = s_xchage_tx_invalidate(l_price, l_wallet);
+                dap_chain_wallet_close(l_wallet);
+                if (!l_ret) {
+                    char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(&l_price->tx_hash);
+                    dap_string_append_printf(l_str_reply, "Can't invalidate transaction %s\n", l_tx_hash_str);
+                    DAP_DELETE(l_tx_hash_str);
+                }
+                char *l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_price->order_hash);
+                if (dap_chain_net_srv_order_delete_by_hash_str_sync(l_price->net, l_order_hash_str)) {
+                    dap_string_append_printf(l_str_reply, "Can't remove order %s\n", l_order_hash_str);
+                }
+                DAP_DELETE(l_order_hash_str);
+                DAP_DELETE(l_price);
+                if (!l_str_reply->len) {
+                    dap_string_append(l_str_reply, "Price successfully removed");
+                }
+                *a_str_reply = dap_string_free(l_str_reply, false);
+            } else {    // CMD_UPDATE
+                const char *l_val_sell_str = NULL, *l_val_rate_str = NULL, *l_wallet_str = NULL, *l_new_wallet_str = NULL;
+                uint256_t l_datoshi_sell = {};
+                uint256_t l_rate = uint256_0;
+                dap_chain_wallet_t *l_wallet = NULL;
+                dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-coins", &l_val_sell_str);
+                if (l_val_sell_str) {
+                    l_datoshi_sell = dap_chain_balance_scan(l_val_sell_str);
+                    if (IS_ZERO_256(l_datoshi_sell)) {
+                        dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
+                        return -9;
+                    }
+                }
+                dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-rate", &l_val_rate_str);
+                if (l_val_rate_str) {
+                    l_rate = dap_chain_coins_to_balance(l_val_rate_str);
+                    if (!compare256(l_rate, uint256_0)) { // if (l_rate == 0)
+                        dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -rate <long double> = sell / buy");
+                        return -9;
+                    }
+                }
+                dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_new_wallet_str);
+                l_wallet_str = l_new_wallet_str ? l_new_wallet_str : l_price->wallet_str;
+                l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));
+                if (!l_wallet) {
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found");
+                    return -11;
+                }
+                if (!l_val_sell_str && !l_val_rate_str && !l_wallet_str) {
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "At least one of updating parameters is mandatory");
+                    return -13;
+                }
+                uint256_t l_value = dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_token_sell_str);
+                if (!IS_ZERO_256(l_datoshi_sell) && compare256(l_value, l_datoshi_sell) == -1) {
+                        dap_cli_server_cmd_set_reply_text(a_str_reply, "Not enough cash in specified wallet");
+                        dap_chain_wallet_close(l_wallet);
+                        return -12;
+                }
+                if (l_val_sell_str) {
+                    l_price->datoshi_sell = l_datoshi_sell;
+                }
+                if (l_val_rate_str) {
+                    l_price->rate = l_rate;
+                }
+                // Update the transaction
+                dap_chain_datum_tx_t *l_tx = s_xchange_tx_create_request(l_price, l_wallet);
+                if (l_new_wallet_str) {
+                    dap_chain_wallet_close(l_wallet);
+                    l_wallet = dap_chain_wallet_open(l_price->wallet_str, dap_chain_wallet_get_path(g_config));
+                    DAP_DELETE(l_price->wallet_str);
+                    l_price->wallet_str = dap_strdup(l_new_wallet_str);
+                }
+                if (!l_tx) {
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose the conditional transaction");
+                    return -14;
+                }
+                bool l_ret = s_xchage_tx_invalidate(l_price, l_wallet); // may be changed to old price later
+                dap_chain_wallet_close(l_wallet);
+                if (!l_ret) {
+                    char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(&l_price->tx_hash);
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't invalidate transaction %s\n", l_tx_hash_str);
+                    DAP_DELETE(l_tx_hash_str);
+                    return -17;
+                }
+                // Update the order
+                char *l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_price->order_hash);
+                dap_chain_net_srv_order_delete_by_hash_str_sync(l_price->net, l_order_hash_str);
+                DAP_DELETE(l_order_hash_str);
+                l_order_hash_str = s_xchange_order_create(l_price, l_tx);
+                if (l_order_hash_str) {
+                    dap_chain_hash_fast_from_str(l_order_hash_str, &l_price->order_hash);
+                    if(!s_xchange_tx_put(l_tx, l_net)) {
+                        dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't put transaction to mempool");
+                        dap_chain_net_srv_order_delete_by_hash_str_sync(l_net, l_order_hash_str);
+                        DAP_DELETE(l_order_hash_str);
+                        return -15;
+                    }
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str);
+                    DAP_DELETE(l_order_hash_str);
+                } else {
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't compose the order");
+                    DAP_DELETE(l_price->wallet_str);
+                    DAP_DELETE(l_price);
+                    return -18;
+                }
+            }
+        } break;
+        default: {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Subcommand %s not recognized", a_argv[a_arg_index]);
+            return -4;
         }
-    } break;
-    default: {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Subcommand %s not recognized", a_argv[a_arg_index]);
-        return -4;
-    }
     }
     return 0;
 }
 
 // Filter for find tx with DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE
-static bool s_filter_tx_list(dap_chain_datum_t* a_datum, dap_chain_t* a_chain, void* a_filter_func_param)
+static bool s_filter_tx_list(dap_chain_datum_t *a_datum, dap_chain_t *a_chain, void *a_filter_func_param)
 {
     UNUSED(a_chain);
     // Datum type filter -> only tx
-    if (!a_datum || a_datum->header.type_id != DAP_CHAIN_DATUM_TX)
+    if(!a_datum || a_datum->header.type_id != DAP_CHAIN_DATUM_TX)
         return false;
-    dap_chain_datum_tx_t* l_datum_tx = (dap_chain_datum_tx_t*)a_datum->data;
+    dap_chain_datum_tx_t *l_datum_tx = (dap_chain_datum_tx_t*) a_datum->data;
     // Get time from parameters
-    dap_time_t* l_time_mass = (dap_time_t*)a_filter_func_param;
+    dap_time_t *l_time_mass = (dap_time_t*) a_filter_func_param;
     dap_time_t l_time_begin = 0;
     dap_time_t l_time_end = 0;
-    if (l_time_mass) {
+    if(l_time_mass) {
         l_time_begin = l_time_mass[0];
         l_time_end = l_time_mass[1];
     }
     // Time filter
-    if (l_time_begin && l_datum_tx->header.ts_created < l_time_begin)
+    if(l_time_begin && l_datum_tx->header.ts_created < l_time_begin)
         return false;
-    if (l_time_end && l_datum_tx->header.ts_created > l_time_end)
+    if(l_time_end && l_datum_tx->header.ts_created > l_time_end)
         return false;
     // Item filter -> if present tx_out_cond with subtype == SRV_XCHANGE
-    dap_chain_tx_out_cond_t* l_out_cond_item = NULL;
+    dap_chain_tx_out_cond_t *l_out_cond_item = NULL;
     int l_item_idx = 0;
     do {
-        l_out_cond_item = (dap_chain_tx_out_cond_t*)dap_chain_datum_tx_item_get(l_datum_tx, &l_item_idx, TX_ITEM_TYPE_OUT_COND, NULL);
+        l_out_cond_item = (dap_chain_tx_out_cond_t*) dap_chain_datum_tx_item_get(l_datum_tx, &l_item_idx, TX_ITEM_TYPE_OUT_COND, NULL);
         l_item_idx++;
-        if (l_out_cond_item && l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE) {
+        if(l_out_cond_item && l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE) {
             return true;
         }
 
-    } while (l_out_cond_item);
+    }
+    while(l_out_cond_item);
     return false;
 }
 
@@ -999,16 +989,16 @@ static bool s_filter_tx_list(dap_chain_datum_t* a_datum, dap_chain_t* a_chain, v
  * @param a_tx
  * @return 0 if its not SRV_XCHANGE transaction, 1 if its closed, 2 if its open
  */
-static int s_tx_check_for_open_close(dap_chain_net_t* a_net, dap_chain_datum_tx_t* a_tx)
+static int s_tx_check_for_open_close(dap_chain_net_t * a_net, dap_chain_datum_tx_t * a_tx)
 {
     int l_cond_idx = 0;
-    dap_hash_fast_t l_tx_hash = { 0 };
+    dap_hash_fast_t l_tx_hash = {0};
     size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx);
     dap_hash_fast(a_tx, l_tx_size, &l_tx_hash);
-    dap_chain_tx_out_cond_t* l_out_cond_item = dap_chain_datum_tx_out_cond_get(a_tx, &l_cond_idx);
-    if (l_out_cond_item && (l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE))
+    dap_chain_tx_out_cond_t *l_out_cond_item = dap_chain_datum_tx_out_cond_get(a_tx, &l_cond_idx);
+    if ( l_out_cond_item && (l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE) )
     {
-        if (dap_chain_ledger_tx_hash_is_used_out_item(a_net->pub.ledger, &l_tx_hash, l_cond_idx))
+        if(dap_chain_ledger_tx_hash_is_used_out_item(a_net->pub.ledger, &l_tx_hash, l_cond_idx))
             return 1; // If its SRV_XCHANGE and spent its closed
         else
             return 2; // If its SRV_XCHANGE and not spent its open
@@ -1023,32 +1013,32 @@ static int s_tx_check_for_open_close(dap_chain_net_t* a_net, dap_chain_datum_tx_
  * @param a_net
  * @param a_tx
  */
-static void s_string_append_tx_info(dap_string_t* a_reply_str, dap_chain_net_t* a_net, dap_chain_datum_tx_t* a_tx)
+static void s_string_append_tx_info( dap_string_t * a_reply_str, dap_chain_net_t * a_net, dap_chain_datum_tx_t * a_tx )
 {
     size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx);
 
-    dap_hash_fast_t l_tx_hash = { 0 };
-    char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE + 1];
+    dap_hash_fast_t l_tx_hash = {0};
+    char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE+1];
 
     dap_hash_fast(a_tx, l_tx_size, &l_tx_hash);
     dap_chain_hash_fast_to_str(&l_tx_hash, l_tx_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE + 1);
-    //                    dap_string_append_printf(l_reply_str, "Hash: %s\n", l_hash_str);
+//                    dap_string_append_printf(l_reply_str, "Hash: %s\n", l_hash_str);
 
-        // Get input token ticker
-    const char* l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(
-        a_net->pub.ledger, &l_tx_hash);
+    // Get input token ticker
+    const char * l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(
+                a_net->pub.ledger, &l_tx_hash);
 
     // Find SRV_XCHANGE out_cond item
     int l_cond_idx = 0;
-    dap_chain_tx_out_cond_t* l_out_cond_item = dap_chain_datum_tx_out_cond_get(a_tx, &l_cond_idx);
-    if (l_out_cond_item && (l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE))
+    dap_chain_tx_out_cond_t *l_out_cond_item = dap_chain_datum_tx_out_cond_get(a_tx, &l_cond_idx);
+    if ( l_out_cond_item && (l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE) )
     {
         bool l_is_closed = dap_chain_ledger_tx_hash_is_used_out_item(a_net->pub.ledger, &l_tx_hash, l_cond_idx);
 
         uint256_t l_value_from = l_out_cond_item->header.value;
         uint256_t l_value_to = l_out_cond_item->subtype.srv_xchange.buy_value;
-        char* l_value_to_str = dap_chain_balance_to_coins(l_value_to);
-        char* l_value_from_str = dap_chain_balance_to_coins(l_value_from);
+        char *l_value_to_str = dap_chain_balance_to_coins(l_value_to);
+        char *l_value_from_str = dap_chain_balance_to_coins(l_value_from);
 
         dap_string_append_printf(a_reply_str, "Hash: %s,", l_tx_hash_str);
         dap_string_append_printf(a_reply_str, "  Status: %s,", l_is_closed ? "closed" : "open");
@@ -1061,47 +1051,47 @@ static void s_string_append_tx_info(dap_string_t* a_reply_str, dap_chain_net_t*
 }
 
 
-static int s_cli_srv_xchange_tx_list_addr(
-    dap_chain_net_t* a_net,
-    dap_time_t      a_after,
-    dap_time_t      a_before,
-    dap_chain_addr_t* a_addr,
-    int         a_opt_status,
-    char** a_str_reply
-)
+static int s_cli_srv_xchange_tx_list_addr (
+                    dap_chain_net_t     *a_net,
+                        dap_time_t      a_after,
+                        dap_time_t      a_before,
+                    dap_chain_addr_t    *a_addr,
+                            int         a_opt_status,
+                                char    **a_str_reply
+                                          )
 {
-    char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE + 8] = { 0 };
-    dap_chain_hash_fast_t l_tx_first_hash = { 0 };
-    dap_chain_datum_tx_t* l_datum_tx;
-    size_t  l_datum_tx_size, l_tx_total, l_tx_count;
-    int l_item_idx, l_rc;
-    dap_string_t* l_reply_str;
-    dap_hash_fast_t l_hash;
-    dap_chain_tx_out_cond_t* l_out_cond_item;
+char l_hash_str [DAP_CHAIN_HASH_FAST_STR_SIZE + 8] = {0};
+dap_chain_hash_fast_t l_tx_first_hash = {0};
+dap_chain_datum_tx_t    *l_datum_tx;
+size_t  l_datum_tx_size, l_tx_total, l_tx_count;
+int l_item_idx, l_rc;
+dap_string_t *l_reply_str;
+dap_hash_fast_t l_hash;
+dap_chain_tx_out_cond_t *l_out_cond_item;
 
 
-    if (!(l_reply_str = dap_string_new("")))                              /* Prepare output string discriptor*/
+    if ( !(l_reply_str = dap_string_new("")) )                              /* Prepare output string discriptor*/
         return  log_it(L_ERROR, "Cannot allocate a memory, errno=%d", errno), -ENOMEM;
 
     memset(&l_tx_first_hash, 0, sizeof(dap_chain_hash_fast_t));             /* Initial hash == zero */
 
 
-    for (l_tx_count = l_tx_total = 0;
-        (l_datum_tx = dap_chain_ledger_tx_find_by_addr(a_net->pub.ledger, NULL, a_addr, &l_tx_first_hash));
-        l_tx_total++)
+    for ( l_tx_count = l_tx_total = 0;
+            (l_datum_tx = dap_chain_ledger_tx_find_by_addr(a_net->pub.ledger, NULL, a_addr, &l_tx_first_hash));
+                l_tx_total++)
     {
         /* Check time range (if need ) */
-        if (!(l_datum_tx->header.ts_created > a_after))
+        if ( !(l_datum_tx->header.ts_created > a_after) )
             continue;
 
-        if (a_before && (l_datum_tx->header.ts_created > a_before))
+        if ( a_before && (l_datum_tx->header.ts_created > a_before) )
             continue;
 
 
         /* TX hash */
         l_datum_tx_size = dap_chain_datum_tx_get_size(l_datum_tx);
 
-        if (!dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_hash))
+        if ( !dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_hash) )
         {                                                                   /* Never must be happend, but ... */
             log_it(L_ERROR, "dap_hash_fast(..., %zu octets) return error", l_datum_tx_size);
             dump_it("l_datum_tx", l_datum_tx, l_datum_tx_size);
@@ -1111,26 +1101,22 @@ static int s_cli_srv_xchange_tx_list_addr(
 
         /* Find SRV_XCHANGE out_cond item */
         for (l_out_cond_item = NULL, l_item_idx = 0;
-            (l_out_cond_item = (dap_chain_tx_out_cond_t*)dap_chain_datum_tx_item_get(l_datum_tx, &l_item_idx, TX_ITEM_TYPE_OUT_COND, NULL));
-            l_item_idx++)
+            (l_out_cond_item = (dap_chain_tx_out_cond_t *) dap_chain_datum_tx_item_get(l_datum_tx, &l_item_idx, TX_ITEM_TYPE_OUT_COND, NULL));
+                l_item_idx++)
         {
-            if (l_out_cond_item->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE)
+            if ( l_out_cond_item->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE )
                 continue;
 
             if (a_opt_status)                                                   /* 1 - closed, 2 - open  */
             {
                 l_rc = dap_chain_ledger_tx_hash_is_used_out_item(a_net->pub.ledger, &l_hash, l_item_idx);
 
-                if (a_opt_status)
+                if ( a_opt_status )
                 {
-                    if ((a_opt_status == 1) && l_rc)              /* Select close only */
-                    {
-                        ;
-                    }
-                    else if ((a_opt_status == 2) && (!l_rc))     /* Select open only */
-                    {
-                        ;
-                    }
+                    if ( (a_opt_status == 1) && l_rc )              /* Select close only */
+                        {;}
+                    else if ( (a_opt_status == 2) &&  (!l_rc) )     /* Select open only */
+                        {;}
                     else continue;
                 }
             }
@@ -1138,14 +1124,14 @@ static int s_cli_srv_xchange_tx_list_addr(
             dap_string_append_printf(l_reply_str, "Hash: %s\n", l_hash_str);
 
 
-            const char* l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &l_hash);
+            const char *l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &l_hash);
 
             uint256_t l_value_to = l_out_cond_item->subtype.srv_xchange.buy_value;
             uint256_t l_tx_input_values = dap_chain_net_get_tx_total_value(a_net, l_datum_tx);
 
-            char* l_tx_input_values_str = dap_chain_balance_to_coins(l_tx_input_values);
-            char* l_value_from_str = dap_chain_balance_to_coins(l_tx_input_values);
-            char* l_value_to_str = dap_chain_balance_to_coins(l_value_to);
+            char *l_tx_input_values_str = dap_chain_balance_to_coins(l_tx_input_values);
+            char *l_value_from_str = dap_chain_balance_to_coins(l_tx_input_values);
+            char *l_value_to_str = dap_chain_balance_to_coins(l_value_to);
 
             dap_string_append_printf(l_reply_str, "  Status: %s,", l_rc ? "closed" : "open");
             dap_string_append_printf(l_reply_str, "  From: %s %s,", l_tx_input_values_str, l_tx_input_ticker);
@@ -1166,621 +1152,611 @@ static int s_cli_srv_xchange_tx_list_addr(
 
 
 
-static int s_cli_srv_xchange(int a_argc, char** a_argv, char** a_str_reply)
+static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply)
 {
-    enum { CMD_NONE = 0, CMD_ORDER, CMD_ORDERS, CMD_PURCHASE, CMD_ENABLE, CMD_DISABLE, CMD_TX_LIST, CMD_TOKEN_PAIR };
+    enum {CMD_NONE = 0, CMD_ORDER, CMD_ORDERS, CMD_PURCHASE, CMD_ENABLE, CMD_DISABLE, CMD_TX_LIST, CMD_TOKEN_PAIR };
     int l_arg_index = 1, l_cmd_num = CMD_NONE, l_rc;
 
-    if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "order", NULL)) {
+    if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "order", NULL)) {
         l_cmd_num = CMD_ORDER;
     }
-    else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "orders", NULL)) {
+    else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "orders", NULL)) {
         l_cmd_num = CMD_ORDERS;
     }
-    else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "purchase", NULL)) {
+    else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "purchase", NULL)) {
         l_cmd_num = CMD_PURCHASE;
     }
-    else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "enable", NULL)) {
+    else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "enable", NULL)) {
         l_cmd_num = CMD_ENABLE;
     }
-    else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "disable", NULL)) {
+    else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "disable", NULL)) {
         l_cmd_num = CMD_DISABLE;
     }
-    else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "tx_list", NULL)) {
+    else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "tx_list", NULL)) {
         l_cmd_num = CMD_TX_LIST;
     }
-    else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "token_pair", NULL)) {
+    else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "token_pair", NULL)) {
         l_cmd_num = CMD_TOKEN_PAIR;
     }
 
 
     switch (l_cmd_num) {
-    case CMD_ORDER:
-        return s_cli_srv_xchange_order(a_argc, a_argv, l_arg_index + 1, a_str_reply);
-    case CMD_ORDERS: {
-        const char* l_net_str = NULL;
-        l_arg_index++;
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
-        if (!l_net_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'orders' required parameter -net");
-            return -2;
-        }
-        dap_chain_net_t* l_net = dap_chain_net_by_name(l_net_str);
-        if (!l_net) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
-            return -3;
-        }
+        case CMD_ORDER:
+            return s_cli_srv_xchange_order(a_argc, a_argv, l_arg_index + 1, a_str_reply);
+        case CMD_ORDERS: {
+            const char *l_net_str = NULL;
+            l_arg_index++;
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
+            if (!l_net_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'orders' required parameter -net");
+                return -2;
+            }
+            dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str);
+            if (!l_net) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
+                return -3;
+            }
 
-        char* l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(l_net);
+            char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(l_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);
-        dap_chain_net_srv_xchange_price_t* l_price;
-        dap_string_t* l_reply_str = dap_string_new("");
+            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);
+            dap_chain_net_srv_xchange_price_t *l_price;
+            dap_string_t *l_reply_str = dap_string_new("");
 
 
-        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;
+            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_XCHANGE_ID)
-                continue;
+                if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_XCHANGE_ID)
+                    continue;
 
-            // TODO add filters to list (tokens, network, etc.)
-            l_price = s_xchange_price_from_order(l_net, l_order);
-            if (!l_price) {
-                log_it(L_WARNING, "Can't create price from order");
-                continue;
-            }
+                // TODO add filters to list (tokens, network, etc.)
+                l_price = s_xchange_price_from_order(l_net, l_order);
+                if( !l_price ){
+                    log_it(L_WARNING,"Can't create price from order");
+                    continue;
+                }
 
-            uint256_t l_datoshi_buy;
-            char* l_cp1, * l_cp2, * l_cp3;
+                uint256_t l_datoshi_buy;
+                char *l_cp1, *l_cp2, *l_cp3;
 
-            MULT_256_COIN(l_price->datoshi_sell, l_price->rate, &l_datoshi_buy);  /* sell/buy computation */
+                MULT_256_COIN(l_price->datoshi_sell, l_price->rate, &l_datoshi_buy);  /* sell/buy computation */
 
-            dap_string_append_printf(l_reply_str, "orderHash: %s tokSel: %s, net: %s, tokBuy: %s, sell: %s, buy: %s buy/sell: %s\n", l_orders[i].key,
-                l_price->token_sell, l_price->net->pub.name,
-                l_price->token_buy,
-                l_cp1 = dap_chain_balance_print(l_price->datoshi_sell), l_cp2 = dap_chain_balance_print(l_datoshi_buy),
-                l_cp3 = dap_chain_balance_to_coins(l_price->rate));
+                dap_string_append_printf(l_reply_str, "orderHash: %s tokSel: %s, net: %s, tokBuy: %s, sell: %s, buy: %s buy/sell: %s\n", l_orders[i].key,
+                                         l_price->token_sell, l_price->net->pub.name,
+                                         l_price->token_buy,
+                                         l_cp1 = dap_chain_balance_print(l_price->datoshi_sell), l_cp2 = dap_chain_balance_print(l_datoshi_buy),
+                                         l_cp3 = dap_chain_balance_to_coins(l_price->rate));
 
-            DAP_DEL_Z(l_cp1);
-            DAP_DEL_Z(l_cp2);
-            DAP_DEL_Z(l_cp3);
-            DAP_DEL_Z(l_price);
-        }
-        dap_global_db_objs_delete(l_orders, l_orders_count);
-        DAP_DELETE(l_gdb_group_str);
-        if (!l_reply_str->len) {
-            dap_string_append(l_reply_str, "No orders found");
-        }
-        *a_str_reply = dap_string_free(l_reply_str, false);
-    } break;
+                DAP_DEL_Z(l_cp1);
+                DAP_DEL_Z(l_cp2);
+                DAP_DEL_Z(l_cp3);
+                DAP_DEL_Z(l_price);
+            }
+            dap_global_db_objs_delete(l_orders, l_orders_count);
+            DAP_DELETE( l_gdb_group_str);
+            if (!l_reply_str->len) {
+                dap_string_append(l_reply_str, "No orders found");
+            }
+            *a_str_reply = dap_string_free(l_reply_str, false);
+        } break;
 
 
-    case CMD_PURCHASE: {
-        const char* l_net_str = NULL, * l_wallet_str = NULL, * l_order_hash_str = NULL, * l_val_buy_str = NULL;
-        l_arg_index++;
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
-        if (!l_net_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'purchase' required parameter -net");
-            return -2;
-        }
-        dap_chain_net_t* l_net = dap_chain_net_by_name(l_net_str);
-        if (!l_net) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
-            return -3;
-        }
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_wallet_str);
-        if (!l_wallet_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'purchase' required parameter -wallet");
-            return -10;
-        }
-        dap_chain_wallet_t* l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));
-        if (!l_wallet) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found");
-            return -11;
-        }
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-order", &l_order_hash_str);
-        if (!l_order_hash_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'purchase' required parameter -order");
-            return -12;
-        }
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-coins", &l_val_buy_str);
-        if (!l_val_buy_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'purchase' required parameter -coins");
-            return -8;
-        }
-        uint256_t l_datoshi_buy = dap_chain_balance_scan(l_val_buy_str);
-        if (IS_ZERO_256(l_datoshi_buy)) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
-            return -9;
-        }
-        dap_chain_net_srv_order_t* l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str);
-        if (l_order) {
-            dap_chain_net_srv_xchange_price_t* l_price = s_xchange_price_from_order(l_net, l_order);
-            if (!l_price) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't create price from order");
-                return -13;
+        case CMD_PURCHASE: {
+            const char *l_net_str = NULL, *l_wallet_str = NULL, *l_order_hash_str = NULL, *l_val_buy_str = NULL;
+            l_arg_index++;
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
+            if (!l_net_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'purchase' required parameter -net");
+                return -2;
             }
-            // Create conditional transaction
-            dap_chain_datum_tx_t* l_tx = s_xchange_tx_create_exchange(l_price, l_wallet, l_datoshi_buy);
-            if (l_tx && s_xchange_tx_put(l_tx, l_net)) {
-                // TODO send request to seller to update / delete order & price
-                dap_chain_net_srv_order_delete_by_hash_str_sync(l_price->net, l_order_hash_str);
-            }
-            DAP_DELETE(l_price);
-            DAP_DELETE(l_order);
-            dap_cli_server_cmd_set_reply_text(a_str_reply, l_tx ? "Exchange transaction has done" :
-                "Exchange transaction error");
-        }
-        else {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order not found");
-            return -13;
-        }
-    } break;
-    case CMD_ENABLE: {
-        s_srv_xchange->enabled = true;
-    } break;
-    case CMD_DISABLE: {
-        s_srv_xchange->enabled = false;
-    } break;
-    case CMD_TX_LIST: {
-        const char* l_net_str = NULL, * l_time_begin_str = NULL, * l_time_end_str = NULL;
-        const char* l_status_str = NULL, * l_addr_str = NULL;  /* @RRL:  #6294 */
-        int     l_opt_status, l_show_tx_nr = 0;
-        dap_chain_addr_t* l_addr;
-
-        l_arg_index++;
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-time_from", &l_time_begin_str);
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-time_to", &l_time_end_str);
-
-        /*
-         * @RRL:  #6294: [[-addr <addr> [-status closed | open]]
-         * we should check for valid combination of the status and addr options
-         */
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-addr", &l_addr_str);
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-status", &l_status_str);
-
-
-        /* Validate input arguments ... */
-        l_opt_status = 0;   /* 0 - all */
-
-        if (l_status_str)
-        {
-            /* 1 - closed, 2 - open  */
-            if (dap_strcmp(l_status_str, "close") == 0)
-                l_opt_status = 1;
-            else if (dap_strcmp(l_status_str, "open") == 0)
-                l_opt_status = 2;
-            else if (dap_strcmp(l_status_str, "all") == 0)
-                l_opt_status = 0;
-            else {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized '-status %s'", l_status_str);
+            dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str);
+            if (!l_net) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
                 return -3;
             }
-        }
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_wallet_str);
+            if (!l_wallet_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'purchase' required parameter -wallet");
+                return -10;
+            }
+            dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));
+            if (!l_wallet) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified wallet not found");
+                return -11;
+            }
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-order", &l_order_hash_str);
+            if (!l_order_hash_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'purchase' required parameter -order");
+                return -12;
+            }
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-coins", &l_val_buy_str);
+            if (!l_val_buy_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'purchase' required parameter -coins");
+                return -8;
+            }
+            uint256_t l_datoshi_buy = dap_chain_balance_scan(l_val_buy_str);
+            if (IS_ZERO_256(l_datoshi_buy)) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
+                return -9;
+            }
+            dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_find_by_hash_str(l_net, l_order_hash_str);
+            if (l_order) {
+                dap_chain_net_srv_xchange_price_t *l_price = s_xchange_price_from_order(l_net, l_order);
+                if(!l_price){
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't create price from order");
+                    return -13;
+                }
+                // Create conditional transaction
+                dap_chain_datum_tx_t *l_tx = s_xchange_tx_create_exchange(l_price, l_wallet, l_datoshi_buy);
+                if (l_tx && s_xchange_tx_put(l_tx, l_net)) {
+                    // TODO send request to seller to update / delete order & price
+                    dap_chain_net_srv_order_delete_by_hash_str_sync(l_price->net, l_order_hash_str);
+                }
+                DAP_DELETE(l_price);
+                DAP_DELETE(l_order);
+                dap_cli_server_cmd_set_reply_text(a_str_reply, l_tx ? "Exchange transaction has done" :
+                                                                      "Exchange transaction error");
+            } else {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order not found");
+                return -13;
+            }
+        } break;
+        case CMD_ENABLE: {
+            s_srv_xchange->enabled = true;
+        } break;
+        case CMD_DISABLE: {
+            s_srv_xchange->enabled = false;
+        } break;
+        case CMD_TX_LIST: {
+            const char *l_net_str = NULL, *l_time_begin_str = NULL, *l_time_end_str = NULL;
+            const char *l_status_str = NULL, *l_addr_str = NULL;  /* @RRL:  #6294 */
+            int     l_opt_status, l_show_tx_nr = 0;
+            dap_chain_addr_t *l_addr;
 
+            l_arg_index++;
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-time_from", &l_time_begin_str);
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-time_to", &l_time_end_str);
 
-        if (!l_net_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'tx_list' required parameter -net");
-            return -3;
-        }
-        dap_chain_net_t* l_net = dap_chain_net_by_name(l_net_str);
-        if (!l_net) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
-            return -4;
-        }
+            /*
+             * @RRL:  #6294: [[-addr <addr> [-status closed | open]]
+             * we should check for valid combination of the status and addr options
+             */
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-addr", &l_addr_str);
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-status", &l_status_str);
 
-        dap_time_t l_time[2];
-        l_time[0] = dap_time_from_str_rfc822(l_time_begin_str);
-        l_time[1] = dap_time_from_str_rfc822(l_time_end_str);
 
+            /* Validate input arguments ... */
+            l_opt_status = 0;   /* 0 - all */
 
-        /* Dispatch request processing to ... */
-        if (l_addr_str)
-        {
-            if (!(l_addr = dap_chain_addr_from_str(l_addr_str)))
-                return  dap_cli_server_cmd_set_reply_text(a_str_reply, "Cannot convert -addr '%s' to internal representative", l_addr_str), -EINVAL;
+            if ( l_status_str )
+            {
+                /* 1 - closed, 2 - open  */
+                if ( dap_strcmp (l_status_str, "close") == 0 )
+                    l_opt_status = 1;
+                else if ( dap_strcmp (l_status_str, "open") == 0 )
+                    l_opt_status = 2;
+                else if ( dap_strcmp (l_status_str, "all") == 0 )
+                    l_opt_status = 0;
+                else  {
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized '-status %s'", l_status_str);
+                    return -3;
+                }
+            }
 
-            return  s_cli_srv_xchange_tx_list_addr(l_net, l_time[0], l_time[1], l_addr, l_opt_status, a_str_reply);
-        }
+
+            if(!l_net_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'tx_list' required parameter -net");
+                return -3;
+            }
+            dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str);
+            if(!l_net) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
+                return -4;
+            }
+
+            dap_time_t l_time[2];
+            l_time[0] = dap_time_from_str_rfc822(l_time_begin_str);
+            l_time[1] = dap_time_from_str_rfc822(l_time_end_str);
+
+
+            /* Dispatch request processing to ... */
+            if ( l_addr_str )
+            {
+                if ( !(l_addr = dap_chain_addr_from_str(l_addr_str)) )
+                    return  dap_cli_server_cmd_set_reply_text(a_str_reply, "Cannot convert -addr '%s' to internal representative", l_addr_str), -EINVAL;
+
+                return  s_cli_srv_xchange_tx_list_addr (l_net, l_time[0], l_time[1], l_addr, l_opt_status, a_str_reply);
+            }
 
 
-        // Prepare output string
-        dap_string_t* l_reply_str = dap_string_new("");
+            // Prepare output string
+            dap_string_t *l_reply_str = dap_string_new("");
 
-        // Find transactions using filter function s_filter_tx_list()
-        dap_list_t* l_datum_list0 = dap_chain_datum_list(l_net, NULL, s_filter_tx_list, l_time);
-        size_t l_datum_num = dap_list_length(l_datum_list0);
+            // Find transactions using filter function s_filter_tx_list()
+            dap_list_t *l_datum_list0 = dap_chain_datum_list(l_net, NULL, s_filter_tx_list, l_time);
+            size_t l_datum_num = dap_list_length(l_datum_list0);
 
-        if (l_datum_num > 0) {
-            //dap_string_append_printf(l_reply_str, "Found %zu transactions:\n", l_datum_num);
-            log_it(L_DEBUG, "Found %zu transactions:\n", l_datum_num);
+            if(l_datum_num > 0) {
+                //dap_string_append_printf(l_reply_str, "Found %zu transactions:\n", l_datum_num);
+                log_it(L_DEBUG,  "Found %zu transactions:\n", l_datum_num);
 
-            dap_list_t* l_datum_list = l_datum_list0;
-            char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE + 8] = { 0 };
+                dap_list_t *l_datum_list = l_datum_list0;
+                char l_hash_str [DAP_CHAIN_HASH_FAST_STR_SIZE + 8] = {0};
 
-            while (l_datum_list) {
+                while(l_datum_list) {
 #if 0
-                {/* @RRL */
-                    dap_chain_datum_t* p1 = (dap_chain_datum_t*)l_datum_list->data;
+                    {/* @RRL */
+                    dap_chain_datum_t *p1 = (dap_chain_datum_t *) l_datum_list->data;
                     log_it(L_CRITICAL, "l_datum: %p, [ver: %d, typ: %d, size: %d, ts: %llu]",
                         p1, p1->header.version_id, p1->header.type_id, p1->header.data_size, p1->header.ts_create);
 
-                    dap_chain_datum_tx_t* p2 = (dap_chain_datum_tx_t*)p1->data;
+                    dap_chain_datum_tx_t *p2 = (dap_chain_datum_tx_t*) p1->data;
                     log_it(L_CRITICAL, "l_datum_tx: %p, [ts_created: %llu, size: %d]",
                         p2, p2->header.ts_created, p2->header.tx_items_size);
-                }
+                    }
 #endif
 
-                dap_chain_datum_tx_t* l_datum_tx = (dap_chain_datum_tx_t*)((dap_chain_datum_t*)l_datum_list->data)->data;
-                size_t l_datum_tx_size = dap_chain_datum_tx_get_size(l_datum_tx);
+                    dap_chain_datum_tx_t *l_datum_tx = (dap_chain_datum_tx_t*) ((dap_chain_datum_t*) l_datum_list->data)->data;
+                    size_t l_datum_tx_size = dap_chain_datum_tx_get_size(l_datum_tx);
 
-                // Delimiter between tx
+                    // Delimiter between tx
 //                    if(l_datum_list != l_datum_list0) {
 //                        dap_string_append(l_reply_str, "\n\n");
 //                    }
 
                     // Tx hash
-                dap_hash_fast_t l_tx_hash = { 0 };
+                    dap_hash_fast_t l_tx_hash = {0};
 
-                dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_tx_hash);
-                dap_chain_hash_fast_to_str(&l_tx_hash, l_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE + 1);
-                //                    dap_string_append_printf(l_reply_str, "Hash: %s\n", l_hash_str);
+                    dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_tx_hash);
+                    dap_chain_hash_fast_to_str(&l_tx_hash, l_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE + 1);
+//                    dap_string_append_printf(l_reply_str, "Hash: %s\n", l_hash_str);
 
-                                    // Get input token ticker
-                const char* l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(
-                    l_net->pub.ledger, &l_tx_hash);
-
-                // Find SRV_XCHANGE out_cond item
-                int l_prev_cond_idx = 0;
-                dap_chain_tx_out_cond_t* l_out_cond_item = dap_chain_datum_tx_out_cond_get(l_datum_tx, &l_prev_cond_idx);
-                if (l_out_cond_item && (l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE))
-                {
-                    uint256_t l_value_from = l_out_cond_item->header.value;
-                    uint256_t l_value_to = l_out_cond_item->subtype.srv_xchange.buy_value;
-                    char* l_value_to_str = dap_chain_balance_to_coins(l_value_to);
-                    char* l_value_from_str = dap_chain_balance_to_coins(l_value_from);
+                    // Get input token ticker
+                    const char * l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(
+                                l_net->pub.ledger, &l_tx_hash);
 
-                    l_rc = dap_chain_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, &l_tx_hash, l_prev_cond_idx);
-
-                    if ((l_opt_status == 1 && !l_rc) ||       /* Select close only */
-                        (l_opt_status == 2 && l_rc))     /* Select open only */
-                        continue;
-
-                    l_show_tx_nr++;
-
-                    dap_string_append_printf(l_reply_str, "Hash: %s,", l_hash_str);
-                    dap_string_append_printf(l_reply_str, "  Status: %s,", l_rc ? "closed" : "open");
-                    dap_string_append_printf(l_reply_str, "  From: %s %s,", l_value_from_str, l_tx_input_ticker);
-                    dap_string_append_printf(l_reply_str, "  To: %s %s\n", l_value_to_str, l_out_cond_item->subtype.srv_xchange.buy_token);
+                    // Find SRV_XCHANGE out_cond item
+                    int l_prev_cond_idx = 0;
+                    dap_chain_tx_out_cond_t *l_out_cond_item = dap_chain_datum_tx_out_cond_get(l_datum_tx, &l_prev_cond_idx);
+                    if ( l_out_cond_item && (l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE) )
+                    {
+                        uint256_t l_value_from = l_out_cond_item->header.value;
+                        uint256_t l_value_to = l_out_cond_item->subtype.srv_xchange.buy_value;
+                        char *l_value_to_str = dap_chain_balance_to_coins(l_value_to);
+                        char *l_value_from_str = dap_chain_balance_to_coins(l_value_from);
 
-                    DAP_DELETE(l_value_from_str);
-                    DAP_DELETE(l_value_to_str);
-                }
+                        l_rc = dap_chain_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, &l_tx_hash, l_prev_cond_idx);
 
-                l_datum_list = dap_list_next(l_datum_list);
-            }
-            dap_string_append_printf(l_reply_str, "Found %d transactions", l_show_tx_nr);
-        }
-        else {
-            dap_string_append(l_reply_str, "Transactions not found");
-        }
-        dap_list_free_full(l_datum_list0, NULL);
-        *a_str_reply = dap_string_free(l_reply_str, false);
-    } break;
-        // Token pair control
-    case CMD_TOKEN_PAIR: {
-
-        // Find and check the network
-        const char* l_net_str = NULL;
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
-        if (!l_net_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'token_pair' required parameter -net");
-            return -3;
-        }
-        dap_chain_net_t* l_net = dap_chain_net_by_name(l_net_str);
-        if (!l_net) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
-            return -4;
-        }
+                        if ((l_opt_status == 1 && !l_rc) ||       /* Select close only */
+                                (l_opt_status == 2 &&  l_rc))     /* Select open only */
+                            continue;
 
+                        l_show_tx_nr++;
 
-        // Select subcommands
+                        dap_string_append_printf(l_reply_str, "Hash: %s,", l_hash_str);
+                        dap_string_append_printf(l_reply_str, "  Status: %s,", l_rc ? "closed" : "open");
+                        dap_string_append_printf(l_reply_str, "  From: %s %s,", l_value_from_str, l_tx_input_ticker);
+                        dap_string_append_printf(l_reply_str, "  To: %s %s\n", l_value_to_str, l_out_cond_item->subtype.srv_xchange.buy_token);
 
-        // check for price subcommand
-        const char* l_price_subcommand = NULL;
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "price", &l_price_subcommand);
+                        DAP_DELETE(l_value_from_str);
+                        DAP_DELETE(l_value_to_str);
+                    }
 
-        // check for get subcommand
-        if (l_price_subcommand) {
-            // Check for token1
-            const char* l_token_from_str = NULL;
-            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-token_from", &l_token_from_str);
-            if (!l_token_from_str) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "No argument '-token_from'");
-                return -5;
+                    l_datum_list = dap_list_next(l_datum_list);
+                }
+                dap_string_append_printf(l_reply_str, "Found %d transactions", l_show_tx_nr);
             }
-            dap_chain_datum_token_t* l_token_from_datum = dap_chain_ledger_token_ticker_check(l_net->pub.ledger, l_token_from_str);
-            if (!l_token_from_datum) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find \"%s\" token in network \"%s\" for argument '-token_from' ", l_token_from_str, l_net->pub.name);
-                return -6;
+            else{
+                dap_string_append(l_reply_str, "Transactions not found");
             }
+            dap_list_free_full(l_datum_list0, NULL);
+            *a_str_reply = dap_string_free(l_reply_str, false);
+        } break;
+        // Token pair control
+        case CMD_TOKEN_PAIR: {
 
-            // Check for token2
-            const char* l_token_to_str = NULL;
-            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-token_to", &l_token_to_str);
-            if (!l_token_to_str) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "No argument '-token_to'");
-                return -5;
-            }
-            dap_chain_datum_token_t* l_token_to_datum = dap_chain_ledger_token_ticker_check(l_net->pub.ledger, l_token_to_str);
-            if (!l_token_to_datum) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find \"%s\" token in network \"%s\" for argument '-token2' ", l_token_to_str, l_net->pub.name);
-                return -6;
+            // Find and check the network
+            const char *l_net_str = NULL;
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str);
+            if(!l_net_str) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'token_pair' required parameter -net");
+                return -3;
             }
-
-            // Read time_from
-            dap_time_t l_time_from = 0;
-            const char* l_time_from_str = NULL;
-            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-time_from", &l_time_from_str);
-            l_time_from = dap_time_from_str_rfc822(l_time_from_str);
-
-            // Read time_to
-            dap_time_t l_time_to = 0;
-            const char* l_time_to_str = NULL;
-            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-time_to", &l_time_to_str);
-            l_time_to = dap_time_from_str_rfc822(l_time_to_str);
-
-            // Check for price subcommand
-            if (strcmp(l_price_subcommand, "average") == 0) {
-                dap_string_t* l_reply_str = dap_string_new("");
-
-                dap_list_t* l_tx_cond_list = dap_chain_net_get_tx_cond_all_by_srv_uid(l_net, c_dap_chain_net_srv_xchange_uid,
-                    l_time_from, l_time_to, TX_SEARCH_TYPE_NET);
-                dap_list_t* l_cur = l_tx_cond_list;
-                uint256_t l_total_rates = { 0 };
-                uint256_t l_total_rates_count = { 0 };
-                uint256_t l_rate = {};
-                while (l_cur) {
-                    dap_chain_datum_tx_t* l_tx = (dap_chain_datum_tx_t*)l_cur->data;
-                    if (l_tx) {
-                        dap_hash_fast_t* l_tx_hash = dap_chain_node_datum_tx_calc_hash(l_tx);
-
-                        // Get input token ticker
-                        const char* l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(
-                            l_net->pub.ledger, l_tx_hash);
-
-                        int l_direction = 0; //  1 - from/to,  -1  - to/from
-                        // Compare with token_from and token_to
-                        if (dap_strcmp(l_tx_input_ticker, l_token_from_str) == 0)
-                            l_direction = 1;
-                        else if (dap_strcmp(l_tx_input_ticker, l_token_to_str) == 0)
-                            l_direction = -1;
-                        else {
-                            l_cur = dap_list_next(l_cur);
-                            DAP_DEL_Z(l_tx_hash);
-                            continue;
-                        }
-                        int l_cond_idx = 0;
-                        dap_chain_tx_out_cond_t* l_out_cond_item = dap_chain_datum_tx_out_cond_get(l_tx, &l_cond_idx);
-                        if (l_out_cond_item && l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE &&
-                            dap_chain_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, l_tx_hash, l_cond_idx)) {
-                            uint256_t l_value_sell = l_out_cond_item->header.value;
-                            uint256_t l_value_buy = l_out_cond_item->subtype.srv_xchange.buy_value;
-                            if (l_direction == 1) {
-                                if (compare256(l_value_sell, uint256_0) != 0) {
-                                    DIV_256_COIN(l_value_buy, l_value_sell, &l_rate);
-                                    if (SUM_256_256(l_rate, l_total_rates, &l_total_rates) != 0)
-                                        log_it(L_ERROR, "Overflow on avarage price calculation (summing)");
-                                    INCR_256(&l_total_rates_count);
-                                }
-                                else {
-                                    log_it(L_ERROR, "Sell value is 0 in avarage price calculation (summing)");
-                                }
-                            }
-                            else if (l_direction == -1) {
-                                if (compare256(l_value_buy, uint256_0) != 0) {
-                                    DIV_256_COIN(l_value_sell, l_value_buy, &l_rate);
-                                    if (SUM_256_256(l_rate, l_total_rates, &l_total_rates) != 0)
-                                        log_it(L_ERROR, "Overflow on avarage price calculation (summing)");
-                                    INCR_256(&l_total_rates_count);
-                                }
-                                else {
-                                    log_it(L_ERROR, "Buy value is 0 in avarage price calculation (summing)");
-                                }
-                            }
-                            else {
-                                log_it(L_ERROR, "Wrong direction, not buy nor send (%d)", l_direction);
-                            }
-                        }
-                        DAP_DEL_Z(l_tx_hash);
-                    }
-                    l_cur = dap_list_next(l_cur);
-                }
-                dap_list_free_full(l_tx_cond_list, NULL);
-                uint256_t l_rate_average = { 0 };
-                if (compare256(l_total_rates_count, uint256_0) != 0)
-                    DIV_256(l_total_rates, l_total_rates_count, &l_rate_average);
-
-                if (compare256(l_total_rates_count, uint256_0) != 0)
-                    DIV_256(l_total_rates, l_total_rates_count, &l_rate_average);
-
-                char* l_rate_average_str = dap_chain_balance_to_coins(l_rate_average);
-                char* l_last_rate_str = dap_chain_balance_to_coins(l_rate);
-                dap_string_append_printf(l_reply_str, "Average price: %s   Last price: %s", l_rate_average_str, l_last_rate_str);
-                DAP_DELETE(l_rate_average_str);
-                DAP_DELETE(l_last_rate_str);
-                *a_str_reply = dap_string_free(l_reply_str, false);
-                break;
+            dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str);
+            if(!l_net) {
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
+                return -4;
             }
-            else if (strcmp(l_price_subcommand, "history") == 0) {
 
-                dap_string_t* l_reply_str = dap_string_new("");
 
-                dap_chain_datum_tx_spends_items_t* l_tx_spends = dap_chain_net_get_tx_cond_all_with_spends_by_srv_uid(l_net, c_dap_chain_net_srv_xchange_uid,
-                    l_time_from, l_time_to, TX_SEARCH_TYPE_NET);
+            // Select subcommands
 
+            // check for price subcommand
+            const char * l_price_subcommand = NULL;
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "price", &l_price_subcommand);
 
-                dap_chain_datum_tx_spends_item_t* l_cur = NULL, * l_tmp = NULL;
-                HASH_ITER(hh, l_tx_spends->tx_outs, l_cur, l_tmp) {
-                    dap_chain_datum_tx_t* l_tx = l_cur->tx;
-                    if (l_tx) {
-                        dap_hash_fast_t* l_tx_hash = &l_cur->tx_hash;
-
-                        // Get input token ticker
-                        const char* l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(
-                            l_net->pub.ledger, l_tx_hash);
+            // check for get subcommand
+            if ( l_price_subcommand ){
+                // Check for token1
+                const char * l_token_from_str = NULL;
+                dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-token_from", &l_token_from_str);
+                if(!l_token_from_str){
+                    dap_cli_server_cmd_set_reply_text(a_str_reply,"No argument '-token_from'");
+                    return -5;
+                }
+                dap_chain_datum_token_t * l_token_from_datum = dap_chain_ledger_token_ticker_check( l_net->pub.ledger, l_token_from_str);
+                if(!l_token_from_datum){
+                    dap_cli_server_cmd_set_reply_text(a_str_reply,"Can't find \"%s\" token in network \"%s\" for argument '-token_from' ", l_token_from_str, l_net->pub.name);
+                    return -6;
+                }
 
-                        int l_direction = 0; //  1 - from/to,  -1  - to/from
-                        // Compare with token_from and token_to
-                        if (dap_strcmp(l_tx_input_ticker, l_token_from_str) == 0)
-                            l_direction = 1;
-                        else if (dap_strcmp(l_tx_input_ticker, l_token_to_str) == 0)
-                            l_direction = -1;
-                        else {
-                            continue;
-                        }
+                // Check for token2
+                const char * l_token_to_str = NULL;
+                dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-token_to", &l_token_to_str);
+                if(!l_token_to_str){
+                    dap_cli_server_cmd_set_reply_text(a_str_reply,"No argument '-token_to'");
+                    return -5;
+                }
+                dap_chain_datum_token_t * l_token_to_datum = dap_chain_ledger_token_ticker_check( l_net->pub.ledger, l_token_to_str);
+                if(!l_token_to_datum){
+                    dap_cli_server_cmd_set_reply_text(a_str_reply,"Can't find \"%s\" token in network \"%s\" for argument '-token2' ", l_token_to_str, l_net->pub.name);
+                    return -6;
+                }
 
-                        // Check if output is spent
-                        int l_cond_idx = 0;
-                        dap_chain_tx_out_cond_t* l_out_cond_item = l_cur->out_cond;
-                        if (l_out_cond_item && l_cur->tx_next) {
-
-                            // Print tx_hash
-                            char* l_tx_hash_str = dap_chain_hash_fast_to_str_new(l_tx_hash);
-                            dap_string_append_printf(l_reply_str, "Tx hash: %s\n", l_tx_hash_str);
-                            DAP_DEL_Z(l_tx_hash_str);
-
-                            // Print tx_created
-                            char l_tx_ts_str[92] = { 0 };
-                            struct tm l_tm = { 0 };                                             /* Convert ts to  Sat May 17 01:17:08 2014 */
-                            uint64_t l_ts = l_tx->header.ts_created; // We take the next tx in chain to print close time, not the open one
-                            if ((localtime_r((time_t*)&l_ts, &l_tm)))
-                                asctime_r(&l_tm, l_tx_ts_str);
-
-                            dap_string_append_printf(l_reply_str, "\tts_created: %s", l_tx_ts_str);
-
-                            // Print tx_closed
-                            memset(l_tx_ts_str, 0, sizeof(l_tx_ts_str));
-                            memset(&l_tm, 0, sizeof(l_tm));                                             /* Convert ts to  Sat May 17 01:17:08 2014 */
-                            l_ts = l_cur->tx_next->header.ts_created; // We take the next tx in chain to print close time, not the open one
-                            if ((localtime_r((time_t*)&l_ts, &l_tm)))
-                                asctime_r(&l_tm, l_tx_ts_str);
-
-                            dap_string_append_printf(l_reply_str, "\tts_closed: %s", l_tx_ts_str);
-
-                            // Print value_from/value_to
-
-                            uint256_t l_value_from = l_out_cond_item->header.value;
-                            uint256_t l_value_to = l_out_cond_item->subtype.srv_xchange.buy_value;
-                            uint256_t l_rate = {};
-                            if (l_direction == 1) {
-                                if (compare256(l_value_from, uint256_0) != 0) {
-                                    DIV_256_COIN(l_value_to, l_value_from, &l_rate);
-                                }
-                                else
-                                    log_it(L_ERROR, "Value_from is zero, can't calc rate");
+                // Read time_from
+                dap_time_t l_time_from = 0;
+                const char * l_time_from_str = NULL;
+                dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-time_from", &l_time_from_str);
+                l_time_from = dap_time_from_str_rfc822(l_time_from_str);
+
+                // Read time_to
+                dap_time_t l_time_to = 0;
+                const char * l_time_to_str = NULL;
+                dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-time_to", &l_time_to_str);
+                l_time_to = dap_time_from_str_rfc822(l_time_to_str);
+
+                // Check for price subcommand
+                if (strcmp(l_price_subcommand,"average") == 0){
+                    dap_string_t *l_reply_str = dap_string_new("");
+
+                    dap_list_t *l_tx_cond_list = dap_chain_net_get_tx_cond_all_by_srv_uid(l_net, c_dap_chain_net_srv_xchange_uid,
+                                                                                          l_time_from,l_time_to,TX_SEARCH_TYPE_NET );
+                    dap_list_t * l_cur = l_tx_cond_list;
+                    uint256_t l_total_rates = {0};
+                    uint256_t l_total_rates_count = {0};
+                    uint256_t l_rate = {};
+                    while(l_cur){
+                        dap_chain_datum_tx_t * l_tx =(dap_chain_datum_tx_t *) l_cur->data;
+                        if(l_tx){
+                            dap_hash_fast_t * l_tx_hash = dap_chain_node_datum_tx_calc_hash(l_tx);
+
+                            // Get input token ticker
+                            const char * l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(
+                                        l_net->pub.ledger, l_tx_hash);
+
+                            int l_direction = 0; //  1 - from/to,  -1  - to/from
+                            // Compare with token_from and token_to
+                            if(dap_strcmp(l_tx_input_ticker, l_token_from_str) == 0)
+                                l_direction = 1;
+                            else if (dap_strcmp(l_tx_input_ticker, l_token_to_str) == 0)
+                                l_direction = -1;
+                            else {
+                                l_cur = dap_list_next(l_cur);
+                                DAP_DEL_Z(l_tx_hash);
+                                continue;
                             }
-                            else if (l_direction == -1) {
-                                if (compare256(l_value_to, uint256_0) != 0) {
-                                    DIV_256_COIN(l_value_from, l_value_to, &l_rate);
+                            int l_cond_idx = 0;
+                            dap_chain_tx_out_cond_t *l_out_cond_item = dap_chain_datum_tx_out_cond_get(l_tx, &l_cond_idx);
+                            if(l_out_cond_item && l_out_cond_item->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE &&
+                                    dap_chain_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, l_tx_hash, l_cond_idx)) {
+                                uint256_t l_value_sell = l_out_cond_item->header.value;
+                                uint256_t l_value_buy = l_out_cond_item->subtype.srv_xchange.buy_value;
+                                if( l_direction == 1){
+                                    if(compare256(l_value_sell,uint256_0) !=0 ){
+                                        DIV_256_COIN(l_value_buy, l_value_sell, &l_rate);
+                                        if(SUM_256_256(l_rate, l_total_rates, &l_total_rates )!= 0)
+                                            log_it(L_ERROR, "Overflow on avarage price calculation (summing)");
+                                        INCR_256(&l_total_rates_count);
+                                    }else{
+                                        log_it(L_ERROR, "Sell value is 0 in avarage price calculation (summing)");
+                                    }
+                                }else if (l_direction == -1){
+                                    if(compare256(l_value_buy,uint256_0) !=0 ){
+                                        DIV_256_COIN(l_value_sell, l_value_buy, &l_rate);
+                                        if(SUM_256_256(l_rate, l_total_rates, &l_total_rates )!= 0)
+                                            log_it(L_ERROR, "Overflow on avarage price calculation (summing)");
+                                        INCR_256(&l_total_rates_count);
+                                    }else{
+                                        log_it(L_ERROR, "Buy value is 0 in avarage price calculation (summing)");
+                                    }
+                                }else{
+                                    log_it(L_ERROR,"Wrong direction, not buy nor send (%d)",l_direction);
                                 }
-                                else
-                                    log_it(L_ERROR, "Value_tois zero, can't calc rate");
                             }
+                            DAP_DEL_Z(l_tx_hash);
+                        }
+                        l_cur = dap_list_next(l_cur);
+                    }
+                    dap_list_free_full(l_tx_cond_list, NULL);
+                    uint256_t l_rate_average = {0};
+                    if( compare256(l_total_rates_count, uint256_0) != 0 )
+                        DIV_256(l_total_rates,l_total_rates_count,&l_rate_average);
+
+                    if( compare256(l_total_rates_count, uint256_0) != 0 )
+                        DIV_256(l_total_rates,l_total_rates_count,&l_rate_average);
+
+                    char *l_rate_average_str = dap_chain_balance_to_coins(l_rate_average);
+                    char *l_last_rate_str = dap_chain_balance_to_coins(l_rate);
+                    dap_string_append_printf(l_reply_str,"Average price: %s   Last price: %s", l_rate_average_str, l_last_rate_str);
+                    DAP_DELETE(l_rate_average_str);
+                    DAP_DELETE(l_last_rate_str);
+                    *a_str_reply = dap_string_free(l_reply_str, false);
+                    break;
+                }else if (strcmp(l_price_subcommand,"history") == 0){
+
+                    dap_string_t *l_reply_str = dap_string_new("");
+
+                    dap_chain_datum_tx_spends_items_t * l_tx_spends = dap_chain_net_get_tx_cond_all_with_spends_by_srv_uid(l_net, c_dap_chain_net_srv_xchange_uid,
+                            l_time_from,l_time_to,TX_SEARCH_TYPE_NET);
+
+
+                    dap_chain_datum_tx_spends_item_t * l_cur = NULL, *l_tmp = NULL;
+                    HASH_ITER(hh, l_tx_spends->tx_outs, l_cur,l_tmp) {
+                        dap_chain_datum_tx_t * l_tx =l_cur->tx;
+                        if(l_tx){
+                            dap_hash_fast_t * l_tx_hash = &l_cur->tx_hash;
+
+                            // Get input token ticker
+                            const char * l_tx_input_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(
+                                        l_net->pub.ledger, l_tx_hash);
+
+                            int l_direction = 0; //  1 - from/to,  -1  - to/from
+                            // Compare with token_from and token_to
+                            if(dap_strcmp(l_tx_input_ticker, l_token_from_str) == 0)
+                                l_direction = 1;
+                            else if (dap_strcmp(l_tx_input_ticker, l_token_to_str) == 0)
+                                l_direction = -1;
                             else {
-                                log_it(L_ERROR, "Wrong direction, not buy nor send (%d)", l_direction);
+                                continue;
+                            }
+
+                            // Check if output is spent
+                            int l_cond_idx = 0;
+                            dap_chain_tx_out_cond_t *l_out_cond_item = l_cur->out_cond;
+                            if(l_out_cond_item && l_cur->tx_next) {
+
+                                // Print tx_hash
+                                char * l_tx_hash_str = dap_chain_hash_fast_to_str_new(l_tx_hash);
+                                dap_string_append_printf(l_reply_str,"Tx hash: %s\n", l_tx_hash_str);
+                                DAP_DEL_Z(l_tx_hash_str);
+
+                                // Print tx_created
+                                char l_tx_ts_str[92] = {0};
+                                struct tm l_tm={0};                                             /* Convert ts to  Sat May 17 01:17:08 2014 */
+                                uint64_t l_ts = l_tx->header.ts_created; // We take the next tx in chain to print close time, not the open one
+                                if ( (localtime_r((time_t *) &l_ts, &l_tm )) )
+                                    asctime_r (&l_tm, l_tx_ts_str);
+
+                                dap_string_append_printf(l_reply_str,"\tts_created: %s", l_tx_ts_str);
+
+                                // Print tx_closed
+                                memset(l_tx_ts_str,0,sizeof(l_tx_ts_str));
+                                memset(&l_tm,0,sizeof(l_tm));                                             /* Convert ts to  Sat May 17 01:17:08 2014 */
+                                l_ts = l_cur->tx_next->header.ts_created; // We take the next tx in chain to print close time, not the open one
+                                if ( (localtime_r((time_t *) &l_ts, &l_tm )) )
+                                    asctime_r (&l_tm, l_tx_ts_str);
+
+                                dap_string_append_printf(l_reply_str,"\tts_closed: %s", l_tx_ts_str);
+
+                                // Print value_from/value_to
+
+                                uint256_t l_value_from = l_out_cond_item->header.value;
+                                uint256_t l_value_to = l_out_cond_item->subtype.srv_xchange.buy_value;
+                                uint256_t l_rate = {};
+                                if( l_direction == 1){
+                                    if(compare256(l_value_from, uint256_0) != 0){
+                                        DIV_256_COIN(l_value_to, l_value_from, &l_rate);
+                                    }else
+                                        log_it(L_ERROR,"Value_from is zero, can't calc rate");
+                                }else if(l_direction == -1){
+                                    if(compare256(l_value_to, uint256_0) != 0){
+                                        DIV_256_COIN(l_value_from, l_value_to, &l_rate);
+                                    }else
+                                        log_it(L_ERROR,"Value_tois zero, can't calc rate");
+                                }else{
+                                    log_it(L_ERROR,"Wrong direction, not buy nor send (%d)",l_direction);
+                                }
+                                char * l_value_from_str = dap_chain_balance_to_coins(l_value_from);
+                                char * l_value_to_str = dap_chain_balance_to_coins(l_value_to);
+                                char *l_rate_str = dap_chain_balance_to_coins(l_rate);
+
+                                dap_string_append_printf(l_reply_str, "  From: %s %s   ", l_value_from_str, l_tx_input_ticker);
+                                dap_string_append_printf(l_reply_str, "  To: %s %s   ", l_value_to_str, l_out_cond_item->subtype.srv_xchange.buy_token );
+                                dap_string_append_printf(l_reply_str, "  Price: %s", l_rate_str);
+                                DAP_DELETE(l_value_from_str);
+                                DAP_DELETE(l_value_to_str);
+                                DAP_DELETE(l_rate_str);
+                                // Delimiter between tx
+                                dap_string_append_printf(l_reply_str,"\n\n");
                             }
-                            char* l_value_from_str = dap_chain_balance_to_coins(l_value_from);
-                            char* l_value_to_str = dap_chain_balance_to_coins(l_value_to);
-                            char* l_rate_str = dap_chain_balance_to_coins(l_rate);
-
-                            dap_string_append_printf(l_reply_str, "  From: %s %s   ", l_value_from_str, l_tx_input_ticker);
-                            dap_string_append_printf(l_reply_str, "  To: %s %s   ", l_value_to_str, l_out_cond_item->subtype.srv_xchange.buy_token);
-                            dap_string_append_printf(l_reply_str, "  Price: %s", l_rate_str);
-                            DAP_DELETE(l_value_from_str);
-                            DAP_DELETE(l_value_to_str);
-                            DAP_DELETE(l_rate_str);
-                            // Delimiter between tx
-                            dap_string_append_printf(l_reply_str, "\n\n");
-                        }
 
+                        }
                     }
-                }
-                dap_chain_datum_tx_spends_items_free(l_tx_spends);
+                    dap_chain_datum_tx_spends_items_free(l_tx_spends);
 
-                *a_str_reply = dap_string_free(l_reply_str, false);
-                break;
+                    *a_str_reply = dap_string_free(l_reply_str, false);
+                    break;
 
-            }break;
-        }
+                }break;
+            }
 
-        const char* l_list_subcommand = NULL;
-        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "list", &l_list_subcommand);
-        if (l_list_subcommand) {
-            if (strcmp(l_list_subcommand, "all") == 0) {
-                dap_string_t* l_reply_str = dap_string_new("");
-                char** l_tickers = NULL;
-                size_t l_tickers_count = 0;
-                dap_chain_ledger_addr_get_token_ticker_all(l_net->pub.ledger, NULL, &l_tickers, &l_tickers_count);
-
-                size_t l_pairs_count = 0;
-                if (l_tickers) {
-                    for (size_t i = 0; i < l_tickers_count; i++) {
-                        for (size_t j = i + 1; j < l_tickers_count; j++) {
-                            if (l_tickers[i] && l_tickers[j]) {
-                                dap_string_append_printf(l_reply_str, "%s:%s ", l_tickers[i], l_tickers[j]);
-                                l_pairs_count++;
+            const char * l_list_subcommand = NULL;
+            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "list", &l_list_subcommand);
+            if( l_list_subcommand ){
+                if (strcmp(l_list_subcommand,"all") == 0){
+                    dap_string_t *l_reply_str = dap_string_new("");
+                    char ** l_tickers = NULL;
+                    size_t l_tickers_count = 0;
+                    dap_chain_ledger_addr_get_token_ticker_all(l_net->pub.ledger,NULL,&l_tickers,&l_tickers_count);
+
+                    size_t l_pairs_count = 0;
+                    if(l_tickers){
+                        for(size_t i = 0; i< l_tickers_count; i++){
+                            for(size_t j = i+1; j< l_tickers_count; j++){
+                                if(l_tickers[i] && l_tickers[j]){
+                                    dap_string_append_printf(l_reply_str,"%s:%s ", l_tickers[i], l_tickers[j]);
+                                    l_pairs_count++;
+                                }
                             }
-                        }
 
-                    }
+                        }
 
-                    // Free tickers array
-                    for (size_t i = 0; i < l_tickers_count; i++) {
-                        DAP_DELETE(l_tickers[i]);
+                        // Free tickers array
+                        for(size_t i = 0; i< l_tickers_count; i++){
+                            DAP_DELETE(l_tickers[i]);
+                        }
+                        DAP_DELETE(l_tickers);
                     }
-                    DAP_DELETE(l_tickers);
+                    dap_string_prepend_printf( l_reply_str,"Tokens count pair: %zd\n", l_pairs_count);
+                    *a_str_reply = dap_string_free(l_reply_str, false);
+                    break;
                 }
-                dap_string_prepend_printf(l_reply_str, "Tokens count pair: %zd\n", l_pairs_count);
-                *a_str_reply = dap_string_free(l_reply_str, false);
-                break;
             }
-        }
 
-        // No subcommand selected
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'token pair' required proper subcommand, please read its manual with command 'help srv_xchange'");
+            // No subcommand selected
+            dap_cli_server_cmd_set_reply_text(a_str_reply,"Command 'token pair' required proper subcommand, please read its manual with command 'help srv_xchange'");
 
 
-    } break;
+        } break;
 
-    default: {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Command %s not recognized", a_argv[l_arg_index]);
-        return -1;
-    }
+        default: {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Command %s not recognized", a_argv[l_arg_index]);
+            return -1;
+        }
     }
     return 0;
 }
 
-static int s_callback_requested(dap_chain_net_srv_t* a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t* a_srv_client, const void* a_data, size_t a_data_size)
+static int s_callback_requested(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size)
 {
     return 0;
 }
 
-static int s_callback_response_success(dap_chain_net_srv_t* a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t* a_srv_client, const void* a_data, size_t a_data_size)
+static int s_callback_response_success(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size)
 {
     return 0;
 }
 
-static int s_callback_response_error(dap_chain_net_srv_t* a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t* a_srv_client, const void* a_data, size_t a_data_size)
+static int s_callback_response_error(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size)
 {
     return 0;
 }
 
-static int s_callback_receipt_next_success(dap_chain_net_srv_t* a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t* a_srv_client, const void* a_data, size_t a_data_size)
+static int s_callback_receipt_next_success(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size)
 {
     return 0;
 }
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 0c24ced5b4a26ee03dd4145ad516bc44aa84bd47..06b7b15e348f3ea75e660312457ed25955f8232b 100644
--- a/modules/service/xchange/include/dap_chain_net_srv_xchange.h
+++ b/modules/service/xchange/include/dap_chain_net_srv_xchange.h
@@ -31,15 +31,15 @@
 #define GROUP_LOCAL_XCHANGE "local.xchange"
 
 typedef struct dap_chain_net_srv_xchange_price {
-    char* wallet_str;
+    char *wallet_str;
     char token_sell[DAP_CHAIN_TICKER_SIZE_MAX];
     uint256_t datoshi_sell;
-    dap_chain_net_t* net;
+    dap_chain_net_t *net;
     char token_buy[DAP_CHAIN_TICKER_SIZE_MAX];
     uint256_t rate;
     dap_chain_hash_fast_t tx_hash;
     dap_chain_hash_fast_t order_hash;
-    dap_enc_key_t* wallet_key;
+    dap_enc_key_t *wallet_key;
 } dap_chain_net_srv_xchange_price_t;
 
 typedef struct dap_srv_xchange_order_ext {
@@ -49,7 +49,7 @@ typedef struct dap_srv_xchange_order_ext {
 } dap_srv_xchange_order_ext_t;
 
 typedef struct dap_chain_net_srv_xchange {
-    dap_chain_net_srv_t* parent;
+    dap_chain_net_srv_t *parent;
     bool enabled;
 } dap_chain_net_srv_xchange_t;
 
@@ -57,4 +57,4 @@ 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();
-bool dap_chain_net_srv_xchange_verificator(dap_ledger_t* a_ledger, dap_chain_tx_out_cond_t* a_cond, dap_chain_datum_tx_t* a_tx, bool a_owner);
+bool dap_chain_net_srv_xchange_verificator(dap_ledger_t * a_ledger, dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner);
diff --git a/modules/type/blocks/dap_chain_block.c b/modules/type/blocks/dap_chain_block.c
index 8b629db8e93dfb4e38872d0ed9c886fb34b8e915..a11fd022dba65be5017fc151c792be0bc2c57545 100644
--- a/modules/type/blocks/dap_chain_block.c
+++ b/modules/type/blocks/dap_chain_block.c
@@ -70,8 +70,7 @@ dap_chain_block_t *dap_chain_block_new(dap_chain_hash_fast_t *a_prev_block, size
         l_block->hdr.version = 1;
         l_block->hdr.ts_created = time(NULL);
 
-        dap_chain_hash_fast_t l_hash_null={0};
-        memcpy(&l_block->hdr.merkle, &l_hash_null, sizeof(dap_chain_hash_fast_t));
+        l_block->hdr.merkle = (dap_chain_hash_fast_t){ 0 };
 
         size_t l_block_size = sizeof(l_block->hdr);
         if( a_prev_block ){
@@ -565,7 +564,7 @@ void dap_chain_block_meta_extract(dap_chain_block_meta_t ** a_meta, size_t a_met
                     }
 
                     if (l_meta->hdr.data_size == sizeof (**a_block_links) ){
-                        memcpy(&a_block_links[*a_block_links_count], l_meta->data, l_meta->hdr.data_size);
+                        *a_block_links[*a_block_links_count] = *(dap_chain_hash_fast_t*)l_meta->data;
                         (*a_block_links_count)++;
                     }else
                         log_it(L_WARNING, "Link meta #%zu has wrong size %hu when expecting %zu", i, l_meta->hdr.data_size, sizeof (*a_block_prev_hash));
@@ -611,7 +610,7 @@ void dap_chain_block_meta_extract(dap_chain_block_meta_t ** a_meta, size_t a_met
                         log_it(L_WARNING, "Merkle root meta #%zu has wrong size %hu when expecting %zu", i, l_meta->hdr.data_size, sizeof (*a_nonce2));
                 }
             break;
-            default: { log_it(L_WARNING, "Unknown meta #%zu type 0x%02hx (size %hu), possible corrupted block or you need to upgrade your software",
+            default: { log_it(L_WARNING, "Unknown meta #%zu type 0x%02x (size %u), possible corrupted block or you need to upgrade your software",
                                  i, l_meta->hdr.type, l_meta->hdr.type); }
         }
     }
diff --git a/modules/type/blocks/dap_chain_block_cache.c b/modules/type/blocks/dap_chain_block_cache.c
index 4ef96a09c474a1239a0744c24801507d0a86116f..b81d8748b9dec9809edb0e9f679f9d23db06ffcd 100644
--- a/modules/type/blocks/dap_chain_block_cache.c
+++ b/modules/type/blocks/dap_chain_block_cache.c
@@ -96,16 +96,13 @@ int dap_chain_block_cache_update(dap_chain_block_cache_t * a_block_cache)
     assert(a_block_cache->block);
     dap_hash_fast(a_block_cache->block, a_block_cache->block_size, &a_block_cache->block_hash);
     a_block_cache->block_hash_str = dap_hash_fast_to_str_new(&a_block_cache->block_hash);
-    if (a_block_cache->meta)
-        DAP_DELETE(a_block_cache->meta);
-    if (a_block_cache->datum)
-        DAP_DELETE(a_block_cache->datum);
+    DAP_DEL_Z(a_block_cache->meta);
     a_block_cache->meta = dap_chain_block_get_meta(a_block_cache->block, a_block_cache->block_size, &a_block_cache->meta_count);
     if (a_block_cache->meta_count != a_block_cache->block->hdr.meta_count) {
         DAP_DELETE(a_block_cache->meta);
         return -1;
     }
-    dap_chain_block_meta_extract( a_block_cache->meta,a_block_cache->meta_count,
+    dap_chain_block_meta_extract(a_block_cache->meta,a_block_cache->meta_count,
                                         &a_block_cache->prev_hash,
                                         &a_block_cache->anchor_hash,
                                         &a_block_cache->merkle_root,
@@ -113,26 +110,28 @@ int dap_chain_block_cache_update(dap_chain_block_cache_t * a_block_cache)
                                         &a_block_cache->links_hash_count,
                                         &a_block_cache->is_genesis,
                                         &a_block_cache->nonce,
-                                        &a_block_cache->nonce2
-                                      );
-    a_block_cache->datum = dap_chain_block_get_datums( a_block_cache->block, a_block_cache->block_size, &a_block_cache->datum_count );
+                                        &a_block_cache->nonce2);
+     DAP_DEL_Z(a_block_cache->datum);
+     a_block_cache->datum = dap_chain_block_get_datums(a_block_cache->block, a_block_cache->block_size, &a_block_cache->datum_count);
+
     if (a_block_cache->datum_count != a_block_cache->block->hdr.datum_count) {
         DAP_DELETE(a_block_cache->datum);
         return -2;
     }
-    for (size_t i = 0; i< a_block_cache->datum_count; i++){
-        dap_chain_datum_t * l_datum = a_block_cache->datum[i];
-        if ( l_datum && l_datum->header.data_size && l_datum->header.type_id == DAP_CHAIN_DATUM_TX){
-            dap_chain_hash_fast_t l_tx_hash;
-            dap_chain_block_cache_tx_index_t * l_tx_index = NULL;
-            dap_hash_fast(l_datum->data,l_datum->header.data_size, &l_tx_hash);
-            HASH_FIND(hh, a_block_cache->tx_index, &l_tx_hash, sizeof (l_tx_hash), l_tx_index);
-            if ( ! l_tx_index ){
-                l_tx_index = DAP_NEW_Z(dap_chain_block_cache_tx_index_t);
-                memcpy(&l_tx_index->tx_hash,&l_tx_hash, sizeof (l_tx_hash) );
-                l_tx_index->tx =(dap_chain_datum_tx_t*) l_datum->data;
-                HASH_ADD(hh, a_block_cache->tx_index, tx_hash, sizeof (l_tx_hash), l_tx_index);
-            }
+    dap_chain_datum_t *l_datum;
+    for (size_t i = 0; i < a_block_cache->datum_count && (l_datum = a_block_cache->datum[i]); i++) {
+        if (l_datum->header.data_size == 0 || l_datum->header.type_id != DAP_CHAIN_DATUM_TX)
+            break;
+        dap_chain_hash_fast_t l_tx_hash;
+        dap_hash_fast(l_datum->data,l_datum->header.data_size, &l_tx_hash);
+
+        dap_chain_block_cache_tx_index_t *l_tx_index = NULL;
+        HASH_FIND(hh, a_block_cache->tx_index, &l_tx_hash, sizeof (l_tx_hash), l_tx_index);
+        if (!l_tx_index) {
+            l_tx_index = DAP_NEW_Z(dap_chain_block_cache_tx_index_t);
+            l_tx_index->tx_hash = l_tx_hash;
+            l_tx_index->tx = (dap_chain_datum_tx_t*)l_datum->data;
+            HASH_ADD(hh, a_block_cache->tx_index, tx_hash, sizeof(l_tx_hash), l_tx_index);
         }
     }
     return 0;
@@ -157,6 +156,14 @@ dap_chain_datum_tx_t* dap_chain_block_cache_get_tx_by_hash (dap_chain_block_cach
  */
 void dap_chain_block_cache_delete(dap_chain_block_cache_t * a_block_cache)
 {
+    DAP_DEL_Z(a_block_cache->block_hash_str);
+    DAP_DEL_Z(a_block_cache->datum);
+    DAP_DEL_Z(a_block_cache->meta);
+    DAP_DEL_Z(a_block_cache->links_hash);
+    dap_chain_block_cache_tx_index_t *l_tx_cur, *l_tmp;
+    HASH_ITER(hh, a_block_cache->tx_index, l_tx_cur, l_tmp) {
+        HASH_DEL(a_block_cache->tx_index, l_tx_cur);
+        DAP_FREE(l_tx_cur);
+    }
     DAP_DELETE(a_block_cache);
-    log_it(L_DEBUG,"Block cache deleted");
 }
diff --git a/modules/type/blocks/dap_chain_block_chunk.c b/modules/type/blocks/dap_chain_block_chunk.c
index 265767acea40e25d9f564d3fac52fd8f25781351..def3a69ec39f7386564160a7e35ec55bf0e4de02 100644
--- a/modules/type/blocks/dap_chain_block_chunk.c
+++ b/modules/type/blocks/dap_chain_block_chunk.c
@@ -57,19 +57,15 @@ dap_chain_block_chunks_t * dap_chain_block_chunks_create(dap_chain_cs_blocks_t *
  */
 void dap_chain_block_chunks_delete(dap_chain_block_chunks_t * a_chunks)
 {
-    dap_chain_block_chunk_t * l_chunk = a_chunks->chunks_last;
-
-    while(l_chunk){
-        dap_chain_block_cache_hash_t* l_block_cache_hash = NULL, *l_tmp = NULL;
-        HASH_ITER(hh, l_chunk->block_cache_hash , l_block_cache_hash, l_tmp){
-            // Clang bug at this, l_block_cache_hash should change at every loop cycle
-            HASH_DEL(l_chunk->block_cache_hash, l_block_cache_hash);
+    dap_chain_block_cache_hash_t *l_block_cache_hash, *l_block_cache_hash_tmp;
+    for (dap_chain_block_chunk_t *l_chunk = a_chunks->chunks_last; l_chunk; l_chunk = l_chunk->prev) {
+        HASH_ITER(hh, l_chunk->block_cache_hash , l_block_cache_hash, l_block_cache_hash_tmp){
+        HASH_DEL(l_chunk->block_cache_hash, l_block_cache_hash);
             DAP_DELETE(l_block_cache_hash);
         }
     }
-    dap_chain_block_cache_t* l_block_cache = NULL, *l_tmp = NULL;
-    HASH_ITER(hh, a_chunks->cache , l_block_cache, l_tmp){
-        // Clang bug at this, l_block_cache should change at every loop cycle
+    dap_chain_block_cache_t* l_block_cache, *l_block_cache_tmp = NULL;
+    HASH_ITER(hh, a_chunks->cache , l_block_cache, l_block_cache_tmp) {
         HASH_DEL(a_chunks->cache, l_block_cache);
         dap_chain_block_cache_delete(l_block_cache);
     }
@@ -110,7 +106,7 @@ void dap_chain_block_chunks_add(dap_chain_block_chunks_t * a_chunks,dap_chain_bl
             l_chunk_cache_hash = DAP_NEW_Z(dap_chain_block_cache_hash_t);
             l_chunk_cache_hash->block_cache=a_block_cache;
             l_chunk_cache_hash->ts_created = time(NULL);
-            memcpy(&l_chunk_cache_hash->block_hash, &a_block_cache->block_hash,sizeof (a_block_cache->block_hash));
+            l_chunk_cache_hash->block_hash = a_block_cache->block_hash;
             l_chunk_cache_hash->chunk = l_chunk;
 
             // Update first block cache from the head
@@ -132,7 +128,7 @@ void dap_chain_block_chunks_add(dap_chain_block_chunks_t * a_chunks,dap_chain_bl
         l_chunk_cache_hash = DAP_NEW_Z(dap_chain_block_cache_hash_t);
         l_chunk_cache_hash->block_cache=a_block_cache;
         l_chunk_cache_hash->ts_created = time(NULL);
-        memcpy(&l_chunk_cache_hash->block_hash, &a_block_cache->block_hash,sizeof (a_block_cache->block_hash));
+        l_chunk_cache_hash->block_hash = a_block_cache->block_hash;
         l_chunk_cache_hash->chunk = l_chunk;
 
         // Update first block cache from the head
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index aa24611d3c4acd6195ef08d6aa6f6cd61f85d68d..35b61523a0affc2e78ee41ba5762691a39f65c3a 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -152,26 +152,26 @@ int dap_chain_cs_blocks_init()
     s_debug_more = dap_config_get_item_bool_default(g_config, "blocks", "debug_more", false);
     dap_cli_server_cmd_add ("block", s_cli_blocks, "Create and explore blockchains",
         "New block create, fill and complete commands:"
-            "block -net <net_name> -chain <chain name> new\n"
+            "block -net <net_name> -chain <chain_name> new\n"
                 "\t\tCreate new block and flush memory if was smth formed before\n\n"
 
-            "block -net <net_name> -chain <chain name> new_datum_add <datum hash>\n"
+            "block -net <net_name> -chain <chain_name> new_datum_add <datum_hash>\n"
                 "\t\tAdd block section from datum <datum hash> taken from the mempool\n\n"
 
-            "block -net <net_name> -chain <chain name> new_datum_del <datum hash>\n"
+            "block -net <net_name> -chain <chain_name> new_datum_del <datum_hash>\n"
                 "\t\tDel block section with datum <datum hash>\n\n"
 
-            "block -net <net_name> -chain <chain name> new_datum_list\n"
+            "block -net <net_name> -chain <chain_name> new_datum_list\n"
                 "\t\tList block sections and show their datums hashes\n\n"
 
-            "block -net <net_name> -chain <chain name> new_datum\n\n"
+            "block -net <net_name> -chain <chain_name> new_datum\n\n"
                 "\t\tComplete the current new round, verify it and if everything is ok - publish new events in chain\n\n"
 
         "Blockchain explorer:"
-            "block -net <net_name> -chain <chain name> dump <block hash>\n"
+            "block -net <net_name> -chain <chain_name> dump <block_hash>\n"
                 "\t\tDump block info\n\n"
 
-            "block -net <net_name> -chain <chain name> list [-from_hash <block hash>] [-to_hash <block hash>]"
+            "block -net <net_name> -chain <chain_name> list [-from_hash <block_hash>] [-to_hash <block_hash>]"
             "[-from_dt <datetime>] [-to_dt <datetime>]"
                 "\t\t List blocks"
 
@@ -619,15 +619,15 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply)
  */
 static void s_callback_delete(dap_chain_t * a_chain)
 {
-    dap_chain_cs_blocks_t * l_blocks = DAP_CHAIN_CS_BLOCKS ( a_chain );
+    s_callback_cs_blocks_purge(a_chain);
+    dap_chain_cs_blocks_t * l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain);
     pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock);
     if(l_blocks->callback_delete )
         l_blocks->callback_delete(l_blocks);
-    DAP_DEL_Z(l_blocks->_inheritor)
     pthread_rwlock_unlock(&PVT(l_blocks)->rwlock);
     pthread_rwlock_destroy(&PVT(l_blocks)->rwlock);
     pthread_rwlock_destroy(&PVT(l_blocks)->datums_lock);
-    dap_chain_block_chunks_delete(PVT(l_blocks)->chunks );
+    DAP_DEL_Z(l_blocks->_inheritor)
     DAP_DEL_Z(l_blocks->_pvt)
     log_it(L_INFO, "Block destructed");
 }
@@ -635,12 +635,12 @@ static void s_callback_delete(dap_chain_t * a_chain)
 static void s_callback_cs_blocks_purge(dap_chain_t *a_chain)
 {
     dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain);
-    pthread_rwlock_rdlock(&PVT(l_blocks)->rwlock);
+    pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock);
     dap_chain_block_cache_t *l_block, *l_block_tmp;
     HASH_ITER(hh, PVT(l_blocks)->blocks, l_block, l_block_tmp) {
         HASH_DEL(PVT(l_blocks)->blocks, l_block);
         DAP_DELETE(l_block->block);
-        DAP_DELETE(l_block);
+        dap_chain_block_cache_delete(l_block);
     }
     pthread_rwlock_unlock(&PVT(l_blocks)->rwlock);
     dap_chain_block_chunks_delete(PVT(l_blocks)->chunks);
@@ -685,7 +685,7 @@ static int s_add_atom_to_ledger(dap_chain_cs_blocks_t * a_blocks, dap_ledger_t *
                     // Save tx hash -> block_hash link in hash table
                     dap_chain_tx_block_index_t * l_tx_block= DAP_NEW_Z(dap_chain_tx_block_index_t);
                     l_tx_block->ts_added = time(NULL);
-                    memcpy(&l_tx_block->block_hash, &a_block_cache->block_hash, sizeof ( l_tx_block->block_hash));
+                    l_tx_block->block_hash = a_block_cache->block_hash;
                     dap_hash_fast(l_tx, l_tx_size, &l_tx_block->tx_hash);
                     pthread_rwlock_wrlock( &PVT(a_blocks)->rwlock );
                     HASH_ADD(hh, PVT(a_blocks)->tx_block_index, tx_hash, sizeof(l_tx_block->tx_hash), l_tx_block);
@@ -1124,7 +1124,7 @@ static dap_chain_atom_ptr_t *s_callback_atom_iter_get_links( dap_chain_atom_iter
             dap_chain_atom_ptr_t * l_ret = DAP_NEW_Z_SIZE(dap_chain_atom_ptr_t, l_block_cache->links_hash_count *sizeof (dap_chain_atom_ptr_t) );
             for (size_t i = 0; i< l_block_cache->links_hash_count; i ++){
                 dap_chain_cs_blocks_t *l_cs_blocks = (dap_chain_cs_blocks_t *)l_block_cache->_inheritor;
-                dap_chain_block_cache_t *l_link =  dap_chain_block_cs_cache_get_by_hash(l_cs_blocks, &l_block_cache->links_hash[i]);
+                dap_chain_block_cache_t *l_link = dap_chain_block_cs_cache_get_by_hash(l_cs_blocks, &l_block_cache->links_hash[i]);
                 assert(l_link);
                 (*a_links_size_ptr)[i] = l_link->block_size;
                 l_ret[i] = l_link->block;
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 786f7557ea0165ca39b2865a25b6b0426109a819..f5a7db1da6c6d12035ba8c97ecb0b2825b457120 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -142,14 +142,14 @@ int dap_chain_cs_dag_init(void)
     s_debug_more = dap_config_get_item_bool_default(g_config,"dag","debug_more",false);
 
     dap_cli_server_cmd_add ("dag", s_cli_dag, "DAG commands",
-        "dag event create -net <net_name> -chain <chain_name> -datum <datum hash> [-H {hex | base58(default)}]\n"
+        "dag event create -net <net_name> -chain <chain_name> -datum <datum_hash> [-H {hex | base58(default)}]\n"
             "\tCreate event from datum mempool element\n\n"
-        "dag event cancel -net <net_name> -chain <chain_name> -event <event hash>\n"
+        "dag event cancel -net <net_name> -chain <chain_name> -event <event_hash>\n"
             "\tRemove event from forming new round and put back its datum to mempool\n\n"
-        "dag event sign -net <net_name> -chain <chain_name> -event <event hash>\n"
+        "dag event sign -net <net_name> -chain <chain_name> -event <event_hash>\n"
             "\tAdd sign to event <event hash> in round.new. Hash doesn't include other signs so event hash\n"
             "\tdoesn't changes after sign add to event. \n\n"
-        "dag event dump -net <net_name> -chain <chain_name> -event <event hash> -from {events | events_lasts | threshold | round.new  | round.<Round id in hex>} [-H {hex | base58(default)}]\n"
+        "dag event dump -net <net_name> -chain <chain_name> -event <event_hash> -from {events | events_lasts | threshold | round.new  | round.<Round id in hex>} [-H {hex | base58(default)}]\n"
             "\tDump event info\n\n"
         "dag event list -net <net_name> -chain <chain_name> -from {events | events_lasts | threshold | round.new | round.<Round id in hex>}\n\n"
             "\tShow event list \n\n"
@@ -371,10 +371,10 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger
                                       l_hash_item_hashv, l_tx_event);
                 if (!l_tx_event) {
                     l_tx_event = DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
-                    l_tx_event->ts_added = a_event_item->ts_added;
-                    l_tx_event->event = a_event_item->event;
-                    l_tx_event->event_size = a_event_item->event_size;
-                    memcpy(&l_tx_event->hash, &l_tx_hash, sizeof(l_tx_hash));
+                    l_tx_event->ts_added    = a_event_item->ts_added;
+                    l_tx_event->event       = a_event_item->event;
+                    l_tx_event->event_size  = a_event_item->event_size;
+                    l_tx_event->hash        = l_tx_hash;
                     HASH_ADD_BYHASHVALUE(hh, PVT(a_dag)->tx_events, hash, sizeof(l_tx_event->hash),
                                          l_hash_item_hashv, l_tx_event);
                 }
@@ -431,7 +431,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
 
     dap_chain_hash_fast_t l_event_hash;
     dap_chain_cs_dag_event_calc_hash(l_event, a_atom_size, &l_event_hash);
-    memcpy(&l_event_item->hash, &l_event_hash, sizeof(dap_chain_hash_fast_t));
+    l_event_item->hash = l_event_hash;
 
     char * l_event_hash_str = NULL;
     if(s_debug_more) {
@@ -607,8 +607,7 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_d
                 }
             }
             if (!l_is_already_in_event && l_hashes_linked < l_hashes_size) {
-                memcpy(&l_hashes[l_hashes_linked], l_hash, sizeof(*l_hash));
-                l_hashes_linked++;
+                l_hashes[l_hashes_linked++] = *l_hash;
             }
 
             l_rnd_steps++;
@@ -651,7 +650,7 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_d
                 dap_chain_cs_dag_event_round_item_t *l_round_item =
                             DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_round_item_t,
                                             sizeof(dap_chain_cs_dag_event_round_item_t));
-                memcpy(&l_round_item->round_info.datum_hash, &l_datum_hash, sizeof(dap_chain_hash_fast_t));
+                l_round_item->round_info.datum_hash = l_datum_hash;
                 dap_chain_cs_dag_event_calc_hash(l_event,l_event_size, &l_event_hash);
                 char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash);
                 bool l_res = dap_chain_cs_dag_event_gdb_set(l_dag, l_event_hash_str, l_event, l_event_size, l_round_item);
diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c
index d6720026cd364b4d74839ca8a4146963ae94ae7e..92b4a616fde3e21bfe531312892fa0412d4fcd58 100644
--- a/modules/type/dag/dap_chain_cs_dag_event.c
+++ b/modules/type/dag/dap_chain_cs_dag_event.c
@@ -282,8 +282,8 @@ bool dap_chain_cs_dag_event_gdb_set(dap_chain_cs_dag_t *a_dag, char *a_event_has
 
     l_round_item->event_size = (uint32_t)a_event_size;
     l_round_item->data_size = (uint32_t)(a_event_size+l_signs_size);
+    l_round_item->round_info = a_round_item->round_info;
 
-    memcpy(&l_round_item->round_info, &a_round_item->round_info, sizeof(dap_chain_cs_dag_event_round_info_t));
     memcpy(l_round_item->event_n_signs,                 a_event, a_event_size);
     memcpy(l_round_item->event_n_signs + a_event_size,  l_signs, l_signs_size);