diff --git a/3rdparty/cuttdb/CMakeLists.txt b/3rdparty/cuttdb/CMakeLists.txt
index 8cf9f34ac98198a42100658743882ac0b31a3bba..fcb7e8a592494e323eaec17a0a46cd909ad38b05 100755
--- a/3rdparty/cuttdb/CMakeLists.txt
+++ b/3rdparty/cuttdb/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.1)
+cmake_minimum_required(VERSION 3.10)
 
 project(dap_cuttdb C)
 
diff --git a/3rdparty/json-c-darwin/CMakeLists.txt b/3rdparty/json-c-darwin/CMakeLists.txt
index 455c70f283a430a482d5350b6a8e9e0fceddecdf..f051a06cdd03295a8e14a30aa5484bb8c9d50b13 100644
--- a/3rdparty/json-c-darwin/CMakeLists.txt
+++ b/3rdparty/json-c-darwin/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (json-c)
   
 file(GLOB JSON_C_SRCS FILES *.c)
diff --git a/3rdparty/json-c/CMakeLists.txt b/3rdparty/json-c/CMakeLists.txt
index 455c70f283a430a482d5350b6a8e9e0fceddecdf..f051a06cdd03295a8e14a30aa5484bb8c9d50b13 100644
--- a/3rdparty/json-c/CMakeLists.txt
+++ b/3rdparty/json-c/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (json-c)
   
 file(GLOB JSON_C_SRCS FILES *.c)
diff --git a/3rdparty/libmagic-darwin/CMakeLists.txt b/3rdparty/libmagic-darwin/CMakeLists.txt
index 5c44277f082502ac2c2f08017884c4b71ea95e5a..c7356c623c0be98aeb1f2da5f820d238d1101852 100755
--- a/3rdparty/libmagic-darwin/CMakeLists.txt
+++ b/3rdparty/libmagic-darwin/CMakeLists.txt
@@ -3,7 +3,7 @@
 # value of 3.4.0 or lower.
 # by huzongyao
 
-cmake_minimum_required(VERSION 3.4.1)
+cmake_minimum_required(VERSION 3.10)
 
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -DHAVE_CONFIG_H -I/usr/lib/jvm/java-8-openjdk-amd64/include/ -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux/")
 
diff --git a/3rdparty/libmagic/CMakeLists.txt b/3rdparty/libmagic/CMakeLists.txt
index 33a21014bb650e31989703556be2df618bd20fd0..681005e1e0469216d454ce219db5ee09d101a4a8 100755
--- a/3rdparty/libmagic/CMakeLists.txt
+++ b/3rdparty/libmagic/CMakeLists.txt
@@ -3,7 +3,7 @@
 # value of 3.4.0 or lower.
 # by huzongyao
 
-cmake_minimum_required(VERSION 3.4.1)
+cmake_minimum_required(VERSION 3.10)
 
 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -DHAVE_CONFIG_H -I/usr/lib/jvm/java-8-openjdk-amd64/include/ -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux/")
 
diff --git a/3rdparty/wolfssl/CMakeLists.txt b/3rdparty/wolfssl/CMakeLists.txt
index 171c8ef3fadf66c1b988be8af14d59b14f9767bb..c6a14fd2e6825b533b50e5e8fcd3cde8dbe7a058 100644
--- a/3rdparty/wolfssl/CMakeLists.txt
+++ b/3rdparty/wolfssl/CMakeLists.txt
@@ -19,7 +19,7 @@
 # Project
 ####################################################
 
-cmake_minimum_required(VERSION 3.2)
+cmake_minimum_required(VERSION 3.10)
 
 if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
     message(FATAL_ERROR "In-source builds are not allowed.\
diff --git a/CMakeLists.txt b/CMakeLists.txt
index efe32c7df4701740435185f10fabd5b06eb7bfab..4fcc818e8421210505a1f140ebb39bf3e172957d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,9 +1,28 @@
 project(cellframe-sdk C)
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 set(CMAKE_C_STANDARD 11)
 set(CELLFRAME_SDK_NATIVE_VERSION "3.1-0")
+
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
+
+set(BUILD_CRYPTO_TESTS ON)
+
+if(NOT DEFINED ${CELLFRAME_MODULES})
+    include (cmake/OS_Detection.cmake)
+    if (WIN32)
+        set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange")
+    elseif(BSD)
+        set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange")
+    elseif(DARWIN)
+        set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange")
+    elseif(ANDROID)
+        set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange")
+    elseif(LINUX)
+        set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-none srv-app srv-app-db srv-datum srv-stake srv-xchange modules-dynamic srv-vpn")
+    endif()
+endif()
+
 set(DAPSDK_MODULES "")
 
 if(NOT DEFINED ${CELLFRAME_MODULES})
diff --git a/cmake/OS_Detection.cmake b/cmake/OS_Detection.cmake
index a4d15a653c13b2ca287431446ce10a78a93c5679..8148074e3a757572b7abc583b6e128ead19cec98 100644
--- a/cmake/OS_Detection.cmake
+++ b/cmake/OS_Detection.cmake
@@ -1,3 +1,5 @@
+include_guard(GLOBAL)
+
 if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
     set(OS_TYPE_DESKTOP ON)
     set(LINUX ON)
diff --git a/dap-sdk/CMakeLists.txt b/dap-sdk/CMakeLists.txt
index f1b30e0ed0b169065f03f9b01d38c9ae34a4d3c9..9a6f3fa6394bd90cbc3d3d93c2aae300b843a209 100644
--- a/dap-sdk/CMakeLists.txt
+++ b/dap-sdk/CMakeLists.txt
@@ -1,4 +1,4 @@
-set(DAP_SDK_NATIVE_VERSION "2.3-0")
+set(DAP_SDK_NATIVE_VERSION "2.2-2")
 
 # We switch off SSL until its not switched on back
 if(DAPSDK_MODULES MATCHES "ssl-support")
diff --git a/dap-sdk/core/CMakeLists.txt b/dap-sdk/core/CMakeLists.txt
index 60cb7dc92bb74181db1175cbff2a015ee55576f3..5956ea55318d1c3e02efe8d27c8ecb2d06c21a83 100755
--- a/dap-sdk/core/CMakeLists.txt
+++ b/dap-sdk/core/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_core)
 
 add_definitions("-D_GNU_SOURCE") 
diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h
index a5460b55f1b16422a19924985ac53fcf5b34aa2d..7e4f3c69e8db6be34eaba0e9d66c1824d6d377f6 100755
--- a/dap-sdk/core/include/dap_common.h
+++ b/dap-sdk/core/include/dap_common.h
@@ -143,7 +143,7 @@ typedef uint8_t byte_t;
   #define DAP_DUP_SIZE(a, s)    memcpy(malloc(s), a, s)
 #endif
 
-#define DAP_DEL_Z(a)          if(a) { DAP_DELETE(a); a=NULL;}
+#define DAP_DEL_Z(a)            if (a) { DAP_DELETE(a); (a) = NULL; }
 
 DAP_STATIC_INLINE void *_dap_aligned_alloc( uintptr_t alignment, uintptr_t size )
 {
@@ -451,6 +451,7 @@ char *dap_log_get_item(time_t a_start_time, int a_limit);
 #define DAP_PRINTF_ATTR(format_index, args_index)
 #endif /* __GNUC__ */
 
+
 DAP_PRINTF_ATTR(3, 4) void _log_it( const char * log_tag, enum dap_log_level, const char * format, ... );
 #define log_it( _log_level, ...) _log_it( LOG_TAG, _log_level, ##__VA_ARGS__)
 
diff --git a/dap-sdk/core/include/dap_math_ops.h b/dap-sdk/core/include/dap_math_ops.h
index 5cc8142dd9757d042dc4b9b9403d092c02bf7a58..c030d1007552881075d3d8883b5183870e7d7b41 100755
--- a/dap-sdk/core/include/dap_math_ops.h
+++ b/dap-sdk/core/include/dap_math_ops.h
@@ -1,5 +1,4 @@
 #pragma once
-
 #include <stdint.h>
 #include <stdio.h>
 #include "assert.h"
@@ -14,22 +13,17 @@
 #if __SIZEOF_INT128__ == 16
 
 #define DAP_GLOBAL_IS_INT128
-
-#endif
-
-
-#ifdef DAP_GLOBAL_IS_INT128
 typedef __int128 _dap_int128_t;
 
-//#if !defined (int128_t)
+#if !defined (int128_t)
 typedef __int128 int128_t;
-//#endif
+#endif
 
-//#if !defined (uint128_t)
+#if !defined (uint128_t)
 typedef unsigned __int128 uint128_t;
-//#endif
+#endif
 
-#else //DAP_GLOBAL_IS_INT128
+#else // __SIZEOF_INT128__ == 16
 
 typedef union uint128 {
     struct{
@@ -50,16 +44,16 @@ typedef union int128 {
     int32_t i32[4];
 } int128_t;
 
-#endif //DAP_GLOBAL_IS_INT128
-
 typedef int128_t _dap_int128_t;
 
-typedef struct uint256 {
+#endif // __SIZEOF_INT128__ == 16
+
+typedef struct uint256_t {
     uint128_t hi;
     uint128_t lo;
 } DAP_ALIGN_PACKED uint256_t;
 
-typedef struct uint512 {
+typedef struct uint512_t {
     uint256_t hi;
     uint256_t lo;
 } DAP_ALIGN_PACKED uint512_t;
@@ -69,33 +63,14 @@ typedef struct uint512 {
 ////////////////////////////////////////////////////////////////////////////////////////////////
 
 #ifndef DAP_GLOBAL_IS_INT128
-
-// uint128_t dap_uint128_substract(uint128_t a, uint128_t b);
-// uint128_t dap_uint128_add(uint128_t a, uint128_t b);
-// bool dap_uint128_check_equal(uint128_t a, uint128_t b);
-// const  uint128_t two_power_64={ .hi = 1, .lo = 0};
-// const  uint128_t lo_64={ .hi = 0, .lo = 0xffffffffffffffff};
-// const  uint128_t hi_64={ .hi = 0xffffffffffffffff, .lo = 0};
-// const  uint128_t zero_128={.hi=0,.lo=0};
-// #define zero_128 ((uint128_t){.hi=0,.lo=0})
-
 #define uint128_0 ((uint128_t){.hi=0,.lo=0})
 #define uint128_1 ((uint128_t){.hi=0,.lo=1})
-
-// const uint64_t lo_32=0xffffffff;
-// const uint64_t hi_32=0xffffffff00000000;
-// const uint64_t ones_64=0xffffffffffffffff;
-
 #else // DAP_GLOBAL_IS_INT128
-
-// #define zero_128 ((uint128_t)0)
-#define uint128_0 ((uint128_t)0)
-#define uint128_1 ((uint128_t)1)
+#define uint128_0 0ULL
+#define uint128_1 1ULL
 
 #endif // DAP_GLOBAL_IS_INT128
 
-// const uint256_t zero_256={.hi=zero_128,.lo=zero_128};
-// #define zero_256 ((uint256_t){.hi=zero_128,.lo=zero_128})
 #define uint256_0 ((uint256_t){.hi=uint128_0,.lo=uint128_0})
 #define uint256_1 ((uint256_t){.hi=uint128_0,.lo=uint128_1})
 #define uint512_0 ((uint512_t){.hi=uint256_0,.lo=uint256_0})
@@ -156,9 +131,9 @@ static inline uint128_t AND_128(uint128_t a_128_bit,uint128_t b_128_bit){
 
 #ifdef DAP_GLOBAL_IS_INT128
     return a_128_bit&b_128_bit;
-#else    
+#else
     uint128_t output=uint128_0;
-    output.hi= a_128_bit.hi & b_128_bit.hi;  
+    output.hi= a_128_bit.hi & b_128_bit.hi;
     output.lo= a_128_bit.lo & b_128_bit.lo;
     return output;
 #endif
@@ -171,7 +146,7 @@ static inline uint128_t OR_128(uint128_t a_128_bit,uint128_t b_128_bit){
 
 #else
     uint128_t output=uint128_0;
-    output.hi= a_128_bit.hi | b_128_bit.hi;  
+    output.hi= a_128_bit.hi | b_128_bit.hi;
     output.lo= a_128_bit.lo | b_128_bit.lo;
     return output;
 #endif
@@ -179,15 +154,15 @@ static inline uint128_t OR_128(uint128_t a_128_bit,uint128_t b_128_bit){
 
 static inline uint256_t AND_256(uint256_t a_256_bit,uint256_t b_256_bit){
     uint256_t output = uint256_0;
-    output.hi = AND_128(a_256_bit.hi, b_256_bit.hi);  
+    output.hi = AND_128(a_256_bit.hi, b_256_bit.hi);
     output.lo = AND_128(a_256_bit.lo, b_256_bit.lo);
     return output;
 }
 
 static inline uint256_t OR_256(uint256_t a_256_bit,uint256_t b_256_bit){
     uint256_t output = uint256_0;
-    output.hi = OR_128(a_256_bit.hi, b_256_bit.hi); 
-    output.lo = OR_128(a_256_bit.lo, b_256_bit.lo); 
+    output.hi = OR_128(a_256_bit.hi, b_256_bit.hi);
+    output.lo = OR_128(a_256_bit.lo, b_256_bit.lo);
     return output;
 }
 
@@ -197,8 +172,8 @@ static inline void LEFT_SHIFT_128(uint128_t a_128_bit,uint128_t* b_128_bit,int n
 #ifdef DAP_GLOBAL_IS_INT128
     *b_128_bit= a_128_bit << n;
 
-#else 
-    if (n >= 64) { // shifting 64-bit integer by more than 63 bits is not defined   
+#else
+    if (n >= 64) { // shifting 64-bit integer by more than 63 bits is not defined
         a_128_bit.hi=a_128_bit.lo;
         a_128_bit.lo=0;
         LEFT_SHIFT_128(a_128_bit,b_128_bit,n-64);
@@ -206,7 +181,7 @@ static inline void LEFT_SHIFT_128(uint128_t a_128_bit,uint128_t* b_128_bit,int n
     if (n == 0) {
        b_128_bit->hi=a_128_bit.hi;
        b_128_bit->lo=a_128_bit.lo;
-    } 
+    }
     else {
         uint64_t shift_temp;
         shift_temp=a_128_bit.lo<<n;
@@ -222,9 +197,9 @@ static inline void RIGHT_SHIFT_128(uint128_t a_128_bit,uint128_t* b_128_bit,int
 
 #ifdef DAP_GLOBAL_IS_INT128
     (*b_128_bit) = a_128_bit >> n;
-#else 
+#else
     if (n >= 64) // shifting 64-bit integer by more than 63 bits is not defined
-    {   
+    {
         a_128_bit.lo=a_128_bit.hi;
         a_128_bit.hi=0;
         RIGHT_SHIFT_128(a_128_bit,b_128_bit,n-64);
@@ -233,7 +208,7 @@ static inline void RIGHT_SHIFT_128(uint128_t a_128_bit,uint128_t* b_128_bit,int
     {
        b_128_bit->hi=a_128_bit.hi;
        b_128_bit->lo=a_128_bit.lo;
-    } 
+    }
     else
     {   uint64_t shift_temp;
         shift_temp=a_128_bit.hi>>n;
@@ -245,10 +220,10 @@ static inline void RIGHT_SHIFT_128(uint128_t a_128_bit,uint128_t* b_128_bit,int
 
 
 static inline void LEFT_SHIFT_256(uint256_t a_256_bit,uint256_t* b_256_bit,int n){
- 
+
     assert (n <= 256);
 
-    if (n >= 128) { // shifting 64-bit integer by more than 63 bits is not defined 
+    if (n >= 128) { // shifting 64-bit integer by more than 63 bits is not defined
         a_256_bit.hi=a_256_bit.lo;
         a_256_bit.lo=uint128_0;
         LEFT_SHIFT_256(a_256_bit,b_256_bit,n-128);
@@ -256,11 +231,11 @@ static inline void LEFT_SHIFT_256(uint256_t a_256_bit,uint256_t* b_256_bit,int n
     if (n == 0) {
        b_256_bit->hi=a_256_bit.hi;
        b_256_bit->lo=a_256_bit.lo;
-    } 
+    }
     if (n<128) {
         uint128_t shift_temp=uint128_0;
         LEFT_SHIFT_128(a_256_bit.lo,&shift_temp,n);
-        b_256_bit->lo=shift_temp;   
+        b_256_bit->lo=shift_temp;
         uint128_t shift_temp_or_left=uint128_0;
         uint128_t shift_temp_or_right=uint128_0;
         LEFT_SHIFT_128(a_256_bit.hi,&shift_temp_or_left,n);
@@ -271,7 +246,7 @@ static inline void LEFT_SHIFT_256(uint256_t a_256_bit,uint256_t* b_256_bit,int n
 
 static inline void RIGHT_SHIFT_256(uint256_t a_256_bit,uint256_t* b_256_bit,int n){
     assert (n <= 256);
-    if (n >= 128) { // shifting 64-bit integer by more than 63 bits is not defined   
+    if (n >= 128) { // shifting 64-bit integer by more than 63 bits is not defined
         a_256_bit.lo=a_256_bit.hi;
         a_256_bit.hi=uint128_0;
         RIGHT_SHIFT_256(a_256_bit,b_256_bit,n-128);
@@ -279,11 +254,11 @@ static inline void RIGHT_SHIFT_256(uint256_t a_256_bit,uint256_t* b_256_bit,int
     if (n == 0) {
        b_256_bit->hi=a_256_bit.hi;
        b_256_bit->lo=a_256_bit.lo;
-    } 
+    }
     if (n<128) {
         uint128_t shift_temp=uint128_0;
         RIGHT_SHIFT_128(a_256_bit.hi,&shift_temp,n);
-        b_256_bit->hi=shift_temp;   
+        b_256_bit->hi=shift_temp;
         uint128_t shift_temp_or_left=uint128_0;
         uint128_t shift_temp_or_right=uint128_0;
         RIGHT_SHIFT_128(a_256_bit.lo,&shift_temp_or_left,n);
@@ -297,12 +272,12 @@ static inline void INCR_128(uint128_t *a_128_bit){
 #ifdef DAP_GLOBAL_IS_INT128
     (*a_128_bit)++;
 
-#else 
+#else
     a_128_bit->lo++;
     if(a_128_bit->lo == 0)
     {
         a_128_bit->hi++;
-    }  
+    }
 #endif
 }
 
@@ -311,12 +286,12 @@ static inline void DECR_128(uint128_t* a_128_bit){
 #ifdef DAP_GLOBAL_IS_INT128
    (*a_128_bit)--;
 
-#else 
+#else
    a_128_bit->lo--;
    if(a_128_bit->hi == 0)
    {
        a_128_bit->hi--;
-   }  
+   }
 #endif
 }
 
@@ -327,14 +302,14 @@ static inline void INCR_256(uint256_t* a_256_bit){
     if(a_256_bit->lo == 0)
     {
         a_256_bit->hi++;
-    }  
+    }
 
-#else 
+#else
     INCR_128(&a_256_bit->lo);
     if(EQUAL_128(a_256_bit->lo, uint128_0))
     {
         INCR_128(&a_256_bit->hi);
-    }  
+    }
 #endif
 }
 
@@ -354,7 +329,7 @@ static inline int OVERFLOW_SUM_64_64(uint64_t a_64_bit,uint64_t b_64_bit)
 }
 
 static inline int OVERFLOW_MULT_64_64(uint64_t a_64_bit,uint64_t b_64_bit)
-{ 
+{
     return (a_64_bit>((uint64_t)-1)/b_64_bit);
 }
 
@@ -472,7 +447,7 @@ static inline int SUM_256_256(uint256_t a_256_bit,uint256_t b_256_bit,uint256_t*
     overflow_flag=0;
     overflow_flag=SUM_128_128(carry_in_128,a_256_bit.hi,&intermediate_value);
     //we store overflow_flag in case there is already overflow
-    int overflow_flag_bis=0; 
+    int overflow_flag_bis=0;
     overflow_flag_bis=SUM_128_128(intermediate_value,b_256_bit.hi,&c_256_bit->hi);
     overflow_flag=overflow_flag||overflow_flag_bis;
 #endif
@@ -591,7 +566,7 @@ static inline void MULT_128_256(uint128_t a_128_bit,uint128_t b_128_bit,uint256_
     //product of .hi terms - stored in .hi field of c_256_bit
     MULT_64_128(a_128_bit.hi,b_128_bit.hi, &c_256_bit->hi);
 
-    //product of .lo terms - stored in .lo field of c_256_bit        
+    //product of .lo terms - stored in .lo field of c_256_bit
     MULT_64_128(a_128_bit.lo,b_128_bit.lo, &c_256_bit->lo);
 
     uint128_t cross_product_one={.hi=0, .lo=0};
@@ -607,7 +582,7 @@ static inline void MULT_128_256(uint128_t a_128_bit,uint128_t b_128_bit,uint256_
     {
         c_256_bit->hi.hi+=1;
     }
-    
+
     MULT_64_128(a_128_bit.lo, b_128_bit.hi, &cross_product_two);
     c_256_bit->lo.hi += cross_product_two.lo;
     if(c_256_bit->lo.hi < cross_product_two.lo)  // if overflowed
@@ -644,7 +619,7 @@ static inline int MULT_128_128(uint128_t a_128_bit, uint128_t b_128_bit, uint128
 
 
 // incorrect
-// static inline int MULT_128_128(uint128_t a_128_bit,uint128_t b_128_bit,uint128_t* accum_128_bit) {    
+// static inline int MULT_128_128(uint128_t a_128_bit,uint128_t b_128_bit,uint128_t* accum_128_bit) {
 //     uint64_t A=(b_128_bit.lo & lo_32)*(a_128_bit.hi & lo_32);
 //     uint64_t B_32_64=((b_128_bit.lo & lo_32)*(a_128_bit.hi & hi_32))&hi_32;
 //     uint64_t C_32_64=((b_128_bit.lo & hi_32)*(a_128_bit.hi & lo_32))&hi_32;
@@ -659,49 +634,49 @@ static inline int MULT_128_128(uint128_t a_128_bit, uint128_t b_128_bit, uint128
 //     int overflow_from_hi_calc=0;
 //     overflow_from_hi_calc=(a_128_bit.hi*b_128_bit.hi>0);
 //     overflow_ctr+=overflow_from_hi_calc;
-    
+
 //     //product of two ".lo" terms
-//     MULT_64_128(a_128_bit.lo,b_128_bit.lo,accum_128_bit);   
+//     MULT_64_128(a_128_bit.lo,b_128_bit.lo,accum_128_bit);
 
 //     int overflow=0;
 //     uint64_t temp=0;
 
-//     overflow=SUM_64_64(A,temp,&accum_128_bit->hi); 
+//     overflow=SUM_64_64(A,temp,&accum_128_bit->hi);
 //     printf("accum_128_bit->hi after add in of A %" PRIu64 "\n",accum_128_bit->hi);
- 
+
 //     overflow_ctr+=overflow;
-//     temp=accum_128_bit->hi; 
+//     temp=accum_128_bit->hi;
 //     overflow=0;
 
-//     overflow=SUM_64_64(B_32_64,temp,&accum_128_bit->hi);  
+//     overflow=SUM_64_64(B_32_64,temp,&accum_128_bit->hi);
 //     overflow_ctr+=overflow;
-//     temp=accum_128_bit->hi; 
+//     temp=accum_128_bit->hi;
 //     overflow=0;
 
-//     overflow=SUM_64_64(C_32_64,temp,&accum_128_bit->hi);  
+//     overflow=SUM_64_64(C_32_64,temp,&accum_128_bit->hi);
 //     overflow_ctr+=overflow;
-//     temp=accum_128_bit->hi; 
+//     temp=accum_128_bit->hi;
 //     overflow=0;
 
-//     overflow=SUM_64_64(E,temp,&accum_128_bit->hi);  
+//     overflow=SUM_64_64(E,temp,&accum_128_bit->hi);
 //     overflow_ctr+=overflow;
-//     temp=accum_128_bit->hi; 
+//     temp=accum_128_bit->hi;
 //     overflow=0;
 
-//     overflow=SUM_64_64(F_32_64,temp,&accum_128_bit->hi);  
+//     overflow=SUM_64_64(F_32_64,temp,&accum_128_bit->hi);
 //     overflow_ctr+=overflow;
-//     temp=accum_128_bit->hi; 
+//     temp=accum_128_bit->hi;
 //     overflow=0;
-        
-//     overflow=SUM_64_64(G_32_64,temp,&accum_128_bit->hi);  
+
+//     overflow=SUM_64_64(G_32_64,temp,&accum_128_bit->hi);
 //     overflow_ctr+=overflow;
-//     temp=accum_128_bit->hi;  
+//     temp=accum_128_bit->hi;
 //     overflow=0;
 
 //     if(overflow_ctr>0){
 //         overflow=1;}
 //     else{overflow=0;}
-    
+
 //     return overflow;
 // }
 
@@ -711,8 +686,8 @@ static inline void MULT_256_512(uint256_t a_256_bit,uint256_t b_256_bit,uint512_
     int dummy_overflow;
     //product of .hi terms - stored in .hi field of c_512_bit
     MULT_128_256(a_256_bit.hi,b_256_bit.hi, &c_512_bit->hi);
-    
-    //product of .lo terms - stored in .lo field of c_512_bit        
+
+    //product of .lo terms - stored in .lo field of c_512_bit
     MULT_128_256(a_256_bit.lo,b_256_bit.lo, &c_512_bit->lo);
 
     //cross product of .hi and .lo terms
@@ -727,21 +702,21 @@ static inline void MULT_256_512(uint256_t a_256_bit,uint256_t b_256_bit,uint512_
     MULT_128_256(a_256_bit.hi,b_256_bit.lo,&cross_product_first_term);
     MULT_128_256(a_256_bit.lo,b_256_bit.hi,&cross_product_second_term);
     overflow=SUM_256_256(cross_product_first_term,cross_product_second_term,&cross_product);
-    
-    
+
+
     LEFT_SHIFT_256(cross_product,&cross_product_shift_128,128); //the factor in front of cross product is 2**128
-    c_512_bit_lo_copy=c_512_bit->lo; 
-    dummy_overflow=SUM_256_256(c_512_bit_lo_copy,cross_product_shift_128,&c_512_bit->lo);    
- 
-    cross_product_shift_128.hi = uint128_0; 
+    c_512_bit_lo_copy=c_512_bit->lo;
+    dummy_overflow=SUM_256_256(c_512_bit_lo_copy,cross_product_shift_128,&c_512_bit->lo);
+
+    cross_product_shift_128.hi = uint128_0;
     cross_product_shift_128.lo = uint128_0;
     RIGHT_SHIFT_256(cross_product,&cross_product_shift_128,128);
-    c_512_bit_hi_copy=c_512_bit->hi;    
+    c_512_bit_hi_copy=c_512_bit->hi;
     dummy_overflow=SUM_256_256(c_512_bit_hi_copy,cross_product_shift_128,&c_512_bit->hi);
 }
 
 static inline int MULT_256_256(uint256_t a_256_bit,uint256_t b_256_bit,uint256_t* accum_256_bit){
-    int overflow=0; 
+    int overflow=0;
     int equal_flag=0;
     uint512_t full_product_512={.hi=uint256_0,.lo=uint256_0,};
     MULT_256_512(a_256_bit,b_256_bit,&full_product_512);
@@ -760,7 +735,7 @@ static inline int MULT_256_256(uint256_t a_256_bit,uint256_t b_256_bit,uint256_t
 //     uint128_t two_0_coeff={.hi=0,.lo=0};
 //     MULT_64_128(a_256_bit.lo.lo,b_256_bit.lo.lo,&two_0_coeff);
 //     accum_256_bit->lo.lo=two_0_coeff.lo;
-    
+
 //     uint128_t two_64_coeff={.hi=0,.lo=0};
 //     uint128_t two_64_coeff_one={.hi=0,.lo=0};
 //     MULT_64_128(a_256_bit.lo.hi,b_256_bit.lo.lo,&two_64_coeff_one);
@@ -770,7 +745,7 @@ static inline int MULT_256_256(uint256_t a_256_bit,uint256_t b_256_bit,uint256_t
 //     int dummy_overflow=0;
 //     dummy_overflow=SUM_128_128(two_64_coeff_one,two_64_coeff_two,&two_64_coeff_sum);
 //     if (two_64_coeff_sum.lo+two_0_coeff.hi<two_64_coeff_sum.lo){
-        
+
 //         two_64_coeff.lo=two_64_coeff_sum.lo+two_0_coeff.hi;
 //         two_64_coeff.hi=1+two_64_coeff_sum.hi;}
 //     else{
@@ -778,7 +753,7 @@ static inline int MULT_256_256(uint256_t a_256_bit,uint256_t b_256_bit,uint256_t
 //         two_64_coeff.hi=two_64_coeff_sum.hi;
 //     }
 //     accum_256_bit->lo.hi=two_64_coeff.lo;
-    
+
 
 //     uint128_t two_128_coeff={.hi=0,.lo=0};
 //     uint128_t two_128_coeff_one={.hi=0,.lo=0};
@@ -791,9 +766,9 @@ static inline int MULT_256_256(uint256_t a_256_bit,uint256_t b_256_bit,uint256_t
 //     dummy_overflow=SUM_128_128(two_128_coeff_one,two_128_coeff_two,&two_128_coeff_sum_one);
 //     uint128_t two_128_coeff_sum_two={.hi=0,.lo=0};
 //     dummy_overflow=SUM_128_128(two_128_coeff_sum_one,two_128_coeff_three,&two_128_coeff_sum_two);
-    
+
 //     if (two_128_coeff_sum_two.lo+two_64_coeff.hi<two_128_coeff_sum_two.lo){
-        
+
 //         two_128_coeff.lo=two_128_coeff_sum_two.lo+two_64_coeff.hi;
 //         two_128_coeff.hi=1+two_128_coeff_sum_two.hi;}
 //     else{
@@ -825,7 +800,7 @@ static inline int MULT_256_256(uint256_t a_256_bit,uint256_t b_256_bit,uint256_t
 //    int overflow_two_192_coeff_sum=0;
 //    overflow_two_192_coeff_sum=SUM_64_64(two_192_coeff_sum_one,two_192_coeff_sum_two,&two_192_coeff);
 
-//     return 0;    
+//     return 0;
 // }
 
 //#ifndef DAP_GLOBAL_IS_INT128
@@ -837,14 +812,14 @@ static inline int compare128(uint128_t a, uint128_t b)
 #ifdef DAP_GLOBAL_IS_INT128
     return ( a > b ? 1 : 0 ) - ( a < b ? 1 : 0 );
 #else
-    return    (((a.hi > b.hi) || ((a.hi == b.hi) && (a.lo > b.lo))) ? 1 : 0) 
+    return    (((a.hi > b.hi) || ((a.hi == b.hi) && (a.lo > b.lo))) ? 1 : 0)
          -    (((a.hi < b.hi) || ((a.hi == b.hi) && (a.lo < b.lo))) ? 1 : 0);
 #endif
 }
 
 static inline int compare256(uint256_t a, uint256_t b)
 {
-    return    (( compare128(a.hi, b.hi) == 1 || (compare128(a.hi, b.hi) == 0 && compare128(a.lo, b.lo) == 1)) ? 1 : 0) 
+    return    (( compare128(a.hi, b.hi) == 1 || (compare128(a.hi, b.hi) == 0 && compare128(a.lo, b.lo) == 1)) ? 1 : 0)
          -    (( compare128(a.hi, b.hi) == -1 || (compare128(a.hi, b.hi) == 0 && compare128(a.lo, b.lo) == -1)) ? 1 : 0);
 }
 
@@ -919,7 +894,7 @@ static inline void divmod_impl_128(uint128_t a_dividend, uint128_t a_divisor, ui
     }
 
     uint128_t l_denominator = a_divisor;
-    uint128_t l_quotient = uint128_0;    
+    uint128_t l_quotient = uint128_0;
     int l_shift = fls128(a_dividend) - fls128(l_denominator);
 
     LEFT_SHIFT_128(l_denominator, &l_denominator, l_shift);
@@ -961,7 +936,7 @@ static inline void divmod_impl_256(uint256_t a_dividend, uint256_t a_divisor, ui
     }
 
     uint256_t l_denominator = a_divisor;
-    uint256_t l_quotient = uint256_0;    
+    uint256_t l_quotient = uint256_0;
     // int l_shift = nlz256(a_dividend) - nlz256(l_denominator);
     int l_shift = fls256(a_dividend) - fls256(l_denominator);
     LEFT_SHIFT_256(l_denominator, &l_denominator, l_shift);
@@ -971,7 +946,7 @@ static inline void divmod_impl_256(uint256_t a_dividend, uint256_t a_divisor, ui
 
         if( compare256(a_dividend, l_denominator) >= 0 ) {
             SUBTRACT_256_256(a_dividend, l_denominator, &a_dividend);
-            l_quotient = OR_256(l_quotient, uint256_1); 
+            l_quotient = OR_256(l_quotient, uint256_1);
         }
         RIGHT_SHIFT_256(l_denominator, &l_denominator, 1);
     }
@@ -998,46 +973,11 @@ static inline void DIV_256(uint256_t a_256_bit, uint256_t b_256_bit, uint256_t*
     *c_256_bit = l_ret;
 }
 
-
-//
-// dap_uint128_substract, dap_uint128_add, dap_uint128_check_equal - temporarily, for compatibility
-static inline uint128_t dap_uint128_substract(uint128_t a, uint128_t b)
-{
-    // if (a < b) {
-    //     return 0;
-    // }
-    // return a - b;
-    uint128_t c = uint128_0;
-    SUBTRACT_128_128(a, b, &c);
-    return c;
-}
-
-/**
- * @brief dap_chain_balance_add
- * @param a
- * @param b
- * @return
- */
-static inline uint128_t dap_uint128_add(uint128_t a, uint128_t b)
-{
-    // uint128_t l_ret = a + b;
-    // if (l_ret < a || l_ret < b) {
-    //     return 0;
-    // }
-    // return l_ret;
-    uint128_t c = uint128_0;
-    SUM_128_128( a, b, &c);
-    return c;
-}
-
-/**
- * @brief dap_uint128_check_equal
- * @param a
- * @param b
- * @return
- */
-static inline bool dap_uint128_check_equal(uint128_t a, uint128_t b)
+#define CONV_256_FLOAT 10000000000000ULL // 10^13, so max float number to mult is 1.000.000
+static inline uint256_t MULT_256_FLOAT(uint256_t a_val, long double a_mult)
 {
-    //return a == b;
-    return EQUAL_128(a, b);
+    uint256_t l_ret = GET_256_FROM_64((uint64_t)(a_mult * CONV_256_FLOAT));
+    MULT_256_256(l_ret, a_val, &l_ret);
+    DIV_256(l_ret, GET_256_FROM_64(CONV_256_FLOAT), &l_ret);
+    return l_ret;
 }
diff --git a/dap-sdk/core/src/android/CMakeLists.txt b/dap-sdk/core/src/android/CMakeLists.txt
index 1e9d95846f79bcecbdddf4c3debbf0d572798269..70d059ded56ed6c6f41a6afb940363248a6f18b5 100755
--- a/dap-sdk/core/src/android/CMakeLists.txt
+++ b/dap-sdk/core/src/android/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 project (dap_core_android C)
 
diff --git a/dap-sdk/core/src/dap_common.c b/dap-sdk/core/src/dap_common.c
index f15e6cb0a91a5d1fe6c09ea96ca8c8c5a176a2cf..b2dc8c9decc0bef075392fbaf37ff645d9c9fcd6 100755
--- a/dap-sdk/core/src/dap_common.c
+++ b/dap-sdk/core/src/dap_common.c
@@ -1085,16 +1085,22 @@ void dap_usleep(time_t a_microseconds)
 
 
 char* dap_ctime_r(time_t *a_time, char* a_buf){
-    if (*a_time > DAP_END_OF_DAYS) {
-        return "(null)\r\n";
+    char *l_fail_ret = "(null)\r\n";
+    if (!a_buf)
+        return l_fail_ret;
+    if(!a_time || *a_time > DAP_END_OF_DAYS) {
+        strcpy(a_buf, l_fail_ret);
+        return l_fail_ret;
     }
     struct tm l_time;
     localtime_r(a_time, &l_time);
     char *l_str_time = asctime_r(&l_time, a_buf);
     if (l_str_time)
         return  l_str_time;
-    else
-        return "(null)\r\n";
+    else {
+        strcpy(a_buf, l_fail_ret);
+        return l_fail_ret;
+    }
 }
 
 int dap_is_alpha_and_(char e)
diff --git a/dap-sdk/core/src/dap_strfuncs.c b/dap-sdk/core/src/dap_strfuncs.c
index 08b7058d71bfc1fd22c3656f41dc049d01b8e8e8..163882b51d80daa2c00267de15f586b0afb50f7b 100755
--- a/dap-sdk/core/src/dap_strfuncs.c
+++ b/dap-sdk/core/src/dap_strfuncs.c
@@ -312,7 +312,7 @@ char* dap_strdup_vprintf(const char *a_format, va_list a_args)
  * @return char* a newly-allocated string holding the result
  */
 
-DAP_PRINTF_ATTR(1,2) char* dap_strdup_printf(const char *a_format, ...)
+DAP_PRINTF_ATTR(1,2) char *dap_strdup_printf(const char *a_format, ...)
 {
     char *l_buffer;
     va_list l_args;
diff --git a/dap-sdk/core/src/dap_string.c b/dap-sdk/core/src/dap_string.c
index 9016f7bfc0fcb0c332ae9aaa8c4cfd550ad25c17..e7d61347828f7033b34f99c347e0ee715c936eb1 100755
--- a/dap-sdk/core/src/dap_string.c
+++ b/dap-sdk/core/src/dap_string.c
@@ -836,10 +836,18 @@ void dap_string_append_vprintf(dap_string_t *string, const char *format, va_list
 
     len = dap_vasprintf(&buf, format, args);
 
-    if(len >= 0) {
+    if (len >= 0) {
         dap_string_maybe_expand(string, len);
-        memcpy(string->str + string->len, buf, len + 1);
-        string->len += len;
+        if (string->str) {
+            memcpy(string->str + string->len, buf, len + 1);
+            string->len += len;
+        } else {
+            const char *l_mem_out = "Out of memory!";
+            const int l_fail_len = strlen(l_mem_out) + 1;
+            string->str = DAP_NEW_SIZE(char, l_fail_len);
+            strcpy(string->str, l_mem_out);
+            string->len = string->allocated_len = l_fail_len;
+        }
         DAP_DELETE(buf);
     }
 }
diff --git a/dap-sdk/core/src/darwin/CMakeLists.txt b/dap-sdk/core/src/darwin/CMakeLists.txt
index 8f981d542da3e9b9540f764c97ee0a8fda60f7c1..651375ede9a29b1854e2e08ce329399b4981e732 100755
--- a/dap-sdk/core/src/darwin/CMakeLists.txt
+++ b/dap-sdk/core/src/darwin/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 project (dap_core_darwin)
 
diff --git a/dap-sdk/core/src/unix/CMakeLists.txt b/dap-sdk/core/src/unix/CMakeLists.txt
index 828fdfb757ca7c653c734c5caeb69b2621b1adfb..1e7ae9443e95046b8352320edbe9bb50ebd3a6c6 100755
--- a/dap-sdk/core/src/unix/CMakeLists.txt
+++ b/dap-sdk/core/src/unix/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 project (dap_core_unix)
 
diff --git a/dap-sdk/core/src/win32/CMakeLists.txt b/dap-sdk/core/src/win32/CMakeLists.txt
index f3d0c43a6662887771ccebe815b8f8102824b6e1..6f84da809b91ab4cc25fffd5a5dd135f41907414 100644
--- a/dap-sdk/core/src/win32/CMakeLists.txt
+++ b/dap-sdk/core/src/win32/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 project (dap_core_win32 C)
 
diff --git a/dap-sdk/core/test/CMakeLists.txt b/dap-sdk/core/test/CMakeLists.txt
index c9ef63ebb3d691543f98993ee2483497de6301c9..47f257f342a8b098a8552a7e6f2e0ee71aeecc40 100755
--- a/dap-sdk/core/test/CMakeLists.txt
+++ b/dap-sdk/core/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 project(core_test)
 
diff --git a/dap-sdk/core/test/uint256_t/unit_test.cpp b/dap-sdk/core/test/uint256_t/unit_test.cpp
index 064d0810b93503a3313483aa2a7f81fc1d57f807..ac4371c00f3453e25c9e2b960ae34416a03eed21 100644
--- a/dap-sdk/core/test/uint256_t/unit_test.cpp
+++ b/dap-sdk/core/test/uint256_t/unit_test.cpp
@@ -39,17 +39,17 @@ int main()
    
    int error_counter_sum_64_128=0;
     
-   uint128_t dap_test_128_shift=uint128_0; 
-   uint128_t dap_test_128_one=uint128_0;
-   uint128_t dap_test_128_two=uint128_0;
-   uint128_t dap_test_128_sub=uint128_0;
-   uint256_t dap_test_256_one=uint256_0;
-   uint256_t dap_test_256_two=uint256_0;
-   uint256_t dap_test_256_sum=uint256_0; 
-   uint256_t dap_test_256_sub=uint256_0; 
-   uint256_t dap_test_256_prod=uint256_0;
-   uint256_t dap_test_256_shift=uint256_0;
-   uint512_t dap_test_512_prod=uint512_0;
+   uint128_t dap_test_128_shift={.hi=0, .lo=0}; 
+   uint128_t dap_test_128_one={.hi=0, .lo=0};
+   uint128_t dap_test_128_two={.hi=0, .lo=0};
+   uint128_t dap_test_128_sub={.hi=0, .lo=0};
+   uint256_t dap_test_256_one={.hi=zero_128, .lo=zero_128};
+   uint256_t dap_test_256_two={.hi=zero_128, .lo=zero_128};
+   uint256_t dap_test_256_sum={.hi=zero_128, .lo=zero_128}; 
+   uint256_t dap_test_256_sub={.hi=zero_128, .lo=zero_128}; 
+   uint256_t dap_test_256_prod={.hi=zero_128, .lo=zero_128};
+   uint256_t dap_test_256_shift={.hi=zero_128, .lo=zero_128};
+   uint512_t dap_test_512_prod={.hi=zero_256, .lo=zero_256};
    int overflow_flag;
    int overflow_flag_prod;
    int borrow_flag_128;
@@ -308,8 +308,8 @@ if (division_enabled==1){
         prod_256_256_file << density_index << std::endl;}
 
         /////////////////////output of 256*256-->512//////////////////////
-        dap_test_512_prod.lo=uint256_0;
-        dap_test_512_prod.hi=uint256_0;
+        dap_test_512_prod.lo=zero_256;
+        dap_test_512_prod.hi=zero_256;
         uint256_t intermed_lo_prod;
         uint256_t intermed_hi_prod;
         MULT_128_256(dap_test_256_one.lo,dap_test_256_two.lo,&intermed_lo_prod);
@@ -442,8 +442,8 @@ if (division_enabled==1){
         dap_test_128_256_prod_one.hi=j;
         dap_test_128_256_prod_two.lo=max_64-(i+1);
         dap_test_128_256_prod_two.hi=max_64-2*(j+1);
-        dap_test_128_256_prod_prod.lo=uint128_0;
-        dap_test_128_256_prod_prod.hi=uint128_0;
+        dap_test_128_256_prod_prod.lo=zero_128;
+        dap_test_128_256_prod_prod.hi=zero_128;
         
         boost::multiprecision::uint256_t boost_test_128_256_prod;
         boost::multiprecision::uint128_t boost_test_128_256_one;
diff --git a/dap-sdk/crypto/CMakeLists.txt b/dap-sdk/crypto/CMakeLists.txt
index 3badd0046895a28ec855633f5e2ba59e44263a7f..91dd01a80a3599e41c81b28cd1c5e35f500d0e70 100755
--- a/dap-sdk/crypto/CMakeLists.txt
+++ b/dap-sdk/crypto/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_crypto)
 
 # fix implicit declaration warnings
diff --git a/dap-sdk/crypto/include/dap_cert.h b/dap-sdk/crypto/include/dap_cert.h
index 0dee3bf8858f543c7878ac73e8eaf341be497b25..ee526e8649a01c2fc532e09c2f0e645266d8e8d6 100755
--- a/dap-sdk/crypto/include/dap_cert.h
+++ b/dap-sdk/crypto/include/dap_cert.h
@@ -45,7 +45,7 @@ typedef enum dap_cert_metadata_type {
 typedef struct dap_cert_metadata {
     const char *key;
     uint32_t length;
-    dap_cert_metadata_type_t type : 8;
+    dap_cert_metadata_type_t type;
     byte_t value[];
 } dap_cert_metadata_t;
 
diff --git a/dap-sdk/crypto/include/dap_hash.h b/dap-sdk/crypto/include/dap_hash.h
index 0f152542f8305978e755706e5a41bd7560ff4c8d..73b0c3a2869e0d07e8603766c0c678cbd453a7c5 100755
--- a/dap-sdk/crypto/include/dap_hash.h
+++ b/dap-sdk/crypto/include/dap_hash.h
@@ -93,6 +93,14 @@ static inline bool dap_hash_fast_compare(dap_hash_fast_t *a_hash1, dap_hash_fast
     return false;
 }
 
+/**
+ * @brief 
+ * compare hash with blank hash
+ * @param a_hash 
+ * @return true 
+ * @return false 
+ */
+
 static inline bool dap_hash_fast_is_blank( dap_hash_fast_t *a_hash )
 {
     static dap_hash_fast_t l_blank_hash = {};
diff --git a/dap-sdk/crypto/include/dap_pkey.h b/dap-sdk/crypto/include/dap_pkey.h
index 56805e565e327460c4dc7aaa1e29b0e82a55c427..93040b6a0617ccb2b2178826787c81ff27ac6c4e 100755
--- a/dap-sdk/crypto/include/dap_pkey.h
+++ b/dap-sdk/crypto/include/dap_pkey.h
@@ -37,9 +37,10 @@ enum dap_pkey_type_enum {
     PKEY_TYPE_MULTI = 0xffff ///  @brief Has inside subset of different keys
 
 };
+typedef uint16_t dap_pkey_type_enum_t;
 
 typedef union dap_pkey_type{
-    enum dap_pkey_type_enum type: 16;
+    dap_pkey_type_enum_t type;
     uint16_t raw;
 } dap_pkey_type_t;
 
diff --git a/dap-sdk/crypto/include/dap_sign.h b/dap-sdk/crypto/include/dap_sign.h
index 4018361a65e70323cda9cb9aca0a741a0ca4b53c..23d13c366641c28d3f6f0bae351bdc3f2c1a92b2 100755
--- a/dap-sdk/crypto/include/dap_sign.h
+++ b/dap-sdk/crypto/include/dap_sign.h
@@ -32,7 +32,7 @@
 #include "dap_hash.h"
 #include "dap_string.h"
 
-typedef enum {
+enum dap_sign_type_enum {
     SIG_TYPE_NULL = 0x0000,
     SIG_TYPE_BLISS = 0x0001,
     SIG_TYPE_DEFO = 0x0002, /// @brief key image for anonymous transaction
@@ -41,10 +41,11 @@ typedef enum {
     SIG_TYPE_DILITHIUM = 0x0102, /// @brief
     SIG_TYPE_MULTI_CHAINED = 0x0f00, ///  @brief Has inside subset of different signatures and sign composed with all of them
     SIG_TYPE_MULTI_COMBINED = 0x0f01 ///  @brief Has inside subset of different public keys and sign composed with all of appropriate private keys
-} dap_sign_type_enum_t;
+};
+typedef uint32_t dap_sign_type_enum_t;
 
 typedef union dap_sign_type {
-    dap_sign_type_enum_t type: 32;
+    dap_sign_type_enum_t type;
     uint32_t raw;
 } DAP_ALIGN_PACKED dap_sign_type_t;
 
diff --git a/dap-sdk/crypto/src/dap_enc_dilithium.c b/dap-sdk/crypto/src/dap_enc_dilithium.c
index bf6ddd748c24db928c2f96e2a2eb4e8e059c5dd7..bf35a074976241b0fa7add50ee1eae2f9d3b4f7f 100755
--- a/dap-sdk/crypto/src/dap_enc_dilithium.c
+++ b/dap-sdk/crypto/src/dap_enc_dilithium.c
@@ -88,7 +88,7 @@ size_t dap_enc_sig_dilithium_verify_sign(struct dap_enc_key * key, const void *
     if( l_ret != 0)
         log_it(L_WARNING,"Wrong signature, can't open with code %d", l_ret);
 
-    return l_ret>0? l_ret : 0;
+    return l_ret < 0 ? l_ret : 0;
 }
 
 void dap_enc_sig_dilithium_key_delete(struct dap_enc_key * key)
diff --git a/dap-sdk/crypto/src/dap_enc_tesla.c b/dap-sdk/crypto/src/dap_enc_tesla.c
index a67cb0618fe84f26f2ebc8c86304d56a8e6b1057..54e40d2e09639b0d264d6fee6e38040453170db6 100755
--- a/dap-sdk/crypto/src/dap_enc_tesla.c
+++ b/dap-sdk/crypto/src/dap_enc_tesla.c
@@ -94,7 +94,7 @@ size_t dap_enc_sig_tesla_verify_sign(struct dap_enc_key * key, const void * msg,
 {
     if(signature_size < sizeof(tesla_signature_t)) {
         log_it(L_ERROR, "bad signature size");
-        return 0;
+        return -6;
     }
 
     return (tesla_crypto_sign_open((tesla_signature_t *) signature, (unsigned char *) msg, msg_size, key->pub_key_data));
diff --git a/dap-sdk/crypto/src/dap_pkey.c b/dap-sdk/crypto/src/dap_pkey.c
index 4a62c3820887fc8789e959f59a57c8ee436f1bf2..a8a40a9ecbce9576cad556911291cc4965543abe 100755
--- a/dap-sdk/crypto/src/dap_pkey.c
+++ b/dap-sdk/crypto/src/dap_pkey.c
@@ -30,9 +30,10 @@
 
 
 /**
- * @brief dap_pkey_from_enc_key
- * @param a_key
- * @return
+ * @brief 
+ * convert encryption key to public key
+ * @param a_key dap_enc_key_t encryption key
+ * @return dap_pkey_t* 
  */
 dap_pkey_t* dap_pkey_from_enc_key(dap_enc_key_t *a_key)
 {
@@ -51,9 +52,10 @@ dap_pkey_t* dap_pkey_from_enc_key(dap_enc_key_t *a_key)
 
 /**
  * @brief dap_pkey_from_enc_key_output
- * @param a_key
- * @param a_output
- * @return
+ * convert encryption key to public key and placed it in output buffer
+ * @param a_key dap_enc_key_t encryption key object
+ * @param a_output output data
+ * @return result
  */
 int dap_pkey_from_enc_key_output(dap_enc_key_t *a_key, void * a_output)
 {
diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c
index 2582d4b1c3a29452a9c377a8c96ef986ae510074..7c64420b0b4202cb9cbf8d8a7a5a3e0332b0667b 100755
--- a/dap-sdk/crypto/src/dap_sign.c
+++ b/dap-sdk/crypto/src/dap_sign.c
@@ -410,7 +410,7 @@ int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t
         case DAP_ENC_KEY_TYPE_SIG_TESLA:
         case DAP_ENC_KEY_TYPE_SIG_PICNIC:
         case DAP_ENC_KEY_TYPE_SIG_DILITHIUM:
-            if(l_key->dec_na(l_key, a_data, a_data_size, l_sign_data, l_sign_data_size) > 0)
+            if(l_key->dec_na(l_key, a_data, a_data_size, l_sign_data, l_sign_data_size) < 0)
                 l_ret = 0;
             else
                 l_ret = 1;
diff --git a/dap-sdk/crypto/test/CMakeLists.txt b/dap-sdk/crypto/test/CMakeLists.txt
index fe129624464d805d51780fd653889e6425e914f9..725414756091afb244a9dbd1388c033f7a485628 100755
--- a/dap-sdk/crypto/test/CMakeLists.txt
+++ b/dap-sdk/crypto/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project(test)
 
 set(CMAKE_C_STANDARD 11)
diff --git a/dap-sdk/crypto/test/crypto/CMakeLists.txt b/dap-sdk/crypto/test/crypto/CMakeLists.txt
index cc132aa8dd3e4a68b24946930966c1bd3aa5de94..ef6afe9d0c1c79ae3e28bd09486a1975e0631996 100755
--- a/dap-sdk/crypto/test/crypto/CMakeLists.txt
+++ b/dap-sdk/crypto/test/crypto/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 project(crypto-test)
 # init CellFrame SDK
@@ -7,20 +7,22 @@ set(SUBMODULES_NO_BUILD ON)
 include (cellframe-sdk/cmake/OS_Detection.cmake)
 set(DAPSDK_MODULES "core crypto network-core network-client network-server")
 
-if( DARWIN)
-    add_subdirectory(cellframe-sdk/3rdparty/json-c-darwin)
-    add_subdirectory(cellframe-sdk/3rdparty/libmagic-darwin)
-    include_directories(cellframe-sdk/3rdparty/json-c-darwin)
-endif()
-if (ANDROID)
-    add_subdirectory(cellframe-sdk/3rdparty/libmagic)
-    add_subdirectory(cellframe-sdk/3rdparty/json-c)
-    include_directories(cellframe-sdk/cellframe-sdk/3rdparty/)
-endif()
+# There is no need, as it was added in cellframe-sdk/CMakeLists.txt
+
+#if( DARWIN)
+#    add_subdirectory(cellframe-sdk/3rdparty/json-c-darwin)
+#    add_subdirectory(cellframe-sdk/3rdparty/libmagic-darwin)
+#    include_directories(cellframe-sdk/3rdparty/json-c-darwin)
+#endif()
+#if (ANDROID)
+#    add_subdirectory(cellframe-sdk/3rdparty/libmagic)
+#    add_subdirectory(cellframe-sdk/3rdparty/json-c)
+#    include_directories(cellframe-sdk/cellframe-sdk/3rdparty/)
+#endif()
 
 #add_subdirectory(cellframe-sdk/dap-sdk)
 #enable_testing()
-add_subdirectory(test)
+#add_subdirectory(test)
 
 
 if ( NOT ( TARGET dap_core ) )
diff --git a/dap-sdk/crypto/test/crypto/dap_enc_ringct20_test.c b/dap-sdk/crypto/test/crypto/dap_enc_ringct20_test.c
index 6ee4936839b488158c4c1e35ea686fb8aab516cb..baa0e819b69b5b7ac34dab2c11ba9349e8210be7 100644
--- a/dap-sdk/crypto/test/crypto/dap_enc_ringct20_test.c
+++ b/dap-sdk/crypto/test/crypto/dap_enc_ringct20_test.c
@@ -3,6 +3,404 @@
 #include "ringct20/ringct20_params.h"
 #include "rand/dap_rand.h"
 
+#define MSIZE 2
+#define WSIZE 3
+#define NSIZE 3
+
+// From original implementation https://github.com/chainchip/Lattice-RingCT-v2.0/blob/master/Ring2.0/ring_test.c
+
+void LRCT_Byte_Test()
+{
+    poly_ringct20 a, ra;
+    uint8_t seed[NEWHOPE_RINGCT20_SYMBYTES] = { 0 };
+    unsigned char bCof[NEWHOPE_RINGCT20_POLYBYTES] = { 0 };
+    randombytes(seed, NEWHOPE_RINGCT20_SYMBYTES);
+    poly_uniform_ringct20(&a, seed);
+//    printf("begin:\n");
+//    poly_print(&a);
+//    printf("serial:\n");
+    poly_serial(&a);
+//    poly_print(&a);
+    poly_tobytes(bCof, &a);
+//    printf("ra:\n");
+    poly_frombytes(&ra, bCof);
+//    poly_print(&ra);
+
+
+}
+
+void LRCT_Setup_Test()
+{
+    poly_ringct20 A[2], H[2];
+    poly_ringct20 S[2];
+    poly_ringct20 L[2];
+    poly_ringct20 h;
+    poly_ringct20 u[3];
+    poly_ringct20 c1;
+    poly_ringct20* t[2];
+    unsigned char msg[2] = { 0x01, 0x02 };
+    unsigned char msg2[2] = { 0x02, 0x03 };
+    int msgLen = 2;
+    unsigned char bt[NEWHOPE_RINGCT20_POLYBYTES] = { 0 };
+    size_t mLen = 2;
+    size_t i = 0;
+    size_t k = 0;
+    int result = 0;
+    int w = 2;
+    int pai = 1;
+
+    t[0] = (poly_ringct20 *)malloc((3) * sizeof(poly_ringct20));
+    t[1] = (poly_ringct20 *)malloc((3) * sizeof(poly_ringct20));
+
+    for (i = 0; i < 2; i++)
+    {
+        for (k = 0; k < 3; k++)
+        {
+            poly_init(t[i] + k);
+        }
+
+    }
+    LRCT_Setup(A, H, 2);
+    LRCT_SampleKey(S, 2);
+    LRCT_KeyGen(L, A, S, 2);
+    LRCT_SampleKey(S, 2);
+    LRCT_KeyGen(L+1, A, S, 2);
+
+    for (k = 0; k < 3; k++)
+    {
+        randombytes(bt, NEWHOPE_RINGCT20_POLYBYTES);
+        poly_frombytes(u + k, bt);
+        poly_serial(u + k);
+        ///poly_print(u+k);
+    }
+//    printf("====================================\n");
+    LRCT_SigGen(&c1, t, &h, A, H,S, u, mLen, L, w,pai, msg, msgLen);
+//    printf("c1\n");
+//    poly_print(&c1);
+//    printf("=================\n");
+    result = LRCT_SigVer(&c1, t, A, H, mLen, &h, L,w, msg, msgLen);
+    dap_assert_PIF(result == 1, "Sign Verify");
+    result = LRCT_SigVer(&c1, t, A, H, mLen, &h, L, w, msg2, msgLen);
+    dap_assert_PIF(result != 1, "Sign Verify");
+    free(t[0]);
+    free(t[1]);
+
+}
+
+void MIMO_LRCT_Setup_Test()
+{
+    poly_ringct20 A[MSIZE], H[MSIZE];
+    poly_ringct20 SList[MSIZE*NSIZE];
+    poly_ringct20 S[MSIZE];
+    poly_ringct20 LList[NSIZE*WSIZE];
+    poly_ringct20 hList[NSIZE];
+    poly_ringct20 c1;
+    poly_ringct20 tList[NSIZE*WSIZE*(MSIZE+1)];
+    int i, j, k;
+    int pai = 2;
+    unsigned char msg[2] = { 0x01, 0x02 };
+    unsigned char msg2[2] = { 0x01, 0x03 };
+    int msgLen = 2;
+    int result = 0;
+    MIMO_LRCT_Setup(A, H, MSIZE);
+    for ( i = 0; i < NSIZE; i++)
+    {
+        LRCT_SampleKey(SList + i*MSIZE, MSIZE);
+        MIMO_LRCT_KeyGen(LList + i*WSIZE + (pai-1) , A, SList + i * MSIZE, MSIZE);
+    }
+    for ( i = 0; i < WSIZE; i++)
+    {
+        if (i != pai-1)
+        {
+            for (j = 0; j < NSIZE; j++)
+            {
+                LRCT_SampleKey(S, MSIZE);
+                MIMO_LRCT_KeyGen(LList + j* WSIZE + i, A, S, MSIZE);
+            }
+        }
+
+    }
+    MIMO_LRCT_SigGen(&c1, tList, hList, SList, NSIZE, A, H, MSIZE, LList, WSIZE, pai, msg, msgLen);
+    result = MIMO_LRCT_SigVer(&c1, tList, hList, NSIZE, A, /*H,*/ MSIZE, LList, WSIZE, msg, msgLen);
+    dap_assert_PIF(result == 1, "Sign verify");
+    result = MIMO_LRCT_SigVer(&c1, tList, hList, NSIZE, A, /*H,*/ MSIZE, LList, WSIZE, msg2, msgLen);
+    dap_assert_PIF(result != 1, "Sign verify");
+}
+
+void LRCT_Spent_Test()
+{
+    poly_ringct20 A[MSIZE], H[MSIZE];
+    poly_ringct20 skPai[MSIZE], pkPai;
+    poly_ringct20 ckPai[MSIZE];
+    poly_ringct20* t[WSIZE];
+    unsigned char bMessage[4] = { 0x01, 0x02, 0x03, 0x4 };
+    size_t msglen = 4;
+    IW iw;
+    //////////////////
+    poly_ringct20 skOA[MSIZE];
+    poly_ringct20 pkOA;
+    IW iwOA;
+    poly_ringct20 ckOA[MSIZE];
+    ////////////////////
+    IW iwList[WSIZE];
+    poly_ringct20 skTmp[MSIZE];
+    poly_ringct20 pkList[WSIZE];
+    poly_ringct20 ckList[WSIZE][MSIZE];
+    unsigned char bListMessage[2] = { 0x01, 0x02};
+    size_t msgListlen = 2;
+    int i = 0;
+    ///////////////////
+    poly_ringct20 L[WSIZE];
+    int paiIndex = 1;
+    poly_ringct20 c1, h;
+    unsigned char bSignMessage[3] = { 0x01, 0x02, 0x03 };
+    size_t msgSignlen = 3;
+    int result =0;
+    size_t k = 0;
+    /////////////////
+    for ( i = 0; i < WSIZE; i++)
+    {
+        t[i] = (poly_ringct20 *)malloc((MSIZE+1) * sizeof(poly_ringct20));
+        for (k = 0; k < MSIZE+1; k++)
+        {
+            poly_init(t[i] + k);
+        }
+    }
+    ///////////////////
+    LRCT_Setup(A, H, MSIZE);
+    LRCT_SampleKey(skPai, MSIZE);
+    LRCT_KeyGen(&pkPai, A, skPai, MSIZE);//A*S+0
+    LRCT_Mint(&iw, ckPai, &pkPai, A, MSIZE, bMessage, msglen);//A*ck + $
+    ///
+    LRCT_SampleKey(skOA, MSIZE);
+    LRCT_KeyGen(&pkOA, A, skOA, MSIZE);//
+    //LRCT_Mint(&iwOA, ckOA, &pkOA, A, MSIZE, bMessage, msglen);
+    //////
+    for( i = 0; i < WSIZE; i++)
+    {
+        if (i == paiIndex)
+        {
+            poly_cofcopy(&iwList[i].a, &iw.a);
+            poly_cofcopy(&iwList[i].cn, &iw.cn);
+        }
+        else
+        {
+            LRCT_SampleKey(skTmp, MSIZE);
+            LRCT_KeyGen(pkList + i, A, skTmp, MSIZE);//A*S+0
+            LRCT_Mint(iwList + i, ckList[i], pkList + i, A, MSIZE, bListMessage, msgListlen);
+        }
+
+    }
+    LRCT_Spend(&iwOA, ckOA, &c1, t, &h, L, bSignMessage, msgSignlen, iwList, WSIZE, paiIndex, skPai, ckPai, bMessage, msglen, &pkOA, A, H, MSIZE);
+    result = LRCT_Verify(&c1, t, &h, A, H, MSIZE, bSignMessage, msgSignlen, L, WSIZE);
+    dap_assert_PIF(result == 1, "Sign Verify");
+    for (i = 0; i < WSIZE; i++)
+    {
+        free(t[i]);
+    }
+}
+
+
+void LRCT_Mul_Test()
+{
+    poly_ringct20 A[2], H[2], H2[2];
+    poly_ringct20 h,h1,r;
+    poly_ringct20 S[2];
+    LRCT_Setup(A, H, 2);
+    LRCT_SampleKey(S, 2);
+
+    LRCT_MatrixMulPoly(&h, H, S, 2);
+
+
+    for (size_t i = 0; i < NEWHOPE_RINGCT20_N; i++)
+    {
+        h.coeffs[i] = coeff_freeze2Q(NEWHOPE_RINGCT20_2Q + NEWHOPE_RINGCT20_Q - h.coeffs[i] * 2);
+    }
+    LRCT_ConstMulMatrix(H2, H, 2, 2);
+    LRCT_MatrixMulPoly(&h1, H2, S, 2);
+    poly_add_ringct20(&r, &h1, &h);
+//    poly_print(&r);
+
+
+}
+void LRCT_MatrixMulVect_Test()
+{
+    poly_ringct20 A[2], H[2];
+    LRCT_Setup(A, H, 2);
+    uint8_t bt[2] = { 0 };
+    bt[0] = 1;
+    bt[1] = 2;
+
+
+}
+void LRCT_Lift_Test()
+{
+    poly_ringct20 A[2], H[2], LA[3], H2[3];
+    poly_ringct20 h;
+    poly_ringct20 S[2];
+    LRCT_SampleKey(S, 2);
+    LRCT_Setup(A, H, 2);
+    LRCT_MatrixMulPoly(&h, H, S, 2);
+    LRCT_Lift(LA, H, &h, 2);
+    ////////////////////////////////////
+    LRCT_ConstMulMatrix(H2, H, 2, 2);
+    for (size_t i = 0; i < NEWHOPE_RINGCT20_N; i++)
+    {
+        H2[2].coeffs[i] = coeff_freeze2Q(NEWHOPE_RINGCT20_2Q + NEWHOPE_RINGCT20_Q - h.coeffs[i] * 2);
+    }
+    for (size_t i = 0; i < 3; i++)
+    {
+        dap_assert_PIF(poly_equal(LA + i, H2 + i) == 1, "Poly equality");
+    }
+}
+void LRCT_KDF_Test()
+{
+
+}
+
+void LRCT_Com_Test()
+{
+    IW iw;
+    poly_ringct20 ck[2];
+    size_t mLen = 2;
+    poly_ringct20  A[2], H[2], sk[2];
+    unsigned char bMessage[4] = { 0x01, 0x02, 0x03, 0x4 };
+    size_t msglen = 4;
+    poly_ringct20 a;
+    LRCT_Setup(A, H, mLen);
+    LRCT_SampleKey(sk, mLen);
+    LRCT_KeyGen(&a, A, sk, mLen);
+//    printf("public key:");
+//    poly_print(&a);
+    LRCT_Mint(&iw, ck, &a, A, mLen, bMessage, msglen);
+//    printf("a:\n");
+//    poly_print(&(iw.a));
+//    printf("cn:\n");
+//    poly_print(&(iw.cn));
+}
+//ntt 变换测试
+void LRCT_Fun_Test()
+{
+    uint8_t seed[NEWHOPE_RINGCT20_SYMBYTES] = { 0 };
+    poly_ringct20 a;
+    randombytes(seed, NEWHOPE_RINGCT20_SYMBYTES);
+    poly_uniform_ringct20(&a, seed);
+    poly_serial(&a);
+    ////////////
+//    printf("begin:\n");
+//    poly_print(&a);
+    //////
+    poly_ntt_ringct20(&a);
+//    printf("after:\n");
+//    poly_print(&a);
+    ////
+    poly_invntt(&a);
+//    printf("recover:\n");
+//    poly_print(&a);
+
+}
+//移位测试
+void LRCT_Shift_Test()
+{
+    poly_ringct20 r, a;
+    poly_init(&r);
+    poly_init(&a);
+    r.coeffs[NEWHOPE_RINGCT20_N - 1] = 1;
+    r.coeffs[0] = 1;
+
+    poly_ntt_ringct20(&r);
+    poly_shift(&a, &r, 1);
+    poly_invntt(&a);
+
+    poly_serial(&a);
+//    poly_print(&a);
+}
+void LRCT_ComHom_Test()
+{
+    unsigned char message[2] = { 0xF0, 0x0F };
+    int messLen = 2;
+    int messBitLen = messLen*8;
+    int i = 0;
+    unsigned char bitTmp = 0;
+    poly_ringct20 *CKi = (poly_ringct20 *)malloc((MSIZE*(messBitLen)) * sizeof(poly_ringct20));
+    poly_ringct20 *comList = (poly_ringct20 *)malloc(((messBitLen)) * sizeof(poly_ringct20));
+    poly_ringct20  A[MSIZE], H[MSIZE], sk[MSIZE], ck0[MSIZE], tmpM[MSIZE];
+    poly_ringct20 a, r, tmp;
+
+    poly_init(&a);
+    poly_init(&tmp);
+    poly_init(&r);
+    for ( i = 0; i < MSIZE; i++)
+    {
+        poly_init(ck0 + i);
+    }
+    LRCT_Setup(A, H, MSIZE);
+    LRCT_SampleKey(sk, MSIZE);
+    //left
+    LRCT_nttCom(&r, A, sk, MSIZE, message, messLen);
+    //right
+    for (i = 1; i < messBitLen; i++)
+    {
+        LRCT_SampleKey(CKi + i*MSIZE, MSIZE);
+    }
+
+    LRCT_GetCK0(CKi, sk, MSIZE, CKi+MSIZE, messBitLen-1);
+
+    for ( i = 0; i < messBitLen; i++)
+    {
+        LRCT_MatrixShift(tmpM, CKi+i*MSIZE, MSIZE, i);
+        LRCT_MatrixAddMatrix(ck0, ck0, tmpM, MSIZE);
+    }
+    for ( i = 0; i < MSIZE; i++)
+    {
+        dap_assert_PIF(poly_equal(ck0 + i, sk + i) == 1, "poly equality")
+    }
+
+    for ( i = 0; i < messLen; i++)
+    {
+        bitTmp = (message[i] & 0x01);
+        LRCT_nttCom(comList + i * 8, A, CKi + (i * 8) * MSIZE, MSIZE, &bitTmp, 1);
+        //////////////////////////////
+        bitTmp = (message[i] & 0x02)>>1;
+        LRCT_nttCom(comList + i * 8 + 1, A, CKi + (i * 8 + 1) * MSIZE, MSIZE, &bitTmp, 1);
+        ////////////
+        bitTmp = (message[i] & 0x04)>>2;
+        LRCT_nttCom(comList + i * 8 + 2, A, CKi + (i * 8 + 2) * MSIZE, MSIZE, &bitTmp, 1);
+        ////////////
+        bitTmp = (message[i] & 0x08)>>3;
+        LRCT_nttCom(comList + i * 8 + 3, A, CKi + (i * 8 + 3) * MSIZE, MSIZE, &bitTmp, 1);
+
+        ////////////
+        bitTmp = (message[i] & 0x10)>>4;
+        LRCT_nttCom(comList + i * 8 + 4, A, CKi + (i * 8 + 4) * MSIZE, MSIZE, &bitTmp, 1);
+
+        ////////////
+        bitTmp = (message[i] & 0x20)>>5;
+        LRCT_nttCom(comList + i * 8 + 5, A, CKi + (i * 8 + 5) * MSIZE, MSIZE, &bitTmp, 1);
+
+        ////////////
+        bitTmp = (message[i] & 0x40)>>6;
+        LRCT_nttCom(comList + i * 8 + 6, A, CKi + (i * 8 + 6) * MSIZE, MSIZE, &bitTmp, 1);
+
+        ////////////
+        bitTmp = (message[i] & 0x80)>>7;
+        LRCT_nttCom(comList + i * 8 + 7, A, CKi + (i * 8 + 7) * MSIZE, MSIZE, &bitTmp, 1);
+    }
+    //poly_cofcopy(&a, comList);
+    for ( i = 0; i < messBitLen; i++)
+    {
+        poly_shift(&tmp, comList + i, i);
+        poly_add_ringct20(&a, &a, &tmp);
+    }
+//    printf("a:\n");
+//    poly_print(&a);
+//    printf("r:\n");
+//    poly_print(&r);
+    dap_assert_PIF(poly_equal(&a, &r) == 1, "poly equality");
+    free(CKi);
+    free(comList);
+}
+
 
 static void test_signing_verifying2(void)
 {
@@ -14,6 +412,7 @@ static void test_signing_verifying2(void)
 
     randombytes(seed, seed_size);
 
+    // one keypair
     dap_enc_key_t* key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_SIG_RINGCT20, NULL, 0, seed, seed_size, 0);
 
     const int allpbknum = 100;
@@ -37,7 +436,8 @@ static void test_signing_verifying2(void)
     dap_assert_PIF(siglen > 0, "Signing message");
 
 //Extract aList//CRUTCH
-    uint8_t *sigdata = (uint8_t*)*(int*)(sig + 4);
+//    uint8_t *sigdata = (uint8_t*)*(int*)(sig + 4);
+    uint8_t *sigdata = (uint8_t*) ((ringct20_signature_t*) sig)->sig_data;
 //    for(int i = 0; i < 16; ++i)
 //        printf("%.2x ", sigdata[i]);
 //    printf(" = sig_extract\n"); fflush(stdout);
@@ -155,8 +555,44 @@ void dap_enc_ringct20_tests_run(const int times)
     dap_print_module_name("dap_enc_ringct20");
     init_test_case();
     char print_buf[512];
-    snprintf(print_buf, sizeof(print_buf), "Signing and verifying message %d time", times);
 
+    snprintf(print_buf, sizeof(print_buf), "Byte test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_Byte_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "Signing and verifying message SISO mode %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_Setup_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "Signing and verifying message MIMO mode %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(MIMO_LRCT_Setup_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "Spent test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_Spent_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "Mul test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_Mul_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "MatrixMulVect test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_MatrixMulVect_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "Lift test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_Lift_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "KDF test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_KDF_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "Com test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_Com_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "Fun test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_Fun_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "Shift test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_Shift_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "ComHom test %d time", times);
+    benchmark_mgs_time(print_buf, benchmark_test_time(LRCT_ComHom_Test, times));
+
+    snprintf(print_buf, sizeof(print_buf), "Signing and verifying message %d time", times);
     benchmark_mgs_time(print_buf, benchmark_test_time(test_signing_verifying2, times));
 
     cleanup_test_case();
diff --git a/dap-sdk/crypto/test/crypto/dap_enc_test.c b/dap-sdk/crypto/test/crypto/dap_enc_test.c
index 12e46f001591dbd6f92ece43288f513c7cc38da8..16ad86be882190c2a2391d626b9b3445321e9060 100755
--- a/dap-sdk/crypto/test/crypto/dap_enc_test.c
+++ b/dap-sdk/crypto/test/crypto/dap_enc_test.c
@@ -468,7 +468,7 @@ void dap_enc_tests_run() {
     dap_print_module_name("dap_enc_sig serealize->deserealize BLISS");
     test_serealize_deserealize_pub_priv(DAP_ENC_KEY_TYPE_SIG_BLISS);
     dap_print_module_name("dap_enc_sig serealize->deserealize PICNIC");
-    test_serealize_deserealize_pub_priv(DAP_ENC_KEY_TYPE_SIG_PICNIC);
+    test_serealize_deserealize_pub_priv(DAP_ENC_KEY_TYPE_SIG_PICNIC); //sometimes fail
     dap_print_module_name("dap_enc_sig serealize->deserealize TESLA");
     test_serealize_deserealize_pub_priv(DAP_ENC_KEY_TYPE_SIG_TESLA);
     dap_print_module_name("dap_enc_sig serealize->deserealize DILITHIUM");
diff --git a/dap-sdk/net/client/CMakeLists.txt b/dap-sdk/net/client/CMakeLists.txt
index 39185cc300f9dfda0ef43ae046d0adc278dbd018..4c1645ab84c8b52b1adb456dca7bc21175fba756 100644
--- a/dap-sdk/net/client/CMakeLists.txt
+++ b/dap-sdk/net/client/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project(dap_client)
 add_definitions ("-D_GNU_SOURCE")
 
diff --git a/dap-sdk/net/client/dap_client.c b/dap-sdk/net/client/dap_client.c
index d9d364beaf5d2bb1c498295604df628dcb1548f2..89d098685ebe254624151aa3682b8fed7db2578a 100644
--- a/dap-sdk/net/client/dap_client.c
+++ b/dap-sdk/net/client/dap_client.c
@@ -177,46 +177,6 @@ uint16_t dap_client_get_uplink_port_unsafe(dap_client_t * a_client)
     return DAP_CLIENT_PVT(a_client)->uplink_port;
 }
 
-/**
- * @brief dap_client_set_auth_cert
- * @param a_client
- * @param a_chain_net_name
- * @param a_option
- */
-void dap_client_set_auth_cert(dap_client_t *a_client, const char *a_chain_net_name)
-{
-    const char *l_auth_hash_str = NULL;
-
-    if(a_client == NULL || a_chain_net_name == NULL){
-        log_it(L_ERROR,"Chain-net is NULL for dap_client_set_auth_cert");
-        return;
-    }
-
-    char *l_path = dap_strdup_printf("network/%s", a_chain_net_name);
-    if (!l_path) {
-        log_it(L_ERROR, "Can't allocate memory: file: %s line: %d", __FILE__, __LINE__);
-        return;
-    }
-
-    dap_config_t *l_cfg = dap_config_open(l_path);
-    free(l_path);
-    if (!l_cfg) {
-        log_it(L_ERROR, "Can't allocate memory: file: %s line: %d", __FILE__, __LINE__);
-        return;
-    }
-
-    dap_cert_t *l_cert = dap_cert_find_by_name(dap_config_get_item_str(l_cfg, "general", "auth_cert"));
-    if (!l_cert) {
-        dap_config_close(l_cfg);
-        log_it(L_ERROR,"l_cert is NULL by dap_cert_find_by_name");
-        return;
-    }
-    dap_client_set_auth_cert_unsafe(a_client, l_cert);
-
-    //dap_cert_delete(l_cert);
-    dap_config_close(l_cfg);
-}
-
 void dap_client_set_auth_cert_unsafe(dap_client_t * a_client, dap_cert_t *a_cert)
 {
     if(a_client == NULL){
@@ -234,7 +194,7 @@ void dap_client_set_auth_cert_unsafe(dap_client_t * a_client, dap_cert_t *a_cert
 void dap_client_delete_unsafe(dap_client_t * a_client)
 {
     if ( DAP_CLIENT_PVT(a_client)->refs_count ==0 ){
-        dap_client_pvt_delete( DAP_CLIENT_PVT(a_client) );
+        dap_client_pvt_delete_unsafe( DAP_CLIENT_PVT(a_client) );
         pthread_mutex_destroy(&a_client->mutex);
         DAP_DEL_Z(a_client)
     } else
@@ -280,7 +240,7 @@ static void s_go_stage_on_client_worker_unsafe(dap_worker_t * a_worker,void * a_
     if (!l_client || l_client->_internal != l_client_pvt) {
         log_it(L_WARNING,"Client is NULL or corrupted, why? Refs %u", l_client_pvt->refs_count);
         if ( l_client_pvt->refs_count ==0 ){
-            dap_client_pvt_delete( l_client_pvt );
+            dap_client_pvt_delete_unsafe(l_client_pvt);
         } else
             l_client_pvt->is_to_delete = true;
         return;
diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c
index 1c722b920415e1274260b59c5b5190f384bf0069..4dc04661e783517de391d5560a68120cfebae637 100644
--- a/dap-sdk/net/client/dap_client_pvt.c
+++ b/dap-sdk/net/client/dap_client_pvt.c
@@ -79,7 +79,7 @@
 #define DAP_ENC_KS_KEY_ID_SIZE 33
 #endif
 
-static int s_max_attempts = 5;
+static int s_max_attempts = 3;
 static int s_timeout = 20;
 static bool s_debug_more = false;
 static time_t s_client_timeout_read_after_connect_seconds = 5;
@@ -124,10 +124,11 @@ static bool s_stream_timer_timeout_check(void * a_arg);
  */
 int dap_client_pvt_init()
 {
-    s_max_attempts = dap_config_get_item_int32_default(g_config,"dap_client","max_tries",5);
-    s_timeout = dap_config_get_item_int32_default(g_config,"dap_client","timeout",10);
-    s_debug_more = dap_config_get_item_bool_default(g_config,"dap_client","debug_more",false);
-    s_client_timeout_read_after_connect_seconds = (time_t) dap_config_get_item_uint32_default(g_config,"dap_client","timeout_read_after_connect",5);
+    s_max_attempts = dap_config_get_item_int32_default(g_config, "dap_client", "max_tries", s_max_attempts);
+    s_timeout = dap_config_get_item_int32_default(g_config, "dap_client", "timeout", s_timeout);
+    s_debug_more = dap_config_get_item_bool_default(g_config, "dap_client", "debug_more", false);
+    s_client_timeout_read_after_connect_seconds = (time_t) dap_config_get_item_uint32_default(g_config,
+                                                  "dap_client","timeout_read_after_connect", s_client_timeout_read_after_connect_seconds);
 
     return 0;
 }
@@ -161,10 +162,52 @@ void dap_client_pvt_new(dap_client_pvt_t * a_client_pvt)
 
 
 /**
- * @brief dap_client_pvt_delete
+ * @brief dap_client_set_auth_cert
+ * @param a_client
+ * @param a_chain_net_name
+ * @param a_option
+ */
+void dap_client_set_auth_cert(dap_client_t *a_client, const char *a_chain_net_name)
+{
+    const char *l_auth_hash_str = NULL;
+
+    if(a_client == NULL || a_chain_net_name == NULL){
+        log_it(L_ERROR,"Chain-net is NULL for dap_client_set_auth_cert");
+        return;
+    }
+
+    char *l_path = dap_strdup_printf("network/%s", a_chain_net_name);
+    if (!l_path) {
+        log_it(L_ERROR, "Can't allocate memory: file: %s line: %d", __FILE__, __LINE__);
+        return;
+    }
+
+    dap_config_t *l_cfg = dap_config_open(l_path);
+    free(l_path);
+    if (!l_cfg) {
+        log_it(L_ERROR, "Can't allocate memory: file: %s line: %d", __FILE__, __LINE__);
+        return;
+    }
+
+    dap_cert_t *l_cert = dap_cert_find_by_name(dap_config_get_item_str(l_cfg, "general", "auth_cert"));
+    if (!l_cert) {
+        dap_config_close(l_cfg);
+        log_it(L_ERROR,"l_cert is NULL by dap_cert_find_by_name");
+        return;
+    }
+    dap_client_set_auth_cert_unsafe(a_client, l_cert);
+
+    //dap_cert_delete(l_cert);
+    dap_config_close(l_cfg);
+}
+
+
+
+/**
+ * @brief dap_client_pvt_delete_unsafe
  * @param a_client_pvt
  */
-void dap_client_pvt_delete(dap_client_pvt_t * a_client_pvt)
+void dap_client_pvt_delete_unsafe(dap_client_pvt_t * a_client_pvt)
 {
     assert(a_client_pvt);
 
diff --git a/dap-sdk/net/client/include/dap_client.h b/dap-sdk/net/client/include/dap_client.h
index 0173b8cc673cb8db251c47f18b0bf3f78b308cb0..8457e838b7cfd55a0c0ca6eabdce765d5d20e815 100644
--- a/dap-sdk/net/client/include/dap_client.h
+++ b/dap-sdk/net/client/include/dap_client.h
@@ -139,7 +139,6 @@ dap_stream_ch_t * dap_client_get_stream_ch_unsafe(dap_client_t * a_client, uint8
 const char * dap_client_get_stream_id(dap_client_t * a_client);
 void dap_client_set_active_channels_unsafe (dap_client_t * a_client, const char * a_active_channels);
 void dap_client_set_auth_cert_unsafe(dap_client_t * a_client, dap_cert_t *a_cert);
-void dap_client_set_auth_cert(dap_client_t *a_client, const char *a_chain_net_name);
 
 dap_client_stage_t dap_client_get_stage(dap_client_t * a_client);
 dap_client_stage_status_t dap_client_get_stage_status(dap_client_t * a_client);
diff --git a/dap-sdk/net/client/include/dap_client_pvt.h b/dap-sdk/net/client/include/dap_client_pvt.h
index 5dc2f3f0e5e0514e06198bc365a7e9b8b65954ac..81af1d0618fc580d240688e23caef24267d39c4c 100644
--- a/dap-sdk/net/client/include/dap_client_pvt.h
+++ b/dap-sdk/net/client/include/dap_client_pvt.h
@@ -116,7 +116,7 @@ void dap_client_pvt_request_enc(dap_client_pvt_t * a_client_internal, const char
                                      dap_client_callback_int_t a_error_proc);
 
 void dap_client_pvt_new(dap_client_pvt_t * a_client_internal);
-void dap_client_pvt_delete(dap_client_pvt_t * a_client_pvt);
+void dap_client_pvt_delete_unsafe(dap_client_pvt_t * a_client_pvt);
 
 int dap_client_pvt_hh_add_unsafe(dap_client_pvt_t* a_client_pvt);
 int dap_client_pvt_hh_del_unsafe(dap_client_pvt_t *a_client_pvt);
diff --git a/dap-sdk/net/core/CMakeLists.txt b/dap-sdk/net/core/CMakeLists.txt
index 5ed51a7bfb0e11bfeeee142d2e78146cc2833d7a..ca3fe8666b0f24b9575ffa8e9454e9e720e8bcfd 100644
--- a/dap-sdk/net/core/CMakeLists.txt
+++ b/dap-sdk/net/core/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 project (dap_server_core C)
 set(CMAKE_C_STANDARD 11)
diff --git a/dap-sdk/net/core/dap_events.c b/dap-sdk/net/core/dap_events.c
index accb805fec84b4394ead6b5ee0aafeedf0b2ac5b..85637f01faeeab6a6db109ceb18869c5bddbc5c3 100644
--- a/dap-sdk/net/core/dap_events.c
+++ b/dap-sdk/net/core/dap_events.c
@@ -298,7 +298,7 @@ void dap_events_delete( dap_events_t *a_events )
 void dap_events_remove_and_delete_socket_unsafe(dap_events_t *a_events, dap_events_socket_t *a_socket, bool a_preserve_inheritor)
 {
     (void) a_events;
-    int l_sock = a_socket->socket;
+//    int l_sock = a_socket->socket;
 //    if( a_socket->type == DESCRIPTOR_TYPE_TIMER)
 //        log_it(L_DEBUG,"Remove timer %d", l_sock);
 
diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c
index 445ebd07c62fdc327a497d7e75ff86f8540c3451..ea25e2cf6f560de4ff2f17931302a26079ff1b9a 100644
--- a/dap-sdk/net/core/dap_events_socket.c
+++ b/dap-sdk/net/core/dap_events_socket.c
@@ -1791,11 +1791,10 @@ void dap_events_socket_remove_and_delete_unsafe( dap_events_socket_t *a_es, bool
     //log_it( L_DEBUG, "es is going to be removed from the lists and free the memory (0x%016X)", a_es );
     dap_events_socket_remove_from_worker_unsafe(a_es, a_es->worker);
 
-    //log_it( L_DEBUG, "dap_events_socket wrapped around %d socket is removed", a_es->socket );
-
     if( a_es->callbacks.delete_callback )
         a_es->callbacks.delete_callback( a_es, NULL ); // Init internal structure
 
+    //log_it( L_DEBUG, "dap_events_socket wrapped around %d socket is removed", a_es->socket );
     dap_events_socket_delete_unsafe(a_es, preserve_inheritor);
 
 }
diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c
index bdbccb4a76f3768e801786fdf9fde5d8bce1986e..792af686326c764b136b3fd0e88a86ab907bbb5c 100644
--- a/dap-sdk/net/core/dap_server.c
+++ b/dap-sdk/net/core/dap_server.c
@@ -292,7 +292,6 @@ static int s_server_run(dap_server_t * a_server, dap_events_socket_callbacks_t *
         l_callbacks.error_callback = a_callbacks->error_callback;
     }
 
-// if we have poll exclusive
 #ifdef DAP_EVENTS_CAPS_EPOLL
     for(size_t l_worker_id = 0; l_worker_id < dap_events_worker_get_count() ; l_worker_id++){
         dap_worker_t *l_w = dap_events_worker_get(l_worker_id);
@@ -305,6 +304,7 @@ static int s_server_run(dap_server_t * a_server, dap_events_socket_callbacks_t *
             // Prepare for multi thread listening
             l_es->ev_base_flags = EPOLLIN;
 #ifdef EPOLLEXCLUSIVE
+            // if we have poll exclusive
             l_es->ev_base_flags |= EPOLLET | EPOLLEXCLUSIVE;
 #endif
             l_es->_inheritor = a_server;
diff --git a/dap-sdk/net/core/dap_timerfd.c b/dap-sdk/net/core/dap_timerfd.c
index 9b6ff27f9b9b649e6ed4916de6fe73cbab6dffb8..044dca1e62f523d2a7a3aa9fef59f8fd45be9e4d 100644
--- a/dap-sdk/net/core/dap_timerfd.c
+++ b/dap-sdk/net/core/dap_timerfd.c
@@ -305,7 +305,8 @@ static void s_es_callback_timer(struct dap_events_socket *a_event_sock)
  * @param a_tfd
  * @param a_callback
  */
-void dap_timerfd_delete(dap_timerfd_t *l_timerfd)
+void dap_timerfd_delete(dap_timerfd_t *a_timerfd)
 {
-    dap_events_socket_remove_and_delete_mt(l_timerfd->events_socket->worker, l_timerfd->esocket_uuid);
+    if (a_timerfd->events_socket->worker)
+        dap_events_socket_remove_and_delete_mt(a_timerfd->events_socket->worker, a_timerfd->esocket_uuid);
 }
diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c
index 9ae994fabc1ae7c7d2c4fe53a9c6e8cc6643864d..68c7bcc6e95066191c91fa8b08303d54755c4da8 100644
--- a/dap-sdk/net/core/dap_worker.c
+++ b/dap-sdk/net/core/dap_worker.c
@@ -202,7 +202,6 @@ void *dap_worker_thread(void *arg)
 
         time_t l_cur_time = time( NULL);
         for(size_t n = 0; n < l_sockets_max; n++) {
-
             bool l_flag_hup, l_flag_rdhup, l_flag_read, l_flag_write, l_flag_error, l_flag_nval, l_flag_msg, l_flag_pri;
 #ifdef DAP_EVENTS_CAPS_EPOLL
             l_cur = (dap_events_socket_t *) l_epoll_events[n].data.ptr;
@@ -280,8 +279,8 @@ void *dap_worker_thread(void *arg)
 #else
 #error "Unimplemented fetch esocket after poll"
 #endif
-            if(!l_cur) {
-                log_it(L_ERROR, "dap_events_socket NULL");
+            if(!l_cur || (l_cur->worker && l_cur->worker != l_worker)) {
+                log_it(L_WARNING, "dap_events_socket was destroyed earlier");
                 continue;
             }
             if(s_debug_reactor) {
@@ -356,7 +355,8 @@ void *dap_worker_thread(void *arg)
                 dap_events_socket_set_readable_unsafe(l_cur, false);
                 dap_events_socket_set_writable_unsafe(l_cur, false);
                 l_cur->buf_out_size = 0;
-                l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+                if (!l_cur->no_close)
+                    l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
                 if(l_cur->callbacks.error_callback)
                     l_cur->callbacks.error_callback(l_cur, l_sock_err); // Call callback to process error event
             }
@@ -527,7 +527,8 @@ void *dap_worker_thread(void *arg)
                             log_it(L_ERROR, "Some error occured in recv() function: %s", strerror(errno));
 #endif
                             dap_events_socket_set_readable_unsafe(l_cur, false);
-                            l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+                            if (!l_cur->no_close)
+                                l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
                             l_cur->buf_out_size = 0;
                         }
 #ifndef DAP_NET_CLIENT_NO_SSL
@@ -536,7 +537,8 @@ void *dap_worker_thread(void *arg)
                             wolfSSL_ERR_error_string(l_errno, l_err_str);
                             log_it(L_ERROR, "Some error occured in SSL read(): %s (code %d)", l_err_str, l_errno);
                             dap_events_socket_set_readable_unsafe(l_cur, false);
-                            l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+                            if (!l_cur->no_close)
+                                l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
                             l_cur->buf_out_size = 0;
                         }
 #endif
@@ -654,7 +656,7 @@ void *dap_worker_thread(void *arg)
                             l_bytes_sent = send(l_cur->socket, (const char *)l_cur->buf_out,
                                                 l_cur->buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL);
 #ifdef DAP_OS_WINDOWS
-							dap_events_socket_set_writable_unsafe(l_cur,false);
+                            //dap_events_socket_set_writable_unsafe(l_cur,false); // enabling this will break windows server replies
 							l_errno = WSAGetLastError();
 #else
 							l_errno = errno;
@@ -752,7 +754,7 @@ void *dap_worker_thread(void *arg)
                         break;
                         case DESCRIPTOR_TYPE_PIPE:
                         case DESCRIPTOR_TYPE_FILE:
-                            l_bytes_sent = write(l_cur->socket, (char *) (l_cur->buf_out), l_cur->buf_out_size );
+                            l_bytes_sent = write(l_cur->fd, (char *) (l_cur->buf_out), l_cur->buf_out_size );
                             l_errno = errno;
                         break;
                         default:
@@ -769,7 +771,8 @@ void *dap_worker_thread(void *arg)
                         { // If we have non-blocking socket
                             log_it(L_ERROR, "Some error occured in send(): %s (code %d)", strerror(l_errno), l_errno);
 #endif
-                            l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+                            if (!l_cur->no_close)
+                                l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
                             l_cur->buf_out_size = 0;
                         }
 #ifndef DAP_NET_CLIENT_NO_SSL
@@ -777,7 +780,8 @@ void *dap_worker_thread(void *arg)
                             char l_err_str[80];
                             wolfSSL_ERR_error_string(l_errno, l_err_str);
                             log_it(L_ERROR, "Some error occured in SSL write(): %s (code %d)", l_err_str, l_errno);
-                            l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
+                            if (!l_cur->no_close)
+                                l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
                             l_cur->buf_out_size = 0;
                         }
 #endif
@@ -801,7 +805,7 @@ void *dap_worker_thread(void *arg)
                 dap_events_socket_set_writable_unsafe(l_cur,true);
             }
 
-            if ((l_cur->flags & DAP_SOCK_SIGNAL_CLOSE) && !l_cur->no_close)
+            if (l_cur->flags & DAP_SOCK_SIGNAL_CLOSE)
             {
                 if (l_cur->buf_out_size == 0) {
                     if(s_debug_reactor)
diff --git a/dap-sdk/net/server/CMakeLists.txt b/dap-sdk/net/server/CMakeLists.txt
index d2023893c59c26ed300b4f149efd06f0974cd9a4..2ad3a1a3f50afb0ce56181094e0348a0aa290fef 100644
--- a/dap-sdk/net/server/CMakeLists.txt
+++ b/dap-sdk/net/server/CMakeLists.txt
@@ -1,5 +1,5 @@
 project(libdap-server C)
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 add_subdirectory(notify_server)
 add_subdirectory(http_server)
diff --git a/dap-sdk/net/server/enc_server/CMakeLists.txt b/dap-sdk/net/server/enc_server/CMakeLists.txt
index 3191a15d5e3f4cbdea8c2eaee44546fc416994ab..4f95407a85ec0b43c836ac9f5da15bb12ae3fe64 100644
--- a/dap-sdk/net/server/enc_server/CMakeLists.txt
+++ b/dap-sdk/net/server/enc_server/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project(dap_enc_server C)
   
 file(GLOB DAP_ENC_SERVER_SRCS FILES *.c)
diff --git a/dap-sdk/net/server/http_server/CMakeLists.txt b/dap-sdk/net/server/http_server/CMakeLists.txt
index 656f8e66cfd03d9b5b471a7847b230ee44bfb7e7..16daa91a058b15877759d622e6f370b07616d6d2 100644
--- a/dap-sdk/net/server/http_server/CMakeLists.txt
+++ b/dap-sdk/net/server/http_server/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_http_server C)
 
 include_directories(http_client/include)
diff --git a/dap-sdk/net/server/http_server/http_client/CMakeLists.txt b/dap-sdk/net/server/http_server/http_client/CMakeLists.txt
index b3633d72034eddd642958862c19b0c10d4bcd206..ed8a4b76399e4a95785c854234229703776398ee 100644
--- a/dap-sdk/net/server/http_server/http_client/CMakeLists.txt
+++ b/dap-sdk/net/server/http_server/http_client/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_http_client)
 
 set(HTTP_SRCS FILES *.c)
diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_client.c b/dap-sdk/net/server/http_server/http_client/dap_http_client.c
index 2a5597c09d8f2628d2c7ffc6b231126f8e64a822..b9c0f0ff39bc9f12a4b09d8c5bda6d3cc0009bfe 100644
--- a/dap-sdk/net/server/http_server/http_client/dap_http_client.c
+++ b/dap-sdk/net/server/http_server/http_client/dap_http_client.c
@@ -645,7 +645,7 @@ void dap_http_client_out_header_generate(dap_http_client_t *a_http_client)
         }
         if ( a_http_client->out_content_type[0] ) {
             dap_http_header_add(&a_http_client->out_headers,"Content-Type",a_http_client->out_content_type);
-            log_it(L_DEBUG,"output: Content-Type = '%s'",a_http_client->out_content_type);
+            log_it(L_DEBUG,"Output: Content-Type = '%s'",a_http_client->out_content_type);
         }
         if ( a_http_client->out_content_length ) {
             dap_snprintf(buf,sizeof(buf),"%zu",a_http_client->out_content_length);
diff --git a/dap-sdk/net/server/json_rpc/CMakeLists.txt b/dap-sdk/net/server/json_rpc/CMakeLists.txt
index 08c7ec1ec22fc6f62854945635c00c2a74c9370f..30207dcaa5881382df12e9c164e4bea61e7d0771 100644
--- a/dap-sdk/net/server/json_rpc/CMakeLists.txt
+++ b/dap-sdk/net/server/json_rpc/CMakeLists.txt
@@ -1,5 +1,5 @@
 project(dap_json_rpc C)
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 add_definitions ("-D_GNU_SOURCE")
 add_definitions("-Dfpic")
diff --git a/dap-sdk/net/server/notify_server/CMakeLists.txt b/dap-sdk/net/server/notify_server/CMakeLists.txt
index c2e03f922786cfb86f5bde0721c090501ecd9e77..8390370099ff6c10b1d12bf7be69d16e16f23d3c 100644
--- a/dap-sdk/net/server/notify_server/CMakeLists.txt
+++ b/dap-sdk/net/server/notify_server/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project(dap_notify_srv C)
   
 file(GLOB DAP_NOTIFY_SRV_SRCS FILES src/*.c)
diff --git a/dap-sdk/net/server/test/CMakeLists.txt b/dap-sdk/net/server/test/CMakeLists.txt
index 54660c94ba0d8a450c5c9444a4242954736979bf..ac1dab4e7dd873bf8662f825bb29dda39022b7ed 100644
--- a/dap-sdk/net/server/test/CMakeLists.txt
+++ b/dap-sdk/net/server/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project(test)
 
 set(CMAKE_C_STANDARD 11)
diff --git a/dap-sdk/net/server/test/enc_server/CMakeLists.txt b/dap-sdk/net/server/test/enc_server/CMakeLists.txt
index 3fd0ab3c3e42ca9e767325b08b0b782648f20b46..2d4df9c5f8087be29cc5c877f22775ea2ac7b303 100644
--- a/dap-sdk/net/server/test/enc_server/CMakeLists.txt
+++ b/dap-sdk/net/server/test/enc_server/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 project(enc_server_test)
 
diff --git a/dap-sdk/net/server/test/http_server/CMakeLists.txt b/dap-sdk/net/server/test/http_server/CMakeLists.txt
index 82d08553ab850ce038e95606af9a5d61d9bb7a85..df544336d79148e82a7d817eee4e34c256153022 100644
--- a/dap-sdk/net/server/test/http_server/CMakeLists.txt
+++ b/dap-sdk/net/server/test/http_server/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 project(http_server_test)
 
diff --git a/dap-sdk/net/stream/CMakeLists.txt b/dap-sdk/net/stream/CMakeLists.txt
index 87d7d736450b46cba9d91e5d5d05abb88cb4fdee..22df0e497b903e8e991ae897ca3cc48103d508e5 100644
--- a/dap-sdk/net/stream/CMakeLists.txt
+++ b/dap-sdk/net/stream/CMakeLists.txt
@@ -1,5 +1,5 @@
 project(libdap-stream C)
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 add_subdirectory(session)
 add_subdirectory(stream)
diff --git a/dap-sdk/net/stream/ch/CMakeLists.txt b/dap-sdk/net/stream/ch/CMakeLists.txt
index e3b535b8d1fbcabebff12e47f44e844e571afc5e..056a3cdd62dbda62f4748f41b493336157fd34f8 100644
--- a/dap-sdk/net/stream/ch/CMakeLists.txt
+++ b/dap-sdk/net/stream/ch/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_stream_ch)
   
 file(GLOB DAP_STREAM_CH_SRCS *.c)
diff --git a/dap-sdk/net/stream/session/CMakeLists.txt b/dap-sdk/net/stream/session/CMakeLists.txt
index 2e294300da2e7b203c1403803eef390997cef1e8..15dac099b8e1c26f913f984343757ec3f9143b86 100644
--- a/dap-sdk/net/stream/session/CMakeLists.txt
+++ b/dap-sdk/net/stream/session/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_session)
   
 file(GLOB SESSION_SRCS *.c)
diff --git a/dap-sdk/net/stream/stream/CMakeLists.txt b/dap-sdk/net/stream/stream/CMakeLists.txt
index 264d313f849dffb88781867be56710f669e8ba39..16fb98fc4e6b8f0e6e25053a63756b6cd19b418b 100755
--- a/dap-sdk/net/stream/stream/CMakeLists.txt
+++ b/dap-sdk/net/stream/stream/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_stream)
   
 file(GLOB STREAM_SRCS *.c)
diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c
index 9a33b5f97471092db8804bb33eec318f84927f9a..689c203b0a738d81c94a06ae416ab47204e14d22 100644
--- a/dap-sdk/net/stream/stream/dap_stream.c
+++ b/dap-sdk/net/stream/stream/dap_stream.c
@@ -820,7 +820,7 @@ static void s_stream_proc_pkt_in(dap_stream_t * a_stream)
         memcpy(l_ret_pkt.sig, c_dap_stream_sig, sizeof(l_ret_pkt.sig));
         dap_events_socket_write_unsafe(a_stream->esocket, &l_ret_pkt, sizeof(l_ret_pkt));
         // Reset client keepalive timer
-        if (a_stream->keepalive_timer) {
+        if (a_stream->keepalive_timer && a_stream->keepalive_timer->events_socket->worker) {
             void *l_arg = a_stream->keepalive_timer->callback_arg;
             dap_timerfd_delete(a_stream->keepalive_timer);
             a_stream->keepalive_timer = dap_timerfd_start_on_worker(a_stream->stream_worker->worker,
diff --git a/dap-sdk/net/stream/stream/dap_stream_pkt.c b/dap-sdk/net/stream/stream/dap_stream_pkt.c
index d0b5efa8aafe23f248c1bdf10bdee81ef9cedffb..38d14061d3e072b87f5908a7f0596b20f4b059f1 100644
--- a/dap-sdk/net/stream/stream/dap_stream_pkt.c
+++ b/dap-sdk/net/stream/stream/dap_stream_pkt.c
@@ -76,7 +76,7 @@ dap_stream_pkt_t * dap_stream_pkt_detect(void * a_data, size_t data_size)
         if(memcmp(sig_start,c_dap_stream_sig,sizeof(c_dap_stream_sig))==0){
             ret = (dap_stream_pkt_t *)sig_start;
             if (length_left < sizeof(dap_stream_ch_pkt_hdr_t)) {
-                log_it(L_ERROR, "Too small packet size %zu", length_left);
+                //log_it(L_ERROR, "Too small packet size %zu", length_left); // it's not an error, just random case
                 ret = NULL;
                 break;
             }
diff --git a/modules/app-cli/CMakeLists.txt b/modules/app-cli/CMakeLists.txt
index 1e8f2c8be518be56301457cab24adfb726fea8e7..26a2deb1bd0440d63b7993d176f644a4d7478fe6 100644
--- a/modules/app-cli/CMakeLists.txt
+++ b/modules/app-cli/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_app_cli)
 
 file(GLOB DAP_APP_CLI_SRCS *.c)
diff --git a/modules/chain/CMakeLists.txt b/modules/chain/CMakeLists.txt
index fc43ed57b2c79b37f3089e46a481d739373c15c3..e6071d1e9ead2ab3f78edf0ac8756c90b1c4fdce 100644
--- a/modules/chain/CMakeLists.txt
+++ b/modules/chain/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain)
   
 file(GLOB DAP_CHAIN_SRCS *.c)
diff --git a/modules/chain/btc_rpc/CMakeLists.txt b/modules/chain/btc_rpc/CMakeLists.txt
index 9e9ded64a179d2bda42ee9430c581d9fc0fc3ce0..930181f7283cee04960465242c2c5448d8ee00b7 100644
--- a/modules/chain/btc_rpc/CMakeLists.txt
+++ b/modules/chain/btc_rpc/CMakeLists.txt
@@ -1,5 +1,5 @@
 project(dap_chain_btc_rpc C)
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 
 add_definitions ("-D_GNU_SOURCE")
 add_definitions("-Dfpic")
diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index c118458f8a59b37f6c30fd7fc04dca6443d8a6ae..6a979e113ae7617d00918448d84390a8731c7c17 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -209,11 +209,17 @@ void dap_chain_delete(dap_chain_t * a_chain)
  * @param a_atom_size
  * @return
  */
-dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size, dap_chain_cell_id_t a_cell_id)
+dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size)
 {
-    dap_chain_atom_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain, a_cell_id);
-    dap_chain_atom_ptr_t l_ret = a_chain->callback_atom_find_by_hash(l_iter, a_atom_hash, a_atom_size);
-    a_chain->callback_atom_iter_delete(l_iter);
+    dap_chain_atom_ptr_t l_ret = NULL;
+    dap_chain_cell_t *l_cell, *l_iter_tmp;
+    HASH_ITER(hh, a_chain->cells, l_cell, l_iter_tmp) {
+        dap_chain_atom_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id);
+        l_ret = a_chain->callback_atom_find_by_hash(l_iter, a_atom_hash, a_atom_size);
+        a_chain->callback_atom_iter_delete(l_iter);
+        if (l_ret)
+            break;
+    }
     return l_ret;
 }
 
@@ -248,21 +254,12 @@ static dap_chain_type_t s_chain_type_from_str(const char *a_type_str)
     if(!dap_strcmp(a_type_str, "token")) {
         return CHAIN_TYPE_TOKEN;
     }
-    // if(!dap_strcmp(a_type_str, "token_256")) {
-    //     return CHAIN_TYPE_256_TOKEN;
-    // }
     if(!dap_strcmp(a_type_str, "emission")) {
         return CHAIN_TYPE_EMISSION;
     }
-    // if(!dap_strcmp(a_type_str, "emission_256")) {
-    //     return CHAIN_TYPE_256_EMISSION;
-    // }
     if(!dap_strcmp(a_type_str, "transaction")) {
         return CHAIN_TYPE_TX;
     }
-    // if(!dap_strcmp(a_type_str, "transaction_256")) {
-    //     return CHAIN_TYPE_256_TX;
-    // }
     if(!dap_strcmp(a_type_str, "ca")) {
         return CHAIN_TYPE_CA;
     }
@@ -280,23 +277,17 @@ static dap_chain_type_t s_chain_type_from_str(const char *a_type_str)
  */
 static uint16_t s_datum_type_from_str(const char *a_type_str)
 {
-    // if(!dap_strcmp(a_type_str, "token")) { // old
-    //     return DAP_CHAIN_DATUM_TOKEN_DECL;
-    // }
     if(!dap_strcmp(a_type_str, "token")) {
-        return DAP_CHAIN_DATUM_256_TOKEN_DECL;
+        return DAP_CHAIN_DATUM_TOKEN_DECL;
     }
-    // if(!dap_strcmp(a_type_str, "emission")) {
-    //     return DAP_CHAIN_DATUM_TOKEN_EMISSION;
-    // }
     if(!dap_strcmp(a_type_str, "emission")) {
-        return DAP_CHAIN_DATUM_256_TOKEN_EMISSION;
+        return DAP_CHAIN_DATUM_TOKEN_EMISSION;
     }
-    // if(!dap_strcmp(a_type_str, "transaction")) {
-    //     return DAP_CHAIN_DATUM_TX;
-    // }
     if(!dap_strcmp(a_type_str, "transaction")) {
-        return DAP_CHAIN_DATUM_256_TX;
+        return DAP_CHAIN_DATUM_TX;
+    }
+    if(!dap_strcmp(a_type_str, "ca")) {
+        return DAP_CHAIN_DATUM_CA;
     }
     if (!dap_strcmp(a_type_str, "signer")) {
         return DAP_CHAIN_DATUM_SIGNER;
@@ -314,17 +305,13 @@ static uint16_t s_chain_type_convert(dap_chain_type_t a_type)
 {
     switch (a_type) {
     case CHAIN_TYPE_TOKEN: 
-    //    return DAP_CHAIN_DATUM_TOKEN_DECL;
-    // case CHAIN_TYPE_256_TOKEN: 
-        return DAP_CHAIN_DATUM_256_TOKEN_DECL;
+        return DAP_CHAIN_DATUM_TOKEN_DECL;
     case CHAIN_TYPE_EMISSION:
-    //    return DAP_CHAIN_DATUM_TOKEN_EMISSION;
-    // case CHAIN_TYPE_256_EMISSION: // 256
-        return DAP_CHAIN_DATUM_256_TOKEN_EMISSION;
+        return DAP_CHAIN_DATUM_TOKEN_EMISSION;
     case CHAIN_TYPE_TX:
-    //    return DAP_CHAIN_DATUM_TX;
-    // case CHAIN_TYPE_256_TX: // 256
-        return DAP_CHAIN_DATUM_256_TX;
+        return DAP_CHAIN_DATUM_TX;
+    case CHAIN_TYPE_CA:
+        return DAP_CHAIN_DATUM_CA;
     default:
         return DAP_CHAIN_DATUM_CUSTOM;
     }
@@ -586,10 +573,10 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not
  * @param a_atom_hash
  * @return
  */
-bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash, dap_chain_cell_id_t a_cell_id)
+bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cel_id)
 {
     bool l_ret = false;
-    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_cell_id);
+    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_cel_id);
     dap_chain_atom_ptr_t * l_lasts_atom;
     size_t l_lasts_atom_count=0;
     size_t* l_lasts_atom_size =NULL;
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 5f99b6083339ac399c6f3eccff42a7a5f3a6c28e..fe9a950693dbd5072953f6b20c41eadbcee98a41 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -70,10 +70,7 @@ static  pthread_rwlock_t s_verificators_rwlock;
 #define MAX_OUT_ITEMS   10
 typedef struct dap_chain_ledger_token_emission_item {
     dap_chain_hash_fast_t datum_token_emission_hash;
-    //union {
     dap_chain_datum_token_emission_t *datum_token_emission;
-    //   dap_chain_datum_256_token_emission_t *datum_256_token_emission; // 256
-    //};
     size_t datum_token_emission_size;
     UT_hash_handle hh;
 } dap_chain_ledger_token_emission_item_t;
@@ -128,17 +125,10 @@ typedef struct dap_chain_ledger_tx_item {
 } dap_chain_ledger_tx_item_t;
 
 typedef struct dap_chain_ledger_tokenizer {
-    // bool type_256;
-    char token_ticker[10];
-    uint64_t sum;
-    UT_hash_handle hh;
-} dap_chain_ledger_tokenizer_t;
-
-typedef struct dap_chain_ledger_tokenizer_256 {
     char token_ticker[10];
     uint256_t sum;
     UT_hash_handle hh;
-} dap_chain_ledger_tokenizer_256_t;
+} dap_chain_ledger_tokenizer_t;
 
 typedef struct dap_chain_ledger_tx_bound {
     dap_chain_hash_fast_t tx_prev_hash_fast;
@@ -149,12 +139,10 @@ typedef struct dap_chain_ledger_tx_bound {
     } in;
     union {
         dap_chain_tx_out_t *tx_prev_out;
-        dap_chain_tx_out_ext_t *tx_prev_out_ext;
-        dap_chain_tx_out_cond_t *tx_prev_out_cond;
         // 256
         dap_chain_256_tx_out_t *tx_prev_out_256;
-        dap_chain_256_tx_out_ext_t *tx_prev_out_ext_256;
-        dap_chain_256_tx_out_cond_t *tx_prev_out_cond_256;
+        dap_chain_tx_out_ext_t *tx_prev_out_ext_256;
+        dap_chain_tx_out_cond_t *tx_prev_out_cond_256;
     } out;
     dap_chain_ledger_tx_item_t *item_out;
 } dap_chain_ledger_tx_bound_t;
@@ -163,7 +151,6 @@ typedef struct dap_chain_ledger_tx_bound {
 typedef struct dap_ledger_wallet_balance {
     char *key;
     char token_ticker[DAP_CHAIN_TICKER_SIZE_MAX];
-    //uint128_t balance;
     uint256_t balance;
     UT_hash_handle hh;
 } dap_ledger_wallet_balance_t;
@@ -245,7 +232,7 @@ void dap_chain_ledger_deinit()
     uint16_t l_net_count = 0;
     dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count);
     for(uint16_t i =0; i < l_net_count; i++) {
-        dap_chain_ledger_purge(l_net_list[i]->pub.ledger);
+        dap_chain_ledger_purge(l_net_list[i]->pub.ledger, true);
     }
     DAP_DELETE(l_net_list);
 }
@@ -291,17 +278,13 @@ void dap_chain_ledger_handle_free(dap_ledger_t *a_ledger)
 
 }
 
-
-/*static int compare_datum_items(const void * l_a, const void * l_b)
+void dap_chain_ledger_load_end(dap_ledger_t *a_ledger)
 {
-    const dap_chain_datum_t *l_item_a = (const dap_chain_datum_t*) l_a;
-    const dap_chain_datum_t *l_item_b = (const dap_chain_datum_t*) l_b;
-    if(l_item_a->header.ts_create == l_item_b->header.ts_create)
-        return 0;
-    if(l_item_a->header.ts_create < l_item_b->header.ts_create)
-        return -1;
-    return 1;
-}*/
+    PVT(a_ledger)->last_tx.found = true;
+    PVT(a_ledger)->last_thres_tx.found = true;
+    PVT(a_ledger)->last_emit.found = true;
+    PVT(a_ledger)->last_ticker.found = true;
+}
 
 
 /**
@@ -310,7 +293,7 @@ void dap_chain_ledger_handle_free(dap_ledger_t *a_ledger)
  * @param a_token
  * @return
  */
-int dap_chain_ledger_token_decl_add_check(dap_ledger_t * a_ledger,  dap_chain_datum_token_t *a_token)
+int dap_chain_ledger_token_decl_add_check(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token)
 {
     if ( !a_ledger){
         if(s_debug_more)
@@ -318,9 +301,9 @@ int dap_chain_ledger_token_decl_add_check(dap_ledger_t * a_ledger,  dap_chain_da
         return  -1;
     }
 
-    dap_chain_ledger_token_item_t * l_token_item;
+    dap_chain_ledger_token_item_t *l_token_item;
     pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock);
-    HASH_FIND_STR(PVT(a_ledger)->tokens,a_token->ticker,l_token_item);
+    HASH_FIND_STR(PVT(a_ledger)->tokens, a_token->ticker, l_token_item);
     pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
     if ( l_token_item != NULL ){
         log_it(L_WARNING,"Duplicate token declaration for ticker '%s' ", a_token->ticker);
@@ -356,17 +339,16 @@ int dap_chain_ledger_token_ticker_check(dap_ledger_t * a_ledger, const char *a_t
  * @param a_token_size
  * @return
  */
-int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,  dap_chain_datum_token_t *a_token, size_t a_token_size)
+int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size)
 {
     if ( !a_ledger){
         if(s_debug_more)
             log_it(L_ERROR, "NULL ledger, can't add datum with token declaration!");
         return  -1;
     }
-
     dap_chain_ledger_token_item_t * l_token_item;
     pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock);
-    HASH_FIND_STR(PVT(a_ledger)->tokens,a_token->ticker,l_token_item);
+    HASH_FIND_STR(PVT(a_ledger)->tokens, a_token->ticker,l_token_item);
     pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
 
     if (l_token_item) {
@@ -376,10 +358,10 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,  dap_chain_datum_token_t
     }
 
     l_token_item = DAP_NEW_Z(dap_chain_ledger_token_item_t);
-    dap_snprintf(l_token_item->ticker,sizeof (l_token_item->ticker),"%s",a_token->ticker);
+    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 = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, a_token_size);
-    memcpy(l_token_item->datum_token, a_token,a_token_size);
+    memcpy(l_token_item->datum_token, a_token, a_token_size);
     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);
@@ -407,7 +389,7 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,  dap_chain_datum_token_t
                 }
                 if(s_debug_more)
                     log_it(L_NOTICE, "Simple token %s added (total_supply = %s total_signs_valid=%hu signs_total=%hu type=DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE )",
-                       a_token->ticker, dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(a_token->header_private.total_supply_256)),
+                       a_token->ticker, dap_chain_balance_to_coins(a_token->header_private.total_supply_256),
                        a_token->header_private.signs_valid, a_token->header_private.signs_total);
             }
             break;
@@ -455,7 +437,7 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,  dap_chain_datum_token_t
                 log_it(L_WARNING,"Unknown token declaration type 0x%04X", a_token->type );
     }
         // Proc emissions tresholds
-    s_treshold_emissions_proc( a_ledger);
+    //s_treshold_emissions_proc( a_ledger); //TODO process thresholds only for no-consensus chains
 
     return  0;
 }
@@ -912,7 +894,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite
     return 0;
 }
 
-int dap_chain_ledger_token_load(dap_ledger_t *a_ledger,  dap_chain_datum_token_t *a_token, size_t a_token_size)
+int dap_chain_ledger_token_load(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size)
 {
     if (PVT(a_ledger)->last_ticker.found) {
         return dap_chain_ledger_token_add(a_ledger, a_token, a_token_size);
@@ -950,7 +932,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger)
                                              "\tAuth signs (valid/total) %zu/%zu\n"
                                              "\tTotal emissions %u\n",
                                              &l_token_item->ticker, l_type_str, l_token_item->flags,
-                                             dap_chain_u256tostr(l_token_item->current_supply), dap_chain_u256tostr(l_token_item->total_supply),
+                                             dap_chain_balance_print(l_token_item->current_supply), dap_chain_balance_print(l_token_item->total_supply),
                                              l_token_item->auth_signs_valid, l_token_item->auth_signs_total,
                                              HASH_COUNT(l_token_item->token_emissions));
         l_ret_list = dap_list_append(l_ret_list, l_item_str);
@@ -1037,7 +1019,6 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
         size_t l_token_size = l_objs[i].value_len;
         l_token_item->datum_token = dap_chain_datum_token_read(l_objs[i].value, &l_token_size);
         pthread_rwlock_init(&l_token_item->token_emissions_rwlock, NULL);
-
         // test tsd
         // size_t signs_total = 0, signs_valid = 0, l_token_size_test = l_token_size - sizeof(dap_chain_datum_token_t) + sizeof(dap_chain_datum_token_old_t);
         // dap_sign_t **sign = dap_chain_datum_token_simple_signs_parse( l_token_item->datum_token, l_token_size_test, &signs_total, &signs_valid);
@@ -1047,6 +1028,13 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
             l_token_item->total_supply = GET_256_FROM_64(l_token_item->datum_token->header_private.total_supply);
         }  else if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE) {
             l_token_item->total_supply = l_token_item->datum_token->header_private.total_supply_256;
+            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]);
+                }
+            }
         }
         HASH_ADD_STR(l_ledger_pvt->tokens, ticker, l_token_item);
         if (i == l_objs_count - 1) {
@@ -1055,7 +1043,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
     }
     dap_chain_global_db_objs_delete(l_objs, l_objs_count);
     DAP_DELETE(l_gdb_group);
-    if (l_objs_count == 0) {
+    if (l_objs_count == 0 || l_ledger_pvt->last_ticker.key == NULL) {
         l_ledger_pvt->last_ticker.found = true;
     }
 
@@ -1089,7 +1077,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
     }
     dap_chain_global_db_objs_delete(l_objs, l_objs_count);
     DAP_DELETE(l_gdb_group);
-    if (l_objs_count == 0) {
+    if (l_objs_count == 0 || l_ledger_pvt->last_emit.hash == NULL) {
         l_ledger_pvt->last_emit.found = true;
     }
 
@@ -1104,12 +1092,12 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
         memcpy(&l_tx_item->cache_data, l_objs[i].value, 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);
         if (i == l_objs_count - 1) {
-            PVT(a_ledger)->last_tx.hash = &l_tx_item->tx_hash_fast;
+            l_ledger_pvt->last_tx.hash = &l_tx_item->tx_hash_fast;
         }
     }
     dap_chain_global_db_objs_delete(l_objs, l_objs_count);
     DAP_DELETE(l_gdb_group);
-    if (l_objs_count == 0) {
+    if (l_objs_count == 0 || l_ledger_pvt->last_tx.hash == NULL) {
         l_ledger_pvt->last_tx.found = true;
     }
 
@@ -1123,12 +1111,12 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
         memcpy(l_tx_item->tx, l_objs[i].value, l_objs[i].value_len);
         HASH_ADD(hh, l_ledger_pvt->treshold_txs, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_item);
         if (i == l_objs_count - 1) {
-            PVT(a_ledger)->last_thres_tx.hash = &l_tx_item->tx_hash_fast;
+            l_ledger_pvt->last_thres_tx.hash = &l_tx_item->tx_hash_fast;
         }
     }
     dap_chain_global_db_objs_delete(l_objs, l_objs_count);
     DAP_DELETE(l_gdb_group);
-    if (l_objs_count == 0) {
+    if (l_objs_count == 0 || l_ledger_pvt->last_thres_tx.hash == NULL) {
         l_ledger_pvt->last_thres_tx.found = true;
     }
 
@@ -1146,9 +1134,8 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger)
             strcpy(l_balance_item->token_ticker, l_ptr);
         }
         if ( l_v0_size == l_objs[i].value_len ) { // old data
-            l_balance_item->balance = uint256_0;
             l_balance_item->balance.lo = *(uint128_t *)l_objs[i].value;
-         } else {
+        } else {
             l_balance_item->balance = *(uint256_t *)l_objs[i].value;
         }
         HASH_ADD_KEYPTR(hh, l_ledger_pvt->balance_accounts, l_balance_item->key,
@@ -1188,7 +1175,7 @@ dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags, char *a_net_name)
 
 int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size)
 {
-    int ret = 0;
+    int l_ret = 0;
     dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
 
     const char * c_token_ticker = ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.ticker;
@@ -1212,84 +1199,79 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_
     pthread_rwlock_unlock(l_token_item ? &l_token_item->token_emissions_rwlock
                                        : &l_ledger_priv->treshold_emissions_rwlock);
     if(l_token_emission_item ) {
-        if(s_debug_more)
+        if(s_debug_more) {
             if ( l_token_emission_item->datum_token_emission->hdr.version == 1 ) //&& l_token_emission_item->datum_token_emission->hdr.type_256 )
                 log_it(L_ERROR, "Can't add token emission datum of %s %s ( %s ): already present in cache",
-                    dap_chain_u256tostr(l_token_emission_item->datum_token_emission->hdr.value_256), c_token_ticker, l_hash_str);
+                    dap_chain_balance_print(l_token_emission_item->datum_token_emission->hdr.value_256), c_token_ticker, l_hash_str);
             else
                 log_it(L_ERROR, "Can't add token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s ): already present in cache",
                     l_token_emission_item->datum_token_emission->hdr.value, c_token_ticker, l_hash_str);
-        ret = -1;
+        }
+        l_ret = -1;
     }else if ( (! l_token_item) && ( l_threshold_emissions_count >= s_treshold_emissions_max)) {
         if(s_debug_more)
             log_it(L_WARNING,"Treshold for emissions is overfulled (%zu max)",
                s_treshold_emissions_max);
-        ret = -2;
-    }else{ // Chech emission correctness
-        size_t l_emission_size = a_token_emission_size;
-        dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size);
-        switch (l_emission->hdr.type){
-            // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH:
-            case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH:{
-                dap_chain_ledger_token_item_t *l_token_item=NULL;
-                pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock);
-                HASH_FIND_STR(PVT(a_ledger)->tokens, l_emission->hdr.ticker, l_token_item);
-                pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
-                if (l_token_item){
-                    assert(l_token_item->datum_token);
-                    if( PVT(a_ledger)->net->pub.token_emission_signs_verify  ){
-                        dap_sign_t * l_sign =(dap_sign_t*) l_emission->data.type_auth.signs;
-                        size_t l_offset= (byte_t*)l_emission - (byte_t*) l_sign;
-                        uint16_t l_aproves = 0, l_aproves_valid = l_token_item->auth_signs_valid;
-
-                        for (uint16_t i=0; i <l_emission->data.type_auth.signs_count && l_offset < l_emission_size; i++){
-                            size_t l_sign_size = dap_sign_get_size(l_sign);
-                            l_sign = (dap_sign_t*) ((byte_t*) l_sign + l_sign_size);
-                            if (UINT16_MAX-l_offset> l_sign_size ){
-                                dap_chain_hash_fast_t l_sign_pkey_hash;
-                                dap_sign_get_pkey_hash(l_sign,&l_sign_pkey_hash);
-                                // Find pkey in auth hashes
-                                for(uint16_t k=0; k< l_token_item->auth_signs_total; k++  ){
-                                    if ( dap_hash_fast_compare(&l_sign_pkey_hash, &l_token_item->auth_signs_pkey_hash[k])) {
-                                        // Verify if its token emission header signed
-                                        if (!dap_sign_verify_size(l_sign, l_emission_size)) {
-                                            break;
-                                        }
-                                        if (dap_sign_verify(l_sign, &l_emission->hdr, sizeof(l_emission))) {
-                                            l_aproves++;
-                                            break;
-                                        }
-                                    }
+        l_ret = -2;
+    }
+    DAP_DELETE(l_hash_str);
+    if (l_ret || !PVT(a_ledger)->check_token_emission)
+        return l_ret;
+    // Check emission correctness
+    size_t l_emission_size = a_token_emission_size;
+    dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size);
+    switch (l_emission->hdr.type){
+        case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH:{
+            dap_chain_ledger_token_item_t *l_token_item=NULL;
+            pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock);
+            HASH_FIND_STR(PVT(a_ledger)->tokens, l_emission->hdr.ticker, l_token_item);
+            pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
+            if (l_token_item){
+                assert(l_token_item->datum_token);
+                dap_sign_t *l_sign = (dap_sign_t *)l_emission->data.type_auth.signs;
+                size_t l_offset = (byte_t *)l_sign - (byte_t *)l_emission;
+                uint16_t l_aproves = 0, l_aproves_valid = l_token_item->auth_signs_valid;
+                for (uint16_t i = 0; i < l_emission->data.type_auth.signs_count && l_offset < l_emission_size; i++) {
+                    if (dap_sign_verify_size(l_sign, l_emission_size - l_offset)) {
+                        dap_chain_hash_fast_t l_sign_pkey_hash;
+                        dap_sign_get_pkey_hash(l_sign, &l_sign_pkey_hash);
+                        // Find pkey in auth hashes
+                        for (uint16_t k=0; k< l_token_item->auth_signs_total; k++) {
+                            if (dap_hash_fast_compare(&l_sign_pkey_hash, &l_token_item->auth_signs_pkey_hash[k])) {
+                                // Verify if its token emission header signed
+                                if (dap_sign_verify(l_sign, &l_emission->hdr, sizeof(l_emission->hdr)) == 1) {
+                                    l_aproves++;
+                                    break;
                                 }
-                                l_offset+=l_sign_size;
-                            }else
-                                l_offset = UINT16_MAX;
-                        }
-
-                        if (l_aproves < l_aproves_valid ){
-                            if(s_debug_more)
-                                if ( l_emission->hdr.version == 1 ) // && l_emission->hdr.type_256 ) // 256
-                                   log_it(L_WARNING, "Emission of %s datoshi of %s:%s is wrong: only %u valid aproves when %u need",
-                                       dap_chain_u256tostr(l_emission->hdr.value_256), a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid );
-                                else
-                                    log_it(L_WARNING, "Emission of %"DAP_UINT64_FORMAT_U" datoshi of %s:%s is wrong: only %u valid aproves when %u need",
-                                       l_emission->hdr.value, a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid );
-                            ret = -1;
+                            }
                         }
+                        size_t l_sign_size = dap_sign_get_size(l_sign);
+                        l_offset += l_sign_size;
+                        l_sign = (dap_sign_t *)((byte_t *)l_emission + l_offset);
+                    } else
+                        break;
+                }
+                if (l_aproves < l_aproves_valid ){
+                    if(s_debug_more) {
+                            if ( l_emission->hdr.version == 2 ) // 256
+                               log_it(L_WARNING, "Emission of %s datoshi of %s:%s is wrong: only %u valid aproves when %u need",
+                                   dap_chain_balance_print(l_emission->hdr.value_256), a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid );
+                            else
+                                log_it(L_WARNING, "Emission of %"DAP_UINT64_FORMAT_U" datoshi of %s:%s is wrong: only %u valid aproves when %u need",
+                                   l_emission->hdr.value, a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid );
                     }
-                }else{
-                    if(s_debug_more)
-                        log_it(L_WARNING,"Can't find token declaration %s:%s thats pointed in token emission datum", a_ledger->net_name, l_emission->hdr.ticker);
-                    ret = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS;
+                    l_ret = -3;
                 }
-            }break;
-            default:{}
-        }
-        DAP_DELETE(l_emission);
+            }else{
+                if(s_debug_more)
+                    log_it(L_WARNING,"Can't find token declaration %s:%s thats pointed in token emission datum", a_ledger->net_name, l_emission->hdr.ticker);
+                l_ret = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN;
+            }
+        }break;
+        default:{}
     }
-    DAP_DELETE(l_hash_str);
-
-    return ret;
+    DAP_DELETE(l_emission);
+    return l_ret;
 }
 
 /**
@@ -1351,13 +1333,13 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_
             }
             DAP_DELETE(l_gdb_group);
             char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_emission_item->datum_token_emission->hdr.address) );
-            if(s_debug_more)
+            if(s_debug_more) {
                 if ( l_token_emission_item->datum_token_emission->hdr.version == 1 ) // && l_token_emission_item->datum_token_emission->hdr.type_256 )
                     log_it(L_NOTICE, "Added token emission datum to %s: type=%s value=%s token=%s to_addr=%s ",
                                l_token_item?"emissions cache":"emissions treshold",
                                c_dap_chain_datum_token_emission_type_str[ l_token_emission_item->datum_token_emission->hdr.type ] ,
                                dap_chain_balance_to_coins(
-                                    dap_chain_uint128_from_uint256(l_token_emission_item->datum_token_emission->hdr.value_256)
+                                    l_token_emission_item->datum_token_emission->hdr.value_256
                                 ), c_token_ticker,
                                l_token_emission_address_str);
                 else
@@ -1366,6 +1348,7 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_
                                c_dap_chain_datum_token_emission_type_str[ l_token_emission_item->datum_token_emission->hdr.type ] ,
                                dap_chain_datoshi_to_coins(l_token_emission_item->datum_token_emission->hdr.value), c_token_ticker,
                                l_token_emission_address_str);
+            }
             DAP_DELETE(l_token_emission_address_str);
         }else{
             if(s_debug_more)
@@ -1375,13 +1358,14 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_
         }
     } else {
         if (l_token_item) {
-            if(s_debug_more)
+            if(s_debug_more) {
                 if ( ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.version == 1 ) // && ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.type_256 ) // 256
                     log_it(L_ERROR, "Duplicate token emission datum of %s %s ( %s )",
-                            dap_chain_u256tostr(((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value_256), c_token_ticker, l_hash_str);
+                            dap_chain_balance_print(((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value_256), c_token_ticker, l_hash_str);
                 else
                     log_it(L_ERROR, "Duplicate token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s )",
                             ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value, c_token_ticker, l_hash_str);
+            }
         }
         ret = -1;
     }
@@ -1412,7 +1396,6 @@ int dap_chain_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token
 dap_chain_datum_token_emission_t * dap_chain_ledger_token_emission_find(dap_ledger_t *a_ledger,
         const char *a_token_ticker, const dap_chain_hash_fast_t *a_token_emission_hash)
 {
-
     dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
     dap_chain_datum_token_emission_t * l_token_emission = NULL;
     dap_chain_ledger_token_item_t * l_token_item = NULL;
@@ -1678,10 +1661,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
     // sum of values in 'out' items from the previous transactions
     dap_chain_ledger_tokenizer_t *l_values_from_prev_tx = NULL, *l_values_from_cur_tx = NULL,
                                  *l_value_cur = NULL, *l_tmp = NULL, *l_res = NULL;
-    
-    dap_chain_ledger_tokenizer_256_t *l_values_from_prev_tx_256 = NULL, *l_values_from_cur_tx_256 = NULL,
-                                 *l_value_cur_256 = NULL, *l_tmp_256 = NULL, *l_res_256 = NULL;
-
     char *l_token = NULL;
     dap_chain_ledger_token_item_t * l_token_item = NULL;
     dap_chain_hash_fast_t *l_emission_hash;
@@ -1720,9 +1699,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
         dap_chain_tx_in_cond_t *l_tx_in_cond;
         dap_chain_hash_fast_t l_tx_prev_hash={0};
         uint8_t l_cond_type = *(uint8_t *)l_list_tmp->data;
-
-        bool l_is_type_256 = false; // 256 type
-
         // one of the previous transaction
         if (l_cond_type == TX_ITEM_TYPE_IN) {
             l_tx_in = (dap_chain_tx_in_t *)l_list_tmp->data;
@@ -1756,17 +1732,12 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             l_is_first_transaction = true;
             if (!l_token) {
                 dap_chain_tx_token_t *l_tx_token = (dap_chain_tx_token_t *)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_TOKEN, NULL);
-                dap_chain_tx_token_t *l_tx_token_256 = (dap_chain_tx_token_t *)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_256_TOKEN, NULL);
-                if (l_tx_token) { // TX_ITEM_TYPE_TOKEN
-                    l_token = l_tx_token->header.ticker;
-                    l_emission_hash = &l_tx_token->header.token_emission_hash;
-                } else if (l_tx_token_256) { // TX_ITEM_TYPE_256_TOKEN
-                    l_token = l_tx_token_256->header.ticker;
-                    l_emission_hash = &l_tx_token_256->header.token_emission_hash;
-                } else {
+                if (!l_tx_token) {
                     l_err_num = -4;
                     break;
                 }
+                l_token = l_tx_token->header.ticker;
+                l_emission_hash = &l_tx_token->header.token_emission_hash;
             }
             DAP_DELETE(bound_item);
             continue;
@@ -1807,9 +1778,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             break;
         }
 
-        uint64_t l_value;
-        uint256_t l_value_256 = uint256_0;
-
+        uint256_t l_value;
         // Get list of all 'out' items from previous transaction
         dap_list_t *l_list_prev_out = dap_chain_datum_tx_items_get(l_tx_prev, TX_ITEM_TYPE_OUT_ALL, NULL);
         // Get one 'out' item in previous transaction bound with current 'in' item
@@ -1821,36 +1790,24 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
         }
         if (l_cond_type == TX_ITEM_TYPE_IN) {
             dap_chain_tx_item_type_t l_type = *(uint8_t *)l_tx_prev_out;
-
-            // if ( l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT ) {
-            //     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));                
-            // } else {
-            //     bound_item->out.tx_prev_out_ext = l_tx_prev_out;
-            //     memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out_ext->addr,sizeof (bound_item->out.tx_prev_out_ext->addr));
-            // }
-
-            if ( l_type == TX_ITEM_TYPE_OUT ) {
-                l_is_type_256 = false;
+            switch (l_type) {
+            case TX_ITEM_TYPE_OUT:
                 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));
-            } else if ( l_type == TX_ITEM_TYPE_256_OUT ) { // 256
-                l_is_type_256 = true;
+                break;
+            case TX_ITEM_TYPE_OUT_256: // 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));
-            } else if (l_type == TX_ITEM_TYPE_OUT_EXT ) {
-                l_is_type_256 = false;
-                bound_item->out.tx_prev_out_ext = l_tx_prev_out;
-                memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out_ext->addr,sizeof (bound_item->out.tx_prev_out_ext->addr));
-            } else if ( l_type == TX_ITEM_TYPE_256_OUT_EXT ) { // 256
-                l_is_type_256 = true;
+                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));
-            } else {
-                l_err_num = -8;
                 break;
+            default:
+                l_err_num = -8;
             }
-
+            if (l_err_num)
+                break;
 
             // calculate hash of public key in current transaction
             dap_chain_hash_fast_t l_hash_pkey;
@@ -1867,20 +1824,14 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                 dap_hash_fast(l_pkey_ser, l_pkey_ser_size, &l_hash_pkey);
                 // hash of public key in 'out' item of previous transaction
 
-                // uint8_t *l_prev_out_addr_key = (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) ?
-                //                                 bound_item->out.tx_prev_out->addr.data.key :
-                //                                 bound_item->out.tx_prev_out_ext->addr.data.key;
-
                 uint8_t *l_prev_out_addr_key = NULL;
                 switch (l_type) {
-                    case TX_ITEM_TYPE_256_OUT:
+                    case TX_ITEM_TYPE_OUT_256:
                         l_prev_out_addr_key = bound_item->out.tx_prev_out_256->addr.data.key; break;
                     case TX_ITEM_TYPE_OUT:
                         l_prev_out_addr_key = bound_item->out.tx_prev_out->addr.data.key; break;
-                    case TX_ITEM_TYPE_256_OUT_EXT:
-                        l_prev_out_addr_key = bound_item->out.tx_prev_out_ext_256->addr.data.key; break;
                     case TX_ITEM_TYPE_OUT_EXT:
-                        l_prev_out_addr_key = bound_item->out.tx_prev_out_ext->addr.data.key; break;
+                        l_prev_out_addr_key = bound_item->out.tx_prev_out_ext_256->addr.data.key; break;
                     default:
                         log_it(L_DEBUG, "Unknown item type %d", l_type);
                     break;
@@ -1894,30 +1845,24 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             }
 
             switch (l_type) {
-                case TX_ITEM_TYPE_256_OUT: // 256
-                    l_value_256 = bound_item->out.tx_prev_out_256->header.value; break;
+                case TX_ITEM_TYPE_OUT_256: // 256
+                    l_value = bound_item->out.tx_prev_out_256->header.value; break;
                 case TX_ITEM_TYPE_OUT:
-                    l_value = bound_item->out.tx_prev_out->header.value; break;
-                case TX_ITEM_TYPE_256_OUT_EXT: // 256
-                    l_value_256 = bound_item->out.tx_prev_out_ext_256->header.value;
-                    l_token = bound_item->out.tx_prev_out_ext->token;
-                break;
-                case TX_ITEM_TYPE_OUT_EXT:
-                    l_value = bound_item->out.tx_prev_out_ext->header.value;
-                    l_token = bound_item->out.tx_prev_out_ext->token;
-                break;
+                    l_value = dap_chain_uint256_from(bound_item->out.tx_prev_out->header.value); break;
+                case TX_ITEM_TYPE_OUT_EXT: // 256
+                    l_value = bound_item->out.tx_prev_out_ext_256->header.value;
+                    l_token = bound_item->out.tx_prev_out_ext_256->token;
+                    break;
                 default:
                     log_it(L_DEBUG, "Unknown item type %d", l_type);
                     break;
             }
-
         } else { // TX_ITEM_TYPE_IN_COND
-            dap_chain_tx_item_type_t l_type = *(uint8_t *)l_tx_prev_out;
-            if( l_type != TX_ITEM_TYPE_OUT_COND && l_type != TX_ITEM_TYPE_256_OUT_COND) {
+            if(*(uint8_t *)l_tx_prev_out != TX_ITEM_TYPE_OUT_256_COND) {
                 l_err_num = -8;
                 break;
             }
-            if (!l_token_item){
+            if (! l_token_item){
                 l_err_num = -16;
                 log_it(L_ERROR,"Can't find token item for conditioned tx out");
                 break;
@@ -1932,20 +1877,8 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             size_t l_pkey_ser_size = 0;
             const uint8_t *l_pkey_ser = dap_sign_get_pkey(l_sign, &l_pkey_ser_size);
 
-
             dap_chain_tx_out_cond_t *l_tx_prev_out_cond = NULL;
-            dap_chain_256_tx_out_cond_t *l_tx_prev_out_cond_256 = NULL; // 256
-
-            if ( l_type == TX_ITEM_TYPE_256_OUT_COND ) { // 256
-                l_is_type_256 = true;
-                l_tx_prev_out_cond_256 = (dap_chain_256_tx_out_cond_t *)l_tx_prev_out;
-            } else {
-                l_is_type_256 = false;
-                l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out;
-            }
-
-            // dap_chain_tx_out_cond_t *l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out;
-            // l_is_type_256 = l_type == TX_ITEM_TYPE_256_OUT_COND ? true : false;
+            l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out;
 
             bool l_owner = false;
             if (l_pkey_ser_size == l_prev_pkey_ser_size &&
@@ -1954,16 +1887,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             }
             // 5b. Call verificator for conditional output
             dap_chain_ledger_verificator_t *l_verificator;
-            // int l_tmp = (int)l_tx_prev_out_cond->header.subtype;
-            // int l_tmp;
-            // if ( l_type == TX_ITEM_TYPE_256_OUT_COND ) { // 256
-            //     l_tmp = (int)l_tx_prev_out_cond_256->header.subtype;
-            // } else {
-            //     l_tmp = (int)l_tx_prev_out_cond->header.subtype;
-            // }
-
-            int l_tmp = ( l_type == TX_ITEM_TYPE_256_OUT_COND ) ?
-                            (int)l_tx_prev_out_cond_256->header.subtype : (int)l_tx_prev_out_cond->header.subtype;
+            int l_tmp = l_tx_prev_out_cond->header.subtype;
 
             pthread_rwlock_rdlock(&s_verificators_rwlock);
             HASH_FIND_INT(s_verificators, &l_tmp, l_verificator);
@@ -1978,15 +1902,9 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                 l_err_num = -14;
                 break;
             }
-
-            // bound_item->out.tx_prev_out_cond = l_tx_prev_out_cond;
-            if ( l_type == TX_ITEM_TYPE_256_OUT_COND ) { // 256
-                bound_item->out.tx_prev_out_cond_256 = l_tx_prev_out_cond;
-                l_value_256 = l_tx_prev_out_cond_256->header.value;
-            } else {
-                bound_item->out.tx_prev_out_cond = l_tx_prev_out_cond;
-                l_value = l_tx_prev_out_cond->header.value;
-            }
+            // calculate sum of values from previous transactions
+            bound_item->out.tx_prev_out_cond_256 = l_tx_prev_out_cond;
+            l_value = l_tx_prev_out_cond->header.value;
             l_token = NULL;
         }
         if (!l_token || !*l_token) {
@@ -2008,7 +1926,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             l_err_num = -15;
             break;
         }
-
         // Check permissions
         if ( (l_token_item->flags & DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED ) ||  // If all is blocked - check if we're
              (l_token_item->flags & DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN) ){ // in white list
@@ -2036,43 +1953,18 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             }
         }
 
-        // HASH_FIND_STR(l_values_from_prev_tx, l_token, l_value_cur);
-        // if (!l_value_cur) {
-        //     l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t);
-        //     strcpy(l_value_cur->token_ticker, l_token);
-        //     HASH_ADD_STR(l_values_from_prev_tx, token_ticker, l_value_cur);
-
-        //     if ( l_is_type_256 ) { // 256
-        //         l_value_cur->type_256 = true;
-        //         SUM_256_256(l_value_cur->sum_256, l_value_256, &l_value_cur->sum_256);
-        //     }else {
-        //         l_value_cur->type_256 = false;
-        //         l_value_cur->sum += l_value;
-        //     }
-        // }
-
-        if ( l_is_type_256 ) { // 256
-            HASH_FIND_STR(l_values_from_prev_tx_256, l_token, l_value_cur_256);
-            if (!l_value_cur_256) {
-                l_value_cur_256 = DAP_NEW_Z(dap_chain_ledger_tokenizer_256_t);
-                strcpy(l_value_cur_256->token_ticker, l_token);
-                HASH_ADD_STR(l_values_from_prev_tx_256, token_ticker, l_value_cur_256);
-            }
-            SUM_256_256(l_value_cur_256->sum, l_value_256, &l_value_cur_256->sum);
-
-        } else {
-            HASH_FIND_STR(l_values_from_prev_tx, l_token, l_value_cur);
-            if (!l_value_cur) {
-                l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t);
-                strcpy(l_value_cur->token_ticker, l_token);
-                HASH_ADD_STR(l_values_from_prev_tx, token_ticker, l_value_cur);
-            }
-            // calculate sum of values from previous transactions per each token
-            l_value_cur->sum += l_value;
+        HASH_FIND_STR(l_values_from_prev_tx, l_token, l_value_cur);
+        if (!l_value_cur) {
+            l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t);
+            strcpy(l_value_cur->token_ticker, l_token);
+            HASH_ADD_STR(l_values_from_prev_tx, token_ticker, l_value_cur);
         }
+        // calculate sum of values from previous transactions per each token
+        SUM_256_256(l_value_cur->sum, l_value, &l_value_cur->sum);
 
         l_list_bound_items = dap_list_append(l_list_bound_items, bound_item);
     }
+
     if (l_list_in)
         dap_list_free(l_list_in);
 
@@ -2083,69 +1975,54 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
         HASH_ITER(hh, l_values_from_prev_tx, l_value_cur, l_tmp) {
             DAP_DELETE(l_value_cur);
         }
-        HASH_ITER(hh, l_values_from_prev_tx_256, l_value_cur_256, l_tmp_256) {
-            DAP_DELETE(l_value_cur_256);
-        }
         return l_err_num;
     }
 
     // 6. Compare sum of values in 'out' items in the current transaction and in the previous transactions
     // Calculate the sum of values in 'out' items from the current transaction
     bool l_multichannel = false;
-    if (HASH_COUNT(l_values_from_prev_tx) > 1){ 
+    if (HASH_COUNT(l_values_from_prev_tx) > 1) {
         l_multichannel = true;
     } else {
         l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t);
         if(l_token)
             strcpy(l_value_cur->token_ticker, l_token);
         HASH_ADD_STR(l_values_from_cur_tx, token_ticker, l_value_cur);
-
-        // 256
-        l_value_cur_256 = DAP_NEW_Z(dap_chain_ledger_tokenizer_256_t);
-        if(l_token)
-            strcpy(l_value_cur_256->token_ticker, l_token);
-        HASH_ADD_STR(l_values_from_cur_tx_256, token_ticker, l_value_cur_256);
     }
-
     dap_list_t *l_list_tx_out = NULL;
     bool emission_flag = !l_is_first_transaction || (l_is_first_transaction && l_ledger_priv->check_token_emission);
     // find 'out' items
     dap_list_t *l_list_out = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx, TX_ITEM_TYPE_OUT_ALL, NULL);
-    uint64_t l_value=0;
-    uint256_t l_value_256=uint256_0;
+    uint256_t l_value = {};
     for (l_list_tmp = l_list_out; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp)) {
         dap_chain_tx_item_type_t l_type = *(uint8_t *)l_list_tmp->data;
         dap_chain_addr_t l_tx_out_to={0};
-        bool l_is_type_256 = false;
-
-        if (l_type == TX_ITEM_TYPE_OUT) {
-            l_is_type_256 = false;
+        switch (l_type) {
+        case TX_ITEM_TYPE_OUT: {
             dap_chain_tx_out_t *l_tx_out = (dap_chain_tx_out_t *)l_list_tmp->data;
             if (l_multichannel) { // token ticker is mandatory for multichannel transactions
                 l_err_num = -16;
                 break;
             }
             if (emission_flag) {
-                 l_value = l_tx_out->header.value;
+                 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_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
- 
-        } else if (l_type == TX_ITEM_TYPE_256_OUT) { // 256
-            l_is_type_256 = true;
+        } break;
+        case TX_ITEM_TYPE_OUT_256: { // 256
             dap_chain_256_tx_out_t *l_tx_out = (dap_chain_256_tx_out_t *)l_list_tmp->data;
             if (l_multichannel) { // token ticker is mandatory for multichannel transactions
                 l_err_num = -16;
                 break;
             }
             if (emission_flag) {
-                 l_value_256 = l_tx_out->header.value;
+                 l_value = l_tx_out->header.value;
             }
             memcpy(&l_tx_out_to , &l_tx_out->addr, sizeof (l_tx_out_to));
             l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
-
-        } else if (l_type == TX_ITEM_TYPE_OUT_EXT) {
-            l_is_type_256 = false;
+        } break;
+        case TX_ITEM_TYPE_OUT_EXT: { // 256
             dap_chain_tx_out_ext_t *l_tx_out = (dap_chain_tx_out_ext_t *)l_list_tmp->data;
             if (!l_multichannel) { // token ticker is depricated for single-channel transactions
                 l_err_num = -16;
@@ -2157,23 +2034,8 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
             }
             memcpy(&l_tx_out_to , &l_tx_out->addr, sizeof (l_tx_out_to));
             l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
-
-        } else if (l_type == TX_ITEM_TYPE_256_OUT_EXT) { // 256
-            l_is_type_256 = true;
-            dap_chain_256_tx_out_ext_t *l_tx_out = (dap_chain_256_tx_out_ext_t *)l_list_tmp->data;
-            if (!l_multichannel) { // token ticker is depricated for single-channel transactions
-                l_err_num = -16;
-                break;
-            }
-            if (emission_flag) {
-                 l_value_256 = 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_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
-
-        } else if (l_type == TX_ITEM_TYPE_OUT_COND) {
-            l_is_type_256 = false;
+        } break;
+        case TX_ITEM_TYPE_OUT_256_COND: {
             dap_chain_tx_out_cond_t *l_tx_out = (dap_chain_tx_out_cond_t *)l_list_tmp->data;
             if (emission_flag) {
                 l_value = l_tx_out->header.value;
@@ -2184,42 +2046,18 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                 break;
             }
             l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
-
-        } else if (l_type == TX_ITEM_TYPE_256_OUT_COND) { // 256
-            l_is_type_256 = true;
-            dap_chain_256_tx_out_cond_t *l_tx_out = (dap_chain_256_tx_out_cond_t *)l_list_tmp->data;
-            if (emission_flag) {
-                l_value_256 = l_tx_out->header.value;
-            }
-            if (l_multichannel) { // out_cond have no field .token
-                log_it(L_WARNING, "No conditional output support for multichannel transaction");
-                l_err_num = -18;
-                break;
-            }
-            l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
+        } break;
+        default: {}
         }
-
-        if (l_is_type_256) { // 256
-            if (l_multichannel) {
-                HASH_FIND_STR(l_values_from_cur_tx_256, l_token, l_value_cur_256);
-                if (!l_value_cur_256) {
-                    l_value_cur_256 = DAP_NEW_Z(dap_chain_ledger_tokenizer_256_t);
-                    strcpy(l_value_cur_256->token_ticker, l_token);
-                    HASH_ADD_STR(l_values_from_cur_tx_256, token_ticker, l_value_cur_256);
-                }
-            }
-            SUM_256_256(l_value_cur_256->sum, l_value_256, &l_value_cur_256->sum);
-        } else {
-            if (l_multichannel) {
-                HASH_FIND_STR(l_values_from_cur_tx, l_token, l_value_cur);
-                if (!l_value_cur) {
-                    l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t);
-                    strcpy(l_value_cur->token_ticker, l_token);
-                    HASH_ADD_STR(l_values_from_cur_tx, token_ticker, l_value_cur);
-                }
+        if (l_multichannel) {
+            HASH_FIND_STR(l_values_from_cur_tx, l_token, l_value_cur);
+            if (!l_value_cur) {
+                l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t);
+                strcpy(l_value_cur->token_ticker, l_token);
+                HASH_ADD_STR(l_values_from_cur_tx, token_ticker, l_value_cur);
             }
-            l_value_cur->sum += l_value;
         }
+        SUM_256_256(l_value_cur->sum, l_value, &l_value_cur->sum);
 
         // Get permissions for token
         l_token_item = NULL;
@@ -2262,56 +2100,37 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
         }
     }
 
+
     if ( l_list_out )
         dap_list_free(l_list_out);
 
     // Additional check whether the transaction is first
-    while (l_is_first_transaction && !l_err_num) {
+    if (l_is_first_transaction && !l_err_num) {
         if (l_ledger_priv->check_token_emission) { // Check the token emission
             dap_chain_datum_token_emission_t * l_token_emission = dap_chain_ledger_token_emission_find(a_ledger, l_token, l_emission_hash);
             if (l_token_emission) {
-                if (l_token_emission->hdr.value != l_value_cur->sum &&
-                        !EQUAL_256(l_token_emission->hdr.value_256, l_value_cur_256->sum) ) {
+                if (!EQUAL_256(l_token_emission->hdr.value_256, l_value_cur->sum)) {
                     l_err_num = -10;
                 }
                 l_value_cur = NULL;
-                l_value_cur_256 = NULL;
             } else {
                 log_it(L_WARNING, "Emission for tx_token wasn't found");
                 l_err_num = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION;
-                break;
             }
         }
-        break;
     }
-
-    while (!l_is_first_transaction && !l_err_num) {
-        bool l_err_flag = false;
-        bool l_err_flag_256 = false;
+    if (!l_is_first_transaction && !l_err_num) {
         HASH_ITER(hh, l_values_from_prev_tx, l_value_cur, l_tmp) {
             HASH_FIND_STR(l_values_from_cur_tx, l_value_cur->token_ticker, l_res);
-            if (!l_res || (l_res->sum != l_value_cur->sum) ){ //&& !EQUAL_256(l_res->sum_256,l_value_cur->sum_256) ) ) {
-                if(s_debug_more)
-                    log_it(L_ERROR, "Sum of values in out items of current tx (%"DAP_UINT64_FORMAT_U") is not equal outs from previous tx (%"DAP_UINT64_FORMAT_U") for token %s",
-                       l_res ? l_res->sum : 0, l_value_cur->sum, l_value_cur->token_ticker);
-                l_err_flag = true;
-                break;
-            }
-        }
-        HASH_ITER(hh, l_values_from_prev_tx_256, l_value_cur_256, l_tmp_256) {
-            HASH_FIND_STR(l_values_from_cur_tx_256, l_value_cur_256->token_ticker, l_res_256);
-            if (!l_res_256 || !EQUAL_256(l_res_256->sum,l_value_cur_256->sum) ) {
+            if (!l_res || !EQUAL_256(l_res->sum, l_value_cur->sum) ) {
                 if(s_debug_more)
                     log_it(L_ERROR, "Sum of values in out items of current tx 256 (%s) is not equal outs from previous tx (%s) for token %s",
-                       dap_chain_u256tostr( ( l_res_256 ? l_res_256->sum : uint256_0) ), dap_chain_u256tostr(l_value_cur_256->sum), l_value_cur_256->token_ticker);
-                l_err_flag_256 = true;
+                       dap_chain_balance_print(l_res ? l_res->sum : uint256_0), dap_chain_balance_print(l_value_cur->sum), l_value_cur->token_ticker);
+                l_err_num = -12;
                 break;
             }
         }
-        if ( l_err_flag && l_err_flag_256 ) 
-            l_err_num = -12;
 
-        break;
     }
 
     HASH_ITER(hh, l_values_from_prev_tx, l_value_cur, l_tmp) {
@@ -2320,15 +2139,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
     HASH_ITER(hh, l_values_from_cur_tx, l_value_cur, l_tmp) {
         DAP_DELETE(l_value_cur);
     }
-
-    // 256
-    HASH_ITER(hh, l_values_from_prev_tx_256, l_value_cur_256, l_tmp_256) {
-        DAP_DELETE(l_value_cur_256);
-    }
-    HASH_ITER(hh, l_values_from_cur_tx_256, l_value_cur_256, l_tmp_256) {
-        DAP_DELETE(l_value_cur_256);
-    }
-
     if (!a_list_bound_items || l_err_num) {
         dap_list_free_full(l_list_bound_items, free);
     } else {
@@ -2361,7 +2171,7 @@ int dap_chain_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *
              a_ledger, a_tx, &l_list_bound_items, &l_list_tx_out)) < 0){
         if(s_debug_more)
             log_it (L_DEBUG, "dap_chain_ledger_tx_add_check() tx not passed the check: code %d ",l_ret_check);
-        return -1;
+        return l_ret_check;
     }
     dap_chain_hash_fast_t *l_tx_hash = dap_chain_node_datum_tx_calc_hash(a_tx);
     char l_tx_hash_str[70];
@@ -2374,10 +2184,9 @@ int dap_chain_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *
 static int s_balance_cache_update(dap_ledger_t *a_ledger, dap_ledger_wallet_balance_t *a_balance)
 {
     char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_BALANCES_STR);
-    // uint128_t *l_balance_value = DAP_NEW_Z(uint128_t);
     uint256_t *l_balance_value = DAP_NEW_Z(uint256_t);
     *l_balance_value = a_balance->balance;
-    if (!dap_chain_global_db_gr_set(dap_strdup(a_balance->key), l_balance_value, sizeof(uint256_t/*uint128_t*/), l_gdb_group)) {
+    if (!dap_chain_global_db_gr_set(dap_strdup(a_balance->key), l_balance_value, sizeof(uint256_t), l_gdb_group)) {
         if(s_debug_more)
             log_it(L_WARNING, "Ledger cache mismatch");
         DAP_DELETE(l_balance_value);
@@ -2433,7 +2242,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
     if (l_item_tmp) {
         if(s_debug_more)
             log_it(L_WARNING, "Transaction %s already present in the cache", l_tx_hash_str);
-        ret = 1;
+        ret = -1;
         goto FIN;
     }
 
@@ -2481,7 +2290,6 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
         ret = l_ret_check;
         goto FIN;
     }
-
     if(s_debug_more)
         log_it ( L_DEBUG, "dap_chain_ledger_tx_add() check passed for tx %s",l_tx_hash_str);
 
@@ -2494,58 +2302,38 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
     // find all bound pairs 'in' and 'out'
     dap_list_t *l_list_tmp = l_list_bound_items;
     char *l_ticker_trl = NULL, *l_ticker_old_trl = NULL;
-
     bool l_stake_updated = false;
-
     // Update balance: deducts
     while(l_list_tmp) {
         dap_chain_ledger_tx_bound_t *bound_item = l_list_tmp->data;
         void *l_item_in = *(void **)&bound_item->in;
-        void *l_item_out = *(void **)&bound_item->out;
         dap_chain_tx_item_type_t l_type = *(uint8_t *)l_item_in;
-        dap_chain_tx_item_type_t l_out_type = *(uint8_t *)l_item_out;
-
         dap_chain_ledger_tx_item_t *l_prev_item_out = bound_item->item_out;
-
-        // l_ticker_trl = *l_prev_item_out->cache_data.token_tiker
-        //         ? dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_tiker)
-        //         : dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext->token);
+        dap_chain_tx_item_type_t l_out_type = *(uint8_t *)l_prev_item_out;
         
         if ( *l_prev_item_out->cache_data.token_tiker ) 
             l_ticker_trl = dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_tiker);
-        else if ( l_out_type == TX_ITEM_TYPE_256_OUT || l_out_type == TX_ITEM_TYPE_256_OUT_EXT ) // 256
+        else if ( l_out_type == TX_ITEM_TYPE_OUT_EXT) // 256
             l_ticker_trl = dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext_256->token);
-        else
-            l_ticker_trl = dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext->token);
-
 
         if (!l_multichannel && l_ticker_old_trl && strcmp(l_token_ticker, l_token_ticker_old)) {
             l_multichannel = true;
         }
         l_ticker_old_trl = dap_stpcpy(l_token_ticker_old, l_token_ticker);
         int l_tx_prev_out_used_idx;
-
         if (l_type == TX_ITEM_TYPE_IN) {
             dap_chain_tx_in_t *l_tx_in = bound_item->in.tx_cur_in;
             dap_ledger_wallet_balance_t *wallet_balance = NULL;
-            //void *l_item_out = *(void **)&bound_item->out;
-            uint256_t l_value = uint256_0;
-
+            uint256_t l_value = {};
             dap_chain_addr_t *l_addr = NULL;
             switch (l_out_type) {
-                case TX_ITEM_TYPE_256_OUT: l_addr = &bound_item->out.tx_prev_out_256->addr; break;
+                case TX_ITEM_TYPE_OUT_256: l_addr = &bound_item->out.tx_prev_out_256->addr; break;
                 case TX_ITEM_TYPE_OUT: l_addr = &bound_item->out.tx_prev_out->addr; break;
-                case TX_ITEM_TYPE_256_OUT_EXT: l_addr = &bound_item->out.tx_prev_out_ext_256->addr; break;
-                case TX_ITEM_TYPE_OUT_EXT: l_addr = &bound_item->out.tx_prev_out_ext->addr; break;
+                case TX_ITEM_TYPE_OUT_EXT: l_addr = &bound_item->out.tx_prev_out_ext_256->addr; break;
                 default:
                     log_it(L_DEBUG, "Unknown item type %d", l_type);
                     break;
             }
-
-            // dap_chain_addr_t *l_addr = (l_out_type == TX_ITEM_TYPE_OUT || l_out_type == TX_ITEM_TYPE_256_OUT) ?
-            //                             &bound_item->out.tx_prev_out->addr :
-            //                             &bound_item->out.tx_prev_out_ext->addr;
-
             char *l_addr_str = dap_chain_addr_to_str(l_addr);
             char *l_wallet_balance_key = dap_strjoin(" ", l_addr_str, l_token_ticker, (char*)NULL);
             pthread_rwlock_rdlock(&PVT(a_ledger)->balance_accounts_rwlock);
@@ -2553,18 +2341,17 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
             pthread_rwlock_unlock(&PVT(a_ledger)->balance_accounts_rwlock);
             if (wallet_balance) {
                 switch (l_out_type) {
-                    case TX_ITEM_TYPE_256_OUT: l_value = bound_item->out.tx_prev_out_256->header.value; break;
+                    case TX_ITEM_TYPE_OUT_256: l_value = bound_item->out.tx_prev_out_256->header.value; break;
                     case TX_ITEM_TYPE_OUT: l_value = GET_256_FROM_64(bound_item->out.tx_prev_out->header.value); break;
-                    case TX_ITEM_TYPE_256_OUT_EXT: l_value = bound_item->out.tx_prev_out_ext_256->header.value; break;
-                    case TX_ITEM_TYPE_OUT_EXT: l_value = GET_256_FROM_64(bound_item->out.tx_prev_out_ext->header.value); break;
+                    case TX_ITEM_TYPE_OUT_EXT: l_value = bound_item->out.tx_prev_out_ext_256->header.value; break;
                     default:
                         log_it(L_DEBUG, "Unknown item type %d", l_type);
                     break;
                 }
 
                 if(s_debug_more)
-                    log_it(L_DEBUG,"SPEND %s from addr: %s", dap_chain_u256tostr(l_value), l_wallet_balance_key);
-                
+                    log_it(L_DEBUG,"SPEND %s from addr: %s", dap_chain_balance_print(l_value), l_wallet_balance_key);
+
                 SUBTRACT_256_256(wallet_balance->balance, l_value, &wallet_balance->balance);
 
                 // Update the cache
@@ -2575,17 +2362,15 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
             }
             DAP_DELETE(l_addr_str);
             DAP_DELETE(l_wallet_balance_key);
-
             /// Mark 'out' item in cache because it used
             l_tx_prev_out_used_idx = l_tx_in->header.tx_out_prev_idx;
         } else { // TX_ITEM_TYPE_IN_COND
-
             // all balance deducts performed with previous conditional transaction
             dap_chain_tx_in_cond_t *l_tx_in_cond = bound_item->in.tx_cur_in_cond;
             /// Mark 'out' item in cache because it used
             l_tx_prev_out_used_idx = l_tx_in_cond->header.tx_out_prev_idx;
             // Update stakes if any
-            dap_chain_tx_out_cond_t *l_cond = bound_item->out.tx_prev_out_cond;
+            dap_chain_tx_out_cond_t *l_cond = bound_item->out.tx_prev_out_cond_256;
             if (l_cond->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE) {
                 dap_chain_ledger_verificator_t *l_verificator;
                 int l_tmp = (int)DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_UPDATE;
@@ -2598,7 +2383,6 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
                 l_stake_updated = true;
             }
         }
-
         // add a used output
         memcpy(&(l_prev_item_out->cache_data.tx_hash_spent_fast[l_tx_prev_out_used_idx]), l_tx_hash, sizeof(dap_chain_hash_fast_t));
         l_prev_item_out->cache_data.n_outs_used++;
@@ -2631,11 +2415,9 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
                 goto FIN;
             }
         }
-
         // go to next previous transaction
         l_list_tmp = dap_list_next(l_list_tmp);
     }
-
     if (l_list_bound_items)
         dap_list_free_full(l_list_bound_items, free);
 
@@ -2645,18 +2427,15 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
         //dap_list_t *l_base_tx_list = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_TOKEN, &l_base_tx_count );
         //if (l_base_tx_count >=1  && l_base_tx_list){
         dap_chain_tx_token_t * l_tx_token = (dap_chain_tx_token_t *) dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_TOKEN, NULL);
-        dap_chain_tx_token_t * l_tx_token_256 = (dap_chain_tx_token_t *) dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_256_TOKEN, NULL);
-
-        if ( l_tx_token_256 )
-            l_ticker_trl = dap_stpcpy(l_token_ticker, l_tx_token_256->header.ticker);
-        else if (l_tx_token)
+        if (l_tx_token)
             l_ticker_trl = dap_stpcpy(l_token_ticker, l_tx_token->header.ticker);
+        //}
     }
 
     //Update balance : raise
     for (dap_list_t *l_tx_out = l_list_tx_out; l_tx_out; l_tx_out = dap_list_next(l_tx_out)) {
         dap_chain_tx_item_type_t l_type = *(uint8_t *)l_tx_out->data;
-        if (l_type == TX_ITEM_TYPE_OUT_COND || l_type == TX_ITEM_TYPE_256_OUT_COND) {
+        if (l_type == TX_ITEM_TYPE_OUT_COND) {
             // Update stakes if any
             dap_chain_tx_out_cond_t *l_cond = (dap_chain_tx_out_cond_t *)l_tx_out->data;
             if (l_cond->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE && !l_stake_updated) {
@@ -2671,32 +2450,25 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
             }
             continue;   // balance raise will be with next conditional transaction
         }
-
         dap_chain_tx_out_t *l_out_item = NULL;
         dap_chain_256_tx_out_t *l_out_item_256 = NULL;
-        dap_chain_tx_out_ext_t *l_out_item_ext = NULL;
-        dap_chain_256_tx_out_ext_t *l_out_item_ext_256 = NULL;
+        dap_chain_tx_out_ext_t *l_out_item_ext_256 = NULL;
 
         switch (l_type) {
-            case TX_ITEM_TYPE_256_OUT: l_out_item_256 = (dap_chain_256_tx_out_t *)l_tx_out->data; break;
+            case TX_ITEM_TYPE_OUT_256: l_out_item_256 = (dap_chain_256_tx_out_t *)l_tx_out->data; break;
             case TX_ITEM_TYPE_OUT: l_out_item = (dap_chain_tx_out_t *)l_tx_out->data; break;
-            case TX_ITEM_TYPE_256_OUT_EXT: l_out_item_ext_256 = (dap_chain_256_tx_out_ext_t *)l_tx_out->data; break;
-            case TX_ITEM_TYPE_OUT_EXT: l_out_item_ext = (dap_chain_tx_out_ext_t *)l_tx_out->data; break;
+            case TX_ITEM_TYPE_OUT_EXT: l_out_item_ext_256 = (dap_chain_tx_out_ext_t *)l_tx_out->data; break;
             default:
                 log_it(L_DEBUG, "Unknown item type %d", l_type);
                 break;
         }
 
-        if ((l_out_item||l_out_item_ext||l_out_item_256||l_out_item_ext_256) && l_ticker_trl) {
-             // dap_chain_addr_t *l_addr = (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) ?
-             //                            &l_out_item->addr :
-             //                            &l_out_item_ext->addr;
+        if ((l_out_item||l_out_item_256||l_out_item_ext_256) && l_ticker_trl) {
             dap_chain_addr_t *l_addr;
             switch (l_type) {
-                case TX_ITEM_TYPE_256_OUT: l_addr = &l_out_item_256->addr; break;
+                case TX_ITEM_TYPE_OUT_256: l_addr = &l_out_item_256->addr; break;
                 case TX_ITEM_TYPE_OUT: l_addr = &l_out_item->addr; break;
-                case TX_ITEM_TYPE_256_OUT_EXT: l_addr = &l_out_item_ext_256->addr; break;
-                case TX_ITEM_TYPE_OUT_EXT: l_addr = &l_out_item_ext->addr; break;
+                case TX_ITEM_TYPE_OUT_EXT: l_addr = &l_out_item_ext_256->addr; break;
                 default:
                     log_it(L_DEBUG, "Unknown item type %d", l_type);
                     break;
@@ -2708,32 +2480,27 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
             //        l_token_ticker, l_addr_str);
             dap_ledger_wallet_balance_t *wallet_balance = NULL;
             if (l_multichannel) {
-                l_ticker_trl = dap_stpcpy(l_token_ticker, l_out_item_ext->token);
+                l_ticker_trl = dap_stpcpy(l_token_ticker, l_out_item_ext_256->token);
             }
             char *l_wallet_balance_key = dap_strjoin(" ", l_addr_str, l_token_ticker, (char*)NULL);
-
-            uint64_t l_value = 0;
-            uint256_t l_value_256 = uint256_0;
+            uint256_t l_value_256 = {};
             switch (l_type) {
-                case TX_ITEM_TYPE_256_OUT: l_value_256 = l_out_item_256->header.value; break; // _256
+                case TX_ITEM_TYPE_OUT_256: l_value_256 = l_out_item_256->header.value; break; // _256
                 case TX_ITEM_TYPE_OUT: l_value_256 = GET_256_FROM_64(l_out_item->header.value); break;
-                case TX_ITEM_TYPE_256_OUT_EXT: l_value_256 = l_out_item_ext_256->header.value; break; // _256
-                case TX_ITEM_TYPE_OUT_EXT: l_value_256 = GET_256_FROM_64(l_out_item_ext->header.value); break;
+                case TX_ITEM_TYPE_OUT_EXT: l_value_256 = l_out_item_ext_256->header.value; break; // _256
                 default:
                     log_it(L_DEBUG, "Unknown item type %d", l_type);
                     break;
             }
 
-            // l_value = (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) ? l_out_item->header.value : l_out_item_ext->header.value;
             if(s_debug_more)
-                log_it (L_DEBUG,"GOT %s to addr: %s", dap_chain_u256tostr(l_value_256), l_wallet_balance_key);
+                log_it (L_DEBUG,"GOT %s to addr: %s", dap_chain_balance_print(l_value_256), l_wallet_balance_key);
             pthread_rwlock_rdlock(&l_ledger_priv->balance_accounts_rwlock);
             HASH_FIND_STR(PVT(a_ledger)->balance_accounts, l_wallet_balance_key, wallet_balance);
             pthread_rwlock_unlock(&l_ledger_priv->balance_accounts_rwlock);
             if (wallet_balance) {
                 if(s_debug_more)
                     log_it(L_DEBUG, "Balance item is present in cache");
-
                 SUM_256_256(wallet_balance->balance, l_value_256, &wallet_balance->balance);
                 DAP_DELETE (l_wallet_balance_key);
                 // Update the cache
@@ -2742,9 +2509,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
                 wallet_balance = DAP_NEW_Z(dap_ledger_wallet_balance_t);
                 wallet_balance->key = l_wallet_balance_key;
                 strcpy(wallet_balance->token_ticker, l_token_ticker);
-
                 SUM_256_256(wallet_balance->balance, l_value_256, &wallet_balance->balance);
-                
                 if(s_debug_more)
                     log_it(L_DEBUG,"!!! Create new balance item: %s %s", l_addr_str, l_token_ticker);
                 pthread_rwlock_wrlock(&l_ledger_priv->balance_accounts_rwlock);
@@ -2785,20 +2550,10 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx,
         if (!l_ticker_trl) { //No token ticker in previous txs
             if(s_debug_more)
                 log_it(L_DEBUG, "No token ticker in previous txs");
-            //int l_tokens_count = 0;
-            //dap_list_t *l_tokens_list = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_TOKEN, &l_tokens_count );
-            //if ( l_tokens_count>0 ){
-                //dap_chain_tx_token_t * l_token = (dap_chain_tx_token_t*) l_tokens_list->data;
             dap_chain_tx_token_t *l_token = (dap_chain_tx_token_t *)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_TOKEN, NULL);
-            // 256
-            dap_chain_tx_token_t *l_token_256 = (dap_chain_tx_token_t *)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_256_TOKEN, NULL);
             l_ticker_trl = l_token
                     ? dap_stpcpy(l_token_ticker, l_token->header.ticker)
-                    : ( l_token_256 // 256
-                            ? dap_stpcpy(l_token_ticker, l_token_256->header.ticker) 
-                            : NULL );
-                //dap_list_free(l_tokens_list);
-            //}
+                    : NULL;
         }
         if (l_ticker_trl && !l_multichannel)
             dap_stpcpy(l_item_tmp->cache_data.token_tiker, l_token_ticker);
@@ -2886,7 +2641,7 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_
 /**
  * Delete all transactions from the cache
  */
-void dap_chain_ledger_purge(dap_ledger_t *a_ledger)
+void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db)
 {
     dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
     const int l_hash_str_size = DAP_CHAIN_HASH_FAST_SIZE * 2 + 2;
@@ -2903,8 +2658,10 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger)
     HASH_ITER(hh, l_ledger_priv->ledger_items , l_item_current, l_item_tmp) {
         DAP_DELETE(l_item_current->tx);
         HASH_DEL(l_ledger_priv->ledger_items, l_item_current);
-        dap_chain_hash_fast_to_str(&l_item_current->tx_hash_fast, l_hash_str, l_hash_str_size);
-        dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_gdb_group);
+        if (!a_preserve_db) {
+            dap_chain_hash_fast_to_str(&l_item_current->tx_hash_fast, l_hash_str, l_hash_str_size);
+            dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_gdb_group);
+        }
         DAP_DELETE(l_item_current);
     }
     DAP_DELETE(l_gdb_group);
@@ -2913,8 +2670,10 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger)
     l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_THRES_STR);
     HASH_ITER(hh, l_ledger_priv->treshold_txs, l_item_current, l_item_tmp) {
         HASH_DEL(l_ledger_priv->treshold_txs, l_item_current);
-        dap_chain_hash_fast_to_str(&l_item_current->tx_hash_fast, l_hash_str, l_hash_str_size);
-        dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_gdb_group);
+        if (!a_preserve_db) {
+            dap_chain_hash_fast_to_str(&l_item_current->tx_hash_fast, l_hash_str, l_hash_str_size);
+            dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_gdb_group);
+        }
         DAP_DELETE(l_item_current->tx);
         DAP_DELETE(l_item_current);
     }
@@ -2925,7 +2684,8 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger)
     l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_BALANCES_STR);
     HASH_ITER(hh, l_ledger_priv->balance_accounts, l_balance_current, l_balance_tmp) {
         HASH_DEL(l_ledger_priv->balance_accounts, l_balance_current);
-        dap_chain_global_db_gr_del(l_balance_current->key, l_gdb_group);
+        if (!a_preserve_db)
+            dap_chain_global_db_gr_del(l_balance_current->key, l_gdb_group);
         DAP_DELETE(l_balance_current);
     }
     DAP_DELETE(l_gdb_group);
@@ -2935,8 +2695,10 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger)
     char *l_emissions_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_EMISSIONS_STR);
     HASH_ITER(hh, l_ledger_priv->treshold_emissions, l_emission_current, l_emission_tmp) {
         HASH_DEL(l_ledger_priv->treshold_emissions, l_emission_current);
-        dap_chain_hash_fast_to_str(&l_emission_current->datum_token_emission_hash, l_hash_str, l_hash_str_size);
-        dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_emissions_gdb_group);
+        if (!a_preserve_db) {
+            dap_chain_hash_fast_to_str(&l_emission_current->datum_token_emission_hash, l_hash_str, l_hash_str_size);
+            dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_emissions_gdb_group);
+        }
         DAP_DELETE(l_emission_current->datum_token_emission);
         DAP_DELETE(l_emission_current);
     }
@@ -2949,13 +2711,16 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger)
         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);
-            dap_chain_hash_fast_to_str(&l_emission_current->datum_token_emission_hash, l_hash_str, l_hash_str_size);
-            dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_emissions_gdb_group);
+            if (!a_preserve_db) {
+                dap_chain_hash_fast_to_str(&l_emission_current->datum_token_emission_hash, l_hash_str, l_hash_str_size);
+                dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_emissions_gdb_group);
+            }
             DAP_DELETE(l_emission_current->datum_token_emission);
             DAP_DELETE(l_emission_current);
         }
         pthread_rwlock_unlock(&l_token_current->token_emissions_rwlock);
-        dap_chain_global_db_gr_del(dap_strdup(l_token_current->ticker), l_gdb_group);
+        if (!a_preserve_db)
+            dap_chain_global_db_gr_del(dap_strdup(l_token_current->ticker), l_gdb_group);
         DAP_DELETE(l_token_current->datum_token);
         pthread_rwlock_destroy(&l_token_current->token_emissions_rwlock);
         DAP_DELETE(l_token_current);
@@ -2963,6 +2728,11 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger)
     DAP_DELETE(l_gdb_group);
     DAP_DELETE(l_emissions_gdb_group);
 
+    l_ledger_priv->last_tx.found = true;
+    l_ledger_priv->last_thres_tx.found = true;
+    l_ledger_priv->last_emit.found = true;
+    l_ledger_priv->last_ticker.found = true;
+
     pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock);
     pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock);
     pthread_rwlock_unlock(&l_ledger_priv->treshold_emissions_rwlock);
@@ -3049,7 +2819,7 @@ uint256_t dap_chain_ledger_calc_balance(dap_ledger_t *a_ledger, const dap_chain_
     if (l_balance_item) {
         if(s_debug_more)
             log_it (L_INFO,"Found address in cache with balance %s",
-                            dap_chain_u256tostr(l_balance_item->balance));
+                            dap_chain_balance_print(l_balance_item->balance));
         l_ret = l_balance_item->balance;
     } else {
         if (s_debug_more)
@@ -3067,15 +2837,7 @@ uint256_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c
 
     if(!a_addr || !dap_chain_addr_check_sum(a_addr))
         return balance;
-    /* proto
-     *
-    dap_ledger_wallet_balance_t *wallet_balance = NULL;
-    HASH_FIND(hh, balance_accounts, a_addr, sizeof(*a_addr), wallet_balance);
-    if (wallet_balance) {
-        balance = wallet_balance->balance;
-    }
 
-    */
     dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
     dap_chain_ledger_tx_item_t *l_iter_current, *l_item_tmp;
     pthread_rwlock_rdlock(&l_ledger_priv->ledger_rwlock);
@@ -3123,7 +2885,7 @@ uint256_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c
                     }
                 }
             }
-            if (l_type == TX_ITEM_TYPE_256_OUT) { // 256
+            if (l_type == TX_ITEM_TYPE_OUT_256) { // 256
                 const dap_chain_256_tx_out_t *l_tx_out = (const dap_chain_256_tx_out_t*) l_list_tmp->data;
                 // const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data;
                 // Check for token name
@@ -3138,23 +2900,8 @@ uint256_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c
                     }
                 }
             }
-            if (l_type == TX_ITEM_TYPE_OUT_EXT) {
+            if (l_type == TX_ITEM_TYPE_OUT_EXT) { // 256
                 const dap_chain_tx_out_ext_t *l_tx_out = (const dap_chain_tx_out_ext_t*) l_list_tmp->data;
-                // Check for token name
-                if (!strcmp(a_token_ticker, l_tx_out->token))
-                {   // if transaction has the out item with requested addr
-                    if (!memcmp(a_addr, &l_tx_out->addr, sizeof(dap_chain_addr_t))) {
-                        // if 'out' item not used & transaction is valid
-                        if(!dap_chain_ledger_item_is_used_out(l_iter_current, l_out_idx_tmp) &&
-                                dap_chain_datum_tx_verify_sign(l_cur_tx)) {
-                            uint256_t l_add = dap_chain_uint256_from(l_tx_out->header.value);
-                            SUM_256_256(balance, l_add, &balance);
-                        }
-                    }
-                }
-            }
-            if (l_type == TX_ITEM_TYPE_256_OUT_EXT) { // 256
-                const dap_chain_256_tx_out_ext_t *l_tx_out = (const dap_chain_256_tx_out_ext_t*) l_list_tmp->data;
                 // const dap_chain_tx_out_ext_t *l_tx_out = (const dap_chain_tx_out_ext_t*) l_list_tmp->data;
                 // Check for token name
                 if (!strcmp(a_token_ticker, l_tx_out->token))
@@ -3175,6 +2922,7 @@ uint256_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c
     return balance;
 }
 
+
 /**
  * Get the transaction in the cache by the addr in out item
  *
@@ -3379,10 +3127,10 @@ dap_chain_datum_tx_t* dap_chain_ledger_tx_cache_find_out_cond(dap_ledger_t *a_le
  * a_public_key[in] public key that signed the transaction
  * a_public_key_size[in] public key size
  */
-uint64_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, dap_chain_addr_t *a_addr,
+uint256_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, dap_chain_addr_t *a_addr,
         dap_chain_tx_out_cond_t **tx_out_cond)
 {
-    uint64_t l_ret_value = 0;
+    uint256_t l_ret_value = {};
 
     dap_chain_datum_tx_t *l_tx_tmp;
     dap_chain_hash_fast_t l_tx_first_hash = { 0 }; // start hash
@@ -3401,7 +3149,7 @@ uint64_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, da
             // TODO check relations a_addr with cond_data and public key
 
             if(l_tx_out_cond) {
-                l_ret_value += l_tx_out_cond->header.value;
+                l_ret_value = l_tx_out_cond->header.value;
                 if(tx_out_cond)
                     *tx_out_cond = l_tx_out_cond;
             }
@@ -3420,13 +3168,12 @@ uint64_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, da
  * @return
  */
 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,
-                                                       uint64_t a_value_need, uint64_t *a_value_transfer)
+                                                       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 };
-    uint64_t l_value_transfer = 0;
-    //uint256_t l_value_transfer = uint256_0;
-    while(l_value_transfer < a_value_need)
+    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,
@@ -3439,11 +3186,7 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c
         uint32_t l_out_idx_tmp = 0; // current index of 'out' item
         for (dap_list_t *l_list_tmp = l_list_out_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;
-            if (l_type == TX_ITEM_TYPE_OUT_COND || l_type == TX_ITEM_TYPE_256_OUT_COND) {
-                continue;
-            }
-            // uint64_t l_value;
-            uint256_t l_value = uint256_0;
+            uint256_t l_value = {};
             switch (l_type) {
                 case TX_ITEM_TYPE_OUT: {
                     dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data;
@@ -3452,7 +3195,7 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c
                     }
                     l_value = GET_256_FROM_64(l_out->header.value);   
                 } break;
-                case TX_ITEM_TYPE_256_OUT: {
+                case TX_ITEM_TYPE_OUT_256: {
                     dap_chain_256_tx_out_t *l_out = (dap_chain_256_tx_out_t *)l_list_tmp->data;
                     if ( IS_ZERO_256(l_out->header.value) || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) {
                         continue;
@@ -3461,48 +3204,27 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c
                 } break;
                 case TX_ITEM_TYPE_OUT_EXT: {
                     dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data;
-                    if (!l_out_ext->header.value || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) ||
-                            strcmp((char *)a_token_ticker, l_out_ext->token)) {
-                        continue;
-                    }
-                    l_value = GET_256_FROM_64(l_out_ext->header.value);
-                } break;
-                case TX_ITEM_TYPE_256_OUT_EXT: {
-                    dap_chain_256_tx_out_ext_t *l_out_ext = (dap_chain_256_tx_out_ext_t *)l_list_tmp->data;
-                    if ( IS_ZERO_256(l_out_ext->header.value) || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) ||
+                    if (IS_ZERO_256(l_out_ext->header.value) || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) ||
                             strcmp((char *)a_token_ticker, l_out_ext->token)) {
                         continue;
                     }
                     l_value = l_out_ext->header.value;
                 } break;
+                case TX_ITEM_TYPE_OUT_COND:
+                case TX_ITEM_TYPE_OUT_256_COND:
+                default:
+                    continue;
             }
-            // if (l_type == TX_ITEM_TYPE_OUT) {
-            //     dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data;
-            //     if (!l_out->header.value || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) {
-            //         continue;
-            //     }
-            //     l_value =  l_out->header.value;
-            // } else { // TX_ITEM_TYPE_OUT_EXT
-            //     dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data;
-            //     if (!l_out_ext->header.value || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) ||
-            //             strcmp((char *)a_token_ticker, l_out_ext->token)) {
-            //         continue;
-            //     }
-            //     l_value =  l_out_ext->header.value;
-            // }
             // 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 *item = DAP_NEW(list_used_item_t);
-                memcpy(&item->tx_hash_fast, &l_tx_cur_hash, sizeof(dap_chain_hash_fast_t));
-                item->num_idx_out = l_out_idx_tmp;
-                item->value = dap_chain_uint256_to(l_value); // this is temporary for compatibility :-)
-                l_list_used_out = dap_list_append(l_list_used_out, item);
-                l_value_transfer += item->value;
-                //SUM_256_256(l_value_transfer, item->value, &l_value_transfer);
+                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));
+                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 (l_value_transfer >= a_value_need) {
-                //if (compare256(l_value_transfer, a_value_need) >= 0) {
+                if (compare256(l_value_transfer, a_value_need) != -1) {
                     break;
                 }
             }
@@ -3511,8 +3233,7 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c
     }
 
     // nothing to tranfer (not enough funds)
-    if(!l_list_used_out || l_value_transfer < a_value_need) {
-    // if(!l_list_used_out || compare256(l_value_transfer, a_value_need) < 0) {
+    if(!l_list_used_out || compare256(l_value_transfer, a_value_need) == -1) {
         dap_list_free_full(l_list_used_out, free);
         return NULL;
     }
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 65d3b5840f3d8a6dbd66b95dc4af3abd0ce1f566..a52ded135cc488ec961a53daf28f3b2bc7738501 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -53,6 +53,7 @@ typedef struct dap_chain_atom_iter{
     void * _inheritor;
 } dap_chain_atom_iter_t;
 
+
 typedef enum dap_chain_atom_verify_res{
     ATOM_ACCEPT=0,
     ATOM_PASS=1,
@@ -97,9 +98,6 @@ typedef enum dap_chain_type
     CHAIN_TYPE_CA,
     CHAIN_TYPE_SIGNER,
     CHAIN_TYPE_LAST
-    // CHAIN_TYPE_256_TOKEN, // 256
-    // CHAIN_TYPE_256_EMISSION, // 256
-    // CHAIN_TYPE_256_TX, // 256
 } dap_chain_type_t;
 
 typedef struct dap_chain{
@@ -187,5 +185,5 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger,const char * a_chai
 
 void dap_chain_delete(dap_chain_t * a_chain);
 void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg);
-dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size, dap_chain_cell_id_t a_cell_id);
-bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash, dap_chain_cell_id_t a_cell_id);
+dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
+bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cel_id);
diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h
index aa8fc05e8c91ed891fd549652f3caf7af90f4998..d88df0abbbc2b6498b39d7e2f80e8a40ff5f9daa 100644
--- a/modules/chain/include/dap_chain_ledger.h
+++ b/modules/chain/include/dap_chain_ledger.h
@@ -57,6 +57,8 @@ typedef bool (* dap_chain_ledger_verificator_callback_t)(dap_chain_tx_out_cond_t
 #define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS  -111
 // Error code for no emission for a transaction (candidate to threshold)
 #define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION  -112
+// Error code for no token for an emission (candidate to threshold)
+#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN     -113
 
 #define DAP_CHAIN_LEDGER_TOKENS_STR              "tokens"
 #define DAP_CHAIN_LEDGER_EMISSIONS_STR           "emissions"
@@ -120,14 +122,13 @@ int dap_chain_ledger_token_ticker_check(dap_ledger_t * a_ledger, const char *a_t
  *
  */
 
-int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token, size_t a_token_size);
-int dap_chain_ledger_token_load(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token, size_t a_token_size);
-int dap_chain_ledger_token_decl_add_check(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token);
+int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size);
+int dap_chain_ledger_token_load(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size);
+int dap_chain_ledger_token_decl_add_check(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token);
 dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger);
 /**
  * Add token emission datum
  */
-
 int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size);
 int dap_chain_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size);
 
@@ -160,7 +161,12 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_
 /**
  * Delete all transactions from the cache
  */
-void dap_chain_ledger_purge(dap_ledger_t *a_ledger);
+void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db);
+
+/**
+ * End of load mode with no chackes for incoming datums
+ */
+void dap_chain_ledger_load_end(dap_ledger_t *a_ledger);
 
 /**
  * Return number transactions from the cache
@@ -205,13 +211,13 @@ dap_chain_datum_tx_t* dap_chain_ledger_tx_cache_find_out_cond(dap_ledger_t *a_le
                                                               dap_chain_tx_out_cond_t **a_out_cond, int *a_out_cond_idx, char *a_token_ticker);
 
 // Get the value from all transactions in the cache with out_cond item
-uint64_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, dap_chain_addr_t *a_addr,
+uint256_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, dap_chain_addr_t *a_addr,
         dap_chain_tx_out_cond_t **tx_out_cond);
 
 // Get the list of 'out' items from previous transactions with summary value >= than a_value_need
 // 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,
-                                                       uint64_t a_value_need, uint64_t *a_value_transfer);
+                                                       uint256_t a_value_need, uint256_t *a_value_transfer);
 int dap_chain_ledger_verificator_rwlock_init(void);
 // 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);
diff --git a/modules/channel/chain-net-srv/CMakeLists.txt b/modules/channel/chain-net-srv/CMakeLists.txt
index 99175488200aa2962f42c06c1e8628b57a8731b2..08b1ea5c1996bb155320f30f87a658a9759dab1d 100644
--- a/modules/channel/chain-net-srv/CMakeLists.txt
+++ b/modules/channel/chain-net-srv/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_stream_ch_chain_net_srv)
 
 file(GLOB DAP_STREAM_CH_CHAIN_NET_SRV_SRCS *.c)
diff --git a/modules/channel/chain-net/CMakeLists.txt b/modules/channel/chain-net/CMakeLists.txt
index c7166b01ad46da9f45d0921c93ecac3a75e952af..66388711cbe54cde8c6fdd278b84965ecb5b744d 100644
--- a/modules/channel/chain-net/CMakeLists.txt
+++ b/modules/channel/chain-net/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_stream_ch_chain_net)
   
 file(GLOB DAP_STREAM_CH_CHAIN_NET_SRCS *.c)
diff --git a/modules/channel/chain-net/dap_stream_ch_chain_net.c b/modules/channel/chain-net/dap_stream_ch_chain_net.c
index 26ad6039af414d7ecac28bf899e8c6c095ddad43..ff6ba4a25cab33352db6f99374310c1cccd3f101 100644
--- a/modules/channel/chain-net/dap_stream_ch_chain_net.c
+++ b/modules/channel/chain-net/dap_stream_ch_chain_net.c
@@ -299,7 +299,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                                                           l_err_str,sizeof (l_err_str));
                         dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
                     } else {
-                        dap_chain_node_addr_t *l_addr_new = dap_chain_node_gen_addr(l_ch_chain_net_pkt->hdr.net_id);
+                        dap_chain_node_addr_t *l_addr_new = dap_chain_node_gen_addr(l_net->pub.id);
                         dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE ,
                                                          l_ch_chain_net_pkt->hdr.net_id, l_addr_new, sizeof (*l_addr_new));
                         dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
diff --git a/modules/channel/chain/CMakeLists.txt b/modules/channel/chain/CMakeLists.txt
index e5a850a5c789c625579eae5b7a10a7b34a78f699..c6aaf1368597bfeeab4ed58d09dd1d347a4117fa 100644
--- a/modules/channel/chain/CMakeLists.txt
+++ b/modules/channel/chain/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_stream_ch_chain)
   
 file(GLOB DAP_STREAM_CH_CHAIN_SRCS *.c)
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 006c0cbc372571a976aabc7167a90de6b342fdde..31e1601111f9a0744555e8572226e3c152611de9 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -308,6 +308,7 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a
     return true;
 }
 
+
 /**
  * @brief s_sync_out_gdb_first_gdb_worker_callback
  * @param a_worker
@@ -478,7 +479,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
     uint64_t l_atom_copy_size = l_pkt_item->pkt_data_size;
     dap_hash_fast(l_atom_copy, l_atom_copy_size, &l_atom_hash);
     size_t l_atom_size = 0;
-    if (dap_chain_get_atom_by_hash(l_chain, &l_atom_hash, &l_atom_size, l_sync_request->request_hdr.cell_id)) {
+    if (dap_chain_get_atom_by_hash(l_chain, &l_atom_hash, &l_atom_size)) {
         if (s_debug_more){
             char l_atom_hash_str[72] = {'\0'};
             dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 );
diff --git a/modules/common/CMakeLists.txt b/modules/common/CMakeLists.txt
index 7689148fe4e70b39da308ebeb5a88cb3f1bc875b..785170c91815e8a9ec72df3d1f8ac5c68e588a7b 100644
--- a/modules/common/CMakeLists.txt
+++ b/modules/common/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_common)
   
 file(GLOB DAP_CHAIN_COMMON_SRCS  *.c)
diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c
index 0a1409b07a81529c0e8b9c40a06aaff3c7cadb93..a0a9fafc2dc013ed513110a7994380d9e48e0355 100644
--- a/modules/common/dap_chain_common.c
+++ b/modules/common/dap_chain_common.c
@@ -58,43 +58,6 @@ size_t dap_chain_hash_slow_to_str( dap_chain_hash_slow_t *a_hash, char *a_str, s
     return strlen(a_str);
 }
 
-/**
- * @brief dap_chain_hash_fast_to_str
- * @param a_hash
- * @param a_str
- * @param a_str_max
- * @return
- */
-#if 0
-size_t dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash, char *a_str, size_t a_str_max )
-{
-    const size_t c_hash_str_size = sizeof(*a_hash) * 2 + 1 /*trailing zero*/+ 2 /* heading 0x */;
-
-    if ( a_str_max < c_hash_str_size ) {
-      log_it( L_ERROR, "String for hash too small, need %u but have only %u", c_hash_str_size, a_str_max );
-    }
-
-//    size_t i;
-    // faster conversion to string
-
-    dap_snprintf( a_str, 3, "0x" );
-
-    size_t l_ret = dap_bin2hex(a_str + 2, a_hash->raw, sizeof(a_hash->raw));
-
-    //for(i = 0; i < sizeof(a_hash->raw); ++i)
-    //    dap_snprintf(a_str + i * 2 + 2, 3, "%02x", (a_hash->raw[i]));
-
-    a_str[c_hash_str_size - 1] = '\0';
-
-    if(!l_ret)
-        return 0;
-
-    return c_hash_str_size - 1; //strlen(a_str);
-}
-#endif
-
-
-
 /**
  * @brief dap_chain_addr_to_str
  * @param a_addr
@@ -146,38 +109,10 @@ dap_chain_net_id_t dap_chain_net_id_from_str(const char * a_net_str)
     log_it(L_DEBUG, "net id: %s", a_net_str);
 
     a_net_str += 2;
-    /*size_t l_net_str_len = strlen( a_net_str);
-    if (l_net_str_len >2){
-        a_net_str+=2;
-        l_net_str_len-=2;
-        if (l_net_str_len == sizeof (l_ret)/2 ){
-            size_t l_pos =0;
-            char l_byte[3];
-            while(l_net_str_len){
-                // Copy two characters for bytes
-                memcpy(l_byte,a_net_str,2);
-                l_byte[2]='\0';
-                // Read byte chars
-                if ( sscanf(l_byte,"%02hhx",&l_ret.raw[l_pos] ) != 1)
-                    if( sscanf(l_byte,"%02hhX",&l_ret.raw[l_pos] ) ==1 )
-                        break;
-
-                // Update pos
-                l_pos++;
-                // Reduce in two steps to not to break if input will have bad input
-                l_net_str_len-=1;
-                if(l_net_str_len)
-                    l_net_str_len-=1;
-            }
-        }else
-            log_it(L_WARNING,"Wrong input string \"%s\" not recognized as network id", a_net_str);
-    } */
-
-    if (!(l_ret.uint64 = strtol(a_net_str, NULL, 0))) {
+    if (!(l_ret.uint64 = strtoll(a_net_str, NULL, 0))) {
         log_it(L_ERROR, "Wrong input string \"%s\" not recognized as network id", a_net_str);
         return l_ret;
     }
-    //dap_stpcpy(&l_ret.raw, a_net_str);
     return l_ret;
 }
 
@@ -282,15 +217,6 @@ int dap_chain_addr_check_sum(const dap_chain_addr_t *a_addr)
     return -1;
 }
 
-// 256
-uint128_t dap_chain_uint128_from_uint256(uint256_t a_from)
-{
-    if ( !( EQUAL_128(a_from.hi, uint128_0) ) ) {
-        log_it(L_ERROR, "Can't convert to uint128_t. It's too big.");
-    }
-    return a_from.lo;
-}
-
 uint64_t dap_chain_uint128_to(uint128_t a_from)
 {
 #ifdef DAP_GLOBAL_IS_INT128
@@ -306,22 +232,32 @@ uint64_t dap_chain_uint128_to(uint128_t a_from)
 #endif
 }
 
-// 256
 uint64_t dap_chain_uint256_to(uint256_t a_from)
 {
-    return dap_chain_uint128_to(a_from.lo);
+#ifdef DAP_GLOBAL_IS_INT128
+    if (a_from.hi || a_from.lo > UINT64_MAX) {
+        log_it(L_ERROR, "Can't convert balance to uint64_t. It's too big.");
+    }
+    return (uint64_t)a_from.lo;
+#else
+    if (!IS_ZERO_128(a_from.hi) || a_from.lo.hi {
+        log_it(L_ERROR, "Can't convert balance to uint64_t. It's too big.");
+    }
+    return a_from.lo.lo;
+#endif
 }
 
-// for tests
-char *dap_chain_u256tostr(uint256_t v_256)
+// 256
+uint128_t dap_chain_uint128_from_uint256(uint256_t a_from)
 {
-    //char *dest = malloc(130 * sizeof(char));
-    //return strcpy(dest, dap_utoa128((char[130]){}, dap_chain_uint128_from_uint256(v_256), 10));
-    return dap_chain_balance_print(dap_chain_uint128_from_uint256(v_256));
+    if ( !( EQUAL_128(a_from.hi, uint128_0) ) ) {
+        log_it(L_ERROR, "Can't convert to uint128_t. It's too big.");
+    }
+    return a_from.lo;
 }
 
 
-char *dap_chain_balance_print(uint128_t a_balance)
+char *dap_chain_balance_print128(uint128_t a_balance)
 {
     char *l_buf = DAP_NEW_Z_SIZE(char, DATOSHI_POW + 3);
     int l_pos = 0;
@@ -358,9 +294,15 @@ char *dap_chain_balance_print(uint128_t a_balance)
     return l_buf;
 }
 
-char *dap_chain_balance_to_coins(uint128_t a_balance)
+char *dap_chain_balance_print(uint256_t a_balance)
 {
-    char *l_buf = dap_chain_balance_print(a_balance);
+    return dap_chain_balance_print128(a_balance.lo);
+}
+
+
+char *dap_chain_balance_to_coins128(uint128_t a_balance)
+{
+    char *l_buf = dap_chain_balance_print128(a_balance);
     int l_strlen = strlen(l_buf);
     int l_pos;
     if (l_strlen > DATOSHI_DEGREE) {
@@ -378,6 +320,11 @@ char *dap_chain_balance_to_coins(uint128_t a_balance)
     return l_buf;
 }
 
+char *dap_chain_balance_to_coins(uint256_t a_balance)
+{
+    return dap_chain_balance_to_coins128(a_balance.lo);
+}
+
 const union { uint64_t u64[2]; uint32_t u32[4]; } DAP_ALIGN_PACKED c_pow10[DATOSHI_POW + 1] = {
     { .u64 = {0,                         1ULL} },                          // 0
     { .u64 = {0,                         10ULL} },                         // 1
@@ -420,7 +367,7 @@ const union { uint64_t u64[2]; uint32_t u32[4]; } DAP_ALIGN_PACKED c_pow10[DATOS
     { .u64 = {5421010862427522170ULL,    687399551400673280ULL} }          // 38
 };
 
-uint128_t dap_chain_balance_scan(char *a_balance)
+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;
@@ -477,7 +424,13 @@ uint128_t dap_chain_balance_scan(char *a_balance)
     return l_ret;
 }
 
-uint128_t dap_chain_coins_to_balance(char *a_coins)
+uint256_t dap_chain_balance_scan(const char *a_balance)
+{
+    return GET_256_FROM_128(dap_chain_balance_scan128(a_balance));
+}
+
+
+uint128_t dap_chain_coins_to_balance128(const char *a_coins)
 {
     uint128_t l_ret = uint128_0, l_nul = uint128_0;
     if (strlen(a_coins) > DATOSHI_POW + 2) {
@@ -513,8 +466,12 @@ uint128_t dap_chain_coins_to_balance(char *a_coins)
         l_buf[l_pos + i] = '0';
     }
     l_buf[l_pos + i] = '\0';
-    l_ret = dap_chain_balance_scan(l_buf);
+    l_ret = dap_chain_balance_scan128(l_buf);
     DAP_DELETE(l_buf);
     return l_ret;
 }
 
+uint256_t dap_chain_coins_to_balance(const char *a_coins)
+{
+    return GET_256_FROM_128(dap_chain_coins_to_balance128(a_coins));
+}
diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c
index dd1da5ab30a840b70b5420351882fb55520b175d..1263cd4bac58ed4f6db4b77c46f3d59e8e94fa5d 100644
--- a/modules/common/dap_chain_datum_token.c
+++ b/modules/common/dap_chain_datum_token.c
@@ -61,12 +61,11 @@ const char *c_dap_chain_datum_token_flag_str[] = {
  * @param a_token_size
  * @return
  */
-dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size_t a_token_size)
+dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t *a_token, size_t a_token_size)
 {
     // Check if token type could have tsd section
-    size_t l_hdr_size = sizeof(*a_token);
     size_t l_tsd_size;
-
+    size_t l_hdr_size = sizeof(dap_chain_datum_token_old_t);
     if (l_hdr_size > a_token_size){
         log_it(L_WARNING, "Token size smaller then header, corrupted data");
         return NULL;
@@ -74,13 +73,15 @@ dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size
 
     switch( a_token->type){
         case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256
+            l_hdr_size = sizeof(dap_chain_datum_token_t);
         case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL:
             l_tsd_size = a_token->header_private_decl.tsd_total_size;
-        break;
+            break;
         case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256
+            l_hdr_size = sizeof(dap_chain_datum_token_t);
         case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
             l_tsd_size = a_token->header_private_update.tsd_total_size;
-        break;
+            break;
         default: return NULL;
     }
 
@@ -117,7 +118,8 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(byte_t *a_token_serial, size
         memcpy(l_token_old, a_token_serial, (*a_token_size));
         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);
-        strncpy(l_token->ticker, l_token_old->ticker, sizeof(l_token_old->ticker) );
+        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);
 
@@ -229,15 +231,18 @@ dap_sign_t ** dap_chain_datum_token_simple_signs_parse(dap_chain_datum_token_t *
     assert(a_datum_token);
     assert(a_signs_total);
     assert(a_signs_valid);
-    assert( a_datum_token_size >= sizeof (a_datum_token));
+    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->header_private.signs_total );
     *a_signs_total=0;
     *a_signs_valid = a_datum_token->header_private.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);
 
-    while( l_offset < (a_datum_token_size-sizeof (a_datum_token) ) && n < a_datum_token->header_private.signs_total ) {
-        dap_sign_t *l_sign = (dap_sign_t *) ( a_datum_token->data_n_tsd + l_offset);
+    while( l_offset < (a_datum_token_size - l_signs_offset) && n < a_datum_token->header_private.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");
diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c
index 7cb301e07ef4e52224811c88d729e213e4b10a9b..ef4b6934d2219b23a8389f909f6f64a49f689651 100644
--- a/modules/common/dap_chain_datum_tx.c
+++ b/modules/common/dap_chain_datum_tx.c
@@ -104,34 +104,14 @@ int dap_chain_datum_tx_add_in_item(dap_chain_datum_tx_t **a_tx, dap_chain_hash_f
  *
  * return summary value from inserted items
  */
-uint64_t dap_chain_datum_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out)
+uint256_t dap_chain_datum_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out)
 {
     dap_list_t *l_list_tmp = a_list_used_out;
-    uint64_t l_value_to_items = 0; // how many datoshi to transfer
+    uint256_t l_value_to_items = {}; // how many datoshi to transfer
     while (l_list_tmp) {
-        list_used_item_t *item = l_list_tmp->data;
-        if (dap_chain_datum_tx_add_in_item(a_tx, &item->tx_hash_fast, item->num_idx_out) == 1) {
-            l_value_to_items += item->value;
-        }
-        l_list_tmp = dap_list_next(l_list_tmp);
-    }
-    return l_value_to_items;
-}
-
-// 256
-uint256_t dap_chain_datum_256_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out)
-{
-    dap_list_t *l_list_tmp = a_list_used_out;
-    uint256_t l_value_to_items = uint256_0; // how many datoshi to transfer
-    while (l_list_tmp) {
-        list_used_item_256_t *item = l_list_tmp->data;
-        if (dap_chain_datum_tx_add_in_item(a_tx, &item->tx_hash_fast, item->num_idx_out) == 1) {
-            //l_value_to_items += item->value;
-            int overflow_flag = SUM_256_256(l_value_to_items, item->value, &l_value_to_items);
-            if ( overflow_flag > 0 ) {
-                log_it(L_ERROR,"overflow sum 256 256");
-            }
-
+        list_used_item_t *l_item = l_list_tmp->data;
+        if (dap_chain_datum_tx_add_in_item(a_tx, &l_item->tx_hash_fast, l_item->num_idx_out) == 1) {
+            SUM_256_256(l_value_to_items, l_item->value, &l_value_to_items);
         }
         l_list_tmp = dap_list_next(l_list_tmp);
     }
@@ -139,7 +119,6 @@ uint256_t dap_chain_datum_256_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, d
 }
 
 
-
 /**
  * @brief dap_chain_datum_tx_add_in_cond_item
  * @param a_tx
@@ -168,21 +147,9 @@ int dap_chain_datum_tx_add_in_cond_item(dap_chain_datum_tx_t **a_tx, dap_chain_h
  *
  * return 1 Ok, -1 Error
  */
-int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint64_t a_value)
-{
-    dap_chain_tx_out_t *l_tx_out = dap_chain_datum_tx_item_out_create(a_addr, a_value);
-    if(l_tx_out) {
-        dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out);
-        DAP_DELETE(l_tx_out);
-        return 1;
-    }
-    return -1;
-}
-
-// 256
-int dap_chain_datum_256_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value)
+int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value)
 {
-    dap_chain_256_tx_out_t *l_tx_out = dap_chain_datum_tx_item_256_out_create(a_addr, a_value);
+    dap_chain_256_tx_out_t *l_tx_out = dap_chain_datum_tx_item_out_create(a_addr, a_value);
     if(l_tx_out) {
         dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out);
         DAP_DELETE(l_tx_out);
@@ -196,7 +163,7 @@ int dap_chain_datum_256_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_c
  *
  * return 1 Ok, -1 Error
  */
-int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint64_t a_value, const char *a_token)
+int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
 {
     dap_chain_tx_out_ext_t *l_tx_out = dap_chain_datum_tx_item_out_ext_create(a_addr, a_value, a_token);
     if(l_tx_out) {
@@ -207,40 +174,15 @@ int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_c
     return -1;
 }
 
-// 256
-int dap_chain_datum_256_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
-{
-    dap_chain_256_tx_out_ext_t *l_tx_out = dap_chain_datum_tx_item_256_out_ext_create(a_addr, a_value, a_token);
-    if(l_tx_out) {
-        dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out);
-        DAP_DELETE(l_tx_out);
-        return 1;
-    }
-    return -1;
-}
 /**
  * Create 'out_cond' item and insert to transaction
  *
  * return 1 Ok, -1 Error
  */
 int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size)
-{
-    dap_chain_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_pay(
-                a_key, a_srv_uid,a_value, a_value_max_per_unit, a_unit, a_cond, a_cond_size );
-    if(l_tx_out) {
-        dap_chain_datum_tx_add_item(a_tx, (const uint8_t *) l_tx_out);
-        DAP_DELETE(l_tx_out);
-        return 1;
-    }
-    return -1;
-}
-
-// 256
-int dap_chain_datum_256_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
         uint256_t a_value, uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size)
 {
-    dap_chain_256_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_256_out_cond_create_srv_pay(
+    dap_chain_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_pay(
                 a_key, a_srv_uid,a_value, a_value_max_per_unit, a_unit, a_cond, a_cond_size );
     if(l_tx_out) {
         dap_chain_datum_tx_add_item(a_tx, (const uint8_t *) l_tx_out);
diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c
index 59b64a3aeec1a30a13928e545a209f7de3d69820..bf418dedec23cde728554304a1779afc8c511a65 100644
--- a/modules/common/dap_chain_datum_tx_items.c
+++ b/modules/common/dap_chain_datum_tx_items.c
@@ -66,6 +66,7 @@ static size_t dap_chain_256_tx_out_get_size(const dap_chain_256_tx_out_t *a_item
     return size;
 }
 
+// 256
 static size_t dap_chain_tx_out_ext_get_size(const dap_chain_tx_out_ext_t *a_item)
 {
     (void) a_item;
@@ -73,26 +74,11 @@ static size_t dap_chain_tx_out_ext_get_size(const dap_chain_tx_out_ext_t *a_item
     return size;
 }
 
-// 256
-static size_t dap_chain_256_tx_out_ext_get_size(const dap_chain_256_tx_out_ext_t *a_item)
-{
-    (void) a_item;
-    size_t size = sizeof(dap_chain_256_tx_out_ext_t);
-    return size;
-}
-
 static size_t dap_chain_tx_out_cond_get_size(const dap_chain_tx_out_cond_t *a_item)
 {
     return sizeof(dap_chain_tx_out_cond_t) + a_item->params_size;
 }
 
-// 256
-static size_t dap_chain_256_tx_out_cond_get_size(const dap_chain_256_tx_out_cond_t *a_item)
-{
-    return sizeof(dap_chain_256_tx_out_cond_t) + a_item->params_size;
-}
-
-
 static size_t dap_chain_tx_pkey_get_size(const dap_chain_tx_pkey_t *a_item)
 {
     size_t size = sizeof(dap_chain_tx_pkey_t) + a_item->header.sig_size;
@@ -140,29 +126,22 @@ size_t dap_chain_datum_item_tx_get_size(const uint8_t *a_item)
     case TX_ITEM_TYPE_OUT: // Transaction outputs
         size = dap_chain_tx_out_get_size((const dap_chain_tx_out_t*) a_item);
         break;
-    case TX_ITEM_TYPE_256_OUT: // 256
+    case TX_ITEM_TYPE_OUT_256: // 256
         size = dap_chain_256_tx_out_get_size((const dap_chain_256_tx_out_t*) a_item);
         break;
-    case TX_ITEM_TYPE_OUT_EXT:
+    case TX_ITEM_TYPE_OUT_EXT: // Exchange transaction outputs
         size = dap_chain_tx_out_ext_get_size((const dap_chain_tx_out_ext_t*) a_item);
         break;
-    case TX_ITEM_TYPE_256_OUT_EXT: // 256
-        size = dap_chain_256_tx_out_ext_get_size((const dap_chain_256_tx_out_ext_t*) a_item);
-        break;
     case TX_ITEM_TYPE_RECEIPT: // Receipt
         size = dap_chain_datum_tx_receipt_get_size((const dap_chain_datum_tx_receipt_t*) a_item);
-        break; 
-    case TX_ITEM_TYPE_256_RECEIPT: // 256
-        size = dap_chain_datum_tx_receipt_get_size((const dap_chain_datum_tx_receipt_t*) a_item);
-        break; 
     case TX_ITEM_TYPE_IN_COND: // Transaction inputs with condition
         size = dap_chain_tx_in_cond_get_size((const dap_chain_tx_in_cond_t*) a_item);
         break;
     case TX_ITEM_TYPE_OUT_COND: // Transaction output with condition
-        size = dap_chain_tx_out_cond_get_size((const dap_chain_tx_out_cond_t*) a_item);
+        size = 0; // obsolete dap_chain_tx_out_cond_get_size((const dap_chain_tx_out_cond_t*) a_item);
         break;
-    case TX_ITEM_TYPE_256_OUT_COND: // 256
-        size = dap_chain_256_tx_out_cond_get_size((const dap_chain_256_tx_out_cond_t*) a_item);
+    case TX_ITEM_TYPE_OUT_256_COND: // 256
+        size = dap_chain_tx_out_cond_get_size((const dap_chain_tx_out_cond_t *)a_item);
         break;
     case TX_ITEM_TYPE_PKEY: // Transaction public keys
         size = dap_chain_tx_pkey_get_size((const dap_chain_tx_pkey_t*) a_item);
@@ -173,9 +152,6 @@ size_t dap_chain_datum_item_tx_get_size(const uint8_t *a_item)
     case TX_ITEM_TYPE_TOKEN: // token item
         size = dap_chain_tx_token_get_size((const dap_chain_tx_token_t*) a_item);
         break;
-    case TX_ITEM_TYPE_256_TOKEN: // token item
-        size = dap_chain_tx_token_get_size((const dap_chain_tx_token_t*) a_item);
-        break;
     default:
         return 0;
     }
@@ -197,17 +173,6 @@ dap_chain_tx_token_t* dap_chain_datum_tx_item_token_create(dap_chain_hash_fast_t
     strncpy(l_item->header.ticker, a_ticker, sizeof(l_item->header.ticker) - 1);
     return l_item;
 }
-// 256
-dap_chain_tx_token_t* dap_chain_datum_tx_item_256_token_create(dap_chain_hash_fast_t * a_datum_token_hash,const char * a_ticker)
-{
-    if(!a_ticker)
-        return NULL;
-    dap_chain_tx_token_t *l_item = DAP_NEW_Z(dap_chain_tx_token_t);
-    l_item->header.type = TX_ITEM_TYPE_256_TOKEN;
-    memcpy (& l_item->header.token_emission_hash, a_datum_token_hash, sizeof ( *a_datum_token_hash ) );
-    strncpy(l_item->header.ticker, a_ticker, sizeof(l_item->header.ticker) - 1);
-    return l_item;
-}
 
 /**
  * Create item dap_chain_tx_out_t
@@ -250,30 +215,18 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint64_t a_value)
-{
-    if(!a_addr)
-        return NULL;
-    dap_chain_tx_out_t *l_item = DAP_NEW_Z(dap_chain_tx_out_t);
-    l_item->header.type = TX_ITEM_TYPE_OUT;
-    l_item->header.value = a_value;
-    memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t));
-    return l_item;
-}
-
-//256
-dap_chain_256_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value)
+dap_chain_256_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value)
 {
     if(!a_addr)
         return NULL;
     dap_chain_256_tx_out_t *l_item = DAP_NEW_Z(dap_chain_256_tx_out_t);
-    l_item->header.type = TX_ITEM_TYPE_256_OUT;
+    l_item->header.type = TX_ITEM_TYPE_OUT_256;
     l_item->header.value = a_value;
     memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t));
     return l_item;
 }
 
-dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint64_t a_value, const char *a_token)
+dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
 {
     if (!a_addr || !a_token)
         return NULL;
@@ -285,28 +238,15 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a
     return l_item;
 }
 
-//256
-dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_256_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
-{
-    if (!a_addr || !a_token)
-        return NULL;
-    dap_chain_256_tx_out_ext_t *l_item = DAP_NEW_Z(dap_chain_256_tx_out_ext_t);
-    l_item->header.type = TX_ITEM_TYPE_256_OUT_EXT;
-    l_item->header.value = a_value;
-    memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t));
-    strcpy(l_item->token, a_token);
-    return l_item;
-}
-
-
 /**
  * Create item dap_chain_tx_out_cond_t
  *
  * return item, NULL Error
  */
 dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint64_t a_value,uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
-                                                                 const void *a_params, size_t a_params_size)
+                                                                             uint256_t a_value, uint256_t a_value_max_per_unit,
+                                                                             dap_chain_net_srv_price_unit_uid_t a_unit,
+                                                                             const void *a_params, size_t a_params_size)
 {
     if(!a_key || !a_params)
         return NULL;
@@ -318,7 +258,7 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc
     if(l_item == NULL)
         return NULL;
 
-    l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
+    l_item->header.item_type = TX_ITEM_TYPE_OUT_256_COND;
     l_item->header.value = a_value;
     l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY; // By default creatre cond for service pay. Rework with smth more flexible
     l_item->subtype.srv_pay.srv_uid = a_srv_uid;
@@ -330,66 +270,15 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc
     return l_item;
 }
 
-// 256
-dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint256_t a_value,uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
-                                                                 const void *a_params, size_t a_params_size)
-{
-    if(!a_key || !a_params)
-        return NULL;
-    size_t l_pub_key_size = 0;
-    uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size);
-
-
-    dap_chain_256_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_256_tx_out_cond_t, sizeof(dap_chain_256_tx_out_cond_t) + a_params_size);
-    if(l_item == NULL)
-        return NULL;
-
-    l_item->header.item_type = TX_ITEM_TYPE_256_OUT_COND;
-    l_item->header.value = a_value;
-    l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY; // By default creatre cond for service pay. Rework with smth more flexible
-    l_item->subtype.srv_pay.srv_uid = a_srv_uid;
-    l_item->subtype.srv_pay.unit = a_unit;
-    l_item->subtype.srv_pay.unit_price_max_datoshi = a_value_max_per_unit;
-    dap_hash_fast( l_pub_key, l_pub_key_size, & l_item->subtype.srv_pay.pkey_hash);
-    l_item->params_size = (uint32_t)a_params_size;
-    memcpy(l_item->params, a_params, a_params_size);
-    return l_item;
-}
-
-
-
 dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_net_id,
-                                                                             const char *a_token, uint64_t a_value,
-                                                                             const void *a_params, uint32_t a_params_size)
-{
-    if (!a_token) {
-        return NULL;
-    }
-    dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size);
-    l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
-    l_item->header.value = a_value;
-    l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE;
-    l_item->subtype.srv_xchange.srv_uid = a_srv_uid;
-    l_item->subtype.srv_xchange.net_id = a_net_id;
-    strcpy(l_item->subtype.srv_xchange.token, a_token);
-    l_item->params_size = a_params_size;
-    if (a_params_size) {
-        memcpy(l_item->params, a_params, a_params_size);
-    }
-    return l_item;
-}
-
-// 256
-dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_256_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_net_id,
                                                                              const char *a_token, uint256_t a_value,
                                                                              const void *a_params, uint32_t a_params_size)
 {
     if (!a_token) {
         return NULL;
     }
-    dap_chain_256_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_256_tx_out_cond_t, sizeof(dap_chain_256_tx_out_cond_t) + a_params_size);
-    l_item->header.item_type = TX_ITEM_TYPE_256_OUT_COND;
+    dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size);
+    l_item->header.item_type = TX_ITEM_TYPE_OUT_256_COND;
     l_item->header.value = a_value;
     l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE;
     l_item->subtype.srv_xchange.srv_uid = a_srv_uid;
@@ -402,12 +291,12 @@ dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_256_out_cond_create_srv_xch
     return l_item;
 }
 
-dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value, long double a_fee_value,
+dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value,
                                                                            dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
                                                                            const void *a_params, uint32_t a_params_size)
 {
     dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size);
-    l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
+    l_item->header.item_type = TX_ITEM_TYPE_OUT_256_COND;
     l_item->header.value = a_value;
     l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE;
     l_item->subtype.srv_stake.srv_uid = a_srv_uid;
@@ -421,27 +310,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c
     return l_item;
 }
 
-// 256
-dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_256_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value,
-                                                                           dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
-                                                                           const void *a_params, uint32_t a_params_size)
-{
-    dap_chain_256_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_256_tx_out_cond_t, sizeof(dap_chain_256_tx_out_cond_t) + a_params_size);
-    l_item->header.item_type = TX_ITEM_TYPE_256_OUT_COND;
-    l_item->header.value = a_value;
-    l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE;
-    l_item->subtype.srv_stake.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));
-    l_item->params_size = a_params_size;
-    if (a_params_size) {
-        memcpy(l_item->params, a_params, a_params_size);
-    }
-    return l_item;
-}
-
-
 /**
  * Create item dap_chain_tx_sig_t
  *
@@ -505,11 +373,7 @@ uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_id
             if (a_type == TX_ITEM_TYPE_ANY || a_type == l_type ||
                     (a_type == TX_ITEM_TYPE_OUT_ALL && l_type == TX_ITEM_TYPE_OUT) ||
                     (a_type == TX_ITEM_TYPE_OUT_ALL && l_type == TX_ITEM_TYPE_OUT_COND) ||
-                    (a_type == TX_ITEM_TYPE_OUT_ALL && l_type == TX_ITEM_TYPE_OUT_EXT) ||
-                    (a_type == TX_ITEM_TYPE_OUT_ALL && l_type == TX_ITEM_TYPE_256_OUT) ||
-                    (a_type == TX_ITEM_TYPE_OUT_ALL && l_type == TX_ITEM_TYPE_256_OUT_COND) ||
-                    (a_type == TX_ITEM_TYPE_OUT_ALL && l_type == TX_ITEM_TYPE_256_OUT_EXT)
-                ) {
+                    (a_type == TX_ITEM_TYPE_OUT_ALL && l_type == TX_ITEM_TYPE_OUT_EXT)) {
                 if(a_item_idx_start)
                     *a_item_idx_start = l_item_idx;
                 if(a_item_out_size)
@@ -567,24 +431,3 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_out_cond_get(dap_chain_datum_tx_t *a
     }
     return l_res;
 }
-
-// 256
-dap_chain_256_tx_out_cond_t *dap_chain_datum_256_tx_out_cond_get(dap_chain_datum_tx_t *a_tx, int *a_out_num)
-{
-    dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT_ALL, NULL);
-    int l_prev_cond_idx = l_list_out_items ? 0 : -1;
-    dap_chain_256_tx_out_cond_t *l_res = NULL;
-    for (dap_list_t *l_list_tmp = l_list_out_items; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_prev_cond_idx++) {
-        if (*(uint8_t *)l_list_tmp->data == TX_ITEM_TYPE_256_OUT_COND) {
-            l_res = l_list_tmp->data;
-            break;
-        }
-    }
-    dap_list_free(l_list_out_items);
-    if (a_out_num) {
-        *a_out_num = l_prev_cond_idx;
-    }
-    return l_res;
-}
-
-
diff --git a/modules/common/dap_chain_datum_tx_receipt.c b/modules/common/dap_chain_datum_tx_receipt.c
index 66a4712322fd4b8f769fde168e5bcc57ae2dc96e..5e374016d46fb98952c1f535ecbcfd39b89d64bf 100644
--- a/modules/common/dap_chain_datum_tx_receipt.c
+++ b/modules/common/dap_chain_datum_tx_receipt.c
@@ -42,7 +42,7 @@
  */
 dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create( dap_chain_net_srv_uid_t a_srv_uid,
                                                                   dap_chain_net_srv_price_unit_uid_t a_units_type,
-                                                                    uint64_t a_units, uint64_t a_value_datoshi,
+                                                                    uint64_t a_units, uint256_t a_value_datoshi,
                                                                   const void * a_ext, size_t a_ext_size)
 {
     dap_chain_datum_tx_receipt_t * l_ret = DAP_NEW_Z_SIZE(dap_chain_datum_tx_receipt_t, dap_chain_datum_tx_receipt_get_size_hdr() +a_ext_size );
@@ -60,27 +60,6 @@ dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create( dap_chain_net_
     return  l_ret;
 }
 
-// 256
-dap_chain_datum_tx_receipt_t * dap_chain_datum_256_tx_receipt_create( dap_chain_net_srv_uid_t a_srv_uid,
-                                                                  dap_chain_net_srv_price_unit_uid_t a_units_type,
-                                                                    uint64_t a_units, uint256_t a_value_datoshi,
-                                                                  const void * a_ext, size_t a_ext_size)
-{
-    dap_chain_datum_tx_receipt_t * l_ret = DAP_NEW_Z_SIZE(dap_chain_datum_tx_receipt_t, dap_chain_datum_tx_receipt_get_size_hdr() +a_ext_size );
-    l_ret->type = TX_ITEM_TYPE_256_RECEIPT;
-    l_ret->receipt_info.units_type = a_units_type;
-    l_ret->receipt_info.srv_uid = a_srv_uid;
-    l_ret->receipt_info.units = a_units;
-    l_ret->receipt_info.value_datoshi_256 = a_value_datoshi;
-    l_ret->size = dap_chain_datum_tx_receipt_get_size_hdr()+a_ext_size;
-
-    if( a_ext_size && a_ext){
-        l_ret->exts_size = a_ext_size;
-        memcpy(l_ret->exts_n_signs, a_ext, a_ext_size);
-    }
-    return  l_ret;
-}
-
 size_t dap_chain_datum_tx_receipt_sign_add(dap_chain_datum_tx_receipt_t ** a_receipt, size_t a_receipt_size, dap_enc_key_t *a_key )
 {
     dap_chain_datum_tx_receipt_t *l_receipt = *a_receipt;
@@ -104,7 +83,6 @@ size_t dap_chain_datum_tx_receipt_sign_add(dap_chain_datum_tx_receipt_t ** a_rec
     return a_receipt_size;
 }
 
-
 /**
  * @brief dap_chain_datum_tx_receipt_sign_get
  * @param l_receipt
@@ -128,7 +106,6 @@ dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t * l
     return l_sign;
 }
 
-
 /**
  * @brief dap_chain_datum_tx_receipt_signs_count
  * @param a_receipt
diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h
index 35804fe06bbd42bbb584630708e2d2f0bee58bfb..f0050efad9427c58f7509a063ce310ca2719fab1 100644
--- a/modules/common/include/dap_chain_common.h
+++ b/modules/common/include/dap_chain_common.h
@@ -189,53 +189,38 @@ typedef union {
     serv_unit_enum_t enm;
 } dap_chain_net_srv_price_unit_uid_t;
 
-typedef enum dap_chain_tx_item_type {
+enum dap_chain_tx_item_type {
     TX_ITEM_TYPE_IN = 0x00, /// @brief  Transaction: inputs
 
     TX_ITEM_TYPE_OUT = 0x10, /// @brief  Transaction: outputs
     TX_ITEM_TYPE_OUT_EXT = 0x11,
-    TX_ITEM_TYPE_256_OUT = 0x12, // 256
-    TX_ITEM_TYPE_256_OUT_EXT = 0x13, // 256
+    TX_ITEM_TYPE_OUT_256 = 0x12, // 256
 
     TX_ITEM_TYPE_PKEY = 0x20,
     TX_ITEM_TYPE_SIG = 0x30,
     TX_ITEM_TYPE_TOKEN = 0x40,
     TX_ITEM_TYPE_TOKEN_EXT = 0x41,
 
-    TX_ITEM_TYPE_256_TOKEN = 0x42,
-    TX_ITEM_TYPE_256_TOKEN_EXT = 0x43,
-
     TX_ITEM_TYPE_IN_COND = 0x50, /// @brief  Transaction: conditon inputs
 
-    TX_ITEM_TYPE_OUT_COND = 0x60, /// @brief  Transaction: conditon outputs
-    TX_ITEM_TYPE_256_OUT_COND = 0x61, // 256
+    TX_ITEM_TYPE_OUT_COND = 0x60, // Obsolete
+    TX_ITEM_TYPE_OUT_256_COND = 0x61, /// @brief  Transaction: 256 bit conditon outputs
 
     TX_ITEM_TYPE_RECEIPT = 0x70,
-    TX_ITEM_TYPE_256_RECEIPT = 0x71,
 
     TX_ITEM_TYPE_OUT_ALL = 0xfe,
     TX_ITEM_TYPE_ANY = 0xff
-} dap_chain_tx_item_type_t;
+};
+typedef uint32_t dap_chain_tx_item_type_t;
 
 
 typedef struct dap_chain_receipt{
     dap_chain_net_srv_uid_t srv_uid; // Service UID
     dap_chain_net_srv_price_unit_uid_t units_type;
     uint64_t units; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
-    union {
-        uint64_t value_datoshi; // Receipt value
-        uint256_t value_datoshi_256;
-    };
+    uint256_t value_datoshi; // Receipt value
 } dap_chain_receipt_info_t;
 
-// 256
-// typedef struct dap_chain_256_receipt{
-//     dap_chain_net_srv_uid_t srv_uid; // Service UID
-//     dap_chain_net_srv_price_unit_uid_t units_type;
-//     uint64_t units; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
-//     uint256_t value_datoshi; // Receipt value
-// } dap_chain_256_receipt_info_t;
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -265,12 +250,6 @@ DAP_STATIC_INLINE uint64_t dap_chain_coins_to_datoshi(long double a_count)
 
 DAP_STATIC_INLINE uint128_t dap_chain_uint128_from(uint64_t a_from)
 {
-// #ifdef DAP_GLOBAL_IS_INT128
-//     return (uint128_t)a_from;
-// #else
-//     uint128_t l_ret = {{ .0, a_from}};
-//     return l_ret;
-// #endif
     uint128_t l_ret = uint128_0;
     ADD_64_INTO_128(a_from, &l_ret );
     return l_ret;
@@ -289,17 +268,21 @@ DAP_STATIC_INLINE uint256_t dap_chain_uint256_from(uint64_t a_from)
     return l_ret_256;
 }
 
+DAP_STATIC_INLINE uint256_t dap_chain_uint256_from_uint128(uint128_t a_from)
+{
+    uint256_t l_ret_256 = uint256_0;
+    ADD_128_INTO_256(a_from, &l_ret_256);
+    return l_ret_256;
+}
+
 uint64_t dap_chain_uint128_to(uint128_t a_from);
 // 256
 uint64_t dap_chain_uint256_to(uint256_t a_from);
 
-char *dap_chain_u256tostr(uint256_t v);
-
-
-char *dap_chain_balance_print(uint128_t a_balance);
-char *dap_chain_balance_to_coins(uint128_t a_balance);
-uint128_t dap_chain_balance_scan(char *a_balance);
-uint128_t dap_chain_coins_to_balance(char *a_coins);
+char *dap_chain_balance_print(uint256_t a_balance);
+char *dap_chain_balance_to_coins(uint256_t a_balance);
+uint256_t dap_chain_balance_scan(const char *a_balance);
+uint256_t dap_chain_coins_to_balance(const char *a_coins);
 
 /**
  * @brief dap_chain_hash_to_str
diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h
index 042789f2d47e2a2863e822494942eaa774343243..0b112fa6b1eb23f27bcf49693dcaa4294b11d38d 100644
--- a/modules/common/include/dap_chain_datum.h
+++ b/modules/common/include/dap_chain_datum.h
@@ -31,13 +31,12 @@
 #define DAP_CHAIN_DATUM_VERSION 0x00
 
 /// End section, means all the rest of the block is empty
-#define DAP_CHAIN_DATUM_BLOCK_END                 0x0000
+#define DAP_CHAIN_DATUM_BLOCK_END           0x0000
 /// Section with additional roots, for example transaction roots
-#define DAP_CHAIN_DATUM_BLOCK_ROOTS 0x0001
+#define DAP_CHAIN_DATUM_BLOCK_ROOTS         0x0001
 
 /// Transaction header section
 #define DAP_CHAIN_DATUM_TX                  0x0100
-#define DAP_CHAIN_DATUM_256_TX              0x0101 // 256
 
 /// Transaction request section
 #define DAP_CHAIN_DATUM_TX_REQUEST          0x0300
@@ -60,9 +59,7 @@
 /// Token
 /// Simple token decl
 #define DAP_CHAIN_DATUM_TOKEN_DECL           0xf000
-#define DAP_CHAIN_DATUM_256_TOKEN_DECL       0xf001 // 256
 #define DAP_CHAIN_DATUM_TOKEN_EMISSION       0xf100
-#define DAP_CHAIN_DATUM_256_TOKEN_EMISSION   0xf101 // 256
 #define DAP_CHAIN_DATUM_TOKEN_DISMISSAL      0xf200
 
 #define DAP_CHAIN_DATUM_CUSTOM               0xffff
@@ -71,8 +68,6 @@
     switch (t) {                            \
         case DAP_CHAIN_DATUM_TX:            \
             s = "DATUM_TX"; break;          \
-        case DAP_CHAIN_DATUM_256_TX:            \
-            s = "DATUM_256_TX"; break;          \
         case DAP_CHAIN_DATUM_TX_REQUEST:    \
             s = "DATUM_WASM_CODE"; break;   \
         case DAP_CHAIN_DATUM_WASM_CODE:     \
@@ -91,12 +86,8 @@
             s = "DATUM_CUSTOM"; break;      \
         case DAP_CHAIN_DATUM_TOKEN_DECL:    \
             s = "DATUM_TOKEN_DECL"; break;  \
-        case DAP_CHAIN_DATUM_256_TOKEN_DECL:    \
-            s = "DATUM_256_TOKEN_DECL"; break;  \
         case DAP_CHAIN_DATUM_TOKEN_EMISSION:\
             s = "DATUM_TOKEN_EMISSION"; break;\
-        case DAP_CHAIN_DATUM_256_TOKEN_EMISSION:\
-            s = "DATUM_256_TOKEN_EMISSION"; break;\
         default:                            \
             s = "DATUM_UNKNOWN"; break;     \
 }
diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h
index 53939e98082797f9f3514dd14a77aa359875a4b3..a0c717d0ced770686f6768d0d193243bf8deb4ae 100644
--- a/modules/common/include/dap_chain_datum_token.h
+++ b/modules/common/include/dap_chain_datum_token.h
@@ -98,6 +98,7 @@ typedef struct dap_chain_datum_token{
             dap_chain_addr_t premine_address;
             uint32_t flags;
         } DAP_ALIGN_PACKED header_public;
+        byte_t free_space[256]; // For future changes
     };
     byte_t data_n_tsd[]; // Signs and/or types-size-data sections
 } DAP_ALIGN_PACKED dap_chain_datum_token_t;
@@ -114,13 +115,13 @@ typedef struct dap_chain_datum_token{
 
 // 256
 // Simple private token decl
-#define DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE           0x0005
+#define DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE               0x0005
 // Extended declaration of privatetoken with in-time control
-#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL     0x0006
+#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL         0x0006
 // Token update
-#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE   0x0007
+#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE       0x0007
 // Open token with now ownership
-#define DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC           0x0008
+#define DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC               0x0008
 
 
 // Macros for token flags
@@ -267,7 +268,6 @@ typedef struct dap_chain_datum_token_emission{
             uint256_t value_256;
         };
         uint8_t nonce[DAP_CHAIN_DATUM_NONCE_SIZE];
-        // bool type_256; // emission 256
     } DAP_ALIGN_PACKED hdr;
     union {
         struct {
@@ -276,10 +276,7 @@ typedef struct dap_chain_datum_token_emission{
             uint64_t lock_time;
         } DAP_ALIGN_PACKED type_presale;
         struct {
-            union {
-                uint64_t value_start;// Default value. Static if nothing else is defined
-                uint256_t value_start_256;
-            };
+            uint64_t value_start;// Default value. Static if nothing else is defined
             char value_change_algo_codename[32];
         } DAP_ALIGN_PACKED type_atom_owner;
         struct {
diff --git a/modules/common/include/dap_chain_datum_tx.h b/modules/common/include/dap_chain_datum_tx.h
index 8c569f03caadd77a89d5a11184bba765af8ac22d..c6b9c79f3d4e87c4fa817ab9586eea1d93714067 100644
--- a/modules/common/include/dap_chain_datum_tx.h
+++ b/modules/common/include/dap_chain_datum_tx.h
@@ -79,11 +79,7 @@ int dap_chain_datum_tx_add_item(dap_chain_datum_tx_t **a_tx, const uint8_t *a_it
  *
  * return summary value from inserted items
  */
-uint64_t dap_chain_datum_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out);
-
-// 256
-uint256_t dap_chain_datum_256_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out);
-
+uint256_t dap_chain_datum_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out);
 
 /**
  * Create 'in' item and insert to transaction
@@ -108,10 +104,7 @@ int dap_chain_datum_tx_add_in_cond_item(dap_chain_datum_tx_t **a_tx, dap_chain_h
  *
  * return 1 Ok, -1 Error
  */
-int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint64_t a_value);
-
-// 256
-int dap_chain_datum_256_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value);
+int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value);
 
 /**
  * Create 'out'_ext item and insert to transaction
@@ -119,10 +112,6 @@ int dap_chain_datum_256_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_c
  * return 1 Ok, -1 Error
  */
 int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr,
-                                        uint64_t a_value, const char *a_token);
-
-// 256
-int dap_chain_datum_256_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr,
                                         uint256_t a_value, const char *a_token);
 
 /**
@@ -131,10 +120,6 @@ int dap_chain_datum_256_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const d
  * return 1 Ok, -1 Error
  */
 int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size);
-
-//256
-int dap_chain_datum_256_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
         uint256_t a_value, uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size);
 
 /**
diff --git a/modules/common/include/dap_chain_datum_tx_in.h b/modules/common/include/dap_chain_datum_tx_in.h
index aabdc298bbaee6eab61d81d83f380e7a4ee1378b..b9fcbc2801aacc75ed0ed7b8dc6f273e8e9cf166 100644
--- a/modules/common/include/dap_chain_datum_tx_in.h
+++ b/modules/common/include/dap_chain_datum_tx_in.h
@@ -34,7 +34,7 @@
 
 typedef struct dap_chain_tx_in{
     struct {
-        dap_chain_tx_item_type_t type:8; /// @param    type            @brief Transaction item type
+        dap_chain_tx_item_type_t type; /// @param    type            @brief Transaction item type
         dap_chain_hash_fast_t tx_prev_hash; /// @param tx_prev_hash    @brief Hash of the previous transaction. 0 for generation TX
         uint32_t tx_out_prev_idx; ///      @param   tx_prev_idx     @brief Previous tx_out index. 0 for generation TX
 //        dap_sign_type_t sig_type; /// Signature type
@@ -45,18 +45,8 @@ typedef struct dap_chain_tx_in{
 } DAP_ALIGN_PACKED dap_chain_tx_in_t;
 
 typedef struct list_used_item {
-    dap_chain_hash_fast_t tx_hash_fast;
-    uint32_t num_idx_out;
-    uint8_t padding[4];
-    uint64_t value;
-//dap_chain_tx_out_t *tx_out;
-} list_used_item_t;
-
-// 256
-typedef struct list_used_item_256 {
     dap_chain_hash_fast_t tx_hash_fast;
     uint32_t num_idx_out;
     uint8_t padding[4];
     uint256_t value;
-//dap_chain_tx_out_t *tx_out;
-} list_used_item_256_t;
+} list_used_item_t;
diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h
index 216577aaa75a3bc8307ab9bee6f91d8f10957888..c06d9abd9e1b50a51ad9ff8b3123e2f8a92f087d 100644
--- a/modules/common/include/dap_chain_datum_tx_items.h
+++ b/modules/common/include/dap_chain_datum_tx_items.h
@@ -53,25 +53,19 @@ DAP_STATIC_INLINE const char * dap_chain_datum_tx_item_type_to_str(dap_chain_tx_
     switch(a_item_type){
         case TX_ITEM_TYPE_IN: return "TX_ITEM_TYPE_IN";
         case TX_ITEM_TYPE_OUT: return "TX_ITEM_TYPE_OUT";
-        case TX_ITEM_TYPE_256_OUT: return "TX_ITEM_TYPE_256_OUT"; // 256
-        case TX_ITEM_TYPE_OUT_EXT: return "TX_ITEM_TYPE_OUT_EXT";
-        case TX_ITEM_TYPE_256_OUT_EXT: return "TX_ITEM_TYPE_256_OUT_EXT"; // 256
+        case TX_ITEM_TYPE_OUT_256: return "TX_ITEM_TYPE_OUT_256"; // 256
+        case TX_ITEM_TYPE_OUT_EXT: return "TX_ITEM_TYPE_OUT_EXT"; // 256
         case TX_ITEM_TYPE_PKEY: return "TX_ITEM_TYPE_PKEY";
         case TX_ITEM_TYPE_SIG: return "TX_ITEM_TYPE_SIG";
         case TX_ITEM_TYPE_TOKEN: return "TX_ITEM_TYPE_TOKEN";
-        case TX_ITEM_TYPE_256_TOKEN: return "TX_ITEM_TYPE_256_TOKEN"; // 256
         case TX_ITEM_TYPE_TOKEN_EXT: return "TX_ITEM_TYPE_TOKEN_EXT";
-        case TX_ITEM_TYPE_256_TOKEN_EXT: return "TX_ITEM_TYPE_256_TOKEN_EXT"; // 256
         case TX_ITEM_TYPE_IN_COND: return "TX_ITEM_TYPE_IN_COND";
-        case TX_ITEM_TYPE_OUT_COND: return "TX_ITEM_TYPE_OUT_COND";
-        case TX_ITEM_TYPE_256_OUT_COND: return "TX_ITEM_TYPE_256_OUT_COND"; // 256
+        case TX_ITEM_TYPE_OUT_COND: return "TX_ITEM_TYPE_OUT_COND"; // 256
         case TX_ITEM_TYPE_RECEIPT: return "TX_ITEM_TYPE_RECEIPT";
-        case TX_ITEM_TYPE_256_RECEIPT: return "TX_ITEM_TYPE_256_RECEIPT"; // 256
         case TX_ITEM_TYPE_OUT_ALL: return "TX_ITEM_TYPE_OUT_ALL";
         case TX_ITEM_TYPE_ANY: return "TX_ITEM_TYPE_ANY";
         default: return "UNDEFINED";
     }
-
 }
 
 /**
@@ -88,9 +82,6 @@ size_t dap_chain_datum_item_tx_get_size(const uint8_t *a_item);
  */
 dap_chain_tx_token_t* dap_chain_datum_tx_item_token_create(dap_chain_hash_fast_t * a_datum_token_hash,const char * a_ticker);
 
-//256
-dap_chain_tx_token_t* dap_chain_datum_tx_item_256_token_create(dap_chain_hash_fast_t * a_datum_token_hash,const char * a_ticker);
-
 /**
  * Create item dap_chain_tx_out_t
  *
@@ -106,20 +97,14 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint64_t a_value);
-
-// 256
-dap_chain_256_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value);
+dap_chain_256_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value);
 
 /**
  * Create item dap_chain_tx_out_ext_t
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint64_t a_value, const char *a_token);
-
-// 256
-dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_256_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token);
+dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token);
 
 /**
  * Create item dap_chain_tx_out_cond_t
@@ -127,51 +112,38 @@ dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_256_out_ext_create(const dap
  * return item, NULL Error
  */
 dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
-                                                                 const void *a_cond, size_t a_cond_size);
-// 256
-dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint256_t a_value, uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
-                                                                 const void *a_cond, size_t a_cond_size);
+                                                                             uint256_t a_value, uint256_t a_value_max_per_unit,
+                                                                             dap_chain_net_srv_price_unit_uid_t a_unit,
+                                                                             const void *a_params, size_t a_params_size);
 /**
  * Create item dap_chain_tx_out_cond_t for eXchange service
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid,
-                                                                             dap_chain_net_id_t a_net_id, const char *a_token, uint64_t a_value,
-                                                                             const void *a_params, uint32_t a_params_size);
-//256
-dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid,
-                                                                             dap_chain_net_id_t a_net_id, const char *a_token, uint256_t a_value,
-                                                                             const void *a_params, uint32_t a_params_size);
-
-
+dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid,
+                                                                                 dap_chain_net_id_t a_net_id, const char *a_token, uint256_t a_value,
+                                                                                 const void *a_params, uint32_t a_params_size);
 /**
  * Create item dap_chain_tx_out_cond_t for stake service
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value, long double a_fee_value,
-                                                                        dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
-                                                                        const void *a_params, uint32_t a_params_size);
-// 256
-dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_256_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value,
-                                                                        dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
-                                                                        const void *a_params, uint32_t a_params_size);
+dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value,
+                                                                               dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
+                                                                               const void *a_params, uint32_t a_params_size);
 /**
  * Create item dap_chain_tx_sig_t
  *
  * return item, NULL Error
  */
-dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size);
+dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size);
 
 /**
  * Get sign from sign item
  *
  * return sign, NULL Error
  */
-dap_sign_t* dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig);
+dap_sign_t *dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig);
 
 /**
  * Get item from transaction
@@ -189,4 +161,3 @@ uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_id
 dap_list_t* dap_chain_datum_tx_items_get(dap_chain_datum_tx_t *a_tx, dap_chain_tx_item_type_t a_type, int *a_item_count);
 // Get conditional out item with it's idx
 dap_chain_tx_out_cond_t *dap_chain_datum_tx_out_cond_get(dap_chain_datum_tx_t *a_tx, int *a_out_num);
-dap_chain_256_tx_out_cond_t *dap_chain_datum_256_tx_out_cond_get(dap_chain_datum_tx_t *a_tx, int *a_out_num);
diff --git a/modules/common/include/dap_chain_datum_tx_out.h b/modules/common/include/dap_chain_datum_tx_out.h
index 0394a74ef6ef244c51aec5852a61f34735d3790e..04d6719941520a3ae76365e8aa16854ba9671a08 100644
--- a/modules/common/include/dap_chain_datum_tx_out.h
+++ b/modules/common/include/dap_chain_datum_tx_out.h
@@ -34,7 +34,7 @@
   */
 typedef struct dap_chain_tx_out{
     struct {
-        dap_chain_tx_item_type_t type:8; ///           @param    type            @brief  Transaction item type
+        dap_chain_tx_item_type_t type; ///           @param    type            @brief  Transaction item type
         uint64_t value; ///                       @param    value           @brief  Number of Datoshis ( DAP/10^9 ) to be transfered
     } header; /// Only header's hash is used for verification
     dap_chain_addr_t addr; ////
@@ -43,9 +43,8 @@ typedef struct dap_chain_tx_out{
 //256
 typedef struct dap_chain_256_tx_out{
     struct {
-        dap_chain_tx_item_type_t type:8; ///           @param    type            @brief  Transaction item type
+        dap_chain_tx_item_type_t type; ///           @param    type            @brief  Transaction item type
         uint256_t value; ///                       @param    value           @brief  Number of Datoshis ( DAP/10^9 ) to be transfered
     } header; /// Only header's hash is used for verification
     dap_chain_addr_t addr; ////
 } DAP_ALIGN_PACKED dap_chain_256_tx_out_t;
-
diff --git a/modules/common/include/dap_chain_datum_tx_out_cond.h b/modules/common/include/dap_chain_datum_tx_out_cond.h
index 1bbd166f0a7f75bd9318382833e3d34733b56ba7..f98afa1ac91b82438cacbac2af771d036bd95e71 100644
--- a/modules/common/include/dap_chain_datum_tx_out_cond.h
+++ b/modules/common/include/dap_chain_datum_tx_out_cond.h
@@ -29,12 +29,13 @@
 #include "dap_chain_common.h"
 #include "dap_chain_datum_tx.h"
 
-typedef enum dap_chain_tx_out_cond_subtype {
+enum dap_chain_tx_out_cond_subtype {
     DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY = 0x01,
     DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE = 0x02,
     DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE = 0x13,
-    DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_UPDATE = 0xFA       // Virtual type for stake update verificator
-} dap_chain_tx_out_cond_subtype_t;
+    DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_UPDATE = 0xFA       // Virtual type for stake update verificator //TODO change it to new type of callback for ledger tx add
+};
+typedef byte_t dap_chain_tx_out_cond_subtype_t;
 
 DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_out_cond_subtype_t a_subtype){
     switch (a_subtype) {
@@ -53,11 +54,11 @@ DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_
 typedef struct dap_chain_tx_out_cond {
     struct {
         /// Transaction item type
-        dap_chain_tx_item_type_t item_type :8;
+        dap_chain_tx_item_type_t item_type;
         /// Condition subtype
-        dap_chain_tx_out_cond_subtype_t subtype : 8;
+        dap_chain_tx_out_cond_subtype_t subtype;
         /// Number of Datoshis ( DAP/10^9 ) to be reserver for service
-        uint64_t value;
+        uint256_t value;
         /// When time expires this output could be used only by transaction owner
         dap_chain_time_t ts_expires;
     } header;
@@ -71,7 +72,7 @@ typedef struct dap_chain_tx_out_cond {
             /// Price unit thats used to check price max
             dap_chain_net_srv_price_unit_uid_t unit;
             /// Maximum price per unit
-            uint64_t unit_price_max_datoshi;
+            uint256_t unit_price_max_datoshi;
         } srv_pay;
         struct {
             // Service uid that only could be used for this outout
@@ -81,7 +82,7 @@ typedef struct dap_chain_tx_out_cond {
             // Chain network to change to
             dap_chain_net_id_t net_id;
             // Total amount of datoshi to change to
-            uint64_t value;
+            uint256_t value;
         } srv_xchange;
         struct {
             // Service uid that only could be used for this outout
@@ -103,14 +104,14 @@ typedef struct dap_chain_tx_out_cond {
  * @struct dap_chain_tx_out
  * @brief Transaction item out_cond
  */
-typedef struct dap_chain_256_tx_out_cond {
+typedef struct dap_chain_tx_out_cond_old {      // Obsolete
     struct {
         /// Transaction item type
-        dap_chain_tx_item_type_t item_type :8;
+        dap_chain_tx_item_type_t item_type;
         /// Condition subtype
-        dap_chain_tx_out_cond_subtype_t subtype : 8;
+        dap_chain_tx_out_cond_subtype_t subtype;
         /// Number of Datoshis ( DAP/10^9 ) to be reserver for service
-        uint256_t value;
+        uint64_t value;
         /// When time expires this output could be used only by transaction owner
         dap_chain_time_t ts_expires;
     } header;
@@ -124,7 +125,7 @@ typedef struct dap_chain_256_tx_out_cond {
             /// Price unit thats used to check price max
             dap_chain_net_srv_price_unit_uid_t unit;
             /// Maximum price per unit
-            uint256_t unit_price_max_datoshi;
+            uint64_t unit_price_max_datoshi;
         } srv_pay;
         struct {
             // Service uid that only could be used for this outout
@@ -134,7 +135,7 @@ typedef struct dap_chain_256_tx_out_cond {
             // Chain network to change to
             dap_chain_net_id_t net_id;
             // Total amount of datoshi to change to
-            uint256_t value;
+            uint64_t value;
         } srv_xchange;
         struct {
             // Service uid that only could be used for this outout
@@ -149,8 +150,4 @@ typedef struct dap_chain_256_tx_out_cond {
     } subtype;
     uint32_t params_size; // Condition parameters size
     uint8_t params[]; // condition parameters, pkey, hash or smth like this
-} DAP_ALIGN_PACKED dap_chain_256_tx_out_cond_t;
-
-
-
-
+} DAP_ALIGN_PACKED dap_chain_tx_out_cond_old_t;
diff --git a/modules/common/include/dap_chain_datum_tx_out_ext.h b/modules/common/include/dap_chain_datum_tx_out_ext.h
index 1a310068cb2a0b20160e76798b1ccc214dd49662..6dc527b209a59d675eb5e358c91e581f33d19fa4 100644
--- a/modules/common/include/dap_chain_datum_tx_out_ext.h
+++ b/modules/common/include/dap_chain_datum_tx_out_ext.h
@@ -29,25 +29,11 @@
 #include "dap_chain_common.h"
 #include "dap_chain_datum_tx.h"
 
-/**
-  * @struct dap_chain_tx_out_ext
-  * @brief Multichannel transaction item output
-  */
 typedef struct dap_chain_tx_out_ext{
     struct {
-        dap_chain_tx_item_type_t type : 8; // Transaction item type - should be TX_ITEM_TYPE_OUT_EXT
-        uint64_t value;                    // Number of Datoshis ( DAP/10^9 ) to be transfered
+        dap_chain_tx_item_type_t type;     // Transaction item type - should be TX_ITEM_TYPE_OUT_EXT
+        uint256_t value;                   // Number of Datoshis ( DAP/10^9 ) to be transfered
     } header;                              // Only header's hash is used for verification
     dap_chain_addr_t addr;                 // Address to transfer to
     char token[DAP_CHAIN_TICKER_SIZE_MAX]; // Which token is transferred
 } DAP_ALIGN_PACKED dap_chain_tx_out_ext_t;
-
-// 256
-typedef struct dap_chain_256_tx_out_ext{
-    struct {
-        dap_chain_tx_item_type_t type : 8; // Transaction item type - should be TX_ITEM_TYPE_OUT_EXT
-        uint256_t value;                    // Number of Datoshis ( DAP/10^9 ) to be transfered
-    } header;                              // Only header's hash is used for verification
-    dap_chain_addr_t addr;                 // Address to transfer to
-    char token[DAP_CHAIN_TICKER_SIZE_MAX]; // Which token is transferred
-} DAP_ALIGN_PACKED dap_chain_256_tx_out_ext_t;
diff --git a/modules/common/include/dap_chain_datum_tx_pkey.h b/modules/common/include/dap_chain_datum_tx_pkey.h
index 58a92b631a850e40e1ff1127cf51bab2678bd53f..cfea7b332887388ea590c365cfafff4136e939e1 100644
--- a/modules/common/include/dap_chain_datum_tx_pkey.h
+++ b/modules/common/include/dap_chain_datum_tx_pkey.h
@@ -33,7 +33,7 @@
   */
 typedef struct dap_chain_tx_pkey{
     struct {
-        dap_chain_tx_item_type_t type:8; /// @param    type            @brief Transaction item type
+        dap_chain_tx_item_type_t type; /// @param    type            @brief Transaction item type
         dap_sign_type_t sig_type; /// Signature type
         uint32_t sig_size; /// Signature size
     } header; /// Only header's hash is used for verification
diff --git a/modules/common/include/dap_chain_datum_tx_receipt.h b/modules/common/include/dap_chain_datum_tx_receipt.h
index b27f0ce374e6b560d0a8255a245fcc2f389c782f..be45c6405239fb1435ed2e4a376ec52735b40346 100644
--- a/modules/common/include/dap_chain_datum_tx_receipt.h
+++ b/modules/common/include/dap_chain_datum_tx_receipt.h
@@ -32,34 +32,26 @@
  * @brief Transaction item out_cond
  */
 typedef struct dap_chain_datum_tx_receipt {
-    uint8_t type; //dap_chain_tx_item_type_t type :8; // Transaction item type
+    dap_chain_tx_item_type_t type; // Transaction item type
     dap_chain_receipt_info_t receipt_info; // Receipt itself
     uint16_t size;
     uint16_t exts_size;
     byte_t exts_n_signs[]; // Signatures, first from provider, second from client
 }DAP_ALIGN_PACKED dap_chain_datum_tx_receipt_t;
 
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 static inline size_t dap_chain_datum_tx_receipt_get_size_hdr(){ return 1+sizeof (dap_chain_receipt_info_t)+sizeof (uint16_t) +sizeof (uint16_t); }
 
-dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create( dap_chain_net_srv_uid_t srv_uid,
-                                                                  dap_chain_net_srv_price_unit_uid_t units_type,
-                                                                    uint64_t units, uint64_t value_datoshi, const void * a_ext, size_t a_ext_size);
-
-// 256
-dap_chain_datum_tx_receipt_t * dap_chain_datum_256_tx_receipt_create( dap_chain_net_srv_uid_t srv_uid,
+dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create(dap_chain_net_srv_uid_t srv_uid,
                                                                   dap_chain_net_srv_price_unit_uid_t units_type,
                                                                     uint64_t units, uint256_t value_datoshi, const void * a_ext, size_t a_ext_size);
-
 size_t dap_chain_datum_tx_receipt_sign_add(dap_chain_datum_tx_receipt_t ** a_receipt, size_t a_receipt_size, dap_enc_key_t *a_key );
-
 dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size , uint16_t sign_position);
-
 uint16_t dap_chain_datum_tx_receipt_signs_count(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size);
-
 static inline uint16_t dap_chain_datum_tx_receipt_get_size(const dap_chain_datum_tx_receipt_t * l_receipt)
 {
     return l_receipt->size;
diff --git a/modules/common/include/dap_chain_datum_tx_sig.h b/modules/common/include/dap_chain_datum_tx_sig.h
index 8265348babd74220775f53d5f38317ec6ca24b4a..8d6c4f27aa1f57d1f93a306c12c6c421bd325a09 100644
--- a/modules/common/include/dap_chain_datum_tx_sig.h
+++ b/modules/common/include/dap_chain_datum_tx_sig.h
@@ -35,8 +35,7 @@
   */
 typedef struct dap_chain_tx_sig{
     struct {
-        dap_chain_tx_item_type_t type:8; /// @param    type            @brief Transaction item type
-//        dap_sign_type_t sig_type; /// Signature type
+        dap_chain_tx_item_type_t type; /// @param    type            @brief Transaction item type
         uint32_t sig_size; /// Signature size
     } header; /// Only header's hash is used for verification
     uint8_t sig[]; /// @param sig @brief raw signature data
diff --git a/modules/common/include/dap_chain_datum_tx_token.h b/modules/common/include/dap_chain_datum_tx_token.h
index 65a99a10b3b80d7ea3eda10025e3e4e44f268ccc..f385363a12654da1b948bc462e7afd132bc47f4a 100644
--- a/modules/common/include/dap_chain_datum_tx_token.h
+++ b/modules/common/include/dap_chain_datum_tx_token.h
@@ -34,7 +34,7 @@
   */
 typedef struct dap_chain_tx_token{
     struct {
-        dap_chain_tx_item_type_t type:8;
+        dap_chain_tx_item_type_t type;
         char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
         uint8_t padding; // Padding
         dap_chain_id_t token_emission_chain_id;
@@ -49,7 +49,7 @@ typedef struct dap_chain_tx_token{
   */
 typedef struct dap_chain_tx_token_ext{
     struct {
-        dap_chain_tx_item_type_t type:8;
+        dap_chain_tx_item_type_t type;
         uint8_t version;
         char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
         uint8_t padding1; // Padding
diff --git a/modules/consensus/block-poa/CMakeLists.txt b/modules/consensus/block-poa/CMakeLists.txt
index 086591aba66c41d3e17a19d4b725cb1fea19e9a5..76095fb37dd1d811d5d14f6a6e9e78ba30aeea8d 100644
--- a/modules/consensus/block-poa/CMakeLists.txt
+++ b/modules/consensus/block-poa/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_cs_block_poa)
 
 file(GLOB DAP_CHAIN_BLOCK_CS_POA_SRCS *.c)
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 aa93918c49be22d8232d0e8460ff6990e7c3ce4e..3ee2f2763ac720aee661543967cfde8dd18cc4cb 100644
--- a/modules/consensus/block-poa/dap_chain_cs_block_poa.c
+++ b/modules/consensus/block-poa/dap_chain_cs_block_poa.c
@@ -22,6 +22,7 @@
     along with any DAP SDK based project.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include "dap_chain_net.h"
 #include "dap_common.h"
 #include "dap_strfuncs.h"
 #include "dap_enc_base58.h"
@@ -32,7 +33,6 @@
 #include "dap_chain_block_cache.h"
 #include "dap_chain_cs_blocks.h"
 #include "dap_chain_cs_block_poa.h"
-#include "dap_chain_net.h"
 #include "dap_chain_node_cli.h"
 #include "dap_chain_node_cli_cmd.h"
 #include "dap_chain_global_db.h"
@@ -190,13 +190,15 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
             l_poa_pvt->auth_certs = DAP_NEW_Z_SIZE ( dap_cert_t *, l_poa_pvt->auth_certs_count * sizeof(dap_cert_t));
             char l_cert_name[512];
             for (size_t i = 0; i < l_poa_pvt->auth_certs_count ; i++ ){
-                dap_snprintf(l_cert_name,sizeof(l_cert_name),"%s.%lu",l_poa_pvt->auth_certs_prefix, i);
-                if ( (l_poa_pvt->auth_certs[i] = dap_cert_find_by_name( l_cert_name)) != NULL ) {
-                    log_it(L_NOTICE, "Initialized auth cert \"%s\"", l_cert_name);
-                } else{
-                    log_it(L_ERROR, "Can't find cert \"%s\"", l_cert_name);
-                    return -1;
+                dap_snprintf(l_cert_name,sizeof(l_cert_name),"%s.%zu",l_poa_pvt->auth_certs_prefix, i);
+                if ((l_poa_pvt->auth_certs[i] = dap_cert_find_by_name( l_cert_name)) == NULL) {
+                    dap_snprintf(l_cert_name,sizeof(l_cert_name),"%s.%zu.pub",l_poa_pvt->auth_certs_prefix, i);
+                    if ((l_poa_pvt->auth_certs[i] = dap_cert_find_by_name( l_cert_name)) == NULL) {
+                        log_it(L_ERROR, "Can't find cert \"%s\"", l_cert_name);
+                        return -1;
+                    }
                 }
+                log_it(L_NOTICE, "Initialized auth cert \"%s\"", l_cert_name);
             }
         }
     }
@@ -223,7 +225,7 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
         PVT(l_poa)->prev_callback_created(a_chain,a_chain_net_cfg);
 
     const char * l_sign_cert_str = NULL;
-    if ( ( l_sign_cert_str = dap_config_get_item_str(a_chain_net_cfg,"block-poa","sign-cert") ) != NULL ) {
+    if ( ( l_sign_cert_str = dap_config_get_item_str(a_chain_net_cfg,"block-poa","blocks-sign-cert") ) != NULL ) {
         dap_cert_t *l_sign_cert = dap_cert_find_by_name(l_sign_cert_str);
         if (l_sign_cert == NULL) {
             log_it(L_ERROR, "Can't load sign certificate, name \"%s\" is wrong", l_sign_cert_str);
@@ -278,7 +280,7 @@ static size_t s_callback_block_sign(dap_chain_cs_blocks_t *a_blocks, dap_chain_b
     dap_chain_cs_block_poa_t *l_poa = DAP_CHAIN_CS_BLOCK_POA(a_blocks);
     dap_chain_cs_block_poa_pvt_t *l_poa_pvt = PVT(l_poa);
     if (!l_poa_pvt->sign_key) {
-        log_it(L_WARNING, "Can't sign block with sign-cert in [block-poa] section");
+        log_it(L_WARNING, "Can't sign block with blocks-sign-cert in [block-poa] section");
         return 0;
     }
     if (!a_block_ptr || !(*a_block_ptr) || !a_block_size) {
@@ -331,6 +333,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t * a_blocks, dap_chain_b
                 break;
             }
         }
+        //TODO verify sign itself
         l_offset += l_sign_size;
         l_sign = (dap_sign_t *)(a_block->meta_n_datum_n_sign + l_offset);
     }
diff --git a/modules/consensus/block-pos/CMakeLists.txt b/modules/consensus/block-pos/CMakeLists.txt
index 587d3b2d0219d463bef78a67f7d2ed8dfc62016f..82db9813d05fe2dd9cff3c19cd96c8164462ed8e 100644
--- a/modules/consensus/block-pos/CMakeLists.txt
+++ b/modules/consensus/block-pos/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_cs_block_pos)
   
 file(GLOB DAP_CHAIN_CS_BLOCK_POS_SRCS *.c)
diff --git a/modules/consensus/block-pos/dap_chain_cs_block_pos.c b/modules/consensus/block-pos/dap_chain_cs_block_pos.c
index 90ffe94de3f5e68243181e331605e6c71697be4d..e3976afc8e6d4cd1a8bf67862a5a0e20a50f3ef9 100644
--- a/modules/consensus/block-pos/dap_chain_cs_block_pos.c
+++ b/modules/consensus/block-pos/dap_chain_cs_block_pos.c
@@ -146,7 +146,7 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf
     dap_chain_cs_block_pos_t *l_pos = DAP_CHAIN_CS_BLOCK_POS(l_blocks);
 
     const char * l_sign_cert_str = NULL;
-    if ( ( l_sign_cert_str = dap_config_get_item_str(a_chain_net_cfg,"block-pos","sign-cert") ) != NULL ) {
+    if ((l_sign_cert_str = dap_config_get_item_str(a_chain_net_cfg,"block-pos","blocks-sign-cert")) != NULL) {
         dap_cert_t *l_sign_cert = dap_cert_find_by_name(l_sign_cert_str);
         if (l_sign_cert == NULL) {
             log_it(L_ERROR, "Can't load sign certificate, name \"%s\" is wrong", l_sign_cert_str);
@@ -188,7 +188,7 @@ static size_t s_callback_block_sign(dap_chain_cs_blocks_t *a_blocks, dap_chain_b
     dap_chain_cs_block_pos_t *l_pos = DAP_CHAIN_CS_BLOCK_POS(a_blocks);
     dap_chain_cs_block_pos_pvt_t *l_pos_pvt = PVT(l_pos);
     if (!l_pos_pvt->blocks_sign_key) {
-        log_it(L_WARNING, "Can't sign block with sign-cert in [block-pos] section");
+        log_it(L_WARNING, "Can't sign block with blocks-sign-cert in [block-pos] section");
         return 0;
     }
     if (!a_block_ptr || !(*a_block_ptr) || !a_block_size) {
diff --git a/modules/consensus/block-pow/CMakeLists.txt b/modules/consensus/block-pow/CMakeLists.txt
index 9f3cc01638bae46853fde94ac5cf5fe0a237561e..ec2ccd4bf15942e0fb9ee3de3cd8228a19980689 100644
--- a/modules/consensus/block-pow/CMakeLists.txt
+++ b/modules/consensus/block-pow/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_cs_block_pow)
   
 file(GLOB DAP_CHAIN_BLOCK_CS_POW_SRCS *.c)
diff --git a/modules/consensus/dag-poa/CMakeLists.txt b/modules/consensus/dag-poa/CMakeLists.txt
index 457d52f9abf7243c6903838c650ec0b595d85a51..69c7fc625840122ee157fa46ffe5f2e0407261df 100644
--- a/modules/consensus/dag-poa/CMakeLists.txt
+++ b/modules/consensus/dag-poa/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_cs_dag_poa)
   
 file(GLOB DAP_CHAIN_DAG_CS_POA_SRCS *.c)
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 a71a7f79b6142b5e1a60dcb85bd6ebf35d933c61..8e7103c53135ceb84251060465abeed499073431 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -268,12 +268,14 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
             char l_cert_name[512];
             for (size_t i = 0; i < l_poa_pvt->auth_certs_count ; i++ ){
                 dap_snprintf(l_cert_name,sizeof(l_cert_name),"%s.%zu",l_poa_pvt->auth_certs_prefix, i);
-                if ( (l_poa_pvt->auth_certs[i] = dap_cert_find_by_name( l_cert_name)) != NULL ) {
-                    log_it(L_NOTICE, "Initialized auth cert \"%s\"", l_cert_name);
-                } else{
-                    log_it(L_ERROR, "Can't find cert \"%s\"", l_cert_name);
-                    return -1;
+                if ((l_poa_pvt->auth_certs[i] = dap_cert_find_by_name( l_cert_name)) == NULL) {
+                    dap_snprintf(l_cert_name,sizeof(l_cert_name),"%s.%zu.pub",l_poa_pvt->auth_certs_prefix, i);
+                    if ((l_poa_pvt->auth_certs[i] = dap_cert_find_by_name( l_cert_name)) == NULL) {
+                        log_it(L_ERROR, "Can't find cert \"%s\"", l_cert_name);
+                        return -1;
+                    }
                 }
+                log_it(L_NOTICE, "Initialized auth cert \"%s\"", l_cert_name);
             }
         }
     }
@@ -351,6 +353,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
                                                           dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size)
 {
     dap_return_val_if_fail(a_dag && a_dag->chain && DAP_CHAIN_CS_DAG_POA(a_dag), NULL);
+    dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name );
     dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA(a_dag);
     if ( PVT(l_poa)->events_sign_cert == NULL){
         log_it(L_ERROR, "Can't sign event with events_sign_cert in [dag-poa] section");
diff --git a/modules/consensus/dag-pos/CMakeLists.txt b/modules/consensus/dag-pos/CMakeLists.txt
index 33b2032af8fdda1b7e8f751d0c06ebb0899b0e00..1e5cecca4333ca95873fbe794694732148f98ee3 100644
--- a/modules/consensus/dag-pos/CMakeLists.txt
+++ b/modules/consensus/dag-pos/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_cs_dag_pos)
   
 file(GLOB DAP_CHAIN_CS_DAG_POS_SRCS *.c)
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 72e5876bf81ac50f72f8c5bc5ee13cf57c9a6b4a..768d985e759ffe368f0c1b08d3cd2b65d8c391b2 100644
--- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
+++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
@@ -147,18 +147,19 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG ( a_chain );
     dap_chain_cs_dag_pos_t * l_pos = DAP_CHAIN_CS_DAG_POS( l_dag );
 
-    const char * l_events_sign_wallet = NULL;
-    if ( ( l_events_sign_wallet = dap_config_get_item_str(a_chain_net_cfg,"dag-pos","events-sign-wallet") ) != NULL ) {
-
-        dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_events_sign_wallet, dap_chain_wallet_get_path(g_config));
-        if (!l_wallet) {
-            log_it(L_ERROR,"Can't load events sign wallet, name \"%s\" is wrong", l_events_sign_wallet);
+    const char * l_sign_cert_str = NULL;
+    if ((l_sign_cert_str = dap_config_get_item_str(a_chain_net_cfg, "dag-pos", "events-sign-cert")) != NULL) {
+        dap_cert_t *l_sign_cert = dap_cert_find_by_name(l_sign_cert_str);
+        if (l_sign_cert == NULL) {
+            log_it(L_ERROR, "Can't load sign certificate, name \"%s\" is wrong", l_sign_cert_str);
+        } else if (l_sign_cert->enc_key->priv_key_data) {
+            PVT(l_pos)->events_sign_key = l_sign_cert->enc_key;
+            log_it(L_NOTICE, "Loaded \"%s\" certificate to sign PoS events", l_sign_cert_str);
         } else {
-            PVT(l_pos)->events_sign_key = dap_chain_wallet_get_key(l_wallet, 0);
-            log_it(L_NOTICE,"Loaded \"%s\" wallet to sign pos event", l_events_sign_wallet);
+            log_it(L_ERROR, "Certificate \"%s\" has no private key", l_sign_cert_str);
         }
     } else {
-        log_it(L_WARNING, "Events sign wallet is empty for %s chain, can't sing any events for it", a_chain->name);
+        log_it(L_ERROR, "No sign certificate provided, can't sign any events");
     }
     return 0;
 }
@@ -269,40 +270,6 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_
                     return -6;
                 }
             }
-            /*
-            dap_chain_datum_t *l_datum = dap_chain_cs_dag_event_get_datum(a_dag_event);
-            // transaction include emission?
-            bool l_is_emit = false;
-            if(l_datum && l_datum->header.type_id == DAP_CHAIN_DATUM_TX) {
-                // transaction
-                dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
-                // find Token items
-                dap_list_t *l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL);
-                if(l_list_tx_token)
-                    l_is_emit = true;
-                dap_list_free(l_list_tx_token);
-            }
-            // if emission then the wallet can be with zero balance
-            if(l_is_emit)
-                return 0;*/
-
-            // bool l_is_enough_balance = false;
-            // for (size_t i =0; i <l_pos_pvt->tokens_hold_size; i++){
-            //     uint256_t l_balance = dap_chain_ledger_calc_balance ( a_dag->chain->ledger , &l_addr, l_pos_pvt->tokens_hold[i] );
-            //     uint64_t l_value = dap_chain_uint256_to(l_balance);
-            //     if (l_value >= l_pos_pvt->tokens_hold_value[i]) {
-            //         l_verified_num++;
-            //         l_is_enough_balance = true;
-            //         break;
-            //     }
-            // }
-            // if (! l_is_enough_balance ){
-            //     char *l_addr_str = dap_chain_addr_to_str(&l_addr);
-            //     log_it(L_WARNING, "Verify of event is false, because bal is not enough for addr=%s", l_addr_str);
-            //     DAP_DELETE(l_addr_str);
-            //     return -1;
-            //}
-
         }
         // Check number
         if ( l_verified_num >= l_pos_pvt->confirmations_minimum ){
diff --git a/modules/consensus/none/CMakeLists.txt b/modules/consensus/none/CMakeLists.txt
index 8072379783889069d785c766ac0b10d786fbe24c..ddf73b014ea1143a5a1c663582a517c424137c7c 100644
--- a/modules/consensus/none/CMakeLists.txt
+++ b/modules/consensus/none/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_cs_none)
   
 file(GLOB DAP_CHAIN_CS_NO_CONSENSUS_SRC *.c)
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c
index 2cc6f6d04ed91ce54ee5913da1571cc65598c343..d6509844a748ba6bc58c3f4b61d08d81017756f2 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/consensus/none/dap_chain_cs_none.c
@@ -177,10 +177,11 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     l_gdb_priv->chain = a_chain;
 
     if(!l_gdb_priv->celled){
-        l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X,l_net->pub.name,
+        l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016llX",l_net->pub.name,
                                                   a_chain->id.uint64);
     }else {
-        l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X".cell-%016"DAP_UINT64_FORMAT_X,l_net->pub.name,
+        // here is not work because dap_chain_net_load() not yet fully performed
+        l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016llX.cell-%016llX",l_net->pub.name,
                                                   a_chain->id.uint64, a_chain->cells->id.uint64);
     }
 
@@ -268,6 +269,7 @@ const char* dap_chain_gdb_get_group(dap_chain_t * a_chain)
     return 1;
 }*/
 
+
 /**
  * @brief Load ledger from mempool
  * 
@@ -343,21 +345,14 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
         return ATOM_REJECT;
     }
     switch (l_datum->header.type_id) {
-        case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256
         case DAP_CHAIN_DATUM_TOKEN_DECL:{
-            dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
-            if (dap_chain_ledger_token_load(a_chain->ledger,l_token, l_datum->header.data_size))
+            if (dap_chain_ledger_token_load(a_chain->ledger, (dap_chain_datum_token_t *)l_datum->data, l_datum->header.data_size))
                 return ATOM_REJECT;
         }break;
-        case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256
         case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
-            // dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data;
-            // l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ?
-            //                                     true : false;
-            if (dap_chain_ledger_token_emission_load(a_chain->ledger, (dap_chain_datum_token_emission_t*) l_datum->data, l_datum->header.data_size))
+            if (dap_chain_ledger_token_emission_load(a_chain->ledger, l_datum->data, l_datum->header.data_size))
                 return ATOM_REJECT;
         }break;
-        case DAP_CHAIN_DATUM_256_TX: // 256
         case DAP_CHAIN_DATUM_TX:{
             dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
             // No trashhold herr, don't save bad transactions to base
@@ -387,6 +382,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
     return ATOM_ACCEPT;
 }
 
+
 /**
  * @brief Verify atomic element (currently simply return ATOM_ACCEPT)
  * 
@@ -415,6 +411,7 @@ static size_t s_chain_callback_atom_get_static_hdr_size()
     return sizeof(l_datum_null->header);
 }
 
+
 /**
  * @brief Create atomic element iterator
  * 
@@ -431,11 +428,11 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_
 
 /**
  * @brief create atom object (dap_chain_atom_iter_t)
- * 
+ *
  * @param a_chain chain object
  * @param a_atom pointer to atom
  * @param a_atom_size size of atom
- * @return dap_chain_atom_iter_t* 
+ * @return dap_chain_atom_iter_t*
  */
 static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain,
         dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
@@ -444,9 +441,11 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t
     l_iter->chain = a_chain;
     l_iter->cur = a_atom;
     l_iter->cur_size = a_atom_size;
+    dap_hash_fast(a_atom, a_atom_size, l_iter->cur_hash);
     return l_iter;
 }
 
+
 /**
  * @brief Delete dag event iterator
  * execute DAP_DELETE(a_atom_iter)
@@ -454,16 +453,20 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t
  */
 static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter)
 {
+    if (a_atom_iter->cur_item)
+        DAP_DELETE(a_atom_iter->cur_item);
+    DAP_DELETE(a_atom_iter->cur_hash);
     DAP_DELETE(a_atom_iter);
 }
 
+
 /**
  * @brief get dap_chain_atom_ptr_t object form database by hash
- * @details Searchs by datum data hash, not for datum's hash itself 
- * @param a_atom_iter dap_chain_atom_iter_t atom object 
+ * @details Searchs by datum data hash, not for datum's hash itself
+ * @param a_atom_iter dap_chain_atom_iter_t atom object
  * @param a_atom_hash dap_chain_hash_fast_t atom hash
  * @param a_atom_size size of atom object
- * @return dap_chain_atom_ptr_t 
+ * @return dap_chain_atom_ptr_t
  */
 static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter,
         dap_chain_hash_fast_t * a_atom_hash, size_t *a_atom_size)
@@ -480,54 +483,70 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at
 
 /**
  * @brief Get the first dag event from database
- * 
- * @param a_atom_iter ap_chain_atom_iter_t object 
+ *
+ * @param a_atom_iter ap_chain_atom_iter_t object
  * @param a_atom_size a_atom_size atom size
- * @return dap_chain_atom_ptr_t 
+ * @return dap_chain_atom_ptr_t
  */
 static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size)
 {
     if (!a_atom_iter)
         return NULL;
     dap_chain_datum_t * l_datum = NULL;
-    a_atom_iter->cur_item = PVT ( DAP_CHAIN_GDB(a_atom_iter->chain) )->hash_items;
+    dap_chain_gdb_datum_hash_item_t *l_item = PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->hash_items;
+    a_atom_iter->cur_item = l_item;
     if (a_atom_iter->cur_item ){
-        dap_chain_gdb_datum_hash_item_t * l_item = PVT ( DAP_CHAIN_GDB(a_atom_iter->chain) )->hash_items;
         size_t l_datum_size =0;
-        l_datum= (dap_chain_datum_t*) dap_chain_global_db_gr_get(l_item->key,&l_datum_size,PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums );
+        l_datum= (dap_chain_datum_t*) dap_chain_global_db_gr_get(l_item->key, &l_datum_size,
+                                                                 PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums );
         if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it
             DAP_DELETE( a_atom_iter->cur);
         a_atom_iter->cur = l_datum;
+        a_atom_iter->cur_size = l_datum_size;
+        dap_chain_hash_fast_from_str(l_item->key, a_atom_iter->cur_hash);
         if (a_atom_size)
             *a_atom_size = l_datum_size;
-    } else if (a_atom_size)
-        *a_atom_size = 0;
+    } else {
+        DAP_DEL_Z(a_atom_iter->cur);
+        a_atom_iter->cur_size = 0;
+        if (a_atom_size)
+            *a_atom_size = 0;
+    }
     return l_datum;
 }
 
+
 /**
  * @brief Get the next dag event from database
- * 
+ *
  * @param a_atom_iter dap_chain_atom_iter_t
  * @param a_atom_size size_t a_atom_size
- * @return dap_chain_atom_ptr_t 
+ * @return dap_chain_atom_ptr_t
  */
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter,size_t *a_atom_size)
+static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t *a_atom_iter, size_t *a_atom_size)
 {
     dap_chain_datum_t * l_datum = NULL;
-    a_atom_iter->cur_item = a_atom_iter->cur_item?
-                ((dap_chain_gdb_datum_hash_item_t*) a_atom_iter->cur_item)->next : NULL;
+    dap_chain_gdb_datum_hash_item_t *l_item = (dap_chain_gdb_datum_hash_item_t*)a_atom_iter->cur_item;
+    if (l_item)
+        l_item = l_item->next;
+    a_atom_iter->cur_item = l_item;
     if (a_atom_iter->cur_item ){
         size_t l_datum_size =0;
-        l_datum= (dap_chain_datum_t*) dap_chain_global_db_gr_get(
-                                ((dap_chain_gdb_datum_hash_item_t*) a_atom_iter->cur_item)->key,
-                                &l_datum_size, PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums );
+        l_datum = (dap_chain_datum_t *)dap_chain_global_db_gr_get(l_item->key, &l_datum_size,
+                                                                  PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums);
         if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it
-            DAP_DELETE( a_atom_iter->cur);
+            DAP_DELETE(a_atom_iter->cur);
         a_atom_iter->cur = l_datum;
-        *a_atom_size = l_datum_size;
-    }else
-        *a_atom_size = 0;
+        a_atom_iter->cur_size = l_datum_size;
+        dap_chain_hash_fast_from_str(l_item->key, a_atom_iter->cur_hash);
+        if (a_atom_size)
+            *a_atom_size = l_datum_size;
+    } else {
+        DAP_DEL_Z(a_atom_iter->cur);
+        a_atom_iter->cur_size = 0;
+        if (a_atom_size)
+            *a_atom_size = 0;
+    }
     return l_datum;
 }
 
diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c
index 89d1fbd18ad9ab89166f48dffea62acc494ab387..7d714677cbc2ced25c5fce0325cb60d9b0d3e241 100644
--- a/modules/global-db/dap_chain_global_db.c
+++ b/modules/global-db/dap_chain_global_db.c
@@ -330,13 +330,9 @@ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_len_out)
  */
 static bool global_db_gr_del_add(char *a_key,const char *a_group, time_t a_timestamp)
 {
-    dap_store_obj_t store_data;
-    memset(&store_data, 0, sizeof(dap_store_obj_t));
+    dap_store_obj_t store_data = {};
     store_data.type = 'a';
     store_data.key = a_key;
-    // no data
-    store_data.value = NULL;
-    store_data.value_len = 0;
     // group = parent group + '.del'
     store_data.group = dap_strdup_printf("%s.del", a_group);
     store_data.timestamp = a_timestamp;
@@ -621,7 +617,7 @@ bool dap_chain_global_db_gr_del(char *a_key,const char *a_group)
     unlock();
     if(l_res >= 0) {
         // add to Del group
-        global_db_gr_del_add(dap_strdup(a_key), store_data.group, store_data.timestamp);
+        global_db_gr_del_add(dap_strdup(a_key), store_data.group, time(NULL));
     }
     // do not add to history if l_res=1 (already deleted)
     if (!l_res) {
diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c
index 4e41cd5dd65b65a6dc8e5a36b3b9f93148a09a40..fe0a48daa53f88a66b4894d8a166d536c084504d 100644
--- a/modules/global-db/dap_chain_global_db_driver.c
+++ b/modules/global-db/dap_chain_global_db_driver.c
@@ -449,17 +449,19 @@ int dap_chain_global_db_driver_appy(pdap_store_obj_t a_store_obj, size_t a_store
         for(size_t i = 0; i < a_store_count; i++) {
             dap_store_obj_t *l_store_obj_cur = a_store_obj + i;
             assert(l_store_obj_cur);
+            char *l_cur_key = dap_strdup(l_store_obj_cur->key);
             int l_ret_tmp = s_drv_callback.apply_store_obj(l_store_obj_cur);
             if(l_ret_tmp == 1) {
-                log_it(L_INFO, "item is missing (may be already deleted) %s/%s\n", l_store_obj_cur->group, l_store_obj_cur->key);
+                log_it(L_INFO, "Item is missing (may be already deleted) %s/%s\n", l_store_obj_cur->group, l_cur_key);
                 l_ret = 1;
-                break;
             }
             if(l_ret_tmp < 0) {
-                log_it(L_ERROR, "Can't write item %s/%s (code %d)\n", l_store_obj_cur->group, l_store_obj_cur->key, l_ret_tmp);
+                log_it(L_ERROR, "Can't write item %s/%s (code %d)\n", l_store_obj_cur->group, l_cur_key, l_ret_tmp);
                 l_ret -= 1;
-                break;
             }
+            DAP_DELETE(l_cur_key);
+            if (l_ret)
+                break;
         }
 
     if(a_store_count > 1 && s_drv_callback.transaction_end)
@@ -517,7 +519,7 @@ size_t dap_chain_global_db_driver_count(const char *a_group, uint64_t id)
  * @param a_group_mask the group mask string
  * @return If successful, returns the list of group names, otherwise NULL.
  */
-dap_list_t* dap_chain_global_db_driver_get_groups_by_mask(const char *a_group_mask)
+dap_list_t *dap_chain_global_db_driver_get_groups_by_mask(const char *a_group_mask)
 {
     dap_list_t *l_list = NULL;
     if(s_drv_callback.get_groups_by_mask)
diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c
index 0b647cc4ff8cc6a21702886bb45d7e0c471987e9..699f07942d106f464d4b3f4459bf7328c1acf8ec 100644
--- a/modules/global-db/dap_chain_global_db_driver_cdb.c
+++ b/modules/global-db/dap_chain_global_db_driver_cdb.c
@@ -585,6 +585,13 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) {
         if(!a_store_obj->key) {
             return -2;
         }
+        /*if (dap_fnmatch("*.del", a_store_obj->group, 0)) {
+            char *l_del_group = dap_strdup_printf("%s.del", a_store_obj->group);
+            pcdb_instance l_cdb_d = dap_cdb_get_db_by_group(l_del_group);
+            if (l_cdb_d) {
+                l_cdb_i->id = max(l_cdb_d->id, l_cdb_i->id);
+            }
+        }*/
         cdb_record l_rec;
         l_rec.key = a_store_obj->key; //dap_strdup(a_store_obj->key);
         int offset = 0;
diff --git a/modules/global-db/dap_chain_global_db_driver_pgsql.c b/modules/global-db/dap_chain_global_db_driver_pgsql.c
index 1232f9837bb27b5d8b2b5a7388cf25cfaaa7e98c..2722bed4207fec3501af157dd2c53a488e241a83 100644
--- a/modules/global-db/dap_chain_global_db_driver_pgsql.c
+++ b/modules/global-db/dap_chain_global_db_driver_pgsql.c
@@ -191,7 +191,7 @@ int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks
 }
 
 /**
- * @brief Deinitializes a SQLite database.
+ * @brief Deinitializes a PostgreSQL database.
  * 
  * @return Returns 0 if successful.
  */
@@ -206,7 +206,7 @@ int dap_db_driver_pgsql_deinit(void)
 }
 
 /**
- * @brief Starts a transaction.
+ * @brief Starts a transaction in a PostgreSQL database.
  * 
  * @return Returns 0 if successful, otherwise -1.
  */
@@ -227,7 +227,7 @@ int dap_db_driver_pgsql_start_transaction(void)
 }
 
 /**
- * @brief Starts a transaction in a PostgreSQL database.
+ * @brief Ends a transaction in a PostgreSQL database.
  * 
  * @return Returns 0 if successful, otherwise -1.
  */
diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c
index 57ab6c1758cf566a439b746d93a3fb0ea00cd46a..a853e58f93e1ab269ccc2486062191fa747ed1d4 100644
--- a/modules/global-db/dap_chain_global_db_driver_sqlite.c
+++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c
@@ -191,14 +191,14 @@ sqlite3* dap_db_driver_sqlite_open(const char *a_filename_utf8, int a_flags, cha
 {
     sqlite3 *l_db = NULL;
 
-    int l_rc = sqlite3_open_v2(a_filename_utf8, &l_db, a_flags | SQLITE_OPEN_NOMUTEX, NULL);
+    int l_rc = sqlite3_open_v2(a_filename_utf8, &l_db, a_flags | SQLITE_OPEN_FULLMUTEX, NULL);
     // if unable to open the database file
     if(l_rc == SQLITE_CANTOPEN) {
         log_it(L_WARNING,"No database on path %s, creating one from scratch", a_filename_utf8);
         if(l_db)
             sqlite3_close(l_db);
         // try to create database
-        l_rc = sqlite3_open_v2(a_filename_utf8, &l_db, a_flags | SQLITE_OPEN_NOMUTEX| SQLITE_OPEN_CREATE, NULL);
+        l_rc = sqlite3_open_v2(a_filename_utf8, &l_db, a_flags | SQLITE_OPEN_FULLMUTEX| SQLITE_OPEN_CREATE, NULL);
     }
 
     if(l_rc != SQLITE_OK) {
@@ -608,16 +608,11 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
     if(a_store_obj->type == 'a') {
         if(!a_store_obj->key)
             return -1;
-        //dap_chain_hash_fast_t l_hash;
-        //dap_hash_fast(a_store_obj->value, a_store_obj->value_len, &l_hash);
-
-        char *l_blob_hash = "";//dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t));
         char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, (int)a_store_obj->value_len);
         DAP_DEL_Z(a_store_obj->value);
         //add one record
-        l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'%s', '%lld', x'%s')",
-                                   l_table_name, a_store_obj->key, l_blob_hash, a_store_obj->timestamp, l_blob_value);
-        //dap_db_driver_sqlite_free(l_blob_hash);
+        l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'', '%lld', x'%s')",
+                                   l_table_name, a_store_obj->key, a_store_obj->timestamp, l_blob_value);
         dap_db_driver_sqlite_free(l_blob_value);
     }
     else if (a_store_obj->type == 'd') {
diff --git a/modules/global-db/dap_chain_global_db_hist.c b/modules/global-db/dap_chain_global_db_hist.c
index aafef57f07da99f0fb8317dd8e98fe7c285a5cd0..6ff0e7871008a90a8d6f1ad15fdfb613056dc9e8 100644
--- a/modules/global-db/dap_chain_global_db_hist.c
+++ b/modules/global-db/dap_chain_global_db_hist.c
@@ -12,7 +12,7 @@
 #include "dap_chain_global_db_hist.h"
 #include "uthash.h"
 
-//#define GDB_SYNC_ALWAYS_FROM_ZERO
+#define GDB_SYNC_ALWAYS_FROM_ZERO
 
 // for dap_db_history()
 typedef struct dap_tx_data{
diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c
index 3c51d5bec51b247045e1f4041e8fb7957ed6162f..e1c5d27c1309c8cfacb2a4938f3cb622d5865d42 100644
--- a/modules/global-db/dap_chain_global_db_remote.c
+++ b/modules/global-db/dap_chain_global_db_remote.c
@@ -11,7 +11,7 @@
 
 #define LOG_TAG "dap_chain_global_db_remote"
 
-// default time of node address expired in hours
+// Default time of a node address expired in hours
 #define NODE_TIME_EXPIRED_DEFAULT 720
 
 /**
diff --git a/modules/mempool/CMakeLists.txt b/modules/mempool/CMakeLists.txt
index b337f93df4d86b0d331ad9c9ba7cbaed078a5d21..95fc039743247a984eed5068182cc11958ac4d6c 100644
--- a/modules/mempool/CMakeLists.txt
+++ b/modules/mempool/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_mempool)
 
 file(GLOB DAP_CHAIN_MEMPOOL_SRC *.c)
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index 8834d39989aaf83202bff19f6b2f6bd546b9444d..5685e903c6bb026a3d1f3bf19b819f6faaaef9ee 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -108,17 +108,18 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_
         const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to,
         const dap_chain_addr_t* a_addr_fee,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value, uint64_t a_value_fee)
+        uint256_t a_value, uint256_t a_value_fee)
 {
     // check valid param
     if(!a_chain | !a_key_from || ! a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size ||
             !dap_chain_addr_check_sum(a_addr_from) || !dap_chain_addr_check_sum(a_addr_to) ||
-            (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || !a_value)
+            (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || IS_ZERO_256(a_value))
         return NULL;
 
     // find the transactions from which to take away coins
-    uint64_t l_value_transfer = 0; // how many coins to transfer
-    uint64_t l_value_need = a_value + a_value_fee;
+    uint256_t l_value_transfer = {}; // how many coins to transfer
+    uint256_t l_value_need;
+    SUM_256_256(a_value, a_value_fee, &l_value_need);
     dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(a_chain->ledger, a_token_ticker,
                                                                              a_addr_from, l_value_need, &l_value_transfer);
     if (!l_list_used_out) {
@@ -129,24 +130,25 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_
     dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create();
     // add 'in' items
     {
-        uint64_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
-        assert(l_value_to_items == l_value_transfer);
+        uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
+        assert(EQUAL_256(l_value_to_items, l_value_transfer));
         dap_list_free_full(l_list_used_out, free);
     }
     // add 'out' items
     {
-        uint64_t l_value_pack = 0; // how much datoshi add to 'out' items
+        uint256_t l_value_pack = {}; // how much datoshi add to 'out' items
         if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_to, a_value) == 1) {
-            l_value_pack += a_value;
+            SUM_256_256(l_value_pack, a_value, &l_value_pack);
             // transaction fee
             if(a_addr_fee) {
                 if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_fee, a_value_fee) == 1)
-                    l_value_pack += a_value_fee;
+                    SUM_256_256(l_value_pack, a_value_fee, &l_value_pack);
             }
         }
         // coin back
-        uint64_t l_value_back = l_value_transfer - l_value_pack;
-        if(l_value_back) {
+        uint256_t l_value_back;
+        SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back);
+        if(!IS_ZERO_256(l_value_back)) {
             if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_from, l_value_back) != 1) {
                 dap_chain_datum_tx_delete(l_tx);
                 return NULL;
@@ -185,24 +187,27 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
         const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to,
         const dap_chain_addr_t* a_addr_fee,
         const char a_token_ticker[10],
-        uint64_t a_value, uint64_t a_value_fee,size_t a_tx_num)
+        uint256_t a_value, uint256_t a_value_fee,size_t a_tx_num)
 {
     // check valid param
     if(!a_chain | !a_key_from || !a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size ||
             !dap_chain_addr_check_sum(a_addr_from) || !dap_chain_addr_check_sum(a_addr_to) ||
-            (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || !a_value || !a_tx_num){
+            (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || IS_ZERO_256(a_value) || !a_tx_num){
         log_it(L_ERROR, "Wrong parameters in dap_chain_mempool_tx_create_massive() call");
         return -1;
 
     }
-    dap_global_db_obj_t * l_objs = DAP_NEW_Z_SIZE(dap_global_db_obj_t, (a_tx_num+1)*sizeof (dap_global_db_obj_t) );
+    dap_global_db_obj_t * l_objs = DAP_NEW_Z_SIZE(dap_global_db_obj_t, (a_tx_num + 1) * sizeof (dap_global_db_obj_t));
 
 
 
     // Search unused out:
-    uint64_t l_value_need =a_tx_num*( a_value + a_value_fee );
-    uint64_t l_value_transfer = 0; // how many coins to transfer
-    log_it(L_DEBUG,"Create %"DAP_UINT64_FORMAT_U" transactions, summary %Lf.7", a_tx_num,dap_chain_datoshi_to_coins(l_value_need) ) ;
+    uint256_t l_single_val = {};
+    SUM_256_256(a_value, a_value_fee, &l_single_val);
+    uint256_t l_value_need = {};
+    MULT_256_256(dap_chain_uint256_from(a_tx_num), l_single_val, &l_value_need);
+    uint256_t l_value_transfer = {}; // how many coins to transfer
+    log_it(L_DEBUG,"Create %"DAP_UINT64_FORMAT_U" transactions, summary %s", a_tx_num, dap_chain_balance_to_coins(l_value_need)) ;
     dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(a_chain->ledger, a_token_ticker,
                                                                              a_addr_from, l_value_need, &l_value_transfer);
     if (!l_list_used_out) {
@@ -217,52 +222,52 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
 
         // create empty transaction
         dap_chain_datum_tx_t *l_tx_new = dap_chain_datum_tx_create();
-        uint64_t l_value_back=0;
+        uint256_t l_value_back = {};
         // add 'in' items
         dap_list_t *l_list_tmp = l_list_used_out;
-        uint64_t l_value_to_items = 0; // how many coins to transfer
+        uint256_t l_value_to_items = {}; // how many coins to transfer
 
         // Add in and remove out used items
         while(l_list_tmp) {
-            list_used_item_t *item = l_list_tmp->data;
+            list_used_item_t *l_item = l_list_tmp->data;
             char l_in_hash_str[70];
 
-            dap_chain_hash_fast_to_str(&item->tx_hash_fast,l_in_hash_str,sizeof (l_in_hash_str) );
+            dap_chain_hash_fast_to_str(&l_item->tx_hash_fast,l_in_hash_str,sizeof (l_in_hash_str) );
 
-            if(dap_chain_datum_tx_add_in_item(&l_tx_new, &item->tx_hash_fast, (uint32_t) item->num_idx_out) == 1) {
-                l_value_to_items += item->value;
-                log_it(L_DEBUG,"Added input %s with %"DAP_UINT64_FORMAT_U" datoshi",l_in_hash_str, item->value);
+            if(dap_chain_datum_tx_add_in_item(&l_tx_new, &l_item->tx_hash_fast, (uint32_t)l_item->num_idx_out) == 1) {
+                SUM_256_256(l_value_to_items, l_item->value, &l_value_to_items);
+                log_it(L_DEBUG, "Added input %s with %s datoshi", l_in_hash_str, dap_chain_balance_print(l_item->value));
             }else{
-                log_it(L_WARNING,"Can't add input from %s with %"DAP_UINT64_FORMAT_U" datoshi",l_in_hash_str, item->value);
+                log_it(L_WARNING, "Can't add input from %s with %s datoshi", l_in_hash_str, dap_chain_balance_print(l_item->value));
             }
             l_list_used_out = l_list_tmp->next;
             DAP_DELETE(l_list_tmp->data);
             dap_list_free1(l_list_tmp);
             l_list_tmp = l_list_used_out;
-            if ( l_value_to_items >= l_value_transfer )
+            if (compare256(l_value_to_items, l_value_transfer) != -1)
                 break;
         }
-        if ( l_value_to_items <  (a_value + a_value_fee) ){
-            log_it(L_ERROR,"Not enought values on output %"DAP_UINT64_FORMAT_U" to produce enought ins %"DAP_UINT64_FORMAT_U" when need %"DAP_UINT64_FORMAT_U"",
-                   l_value_to_items, l_value_transfer,
-                   l_value_need);
+        if (compare256(l_value_to_items, l_single_val) == -1) {
+            log_it(L_ERROR, "Not enought values on output %s to produce enought ins %s when need %s",
+                   dap_chain_balance_print(l_value_to_items), dap_chain_balance_print(l_value_transfer),
+                   dap_chain_balance_print(l_value_need));
             DAP_DELETE(l_objs);
             return -5;
         }
 
         // add 'out' items
-        uint64_t l_value_pack = 0; // how much coin add to 'out' items
+        uint256_t l_value_pack = {}; // how much coin add to 'out' items
         if(dap_chain_datum_tx_add_out_item(&l_tx_new, a_addr_to, a_value) == 1) {
-            l_value_pack += a_value;
+            SUM_256_256(l_value_pack, a_value, &l_value_pack);
             // transaction fee
             if(a_addr_fee) {
                 if(dap_chain_datum_tx_add_out_item(&l_tx_new, a_addr_fee, a_value_fee) == 1)
-                    l_value_pack += a_value_fee;
+                    SUM_256_256(l_value_pack, a_value_fee, &l_value_pack);
             }
         }
         // coin back
-        l_value_back = l_value_transfer - l_value_pack;
-        if(l_value_back) {
+        SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back);
+        if (!IS_ZERO_256(l_value_back)) {
             //log_it(L_DEBUG,"Change back %"DAP_UINT64_FORMAT_U"", l_value_back);
             if(dap_chain_datum_tx_add_out_item(&l_tx_new, a_addr_from, l_value_back) != 1) {
                 dap_chain_datum_tx_delete(l_tx_new);
@@ -281,7 +286,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
         dap_chain_hash_fast_t l_tx_new_hash;
         dap_hash_fast(l_tx_new, l_tx_size, &l_tx_new_hash);
         // If we have value back - update balance cache
-        if(l_value_back) {
+        if (!IS_ZERO_256(l_value_back)) {
             //log_it(L_DEBUG,"We have value back %"DAP_UINT64_FORMAT_U" now lets see how many outputs we have", l_value_back);
             int l_item_count = 0;
             dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get( l_tx_new, TX_ITEM_TYPE_OUT,
@@ -311,7 +316,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
             //log_it(L_DEBUG,"Checked all outputs");
             dap_list_free( l_list_out_items);
         }
-        l_value_transfer -= l_value_pack;
+        SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_transfer);
 
         // Now produce datum
         dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx_new, l_tx_size);
@@ -321,7 +326,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
 
         l_objs[i].key = dap_chain_hash_fast_to_str_new(&l_tx_new_hash);
         //continue;
-        l_objs[i].value = (uint8_t*) l_datum;
+        l_objs[i].value = (uint8_t *)l_datum;
         l_objs[i].value_len = l_tx_size + sizeof(l_datum->header);
         log_it(L_DEBUG, "Prepared obj with key %s (value_len = %"DAP_UINT64_FORMAT_U")",
                l_objs[i].key? l_objs[i].key :"NULL" , l_objs[i].value_len );
@@ -363,10 +368,10 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t *
     // create empty transaction
     dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create();
 
-    uint16_t pos=0;
+    uint16_t pos = 0;
     dap_chain_datum_tx_add_item(&l_tx, (byte_t*) l_receipt);
     pos++;
-    uint64_t l_value_send = l_receipt->receipt_info.value_datoshi;
+    uint256_t l_value_send = l_receipt->receipt_info.value_datoshi;
 
     // add 'in_cond' items
     dap_chain_datum_tx_t *l_tx_cond = dap_chain_ledger_tx_find_by_hash(l_ledger, a_tx_prev_hash);
@@ -376,10 +381,10 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t *
         dap_chain_datum_tx_t *l_tx_tmp;
         dap_chain_hash_fast_t l_tx_cur_hash = { 0 }; // start hash
         dap_chain_tx_out_cond_t *l_tmp_cond;
-        uint64_t l_value_cond = 0;
+        uint256_t l_value_cond = {};
         int l_tmp_cond_idx;
         // Find all transactions
-        while (l_value_cond < l_value_send) {
+        while (compare256(l_value_cond, l_value_send) == -1) {
             l_tx_tmp = dap_chain_ledger_tx_cache_find_out_cond(l_ledger, &l_tx_cur_hash, &l_tmp_cond, &l_tmp_cond_idx, NULL);
             if (!l_tx_tmp) {
                 break;
@@ -392,18 +397,18 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t *
                 continue;
             if (l_tmp_cond->subtype.srv_pay.unit.uint32 != l_out_cond->subtype.srv_pay.unit.uint32)
                 continue;
-            if (l_tmp_cond->subtype.srv_pay.unit_price_max_datoshi != l_out_cond->subtype.srv_pay.unit_price_max_datoshi)
+            if (!EQUAL_256(l_tmp_cond->subtype.srv_pay.unit_price_max_datoshi, l_out_cond->subtype.srv_pay.unit_price_max_datoshi))
                 continue;
             if (memcmp(&l_tmp_cond->subtype.srv_pay.pkey_hash, &l_out_cond->subtype.srv_pay.pkey_hash, sizeof(dap_chain_hash_fast_t)))
                 continue;
             l_value_cond = l_tmp_cond->header.value;
         }
-        if (l_value_cond < l_value_send) {
+        if (compare256(l_value_cond, l_value_send) == -1) {
             log_it(L_WARNING, "Requested conditional transaction is already used out");
             return NULL;
         }
     }
-    if (dap_chain_datum_tx_add_in_cond_item(&l_tx, a_tx_prev_hash, l_prev_cond_idx, pos-1) != 0 ){
+    if (dap_chain_datum_tx_add_in_cond_item(&l_tx, a_tx_prev_hash, l_prev_cond_idx, pos - 1) != 0 ){
         dap_chain_datum_tx_delete(l_tx);
         log_it( L_ERROR, "Cant add tx cond input");
         return NULL;
@@ -420,7 +425,7 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t *
     size_t l_size = dap_chain_datum_item_tx_get_size((uint8_t *)l_out_cond);
     dap_chain_tx_out_cond_t *l_out_cond_new = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, l_size);
     memcpy(l_out_cond_new, l_out_cond, l_size);
-    l_out_cond_new->header.value -= l_value_send;
+    SUBTRACT_256_256(l_out_cond_new->header.value, l_value_send, &l_out_cond_new->header.value);
     dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *)l_out_cond_new);
     DAP_DELETE(l_out_cond_new);
 
@@ -467,19 +472,20 @@ static dap_chain_datum_t* dap_chain_tx_create_cond(dap_chain_net_t * a_net,
         dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond,
         const dap_chain_addr_t* a_addr_from,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
-        dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size)
+        uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
+        dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size)
 {
     dap_ledger_t * l_ledger = a_net ? dap_chain_ledger_by_net_name( a_net->pub.name ) : NULL;
     // check valid param
     if(!a_net || ! l_ledger || !a_key_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size ||
             !dap_chain_addr_check_sum(a_addr_from) ||
-            !a_value)
+            IS_ZERO_256(a_value))
         return NULL;
 
     // find the transactions from which to take away coins
-    uint64_t l_value_transfer = 0; // how many coins to transfer
-    uint64_t l_value_need = a_value + a_value_fee;
+    uint256_t l_value_transfer = {}; // how many coins to transfer
+    uint256_t l_value_need = {};
+    SUM_256_256(a_value, a_value_fee, &l_value_need);
     // list of transaction with 'out' items
     dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_token_ticker,
                                                                              a_addr_from, l_value_need, &l_value_transfer);
@@ -492,24 +498,25 @@ static dap_chain_datum_t* dap_chain_tx_create_cond(dap_chain_net_t * a_net,
     dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create();
     // add 'in' items
     {
-        uint64_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
-        assert(l_value_to_items == l_value_transfer);
+        uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
+        assert(EQUAL_256(l_value_to_items, l_value_transfer));
         dap_list_free_full(l_list_used_out, free);
     }
     // add 'out_cond' and 'out' items
     {
-        uint64_t l_value_pack = 0; // how much coin add to 'out' items
+        uint256_t l_value_pack = {}; // how much coin add to 'out' items
         if(dap_chain_datum_tx_add_out_cond_item(&l_tx, a_key_cond, a_srv_uid, a_value, a_value_per_unit_max, a_unit, a_cond,
                 a_cond_size) == 1) {
-            l_value_pack += a_value;
+            SUM_256_256(l_value_pack, a_value, &l_value_pack);
             // transaction fee
-            if(a_value_fee) {
+            if (!IS_ZERO_256(a_value_fee)) {
                 // TODO add condition with fee for mempool-as-service
             }
         }
         // coin back
-        uint64_t l_value_back = l_value_transfer - l_value_pack;
-        if(l_value_back) {
+        uint256_t l_value_back = {};
+        SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back);
+        if (!IS_ZERO_256(l_value_back)) {
             if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_from, l_value_back) != 1) {
                 dap_chain_datum_tx_delete(l_tx);
                 log_it( L_ERROR, "Cant add coin back output");
@@ -554,8 +561,8 @@ dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net,
         dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond,
         const dap_chain_addr_t* a_addr_from,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
-        dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size)
+        uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
+        dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size)
 {
 
     dap_chain_t *l_chain = NULL;
@@ -568,8 +575,8 @@ dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net,
             return NULL;
     // Make transfer transaction
     dap_chain_datum_t *l_datum = dap_chain_tx_create_cond(a_net,a_key_from, a_key_cond, a_addr_from,
-            a_token_ticker,a_value,a_value_per_unit_max, a_unit,
-            a_srv_uid, a_value_fee, a_cond, a_cond_size);
+                                                          a_token_ticker, a_value, a_value_per_unit_max, a_unit,
+                                                          a_srv_uid, a_value_fee, a_cond, a_cond_size);
 
     if(!l_datum)
         return NULL;
@@ -596,13 +603,13 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net,
         dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond,
         const dap_chain_addr_t* a_addr_from,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
-        dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size)
+        uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
+        dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size)
 {
     // Make transfer transaction
-    dap_chain_datum_t *l_datum = dap_chain_tx_create_cond(a_net,a_key_from, a_key_cond, a_addr_from,
-            a_token_ticker,a_value,a_value_per_unit_max, a_unit,
-            a_srv_uid, a_value_fee, a_cond, a_cond_size);
+    dap_chain_datum_t *l_datum = dap_chain_tx_create_cond(a_net, a_key_from, a_key_cond, a_addr_from,
+                                                          a_token_ticker,a_value,a_value_per_unit_max, a_unit,
+                                                          a_srv_uid, a_value_fee, a_cond, a_cond_size);
 
     if(!l_datum)
         return NULL;
diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h
index 0e8b0be25b623794efbc28e2576eaf50055ac712..631459d42c9959e90e2884f7b14942945313f5be 100644
--- a/modules/mempool/include/dap_chain_mempool.h
+++ b/modules/mempool/include/dap_chain_mempool.h
@@ -48,27 +48,27 @@ dap_hash_fast_t*  dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key
         const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to,
         const dap_chain_addr_t* a_addr_fee,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value, uint64_t a_value_fee);
+        uint256_t a_value, uint256_t a_value_fee);
 
 // Make transfer transaction & insert to cache
 dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net,
         dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond,
         const dap_chain_addr_t* a_addr_from,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
-        dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size);
+        uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
+        dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size);
 dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net,
         dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond,
         const dap_chain_addr_t* a_addr_from,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
-        dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size);
+        uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
+        dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size);
 
 dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * a_net,dap_chain_hash_fast_t *a_tx_prev_hash,
         const dap_chain_addr_t* a_addr_to, dap_enc_key_t * l_key_tx_sign, dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size);
 
-int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a_key_from,
+int dap_chain_mempool_tx_create_massive(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 dap_chain_addr_t* a_addr_fee,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value, uint64_t a_value_fee,size_t a_tx_num);
+        uint256_t a_value, uint256_t a_value_fee, size_t a_tx_num);
diff --git a/modules/mining/CMakeLists.txt b/modules/mining/CMakeLists.txt
index 5950015428d51b7a2359c33fdfe4241b75508844..3967079cb0bf22b50675a75a753d6ad6c5aa0877 100644
--- a/modules/mining/CMakeLists.txt
+++ b/modules/mining/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_crypto)
   
 file(GLOB DAP_CHAIN_CRYPTO_SRCS *.c)
diff --git a/modules/modules_dynamic/cdb/CMakeLists.txt b/modules/modules_dynamic/cdb/CMakeLists.txt
index 1d2ef0120fe05ab073c64c7229dd8e57c2c03aa0..7a387d86a55e76e2ffcf8b6915bcf81ba27a3c4b 100644
--- a/modules/modules_dynamic/cdb/CMakeLists.txt
+++ b/modules/modules_dynamic/cdb/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_modules_dynamic_cdb)
 
 file(GLOB DAP_MODULES_DYNAMIC_CDB_SRCS *.c)
diff --git a/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c b/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c
index fadef7066e975c03cb7ddbc0dd89d6eb446283cb..b4e8130de195b9c6cd04d81be978001d129ed71b 100644
--- a/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c
+++ b/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c
@@ -29,10 +29,11 @@
 #include <dlfcn.h>
 #endif
 
-#define LOG_TAG "dap_http"
+#define LOG_TAG "dap_modules_dynamic"
 
 static const char * s_default_path_modules = "var/modules";
 static void *s_cdb_handle = NULL;
+static bool s_cdb_was_init = false;
 
 void dap_modules_dynamic_close_cdb()
 {
@@ -40,10 +41,13 @@ void dap_modules_dynamic_close_cdb()
         dlclose(s_cdb_handle);
         s_cdb_handle = NULL;
     }
+    s_cdb_was_init = false;
 }
 
 void *dap_modules_dynamic_get_cdb_func(const char *a_func_name)
 {
+    if (!s_cdb_was_init)
+        return NULL;
     char l_lib_path[MAX_PATH] = {'\0'};
     void *l_ref_func = NULL;
     //  find func from dynamic library
@@ -73,16 +77,20 @@ void *dap_modules_dynamic_get_cdb_func(const char *a_func_name)
 
 int dap_modules_dynamic_load_cdb(dap_http_t * a_server)
 {
+    s_cdb_was_init = true;
     int (*dap_chain_net_srv_vpn_cdb_init)(dap_http_t *);
     dap_chain_net_srv_vpn_cdb_init = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_init");
     if (!dap_chain_net_srv_vpn_cdb_init) {
-        log_it(L_ERROR,"dap_modules_dynamic: can't load dap_chain_net_srv_vpn_cdb_init");
+        s_cdb_was_init = false;
+        log_it(L_ERROR, "dap_modules_dynamic: dap_chain_net_srv_vpn_cdb_init not found");
         return -2;
     }
     int l_init_res = dap_chain_net_srv_vpn_cdb_init(a_server);
     if (l_init_res) {
-        log_it(L_ERROR,"dap_modules_dynamic: dap_chain_net_srv_vpn_cdb_init returns %d", l_init_res);
+        s_cdb_was_init = false;
+        log_it(L_ERROR, "dap_modules_dynamic: dap_chain_net_srv_vpn_cdb_init returns %d", l_init_res);
         return -3;
     }
+    s_cdb_was_init = true;
     return 0;
 }
diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt
index 4c05cea61e5af5c5a8710ee0c20c5a9904af0c74..f4ccdaff3953e4c8bc9d6be53701ac60e6ac1b13 100644
--- a/modules/net/CMakeLists.txt
+++ b/modules/net/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_net)
   
 
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index ac3dbf15c4ef6ae3f5a052ae48b077c7fcdcb362..b1f8162a3afa528da2c5799ec9dd37159bc69878 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -144,6 +144,8 @@ typedef struct dap_chain_net_pvt{
     dap_chain_node_addr_t * node_addr;
     dap_chain_node_info_t * node_info;  // Current node's info
 
+    //Active synchronizing link
+    dap_chain_node_client_t *active_link;
     // Established links
     dap_list_t *links;                  // Links list
     size_t links_connected_count;
@@ -255,7 +257,61 @@ static uint8_t *dap_chain_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash);
 
 static dap_global_db_obj_callback_notify_t s_srv_callback_notify = NULL;
 
+/**
+ * @brief
+ * init network settings from cellrame-node.cfg file
+ * register net* commands in cellframe-node-cli interface
+ * @return
+ */
+int dap_chain_net_init()
+{
+    dap_stream_ch_chain_init();
+    dap_stream_ch_chain_net_init();
+    dap_chain_node_client_init();
+    dap_chain_node_cli_cmd_item_create ("net", s_cli_net, "Network commands",
+        "net list [chains -n <chain net name>]"
+            "\tList all networks or list all chains in selected network"
+        "net -net <chain net name> [-mode {update | all}] go {online | offline | sync}\n"
+            "\tFind and establish links and stay online. \n"
+            "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n"
+        "net -net <chain net name> get status\n"
+            "\tLook at current status\n"
+        "net -net <chain net name> stats tx [-from <From time>] [-to <To time>] [-prev_sec <Seconds>] \n"
+            "\tTransactions statistics. Time format is <Year>-<Month>-<Day>_<Hours>:<Minutes>:<Seconds> or just <Seconds> \n"
+        "net -net <chain net name> [-mode {update | all}] sync {all | gdb | chains}\n"
+            "\tSyncronyze gdb, chains or everything\n"
+            "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n"
+        "net -net <chain net name> link {list | add | del | info | establish}\n"
+            "\tList, add, del, dump or establish links\n"
+        "net -net <chain net name> ca add {-cert <cert name> | -hash <cert hash>}\n"
+            "\tAdd certificate to list of authority cetificates in GDB group\n"
+        "net -net <chain net name> ca list\n"
+            "\tPrint list of authority cetificates from GDB group\n"
+        "net -net <chain net name> ca del -hash <cert hash> [-H hex|base58(default)]\n"
+            "\tDelete certificate from list of authority cetificates in GDB group by it's hash\n"
+        "net -net <chain net name> ledger reload\n"
+            "\tPurge the cache of chain net ledger and recalculate it from chain file\n");
+    s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false);
 
+    // maximum number of connections to other nodes
+    s_max_links_count = dap_config_get_item_int32_default(g_config, "general", "max_links", s_max_links_count);
+    // required number of connections to other nodes
+    s_required_links_count = dap_config_get_item_int32_default(g_config, "general", "require_links", s_required_links_count);
+    s_debug_more = dap_config_get_item_bool_default(g_config,"chain_net","debug_more",false);
+
+    dap_chain_net_load_all();
+
+    dap_enc_http_set_acl_callback(dap_chain_net_set_acl);
+    log_it(L_NOTICE,"Chain networks initialized");
+    return 0;
+}
+
+/**
+ * @brief get certificate hash from chain config [acl_accept_ca_gdb] param
+ * 
+ * @param a_net dap_chain_net_t chain object
+ * @return char* 
+ */
 char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net)
 {
     if (a_net) {
@@ -273,9 +329,10 @@ char *dap_chain_net_get_gdb_group_acl(dap_chain_net_t *a_net)
 }
 
 /**
- * @brief s_net_state_to_str
- * @param l_state
- * @return
+ * @brief convert dap_chain_net_state_t net state object to string
+ * 
+ * @param l_state dap_chain_net_state_t
+ * @return const char* 
  */
 inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state)
 {
@@ -283,9 +340,11 @@ inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state)
 }
 
 /**
- * @brief dap_chain_net_state_go_to
- * @param a_net
- * @param a_new_state
+ * @brief set current network state to F_DAP_CHAIN_NET_GO_SYNC
+ * 
+ * @param a_net dap_chain_net_t network object
+ * @param a_new_state dap_chain_net_state_t new network state
+ * @return int 
  */
 int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state)
 {
@@ -297,7 +356,7 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n
     pthread_mutex_lock( &PVT(a_net)->state_mutex_cond); // Preventing call of state_go_to before wait cond will be armed
     // set flag for sync
     PVT(a_net)->flags |= F_DAP_CHAIN_NET_GO_SYNC;
-    PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO;
+    //PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO;  // TODO set this flag according to -mode argument from command line
 #ifndef _WIN32
     pthread_cond_signal( &PVT(a_net)->state_proc_cond );
 #else
@@ -308,12 +367,31 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n
     return 0;
 }
 
+dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net)
+{
+    return PVT(a_net)->state_target;
+}
 
+/**
+ * @brief set s_srv_callback_notify
+ * 
+ * @param a_callback dap_global_db_obj_callback_notify_t callback function
+ */
 void dap_chain_net_set_srv_callback_notify(dap_global_db_obj_callback_notify_t a_callback)
 {
     s_srv_callback_notify = a_callback;
 }
 
+/**
+ * @brief if current network in ONLINE state send to all connected node
+ * executes, when you add data to gdb chain (class=gdb in chain config)
+ * @param a_arg arguments. Can be network object (dap_chain_net_t)
+ * @param a_op_code object type (f.e. l_net->type from dap_store_obj)
+ * @param a_group group, for example "chain-gdb.home21-network.chain-F"
+ * @param a_key key hex value, f.e. 0x12EFA084271BAA5EEE93B988E73444B76B4DF5F63DADA4B300B051E29C2F93
+ * @param a_value buffer with data
+ * @param a_value_len buffer size
+ */
 void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const char *a_group,
                                       const char *a_key, const void *a_value, const size_t a_value_len)
 {
@@ -341,13 +419,13 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c
         dap_store_obj_pkt_t *l_data_out = dap_store_packet_single(l_obj);
         dap_store_obj_free(l_obj, 1);
         dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb");
-        dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t){};
+        dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t) {};
         dap_chain_cell_id_t l_cell_id = l_chain ? l_chain->cells->id : (dap_chain_cell_id_t){};
         pthread_rwlock_rdlock(&PVT(l_net)->rwlock);
         for (dap_list_t *l_tmp = PVT(l_net)->links; l_tmp; l_tmp = dap_list_next(l_tmp)) {
             dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data;
             dap_stream_worker_t *l_stream_worker = dap_client_get_stream_worker(l_node_client->client);
-            if (l_stream_worker)
+            if (!l_stream_worker)
                 continue;
             dap_stream_ch_chain_pkt_write_mt(l_stream_worker, l_node_client->ch_chain_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id.uint64,
                                                  l_chain_id.uint64, l_cell_id.uint64, l_data_out,
@@ -359,14 +437,14 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c
 }
 
 /**
- * @brief s_gbd_history_callback_notify
- * @param a_arg
- * @param a_op_code
- * @param a_prefix
- * @param a_group
- * @param a_key
- * @param a_value
- * @param a_value_len
+ * @brief added like callback in dap_chain_global_db_add_sync_group
+ * 
+ * @param a_arg arguments. Can be network object (dap_chain_net_t)
+ * @param a_op_code object type (f.e. l_net->type from dap_store_obj)
+ * @param a_group group, for example "chain-gdb.home21-network.chain-F"
+ * @param a_key key hex value, f.e. 0x12EFA084271BAA5EEE93B988E73444B76B4DF5F63DADA4B300B051E29C2F93
+ * @param a_value buffer with data
+ * @param a_value_len buffer size
  */
 static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, const char * a_group,
                                                      const char * a_key, const void * a_value, const size_t a_value_len)
@@ -458,16 +536,13 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie
     }
 
     a_node_client->resync_gdb = l_net_pvt->flags & F_DAP_CHAIN_NET_SYNC_FROM_ZERO;
-    if (!a_node_client->is_reconnecting) {
-        if ( s_debug_more )
-        log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name,
-               NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr));
-        pthread_rwlock_wrlock(&l_net_pvt->rwlock);
-        l_net_pvt->links = dap_list_append(l_net_pvt->links, a_node_client);
-        l_net_pvt->links_connected_count++;
-        s_net_links_notify(l_net);
-    }
-
+    if ( s_debug_more )
+    log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name,
+           NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr));
+    pthread_rwlock_wrlock(&l_net_pvt->rwlock);
+    l_net_pvt->links_connected_count++;
+    a_node_client->is_connected = true;
+    s_net_links_notify(l_net);
     if(l_net_pvt->state == NET_STATE_LINKS_CONNECTING ){
         l_net_pvt->state = NET_STATE_LINKS_ESTABLISHED;
         dap_proc_queue_add_callback_inter(a_node_client->stream_worker->worker->proc_queue_input,s_net_states_proc,l_net );
@@ -486,25 +561,18 @@ static void s_node_link_callback_disconnected(dap_chain_node_client_t * a_node_c
     dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg;
     dap_chain_net_pvt_t * l_net_pvt = PVT(l_net);
     pthread_rwlock_wrlock(&l_net_pvt->rwlock);
-    if ( l_net_pvt->state_target ==NET_STATE_ONLINE ){
-        if(s_debug_more)
-            log_it(L_NOTICE, "%s."NODE_ADDR_FP_STR" disconnected, reconnecting back...",
-               l_net->pub.name,
-               NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr) );
-        a_node_client->is_reconnecting = true;
-        dap_chain_net_client_create_n_connect(l_net, a_node_client->info);
-    }else if (l_net_pvt->state_target == NET_STATE_OFFLINE){
-        if(l_net_pvt->links_connected_count) {
-            s_node_link_callback_delete(a_node_client,a_arg);
+    if (a_node_client->is_connected) {
+        a_node_client->is_connected = false;
+        log_it(L_INFO, "%s."NODE_ADDR_FP_STR" disconnected.%s",l_net->pub.name,
+               NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address),
+               l_net_pvt->state_target == NET_STATE_OFFLINE ? "" : " Reconnecting back...");
+        if (l_net_pvt->links_connected_count)
             l_net_pvt->links_connected_count--;
-        } else
-            log_it(L_CRITICAL,"Links count is zero in disconnected callback, looks smbd decreased it twice or forget to increase on connect/reconnect");
-        log_it(L_INFO, "%s."NODE_ADDR_FP_STR" disconnected",l_net->pub.name,NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address));
-
-    }else{
-        log_it(L_CRITICAL,"Link "NODE_ADDR_FP_STR" disconnected, but wrong target state %s: could be only NET_STATE_ONLINE or NET_STATE_OFFLINE "
-               ,NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr)
-               , c_net_states[l_net_pvt->state_target]  );
+        else
+            log_it(L_ERROR, "Links count is zero in disconnected callback, looks smbd decreased it twice or forget to increase on connect/reconnect");
+    }
+    if (l_net_pvt->state_target != NET_STATE_OFFLINE) {
+        a_node_client->keep_connection = true;
     }
     pthread_rwlock_unlock(&l_net_pvt->rwlock);
 }
@@ -755,7 +823,6 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
     assert(l_net_pvt);
     if (l_net_pvt->state_target == NET_STATE_OFFLINE) {
         l_net_pvt->state = NET_STATE_OFFLINE;
-        return true;
     }
 
     pthread_rwlock_wrlock(&l_net_pvt->rwlock);
@@ -912,16 +979,18 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
             log_it(L_INFO, "%s.state: NET_STATE_LINKS_CONNECTING",l_net->pub.name);
             for (dap_list_t *l_tmp = l_net_pvt->links_info; l_tmp; l_tmp = dap_list_next(l_tmp)) {
                 dap_chain_node_info_t *l_link_info = (dap_chain_node_info_t *)l_tmp->data;
-                (void) dap_chain_net_client_create_n_connect(l_net,l_link_info);
+                dap_chain_node_client_t *l_client = dap_chain_net_client_create_n_connect(l_net, l_link_info);
+                l_client->keep_connection = true;
+                l_net_pvt->links = dap_list_append(l_net_pvt->links, l_client);
+                if (dap_list_length(l_net_pvt->links) == s_required_links_count)
+                    break;
             }
         } break;
+
         case NET_STATE_LINKS_ESTABLISHED:{
             log_it(L_INFO,"%s.state: NET_STATE_LINKS_ESTABLISHED", l_net->pub.name);
-            for (dap_list_t *l_tmp = l_net_pvt->links ; l_tmp; l_tmp = dap_list_next(l_tmp)) {
-                //dap_chain_node_client_t *l_link = (dap_chain_node_client_t *)l_tmp->data;
-                //
-            }
         }break;
+
         case NET_STATE_SYNC_GDB :{
             log_it(L_INFO,"%s.state: NET_STATE_SYNC_GDB", l_net->pub.name);
         }break;
@@ -930,11 +999,11 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
             log_it(L_INFO,"%s.state: NET_STATE_SYNC_CHAINS", l_net->pub.name);
         }break;
 
-
         case NET_STATE_ONLINE: {
             log_it(L_NOTICE,"%s.state: NET_STATE_ONLINE", l_net->pub.name);
         }
         break;
+
         default: log_it (L_DEBUG, "Unprocessed state");
     }
     s_net_states_notify(l_net);
@@ -942,6 +1011,38 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
 
     return ! l_repeat_after_exit;
 }
+
+bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client)
+{
+    dap_chain_net_pvt_t *l_net_pvt = PVT(a_net);
+    pthread_rwlock_rdlock(&l_net_pvt->rwlock);
+    bool l_found = false;
+    if (l_net_pvt->active_link) {
+        for (dap_list_t *l_links = l_net_pvt->links; l_links; l_links = dap_list_next(l_links)) {
+            if (l_links->data == l_net_pvt->active_link) {
+                dap_chain_node_client_t *l_client = (dap_chain_node_client_t *)l_links->data;
+                if (l_client->state >= NODE_CLIENT_STATE_ESTABLISHED &&
+                        l_client->state < NODE_CLIENT_STATE_SYNCED) {
+                    l_found = true;
+                    break;
+                }
+            }
+        }
+    }
+    if (!l_found) {
+        l_net_pvt->active_link = a_client;
+    }
+    pthread_rwlock_unlock(&l_net_pvt->rwlock);
+    return !l_found;
+}
+
+void dap_chain_net_sync_unlock(dap_chain_net_t *a_net)
+{
+    dap_chain_net_pvt_t *l_net_pvt = PVT(a_net);
+    pthread_rwlock_rdlock(&l_net_pvt->rwlock);
+    l_net_pvt->active_link = NULL;
+    pthread_rwlock_unlock(&l_net_pvt->rwlock);
+}
 /**
  * @brief dap_chain_net_client_create_n_connect
  * @param a_net
@@ -987,6 +1088,8 @@ dap_chain_node_role_t dap_chain_net_get_role(dap_chain_net_t * a_net)
 static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name ,
                                     const char * a_node_role)
 {
+    if (!a_id || !a_name || !a_node_role)
+        return NULL;
     dap_chain_net_t *ret = DAP_NEW_Z_SIZE( dap_chain_net_t, sizeof(ret->pub) + sizeof(dap_chain_net_pvt_t) );
     ret->pub.name = strdup( a_name );
 
@@ -1058,56 +1161,6 @@ void dap_chain_net_delete( dap_chain_net_t * a_net )
 }
 
 
-/**
- * @brief
- * init network settings from cellrame-node.cfg file
- * register net* commands in cellframe-node-cli interface
- * @return
- */
-int dap_chain_net_init()
-{
-    dap_stream_ch_chain_init();
-    dap_stream_ch_chain_net_init();
-
-    dap_chain_node_client_init();
-    dap_chain_node_cli_cmd_item_create ("net", s_cli_net, "Network commands",
-        "net list [chains -n <chain net name>]"
-            "\tList all networks or list all chains in selected network"
-        "net -net <chain net name> [-mode update|all] go < online | offline >\n"
-            "\tFind and establish links and stay online. \n"
-            "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n"
-        "net -net <chain net name> get status\n"
-            "\tLook at current status\n"
-        "net -net <chain net name> stats tx [-from <From time>] [-to <To time>] [-prev_sec <Seconds>] \n"
-            "\tTransactions statistics. Time format is <Year>-<Month>-<Day>_<Hours>:<Minutes>:<Seconds> or just <Seconds> \n"
-        "net -net <chain net name> [-mode update|all] sync < all | gdb | chains >\n"
-            "\tSyncronyze gdb, chains or everything\n"
-            "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n"
-        "net -net <chain net name> link < list | add | del | info | establish >\n"
-            "\tList, add, del, dump or establish links\n"
-        "net -net <chain net name> ca add {-cert <cert name> | -hash <cert hash>}\n"
-            "\tAdd certificate to list of authority cetificates in GDB group\n"
-        "net -net <chain net name> ca list\n"
-            "\tPrint list of authority cetificates from GDB group\n"
-        "net -net <chain net name> ca del -hash <cert hash> [-H hex|base58(default)]\n"
-            "\tDelete certificate from list of authority cetificates in GDB group by it's hash\n"
-        "net -net <chain net name> ledger reload\n"
-            "\tPurge the cache of chain net ledger and recalculate it from chain file\n"                                        );
-    s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false);
-
-    // maximum number of connections to other nodes
-    s_max_links_count = dap_config_get_item_int32_default(g_config, "general", "max_links", s_max_links_count);
-    // required number of connections to other nodes
-    s_required_links_count = dap_config_get_item_int32_default(g_config, "general", "require_links", s_required_links_count);
-    s_debug_more = dap_config_get_item_bool_default(g_config,"chain_net","debug_more",false);
-
-    dap_chain_net_load_all();
-
-    dap_enc_http_set_acl_callback(dap_chain_net_set_acl);
-    log_it(L_NOTICE,"Chain networks initialized");
-    return 0;
-}
-
 /**
  * @brief 
  * load network config settings
@@ -1166,8 +1219,8 @@ void s_set_reply_text_node_status(char **a_str_reply, dap_chain_net_t * a_net){
     char* l_sync_current_link_text_block = NULL;
     if (PVT(a_net)->state != NET_STATE_OFFLINE)
         l_sync_current_link_text_block = dap_strdup_printf(", active links %u from %u",
-                                                           dap_list_length(PVT(a_net)->links),
-                                                           dap_list_length(PVT(a_net)->links_info));
+                                                           PVT(a_net)->links_connected_count,
+                                                           dap_list_length(PVT(a_net)->links));
     dap_chain_node_cli_set_reply_text(a_str_reply,
                                       "Network \"%s\" has state %s (target state %s)%s%s",
                                       a_net->pub.name, c_net_states[PVT(a_net)->state],
@@ -1205,18 +1258,17 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
     // command 'list'
     const char * l_list_cmd = NULL;
 
-    if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "list", &l_list_cmd) != 0 ) {
+    if(dap_chain_node_cli_find_option_val(argv, arg_index, min(argc, arg_index + 1), "list", &l_list_cmd) != 0 ) {
         dap_string_t *l_string_ret = dap_string_new("");
         if (dap_strcmp(l_list_cmd,"chains")==0){
             const char * l_net_str = NULL;
             dap_chain_net_t* l_net = NULL;
             dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_str);
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "--net", &l_net_str);
-            dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-n", &l_net_str);
+
             l_net = dap_chain_net_by_name(l_net_str);
 
             if (l_net){
-                dap_string_append(l_string_ret,"Chains:\n ");
+                dap_string_append(l_string_ret,"Chains:\n");
                 dap_chain_t * l_chain = l_net->pub.chains;
                 while (l_chain) {
                     dap_string_append_printf(l_string_ret, "\t%s:\n", l_chain->name );
@@ -1225,7 +1277,7 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
             }else{
                 dap_chain_net_item_t * l_net_item, *l_net_item_tmp;
                 int l_net_i = 0;
-                dap_string_append(l_string_ret,"Networks:\n ");
+                dap_string_append(l_string_ret,"Networks:\n");
                 HASH_ITER(hh, s_net_items, l_net_item, l_net_item_tmp){
                     l_net = l_net_item->chain_net;
                     dap_string_append_printf(l_string_ret, "\t%s:\n", l_net_item->name);
@@ -1240,12 +1292,12 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
             }
 
         }else{
-            dap_string_append(l_string_ret,"Networks:\n ");
+            dap_string_append(l_string_ret,"Networks:\n");
             // show list of nets
             dap_chain_net_item_t * l_net_item, *l_net_item_tmp;
             int l_net_i = 0;
             HASH_ITER(hh, s_net_items, l_net_item, l_net_item_tmp){
-                dap_string_append_printf(l_string_ret, "%s\n", l_net_item->name);
+                dap_string_append_printf(l_string_ret, "\t%s\n", l_net_item->name);
                 l_net_i++;
             }
             dap_string_append(l_string_ret, "\n");
@@ -1359,7 +1411,7 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
             else if(strcmp(l_go_str, "sync") == 0) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Network \"%s\" resynchronizing",
                                                   l_net->pub.name);
-                dap_chain_net_state_go_to(l_net, NET_STATE_SYNC_GDB);
+                dap_chain_net_state_go_to(l_net, NET_STATE_SYNC_CHAINS);
             }
 
         } else if ( l_get_str){
@@ -1438,6 +1490,7 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
                 dap_chain_node_cli_set_reply_text(a_str_reply,
                                                   "SYNC_CHAINS state requested to state machine. Current state: %s\n",
                                                   c_net_states[ PVT(l_net)->state] );
+                // TODO set PVT flag to exclude GDB sync
                 dap_chain_net_sync_chains(l_net);
 
             } else {
@@ -1549,7 +1602,7 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
                 ret = -5;
             }
         } else if (l_ledger_str && !strcmp(l_ledger_str, "reload")) {
-            dap_chain_ledger_purge(l_net->pub.ledger);
+            dap_chain_ledger_purge(l_net->pub.ledger, false);
             dap_chain_t *l_chain;
             DL_FOREACH(l_net->pub.chains, l_chain) {
                 if (l_chain->callback_purge) {
@@ -1613,11 +1666,11 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                                             dap_config_get_item_str(l_cfg , "general" , "name" ),
                                             dap_config_get_item_str(l_cfg , "general" , "node-role" )
                                            );
-        dap_chain_net_pvt_t * l_net_pvt = PVT(l_net);
         if(!l_net) {
             log_it(L_ERROR,"Can't create l_net");
             return -1;
         }
+        dap_chain_net_pvt_t * l_net_pvt = PVT(l_net);
         l_net_pvt->load_mode = true;
         l_net_pvt->acl_idx = a_acl_idx;
         l_net->pub.gdb_groups_prefix = dap_strdup (
@@ -1695,7 +1748,6 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
             case NODE_ROLE_ROOT_MASTER:
             case NODE_ROLE_ROOT:
             case NODE_ROLE_ARCHIVE:
-                l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION;
             case NODE_ROLE_MASTER:
                 l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_CELLS_DS;
             case NODE_ROLE_CELL_MASTER:
@@ -2094,6 +2146,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
             l_target_state = NET_STATE_OFFLINE;
         }
         l_net_pvt->load_mode = false;
+        dap_chain_ledger_load_end(l_net->pub.ledger);
 
         if (l_target_state != l_net_pvt->state_target)
             dap_chain_net_state_go_to(l_net, l_target_state);
@@ -2543,23 +2596,12 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t
         return -11;
 
     switch ( a_datum->header.type_id) {
-        case DAP_CHAIN_DATUM_256_TX: // 256
         case DAP_CHAIN_DATUM_TX:
-            return dap_chain_ledger_tx_add_check( a_net->pub.ledger,
-                    (dap_chain_datum_tx_t*) a_datum->data );
-
-        case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256
+            return dap_chain_ledger_tx_add_check( a_net->pub.ledger, (dap_chain_datum_tx_t*)a_datum->data );
         case DAP_CHAIN_DATUM_TOKEN_DECL:
-            return dap_chain_ledger_token_decl_add_check( a_net->pub.ledger,
-                    (dap_chain_datum_token_t*) a_datum->data );
-
-        case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256
-        case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
-            // dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) a_datum->data;
-            // l_token_em->hdr.type_value_256 = a_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ?
-            //                                     true : false;
-            return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger, (dap_chain_datum_token_emission_t*) a_datum->data, a_datum->header.data_size );
-        }
+            return dap_chain_ledger_token_decl_add_check( a_net->pub.ledger, (dap_chain_datum_token_t *)a_datum->data);
+        case DAP_CHAIN_DATUM_TOKEN_EMISSION:
+            return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger, a_datum->data, a_datum->header.data_size );
         default: return 0;
     }
 }
@@ -2573,17 +2615,16 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t
  * @param a_str_out
  * @param a_datum
  */
-void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum, const char *a_hash_out_type)
+void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type)
 {
     if( a_datum == NULL){
         dap_string_append_printf(a_str_out,"==Datum is NULL\n");
         return;
     }
     switch (a_datum->header.type_id){
-        case DAP_CHAIN_DATUM_256_TOKEN_DECL:
         case DAP_CHAIN_DATUM_TOKEN_DECL:{
-            dap_chain_datum_token_t * l_token = (dap_chain_datum_token_t*) a_datum->data;
             size_t l_token_size = a_datum->header.data_size;
+            dap_chain_datum_token_t * l_token = dap_chain_datum_token_read(a_datum->data, &l_token_size);
             if(l_token_size < sizeof(dap_chain_datum_token_t)){
                 dap_string_append_printf(a_str_out,"==Datum has incorrect size. Only %zu, while at least %zu is expected\n",
                                          l_token_size, sizeof(dap_chain_datum_token_t));
@@ -2602,7 +2643,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                         dap_string_append_printf(a_str_out, "total_supply: %"DAP_UINT64_FORMAT_U"\n", l_token->header_private.total_supply );
                     else
                         dap_string_append_printf(a_str_out, "total_supply: %s\n", 
-                                        dap_chain_u256tostr(l_token->header_private.total_supply_256));
+                                                dap_chain_balance_print(l_token->header_private.total_supply_256));
                 }break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{
@@ -2632,13 +2673,13 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256: // 256
                                     dap_string_append_printf(a_str_out,"total_supply: %s\n",
-                                                        dap_chain_u256tostr(
+                                                        dap_chain_balance_print(
                                                                 dap_tsd_get_scalar(l_tsd, uint256_t)));
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: // 128
                                     dap_string_append_printf(a_str_out,"total_supply: %s\n",
-                                                        dap_chain_balance_print(
-                                                            dap_tsd_get_scalar(l_tsd, uint128_t)));
+                                                        dap_chain_balance_print(GET_256_FROM_128(
+                                                            dap_tsd_get_scalar(l_tsd, uint128_t))));
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID :
                                     dap_string_append_printf(a_str_out,"total_signs_valid: %u\n",
@@ -2744,13 +2785,13 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                             switch( l_tsd->type){
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256: // 256
                                     dap_string_append_printf(a_str_out,"total_supply: %s\n",
-                                                            dap_chain_u256tostr(
+                                                            dap_chain_balance_print(
                                                                     dap_tsd_get_scalar(l_tsd, uint256_t)));
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: // 128
                                         dap_string_append_printf(a_str_out,"total_supply: %s\n",
-                                                            dap_chain_balance_print(
-                                                                dap_tsd_get_scalar(l_tsd, uint128_t)));
+                                                            dap_chain_balance_print(GET_256_FROM_128(
+                                                                                        dap_tsd_get_scalar(l_tsd, uint128_t))));
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID :
                                     dap_string_append_printf(a_str_out,"total_signs_valid: %u\n",
@@ -2790,7 +2831,6 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                     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_certs_field_size);
                 }break;
-                case DAP_CHAIN_DATUM_256_TX:
                 case DAP_CHAIN_DATUM_TX:{
                     dap_chain_datum_tx_t * l_tx =(dap_chain_datum_tx_t *) a_datum->data;
                     char buf[50];
@@ -2816,9 +2856,9 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                     dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str, sizeof (l_tx_prev_hash_str)-1);
                                     dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str );
                                 } break;
-                                case TX_ITEM_TYPE_256_OUT: { // 256
+                                case TX_ITEM_TYPE_OUT_256: { // 256
                                     dap_string_append_printf(a_str_out,"\tvalue: %s\n", 
-                                                dap_chain_u256tostr(((dap_chain_256_tx_out_t *)l_cur->data)->header.value)
+                                                dap_chain_balance_print(((dap_chain_256_tx_out_t *)l_cur->data)->header.value)
                                             );
                                     char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_256_tx_out_t *)l_cur->data)->addr );
                                     dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
@@ -2832,20 +2872,9 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                     dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
                                     DAP_DELETE(l_addr_str);
                                 } break;
-                                case TX_ITEM_TYPE_256_OUT_EXT: { // 256
-                                    // dap_chain_256_tx_out_ext_t * l_out_ext = l_cur->data;
+                                case TX_ITEM_TYPE_OUT_EXT: { // 256
                                     dap_string_append_printf(a_str_out,"\tvalue: %s\n",
-                                                dap_chain_u256tostr(((dap_chain_256_tx_out_ext_t *)l_cur->data)->header.value)
-                                            );
-                                    char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_256_tx_out_ext_t *)l_cur->data)->addr );
-                                    dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
-                                    dap_string_append_printf(a_str_out,"\ttoken : %s\n", ((dap_chain_256_tx_out_ext_t *)l_cur->data)->token );
-                                    DAP_DELETE(l_addr_str);
-                                } break;
-                                case TX_ITEM_TYPE_OUT_EXT:{
-                                    // dap_chain_tx_out_ext_t * l_out_ext = l_cur->data;
-                                    dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n",
-                                                ((dap_chain_tx_out_ext_t *)l_cur->data)->header.value
+                                                dap_chain_balance_print(((dap_chain_tx_out_ext_t *)l_cur->data)->header.value)
                                             );
                                     char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_tx_out_ext_t *)l_cur->data)->addr );
                                     dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
@@ -2863,7 +2892,6 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                     dap_hash_fast_to_str(&l_sign_hash,l_sign_hash_str,sizeof (l_sign_hash_str)-1);
                                     dap_string_append_printf(a_str_out,"\tpkey_hash: %s\n", l_sign_hash_str );
                                 } break;
-                                case TX_ITEM_TYPE_256_TOKEN: // 256
                                 case TX_ITEM_TYPE_TOKEN:{
                                     dap_chain_tx_token_t * l_token = l_cur->data;
                                     dap_string_append_printf(a_str_out,"\tticker: %s\n", l_token->header.ticker );
@@ -2873,7 +2901,6 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                                                sizeof (l_token_emission_hash_str)-1);
                                     dap_string_append_printf(a_str_out,"\ttoken_emission_hash: %s", l_token_emission_hash_str );
                                 } break;
-                                case TX_ITEM_TYPE_256_TOKEN_EXT: // 256
                                 case TX_ITEM_TYPE_TOKEN_EXT:{
                                     dap_chain_tx_token_ext_t * l_token = l_cur->data;
                                     dap_string_append_printf(a_str_out,"\tversion: %u\n",l_token->header.version );
@@ -2894,9 +2921,9 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                     dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str,sizeof (l_tx_prev_hash_str)-1);
                                     dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str );
                                 } break;
-                                case TX_ITEM_TYPE_256_OUT_COND: { // 256
-                                    dap_chain_256_tx_out_cond_t * l_out = l_cur->data;
-                                    dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_u256tostr(l_out->header.value) );
+                                case TX_ITEM_TYPE_OUT_256_COND: { // 256
+                                    dap_chain_tx_out_cond_t * l_out = l_cur->data;
+                                    dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_balance_print(l_out->header.value) );
                                     switch ( l_out->header.subtype){
                                         case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{
                                             dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY\n");
@@ -2911,7 +2938,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                                 default: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNKNOWN\n"); break;
                                             }
                                             dap_string_append_printf(a_str_out,"\tunit_price_max: %s\n",
-                                                    dap_chain_u256tostr(l_out->subtype.srv_pay.unit_price_max_datoshi)
+                                                    dap_chain_balance_print(l_out->subtype.srv_pay.unit_price_max_datoshi)
                                                 );
                                             char l_pkey_hash_str[70]={[0]='\0'};
                                             dap_chain_hash_fast_to_str(&l_out->subtype.srv_pay.pkey_hash, l_pkey_hash_str, sizeof (l_pkey_hash_str)-1);
@@ -2930,7 +2957,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                     dap_string_append_printf(a_str_out,"\tparams_size : %u\n", l_out->params_size );
                                 } break;
                                 case TX_ITEM_TYPE_OUT_COND:{
-                                    dap_chain_tx_out_cond_t * l_out = l_cur->data;
+                                    dap_chain_tx_out_cond_old_t * l_out = l_cur->data;
                                     dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", l_out->header.value );
                                     switch ( l_out->header.subtype){
                                         case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{
@@ -2946,9 +2973,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                                 default: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNKNOWN\n"); break;
                                             }
                                             dap_string_append_printf(a_str_out,"\tunit_price_max: %"DAP_UINT64_FORMAT_U"\n",
-                                                        l_out->subtype.srv_pay.unit_price_max_datoshi
-                                                    );
-
+                                                        l_out->subtype.srv_pay.unit_price_max_datoshi);
                                             char l_pkey_hash_str[70]={[0]='\0'};
                                             dap_chain_hash_fast_to_str(&l_out->subtype.srv_pay.pkey_hash, l_pkey_hash_str, sizeof (l_pkey_hash_str)-1);
                                             dap_string_append_printf(a_str_out,"\tpkey_hash: %s\n", l_pkey_hash_str );
@@ -2986,6 +3011,14 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
     }
 }
 
+/**
+ * @brief check certificate access list, written in chain config
+ * 
+ * @param a_net - network object
+ * @param a_pkey_hash - certificate hash
+ * @return true 
+ * @return false 
+ */
 static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pkey_hash)
 {
     const char l_path[] = "network/";
@@ -3046,6 +3079,12 @@ static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pke
     return l_authorized;
 }
 
+/**
+ * @brief s_acl_callback function. Usually called from enc_http_proc
+ * set acl (l_enc_key_ks->acl_list) from acl_accept_ca_list, acl_accept_ca_gdb chain config parameters in [auth] section
+ * @param a_pkey_hash dap_chain_hash_fast_t hash object
+ * @return uint8_t* 
+ */
 static uint8_t *dap_chain_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash)
 {
     uint16_t l_net_count;
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index bf92f61f6bd6b2d22c27bf859fa61800f06bb324..89717fd4ef0ba0625676ba415370353baca2a0ef 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -49,7 +49,7 @@
 #define LOG_TAG "chain_node"
 
 /**
- * Generate node address by shard id
+ * Generate node address
  */
 dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_id_t a_net_id)
 {
@@ -224,7 +224,7 @@ dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_cha
     return node_info;
 }*/
 
-int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum)
+int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_datum)
 {
     bool l_need_process = false;
     for (uint16_t j = 0; j < a_chain->autoproc_datum_types_count; j++) {
@@ -235,31 +235,21 @@ int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a
     }
     if (!l_need_process)
         return -1;
-    if (a_datum->header.type_id == DAP_CHAIN_DATUM_TX) {
-        dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)a_datum->data;
-        dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)dap_chain_datum_tx_item_get(l_tx, NULL, TX_ITEM_TYPE_IN, NULL);
-        // Is not it a base transaction?
-        if (l_tx_in && !dap_hash_fast_is_blank(&l_tx_in->header.tx_prev_hash)) {
-            if (a_role.enums == NODE_ROLE_ROOT) {
-                return -1;
-            }
-        }
-    }
+    // Auth signs for emissions already verified by this callback
     return (int)a_chain->callback_add_datums(a_chain, &a_datum, 1);
 }
 
-static bool s_mempool_auto = false;
 
 /**
- * @brief 
+ * @brief
  * get automatic mempool processing, when network config contains mempool_auto_types for specific datums
- * @return true 
- * @return false 
+ * @return true
+ * @return false
  */
 bool dap_chain_node_mempool_autoproc_init()
 {
     uint16_t l_net_count;
-    bool l_mempool_auto_default = false;
+    bool l_mempool_auto_default = false, l_ret = false;
     dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count);
     for (uint16_t i = 0; i < l_net_count; i++) {
         dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net_list[i]);
@@ -272,10 +262,12 @@ bool dap_chain_node_mempool_autoproc_init()
                 l_mempool_auto_default = true;
                 break;
             default:
+                l_mempool_auto_default = false;
                 break;
         }
-        s_mempool_auto = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", l_mempool_auto_default);
-        if (s_mempool_auto) {
+        l_net_list[i]->pub.mempool_autoproc = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", l_mempool_auto_default);
+        if (l_net_list[i]->pub.mempool_autoproc) {
+            l_ret = true;
             dap_chain_t *l_chain;
             DL_FOREACH(l_net_list[i]->pub.chains, l_chain) {
                 if (!l_chain) {
@@ -290,7 +282,7 @@ bool dap_chain_node_mempool_autoproc_init()
                         if (!l_objs[i].value_len)
                             continue;
                         dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value;
-                        if (dap_chain_node_mempool_process(l_chain, l_role, l_datum) > 0) {
+                        if (dap_chain_node_mempool_process(l_chain, l_datum) >= 0) {
                             // Delete processed objects
                             dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
                         }
@@ -302,7 +294,7 @@ bool dap_chain_node_mempool_autoproc_init()
         }
     }
     DAP_DELETE(l_net_list);
-    return s_mempool_auto;
+    return l_ret;
 }
 
 /**
@@ -310,17 +302,18 @@ bool dap_chain_node_mempool_autoproc_init()
  */
 void dap_chain_node_mempool_autoproc_deinit()
 {
-    s_mempool_auto = false;
 }
 
 void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_group,
                                              const char *a_key, const void *a_value, const size_t a_value_len)
 {
     UNUSED(a_value_len);
-    if (!a_arg || !a_value || !s_mempool_auto || a_op_code != 'a') {
+    if (!a_arg || !a_value || a_op_code != 'a') {
         return;
     }
     dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;
+    if (!l_net->pub.mempool_autoproc)
+        return;
     dap_chain_t *l_chain;
     DL_FOREACH(l_net->pub.chains, l_chain) {
         if (!l_chain) {
@@ -329,8 +322,7 @@ void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, c
         char *l_gdb_group_str = dap_chain_net_get_gdb_group_mempool(l_chain);
         if (!strcmp(a_group, l_gdb_group_str)) {
             dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_value;
-            dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net);
-            if (dap_chain_node_mempool_process(l_chain, l_role, l_datum) > 0) {
+            if (dap_chain_node_mempool_process(l_chain, l_datum) >= 0) {
                 dap_chain_global_db_gr_del(dap_strdup(a_key), l_gdb_group_str);
             }
         }
diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index c3ed8698873fde589373462351ff00ef44043f4f..9f350b946833b87bef110b1d23e452875620d7f2 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -1088,8 +1088,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
     dap_chain_node_cli_cmd_item_create ("tx_cond_create", com_tx_cond_create, "Make cond transaction",
             "tx_cond_create -net <net name> -token <token_ticker> -wallet_f <wallet_from> -wallet_t <wallet_to>"
                                         "-value <value_datoshi> -unit <mb|kb|b|sec|day> -service <vpn>\n" );
-    dap_chain_node_cli_cmd_item_create ("tx_verify", com_tx_verify, "Verifing transaction",
-            "tx_verify  -wallet <wallet name> \n" );
+    dap_chain_node_cli_cmd_item_create ("tx_verify", com_tx_verify, "Verifing transaction in mempool",
+            "tx_verify -net <net name> -chain <chain name> -tx <tx_hash>\n" );
 
     // Transaction history
     dap_chain_node_cli_cmd_item_create("tx_history", com_tx_history, "Transaction history (for address or by hash)",
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 55b797a4dcfc9b1111faf886d161c957e435affe..4340f7d671d56486565efc741cf41c0a2567a76a 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -1803,10 +1803,9 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
 
             for(size_t i = 0; i < l_addr_tokens_size; i++) {
                 if(l_addr_tokens[i]) {
-                    // uint128_t l_balance = dap_chain_ledger_calc_balance(l_ledger, l_addr, l_addr_tokens[i]);
                     uint256_t l_balance = dap_chain_ledger_calc_balance(l_ledger, l_addr, l_addr_tokens[i]);
-                    char *l_balance_coins = dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_balance));
-                    char *l_balance_datoshi = dap_chain_balance_print(dap_chain_uint128_from_uint256(l_balance));
+                    char *l_balance_coins = dap_chain_balance_to_coins(l_balance);
+                    char *l_balance_datoshi = dap_chain_balance_print(l_balance);
                     dap_string_append_printf(l_string_ret, "\t%s (%s) %s\n", l_balance_coins,
                             l_balance_datoshi, l_addr_tokens[i]);
                     if(i < l_addr_tokens_size - 1)
@@ -2460,7 +2459,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
     int l_arg_index = 1;
 
     const char * l_type_str = NULL;
-    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; // 256
+    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE;
 
     const char * l_ticker = NULL;
 
@@ -2494,9 +2493,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
     // Token type
     l_arg_index=dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-type", &l_type_str);
 
-    if (!l_type_str || !strcmp(l_type_str, "private")) {
-        l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; // 256
-    } else {
+    if (l_type_str && strcmp(l_type_str, "private")) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "token_update can't accept type \"%s\"", l_type_str);
         return -22;
     }
@@ -2505,7 +2502,6 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
     size_t l_datum_data_offset = 0;
 
     switch(l_type){
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
         case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{ // 256
             dap_list_t *l_tsd_list = dap_list_alloc();
             size_t l_tsd_total_size = 0;
@@ -2559,15 +2555,9 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
                     }
                 } else if ( strcmp( a_argv[l_arg_index],"-total_supply" )==0){ // Total supply
                     dap_tsd_t * l_tsd;
-                    if ( dap_chain_datum_token_is_old(l_type) ) { // 128
-                        uint128_t l_param_value = dap_chain_balance_scan(l_arg_param); 
-                        l_tsd = dap_tsd_create_scalar(
-                                                DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value);
-                    } else {  // 256
-                        uint256_t l_param_value = GET_256_FROM_128(dap_chain_balance_scan(l_arg_param)); 
-                        l_tsd = dap_tsd_create_scalar(
-                                                DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value);
-                    }
+                    uint256_t l_param_value = dap_chain_balance_scan(l_arg_param);
+                    l_tsd = dap_tsd_create_scalar(
+                                            DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value);
                     dap_list_append( l_tsd_list, l_tsd);
                     l_tsd_total_size+= dap_tsd_size( l_tsd);
                 }else if ( strcmp( a_argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid
@@ -2788,7 +2778,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     const char * l_ticker = NULL;
 
     const char * l_total_supply_str = NULL;
-    uint256_t l_total_supply = uint256_0; // 256
+    uint256_t l_total_supply = {}; // 256
 
     const char * l_signs_emission_str = NULL;
     uint16_t l_signs_emission = 0;
@@ -2804,12 +2794,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     dap_chain_t * l_chain = NULL;
     dap_chain_net_t * l_net = NULL;
 
-    // 256
-    bool l_type_256 = true; //dap_chain_node_cli_check_option(a_argv, l_arg_index, a_argc, "-256") == -1 ? false : true;
-
-    uint16_t l_type = l_type_256 
-                                ? DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE // 256
-                                : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE;
+    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE;
 
     const char * l_hash_out_type = NULL;
     dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-H", &l_hash_out_type);
@@ -2842,14 +2827,11 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
     if (l_type_str) {
         if (strcmp( l_type_str, "private") == 0){
-            l_type = l_type_256 ? DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL // 256
-                                : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL;
+            l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL; // 256
         }else if (strcmp( l_type_str, "private_simple") == 0){
-            l_type = l_type_256 ? DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE // 256
-                                : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE;
+            l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; // 256
         }else if (strcmp( l_type_str, "public_simple") == 0){
-            l_type = l_type_256 ? DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC // 256
-                                : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC;
+            l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC; // 256
         }
     }
 
@@ -2857,8 +2839,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     size_t l_datum_data_offset = 0;
 
     switch(l_type){
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: {
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: { // 256
             dap_list_t *l_tsd_list = dap_list_alloc();
             size_t l_tsd_total_size = 0;
             uint16_t l_flags = 0;
@@ -2879,15 +2860,9 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
                      }
                 } else if ( strcmp( a_argv[l_arg_index],"-total_supply" )==0){ // Total supply
                     dap_tsd_t * l_tsd;
-                    if ( l_type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL ) { // 256
-                        uint256_t l_param_value = GET_256_FROM_128(dap_chain_balance_scan(l_arg_param));
-                        l_tsd = dap_tsd_create_scalar(
-                                        DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value);
-                    } else { // 128
-                        uint128_t l_param_value = dap_chain_balance_scan(l_arg_param);
-                        l_tsd = dap_tsd_create_scalar(
-                                        DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value);
-                    }
+                    uint256_t l_param_value = dap_chain_balance_scan(l_arg_param);
+                    l_tsd = dap_tsd_create_scalar(
+                                    DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value);
                     dap_list_append( l_tsd_list, l_tsd);
                     l_tsd_total_size+= dap_tsd_size( l_tsd);
                 }else if ( strcmp( a_argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid
@@ -2981,14 +2956,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
                 switch (l_tsd->type){
                     case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256: { // 256
                         char *l_balance;
-                        l_balance = dap_chain_u256tostr(dap_tsd_get_scalar(l_tsd, uint256_t));
-                        log_it(L_DEBUG,"== TOTAL_SUPPLY: %s", l_balance);
-                        DAP_DELETE(l_balance);
-                    }
-                    break;
-                    case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: { // 128
-                        char *l_balance;
-                        l_balance = dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint128_t));
+                        l_balance = dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint256_t));
                         log_it(L_DEBUG,"== TOTAL_SUPPLY: %s", l_balance);
                         DAP_DELETE(l_balance);
                     }
@@ -3027,8 +2995,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
 
         }break;
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: {
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: { // 256
             // Total supply value
             dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-total_supply", &l_total_supply_str);
 
@@ -3042,14 +3009,11 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
             // Signs minimum number thats need to authorize the emission
             dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-signs_emission", &l_signs_emission_str);
 
-
             if(!l_total_supply_str) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter '-total_supply'");
                 return -3;
             } else {
-                // char * l_tmp = NULL;
-                l_total_supply = GET_256_FROM_128(dap_chain_balance_scan(l_total_supply_str));
-                //if((l_total_supply = strtoull(l_total_supply_str, &l_tmp, 10)) == 0) {
+                l_total_supply = dap_chain_balance_scan((char *)l_total_supply_str);
                 if ( IS_ZERO_256(l_total_supply) ) {
                     dap_chain_node_cli_set_reply_text(a_str_reply,
                             "token_create requires parameter '-total_supply' to be unsigned integer value that fits in 8 bytes");
@@ -3057,8 +3021,6 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
                 }
             }
 
-
-
             // Signs emission
             if(!l_signs_emission_str) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter '-signs_emission'");
@@ -3105,14 +3067,9 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
             // Create new datum token
             l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t));
-            l_datum_token->type = l_type_256 
-                                            ? DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE // 256
-                                            : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE;
+            l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; // 256
             dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker);
-            if ( l_type_256 )
-                l_datum_token->header_private.total_supply_256 = l_total_supply;
-            else
-                l_datum_token->header_private.total_supply = dap_chain_uint256_to(l_total_supply);
+            l_datum_token->header_private.total_supply_256 = l_total_supply;
             l_datum_token->header_private.signs_total = l_signs_total;
             l_datum_token->header_private.signs_valid = l_signs_emission;
 
@@ -3136,13 +3093,9 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
             return -8;
     }
 
-    dap_chain_datum_t * l_datum = l_type_256 
-                                            ? dap_chain_datum_create( // 256
-                                                        DAP_CHAIN_DATUM_256_TOKEN_DECL,
-                                                        l_datum_token, sizeof(*l_datum_token) + l_datum_data_offset)
-                                            : dap_chain_datum_create(
-                                                        DAP_CHAIN_DATUM_TOKEN_DECL,
-                                                        l_datum_token, sizeof(*l_datum_token) + l_datum_data_offset);
+    dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_DECL,
+                                                         l_datum_token,
+                                                         sizeof(*l_datum_token) + l_datum_data_offset);
     size_t l_datum_size = dap_chain_datum_size(l_datum);
 
     // Calc datum's hash
@@ -3153,7 +3106,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
     // Add datum to mempool with datum_token hash as a key
     char * l_gdb_group_mempool;
-    if(l_chain) {
+    if (l_chain) {
         l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
     }
     else {
@@ -3161,15 +3114,11 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
     }
     int l_ret = 0;
-    char * l_datum_type = l_type_256 ? "256_t" : "";
-    if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
-        if(!dap_strcmp(l_hash_out_type,"hex"))
-            dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s %s with token %s is placed in datum pool ", l_datum_type, l_key_str, l_ticker);
-        else
-            dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s %s with token %s is placed in datum pool ", l_datum_type, l_key_str_base58, l_ticker);
-    }
-    else {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s %s is not placed in datum pool ", l_datum_type, l_key_str_base58);
+    bool l_placed = dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool);
+    dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s with 256bit token %s is%s placed in datum pool",
+                                      dap_strcmp(l_hash_out_type, "hex") ? l_key_str_base58 : l_key_str,
+                                      l_ticker, l_placed ? "" : " not");
+    if (!l_placed) {
         DAP_DELETE(l_datum);
         l_ret = -2;
     }
@@ -3189,23 +3138,15 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     int arg_index = 1;
     const char *str_tmp = NULL;
     char *str_reply_tmp = NULL;
-    // uint64_t l_emission_value = 0;
-    uint256_t l_emission_value = uint256_0;
-
+    uint256_t l_emission_value = {};
 
     const char * l_ticker = NULL;
 
     const char * l_addr_str = NULL;
 
     const char * l_emission_hash_str = NULL;
-    bool l_type_256 = true; // false;
-
-    char * l_emission_hash_str_new = NULL;
     dap_chain_hash_fast_t l_emission_hash={0};
-    
     dap_chain_datum_token_emission_t * l_emission = NULL;
-    //dap_chain_datum_256_token_emission_t * l_emission_256 = NULL; // 256
-    
     char * l_emission_hash_str_base58 = NULL;
 
     const char * l_certs_str = NULL;
@@ -3225,7 +3166,6 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type);
     if(!l_hash_out_type)
         l_hash_out_type = "hex";
-
     if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>");
         return -1;
@@ -3241,10 +3181,6 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     // Token emission
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-emission", &l_emission_hash_str);
 
-    // 256
-    // dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-256", &l_type_256);
-    //l_type_256 = dap_chain_node_cli_check_option(a_argv, arg_index, a_argc, "-256") == -1 ? false : true;
-
     // Emission certs
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-certs", &l_certs_str);
 
@@ -3256,15 +3192,15 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
 
     // Emission value
     if(dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-emission_value", &str_tmp)) {
-        // l_emission_value = strtoull(str_tmp, NULL, 10);
-        l_emission_value = GET_256_FROM_128(dap_chain_balance_scan(str_tmp)); 
+        l_emission_value = dap_chain_balance_scan(str_tmp);
     }
 
-    if( EQUAL_256(l_emission_value, uint256_0) ) {
+    if (IS_ZERO_256(l_emission_value)) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter '-emission_value'");
         return -1;
     }
 
+
     if(!l_addr_str) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter '-addr'");
         return -2;
@@ -3280,6 +3216,7 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
         return -4;
     }
 
+
     if (l_emission_hash_str){// Load emission
         l_emission_hash_str_base58 = dap_enc_base58_encode_hash_to_str(&l_emission_hash);
         if (dap_chain_hash_fast_from_str( l_emission_hash_str,&l_emission_hash) == 0 ){
@@ -3312,6 +3249,8 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
         }
     }
 
+
+
     dap_chain_addr_t * l_addr = dap_chain_addr_from_str(l_addr_str);
 
     if(!l_addr) {
@@ -3339,12 +3278,9 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     else {
         l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TX);
     }
-    //char * l_gdb_group_mempool_emission = dap_chain_net_get_gdb_group_mempool(l_chain_emission);
-    //char * l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool(l_chain_base_tx);
-
     // Create emission datum
     // then create datum in memory
-    if(!l_emission){
+    if (!l_emission) {
         char * l_gdb_group_mempool_emission;
         if(l_chain_emission) {
             l_gdb_group_mempool_emission = dap_chain_net_get_gdb_group_mempool(l_chain_emission);
@@ -3355,35 +3291,19 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
         size_t l_emission_size = sizeof(l_emission->hdr) +
                 sizeof(l_emission->data.type_auth.signs_count);
 
-        // size_t l_emission_256_size = sizeof(l_emission_256->hdr) +
-        //         sizeof(l_emission_256->data.type_auth.signs_count);
-
         l_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_emission_size);
-
-        if ( !l_type_256 ) {
-            // l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH;
-            // l_emission->hdr.type_256 = false;
-            l_emission->hdr.value = dap_chain_uint256_to(l_emission_value);
-        } else { // 256
-            // l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH;
-            // l_emission->hdr.type_256 = true;
-            l_emission->hdr.value_256 = l_emission_value;
-        }
-
-        l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH;
-        l_emission->hdr.version = 1;
-
+        l_emission->hdr.version = 2;
+        l_emission->hdr.value_256 = l_emission_value;
         strncpy(l_emission->hdr.ticker, l_ticker, sizeof(l_emission->hdr.ticker) - 1);
-        // l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH;
+        l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH;
         memcpy(&l_emission->hdr.address, l_addr, sizeof(l_emission->hdr.address));
-
         time_t l_time = time(NULL);
         memcpy(&l_emission->hdr.nonce, &l_time, sizeof(time_t));
+        l_emission->data.type_auth.signs_count = l_certs_size;
         // Then add signs
         size_t l_offset = 0;
-
         for(size_t i = 0; i < l_certs_size; i++) {
-            dap_sign_t * l_sign = dap_cert_sign(l_certs[i], &l_emission->hdr,
+            dap_sign_t *l_sign = dap_cert_sign(l_certs[i], &l_emission->hdr,
                     sizeof(l_emission->hdr), 0);
             size_t l_sign_size = dap_sign_get_size(l_sign);
             l_emission_size += l_sign_size;
@@ -3393,95 +3313,51 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
             DAP_DELETE(l_sign);
         }
 
-        dap_chain_datum_t * l_datum_emission;
-
         // Produce datum
-        if ( !l_type_256 )
-            l_datum_emission = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_EMISSION,
-                    l_emission,
-                    l_emission_size);
-        else // 256
-            l_datum_emission = dap_chain_datum_create(DAP_CHAIN_DATUM_256_TOKEN_EMISSION,
-                    l_emission,
-                    l_emission_size);
-
+        dap_chain_datum_t *l_datum_emission = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_EMISSION,
+                l_emission,
+                l_emission_size);
         size_t l_datum_emission_size = sizeof(l_datum_emission->header) + l_datum_emission->header.data_size;
 
-        // Calc token's hash
-        //dap_chain_hash_fast_t l_emission_hash;
-        dap_hash_fast(l_emission, l_emission_size, &l_emission_hash);
-
-        l_emission_hash_str = l_emission_hash_str_new = dap_chain_hash_fast_to_str_new(&l_emission_hash);
+        // Calc datum emission's hash
+        dap_hash_fast(l_datum_emission, l_datum_emission_size, &l_emission_hash);
+        l_emission_hash_str = dap_chain_hash_fast_to_str_new(&l_emission_hash);
         l_emission_hash_str_base58 = dap_enc_base58_encode_hash_to_str(&l_emission_hash);
 
         // Delete token emission
         DAP_DEL_Z(l_emission);
-        //DAP_DEL_Z(l_emission_256); // 256
-
-//    // Calc datum's hash
-//    dap_chain_hash_fast_t l_datum_emission_hash;
-//    dap_hash_fast(l_datum_emission, l_datum_emission_size, (uint8_t*) &l_datum_emission_hash);
-//    char * l_key_str = dap_chain_hash_fast_to_str_new(&l_datum_emission_hash);
-
-        // Add to mempool emission token
-        if(dap_chain_global_db_gr_set(dap_strdup(l_emission_hash_str_new), (uint8_t *) l_datum_emission, l_datum_emission_size
-                , l_gdb_group_mempool_emission)) {
-            if(!dap_strcmp(l_hash_out_type,"hex"))
-                str_reply_tmp = dap_strdup_printf("Datum%s emission %s is placed in datum pool",
-                            (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""),
-                            l_emission_hash_str_new);
-            else
-                str_reply_tmp = dap_strdup_printf("Datum%s emission %s is placed in datum pool",
-                            (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""),
-                            l_emission_hash_str_base58);
-        }
-        else {
-            if(!dap_strcmp(l_hash_out_type,"hex"))
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Datum%s emission %s is not placed in datum pool",
-                            (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""),
-                            l_emission_hash_str_new);
-            else
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Datum%s emission %s is not placed in datum pool", 
-                            (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""),
-                            l_emission_hash_str_base58);
-            DAP_DEL_Z(l_emission_hash_str_new);
-            l_emission_hash_str = NULL;
-            DAP_DEL_Z(l_emission_hash_str_base58);
+
+        // Add token emission datum to mempool
+        bool l_placed = dap_chain_global_db_gr_set(dap_strdup(l_emission_hash_str),
+                                                   (uint8_t *)l_datum_emission,
+                                                   l_datum_emission_size,
+                                                   l_gdb_group_mempool_emission);
+        str_reply_tmp = dap_strdup_printf("Datum %s with 256bit emission is%s placed in datum pool",
+                                          dap_strcmp(l_hash_out_type, "hex") ? l_emission_hash_str_base58 : l_emission_hash_str,
+                                          l_placed ? "" : " not");
+        DAP_DELETE((char *)l_emission_hash_str);
+        DAP_DEL_Z(l_emission_hash_str_base58);
+        if (!l_placed) {
             DAP_DEL_Z(l_datum_emission);
             return -1;
         }
         l_datum_emission = NULL;
-        l_emission = NULL;
-    }
+    } // TODO possible update emission if it found, or remove -emission parameter
 
     // create first transaction (with tx_token)
     dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t));
+    l_tx->header.ts_created = time(NULL);
     dap_chain_hash_fast_t l_tx_prev_hash = { 0 };
-    dap_chain_tx_token_t *l_tx_token;
-    dap_chain_tx_out_t *l_out;
-    //dap_chain_256_tx_out_t *l_out_256;
-    
     // create items
-    if ( !l_type_256 ) {
-        l_tx_token = dap_chain_datum_tx_item_token_create(&l_emission_hash, l_ticker);
-        l_out = dap_chain_datum_tx_item_out_create(l_addr, dap_chain_uint256_to(l_emission_value));
-    } else { // 256
-        l_tx_token = dap_chain_datum_tx_item_256_token_create(&l_emission_hash, l_ticker);
-        l_out = dap_chain_datum_tx_item_256_out_create(l_addr, l_emission_value);
-    }
+    dap_chain_tx_token_t *l_tx_token = dap_chain_datum_tx_item_token_create(&l_emission_hash, l_ticker);
     dap_chain_tx_in_t *l_in = dap_chain_datum_tx_item_in_create(&l_tx_prev_hash, 0);
+    dap_chain_256_tx_out_t *l_out = dap_chain_datum_tx_item_out_create(l_addr, l_emission_value);
 
     // pack items to transaction
     dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_tx_token);
     dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_in);
-
-    //if ( !l_type_256 ) {
     dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_out);
-    // } else { //256
-    //     dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_out_256);
-    // }
 
-    // Base tx don't need signature items but let it be
     if (l_certs){
         // Sign all that we have with certs
         for(size_t i = 0; i < l_certs_size; i++) {
@@ -3499,26 +3375,14 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
 
     DAP_DEL_Z(l_tx_token);
     DAP_DEL_Z(l_in);
-    // DAP_DEL_Z(l_out);
-    // DAP_DEL_Z(l_out_256);
-
-    DAP_DEL_Z(l_emission_hash_str_new);
-    l_emission_hash_str = NULL;
-    DAP_DEL_Z(l_emission_hash_str_base58);
+    DAP_DEL_Z(l_out);
 
     size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx);
-    dap_chain_datum_t * l_datum_tx;
 
     // Pack transaction into the datum
-    if ( !l_type_256 ) {
-        l_datum_tx = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size);
-    } else {
-        l_datum_tx = dap_chain_datum_create(DAP_CHAIN_DATUM_256_TX, l_tx, l_tx_size);
-    }
+    dap_chain_datum_t * l_datum_tx = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size);
     size_t l_datum_tx_size = dap_chain_datum_size(l_datum_tx);
 
-    // use l_tx hash for compatible with utho hash
-    //dap_hash_fast(l_tx, l_tx_size, &l_key_hash); //dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_key_hash);
     // calc datum hash
     dap_chain_hash_fast_t l_datum_tx_hash;
     dap_hash_fast(l_datum_tx, l_datum_tx_size,  &l_datum_tx_hash);
@@ -3527,38 +3391,21 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     DAP_DEL_Z(l_tx);
 
     // Add to mempool tx token
-    if(dap_chain_global_db_gr_set(dap_strdup(l_tx_hash_str), l_datum_tx, l_datum_tx_size
-            , l_gdb_group_mempool_base_tx)) {
-        if(!dap_strcmp(l_hash_out_type,"hex"))
-            dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is placed in datum pool ",
-                            str_reply_tmp,
-                            (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""),
-                            l_tx_hash_str);
-        else
-            dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is placed in datum pool ",
-                            str_reply_tmp,
-                            (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""),
-                            l_tx_hash_str_base58);
-        DAP_DEL_Z(l_tx_hash_str);
-        DAP_DEL_Z(l_tx_hash_str_base58);
-    } else {
-        if(!dap_strcmp(l_hash_out_type,"hex"))
-            dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is not placed in datum pool ",
-                            str_reply_tmp,
-                            (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""),
-                            l_emission_hash_str);
-        else
-            dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is not placed in datum pool ",
-                            str_reply_tmp,
-                            (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""),
-                            l_tx_hash_str_base58);
-        DAP_DEL_Z(l_tx_hash_str);
-        DAP_DEL_Z(l_tx_hash_str_base58);
-
-        return -2;
-    }
+    bool l_placed = dap_chain_global_db_gr_set(dap_strdup(l_tx_hash_str), l_datum_tx,
+                                               l_datum_tx_size, l_gdb_group_mempool_base_tx);
+    dap_chain_node_cli_set_reply_text(a_str_reply, "%s\nDatum %s with 256bit TX is%s placed in datum pool ",
+                                      str_reply_tmp,
+                                      dap_strcmp(l_hash_out_type, "hex") ? l_tx_hash_str_base58 : l_tx_hash_str,
+                                      l_placed ? "" : " not");
+    DAP_DEL_Z(l_tx_hash_str);
+    DAP_DEL_Z(l_tx_hash_str_base58);
     DAP_DELETE(str_reply_tmp);
     DAP_DELETE(l_addr);
+    if (!l_placed) {
+        DAP_DELETE(l_datum_tx);
+        return -2;
+    }
+
     return 0;
 }
 
@@ -3584,8 +3431,7 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply)
     const char * l_net_name = NULL;
     const char * l_unit_str = NULL;
     const char * l_service_str = NULL;
-    uint64_t l_value_datoshi = 0;
-
+    uint256_t l_value_datoshi = {};
     const char * l_hash_out_type = NULL;
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type);
     if(!l_hash_out_type)
@@ -3667,8 +3513,8 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply)
         return -9;
     }
 
-    l_value_datoshi = strtoll(l_value_datoshi_str, NULL, 10);
-    if(!l_value_datoshi) {
+    l_value_datoshi = dap_chain_balance_scan(l_value_datoshi_str);
+    if(IS_ZERO_256(l_value_datoshi)) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "can't recognize value='%s' as a number", l_value_datoshi_str);
         return -10;
     }
@@ -3708,9 +3554,10 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply)
             addr_cond,
             NULL, l_token_ticker, l_value, 0, (const void*) &l_cond, sizeof(dap_chain_net_srv_abstract_t));
 */
-
+    uint256_t l_value_per_unit_max = {};
+    uint256_t l_value_fee = {};
     dap_chain_hash_fast_t *l_tx_cond_hash = dap_chain_mempool_tx_create_cond(l_net, l_key_from, l_key_cond, l_addr_from, l_token_ticker,
-            l_value_datoshi, 0, l_price_unit, l_srv_uid, 0, NULL, 0);
+            l_value_datoshi, l_value_per_unit_max, l_price_unit, l_srv_uid, l_value_fee, NULL, 0);
 
     dap_chain_wallet_close(l_wallet_from);
     dap_chain_wallet_close(l_wallet_cond);
@@ -3958,12 +3805,8 @@ int com_tx_create(int argc, char ** argv, char **str_reply)
     const char * l_tx_num_str = NULL;
     size_t l_tx_num = 0;
 
-    uint64_t value = 0;
-    uint64_t value_fee = 0;
-
-    // uint256_t value = uint256_0;
-    // uint256_t value_fee = uint256_0;
-
+    uint256_t l_value = {};
+    uint256_t l_value_fee = {};
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-from_wallet", &l_from_wallet_name);
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-to_addr", &addr_base58_to);
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-token", &l_token_ticker);
@@ -3976,11 +3819,11 @@ int com_tx_create(int argc, char ** argv, char **str_reply)
 
     if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-fee", &addr_base58_fee)) {
         if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-value_fee", &str_tmp)) {
-            value_fee = strtoull(str_tmp, NULL, 10);
+            l_value_fee = dap_chain_balance_scan(str_tmp);
         }
     }
     if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-value", &str_tmp)) {
-        value = strtoull(str_tmp, NULL, 10);
+        l_value = dap_chain_balance_scan(str_tmp);
     }
     if(!l_from_wallet_name) {
         dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter '-from_wallet'");
@@ -3990,11 +3833,11 @@ int com_tx_create(int argc, char ** argv, char **str_reply)
         dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter '-to_addr'");
         return -1;
     }
-    if(!value) {
+    if(IS_ZERO_256(l_value)) {
         dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter '-value'");
         return -1;
     }
-    if(addr_base58_fee && !value_fee) {
+    if(addr_base58_fee && IS_ZERO_256(l_value_fee)) {
         dap_chain_node_cli_set_reply_text(str_reply,
                 "tx_create requires parameter '-value_fee' if '-fee' is specified");
         return -1;
@@ -4056,14 +3899,14 @@ int com_tx_create(int argc, char ** argv, char **str_reply)
     if(l_tx_num){
         res = dap_chain_mempool_tx_create_massive(l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from,
                                addr_to, addr_fee,
-                               l_token_ticker, value, value_fee, l_tx_num);
+                               l_token_ticker, l_value, l_value_fee, l_tx_num);
 
         dap_string_append_printf(string_ret, "transfer=%s\n",
                 (res == 0) ? "Ok" : (res == -2) ? "False, not enough funds for transfer" : "False");
     }else{
         dap_hash_fast_t * l_tx_hash = dap_chain_mempool_tx_create(l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to,
                 addr_fee,
-                l_token_ticker, value, value_fee);
+                l_token_ticker, l_value, l_value_fee);
         if (l_tx_hash){
             char l_tx_hash_str[80]={[0]='\0'};
             dap_chain_hash_fast_to_str(l_tx_hash,l_tx_hash_str,sizeof (l_tx_hash_str)-1);
@@ -4096,15 +3939,48 @@ int com_tx_create(int argc, char ** argv, char **str_reply)
  * @param str_reply 
  * @return int 
  */
-int com_tx_verify(int argc, char ** argv, char **str_reply)
+int com_tx_verify(int a_argc, char **a_argv, char **a_str_reply)
 {
-    if(argc > 1) {
-        if(str_reply)
-            dap_chain_node_cli_set_reply_text(str_reply, "command \"%s\" not recognized", argv[1]);
+    const char * l_tx_hash_str = NULL;
+    dap_chain_net_t * l_net = NULL;
+    dap_chain_t * l_chain = NULL;
+    int l_arg_index = 1;
+
+    dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-tx", &l_tx_hash_str);
+    if(!l_tx_hash_str) {
+        dap_chain_node_cli_set_reply_text(a_str_reply, "tx_verify requires parameter '-tx'");
+        return -1;
     }
-    else if(str_reply)
-        dap_chain_node_cli_set_reply_text(str_reply, "command not defined, enter \"help <cmd name>\"");
-    return -1;
+    dap_chain_node_cli_cmd_values_parse_net_chain(&l_arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net);
+    if (!l_net || !l_chain) {
+        return -2;
+    } else if (a_str_reply && *a_str_reply) {
+        DAP_DELETE(*a_str_reply);
+        *a_str_reply = NULL;
+    }
+    dap_hash_fast_t l_tx_hash;
+    char *l_hex_str_from58 = NULL;
+    if (dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) {
+        l_hex_str_from58 = dap_enc_base58_to_hex_str_from_str(l_tx_hash_str);
+        if (!l_hex_str_from58) {
+            dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid tx hash format, need hex or base58");
+            return -3;
+        }
+    }
+    size_t l_tx_size = 0;
+    char *l_gdb_group = dap_chain_net_get_gdb_group_mempool(l_chain);
+    dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)
+            dap_chain_global_db_gr_get(l_hex_str_from58 ? l_hex_str_from58 : l_tx_hash_str, &l_tx_size, l_gdb_group);
+    if (!l_tx) {
+        dap_chain_node_cli_set_reply_text(a_str_reply, "Specified tx not found");
+        return -3;
+    }
+    if (dap_chain_ledger_tx_add_check(l_net->pub.ledger, l_tx)) {
+        dap_chain_node_cli_set_reply_text(a_str_reply, "Specified tx verify fail!");
+        return -4;
+    }
+    dap_chain_node_cli_set_reply_text(a_str_reply, "Specified tx verified successfully");
+    return 0;
 }
 
 
@@ -4134,7 +4010,7 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply)
     if(!l_hash_out_type)
         l_hash_out_type = "hex";
     if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>");
+        dap_chain_node_cli_set_reply_text(a_str_reply, "Invalid parameter -H, valid values: -H <hex | base58>");
         return -1;
     }
 
@@ -4214,12 +4090,12 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply)
 
     char *l_str_ret = NULL;
     if(l_tx_hash_str) {
-        l_str_ret = dap_strdup_printf("history for tx hash %s:\n%s", l_tx_hash_str,
+        l_str_ret = dap_strdup_printf("History for tx hash %s:\n%s", l_tx_hash_str,
                 l_str_out ? l_str_out : " empty");
     }
     else if(l_addr) {
         char *l_addr_str = dap_chain_addr_to_str(l_addr);
-        l_str_ret = dap_strdup_printf("history for addr %s:\n%s", l_addr_str,
+        l_str_ret = dap_strdup_printf("History for addr %s:\n%s", l_addr_str,
                 l_str_out ? l_str_out : " empty");
         DAP_DELETE(l_addr_str);
     }
@@ -4369,54 +4245,35 @@ int cmd_gdb_export(int argc, char ** argv, char ** a_str_reply)
         return -1;
     }
     const char *l_db_path = dap_config_get_item_str(g_config, "resources", "dap_global_db_path");
-
-    // NB! [TEMPFIX] Temporarily backward-compatible until migration to new databases locations (after updates)
-    const char *l_db_driver = dap_config_get_item_str(g_config, "resources", "dap_global_db_driver");
-    char l_db_concat[80];
-    dap_sprintf(l_db_concat, "%s/gdb-%s", l_db_path, l_db_driver);
-
-    struct dirent *d;
-    DIR *dir = opendir(l_db_concat);
+    DIR *dir = opendir(l_db_path);
     if (!dir) {
-        // External "if" to check out old or new path.
-        log_it(L_WARNING, "Probably db directory is in old path. Checking out.");
-        dir = opendir(l_db_path);
-        if (!dir) {
-            log_it(L_ERROR, "Can't open db directory");
-            dap_chain_node_cli_set_reply_text(a_str_reply, "Can't open db directory");
-            return -1;
-        }
+        log_it(L_ERROR, "Can't open db directory");
+        dap_chain_node_cli_set_reply_text(a_str_reply, "Can't open db directory");
+        return -1;
     }
     char l_path[strlen(l_db_path) + strlen(l_filename) + 12];
     memset(l_path, '\0', sizeof(l_path));
     dap_snprintf(l_path, sizeof(l_path), "%s/%s.json", l_db_path, l_filename);
-    /*FILE *l_json_file = fopen(l_path, "a");
-    if (!l_json_file) {
-        log_it(L_ERROR, "Can't open file %s", l_path);
-        dap_chain_node_cli_set_reply_text(a_str_reply, "Can't open specified file");
-        return -1;
-    }*/
+
     struct json_object *l_json = json_object_new_array();
-    for (d = readdir(dir); d; d = readdir(dir)) {
-        if (!dap_strcmp(d->d_name, ".") || !dap_strcmp(d->d_name, "..")) {
-            continue;
-        }
+    dap_list_t *l_groups_list = dap_chain_global_db_driver_get_groups_by_mask("*");
+    for (dap_list_t *l_list = l_groups_list; l_list; l_list = dap_list_next(l_list)) {
         size_t l_data_size = 0;
-        pdap_store_obj_t l_data = dap_chain_global_db_obj_gr_get(NULL, &l_data_size, d->d_name);
-        log_it(L_INFO, "Exporting group %s, number of records: %zu", d->d_name, l_data_size);
+        char *l_group_name = (char *)l_list->data;
+        pdap_store_obj_t l_data = dap_chain_global_db_obj_gr_get(NULL, &l_data_size, l_group_name);
+        log_it(L_INFO, "Exporting group %s, number of records: %zu", l_group_name, l_data_size);
         if (!l_data_size) {
             continue;
         }
 
         struct json_object *l_json_group = json_object_new_array();
         struct json_object *l_json_group_inner = json_object_new_object();
-        json_object_object_add(l_json_group_inner, "group", json_object_new_string(d->d_name));
+        json_object_object_add(l_json_group_inner, "group", json_object_new_string(l_group_name));
 
         for (size_t i = 0; i < l_data_size; ++i) {
             size_t l_out_size = DAP_ENC_BASE64_ENCODE_SIZE((int64_t)l_data[i].value_len) + 1;
             char *l_value_enc_str = DAP_NEW_Z_SIZE(char, l_out_size);
-            //size_t l_enc_size = dap_enc_base64_encode(l_data[i].value, l_data[i].value_len, l_value_enc_str, DAP_ENC_DATA_TYPE_B64);
-
+            dap_enc_base64_encode(l_data[i].value, l_data[i].value_len, l_value_enc_str, DAP_ENC_DATA_TYPE_B64);
             struct json_object *jobj = json_object_new_object();
             json_object_object_add(jobj, "id",      json_object_new_int64((int64_t)l_data[i].id));
             json_object_object_add(jobj, "key",     json_object_new_string(l_data[i].key));
@@ -4431,6 +4288,7 @@ int cmd_gdb_export(int argc, char ** argv, char ** a_str_reply)
         json_object_array_add(l_json, l_json_group_inner);
         dap_store_obj_free(l_data, l_data_size);
     }
+    dap_list_free_full(l_groups_list, free);
     if (json_object_to_file(l_path, l_json) == -1) {
 #if JSON_C_MINOR_VERSION<15
         log_it(L_CRITICAL, "Couldn't export JSON to file, error code %d", errno );
@@ -4505,9 +4363,9 @@ int cmd_gdb_import(int argc, char ** argv, char ** a_str_reply)
             l_group_store[j].timestamp = json_object_get_int64(l_ts);
             l_group_store[j].value_len = (uint64_t)json_object_get_int64(l_value_len);
             l_group_store[j].type   = 'a';
-            //const char *l_value_str = json_object_get_string(l_value);
+            const char *l_value_str = json_object_get_string(l_value);
             char *l_val = DAP_NEW_Z_SIZE(char, l_group_store[j].value_len);
-            //size_t l_dec_size = dap_enc_base64_decode(l_value_str, strlen(l_value_str), l_val, DAP_ENC_DATA_TYPE_B64);
+            dap_enc_base64_decode(l_value_str, strlen(l_value_str), l_val, DAP_ENC_DATA_TYPE_B64);
             l_group_store[j].value  = (uint8_t*)l_val;
         }
         if (dap_chain_global_db_driver_appy(l_group_store, l_records_count)) {
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index accf1657ecf370c428e75e960008ddf9deb441c6..87d243c677ad6638ecececc2e3b78501719ee530 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -27,7 +27,6 @@
 #include <pthread.h>
 
 #include "dap_chain_wallet.h"
-#include "dap_chain_cell.h"
 #include "dap_common.h"
 #include "dap_enc_base58.h"
 #include "dap_strfuncs.h"
@@ -35,6 +34,7 @@
 #include "dap_list.h"
 #include "dap_hash.h"
 
+#include "dap_chain_cell.h"
 #include "dap_chain_datum.h"
 #include "dap_chain_datum_token.h"
 #include "dap_chain_datum_tx_items.h"
@@ -47,14 +47,12 @@
 // for dap_db_history_filter()
 typedef struct dap_tx_data {
     dap_chain_hash_fast_t tx_hash;
-    char tx_hash_str[70];
     char token_ticker[DAP_CHAIN_TICKER_SIZE_MAX];
-    //size_t obj_num;
-    size_t pos_num;
     dap_chain_datum_t *datum;
-    dap_chain_addr_t addr;
-    bool is_use_all_cur_out;// find cur addr in prev OUT items
     UT_hash_handle hh;
+    //useless
+    char tx_hash_str[70];
+    dap_chain_addr_t addr;
 } dap_tx_data_t;
 
 typedef struct dap_chain_tx_hash_processed_ht{
@@ -117,16 +115,13 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
         l_tx_hash_user_str = dap_strdup(l_tx_hash_str);
     else
         l_tx_hash_user_str = dap_enc_base58_from_hex_str_to_str(l_tx_hash_str);
-    dap_list_t *l_list_tx_any = dap_list_concat(
-                                    dap_chain_datum_tx_items_get(a_datum, TX_ITEM_TYPE_256_TOKEN, NULL),
-                                    dap_chain_datum_tx_items_get(a_datum, TX_ITEM_TYPE_TOKEN, NULL)
-                                );
+    dap_list_t *l_list_tx_any = dap_chain_datum_tx_items_get(a_datum, TX_ITEM_TYPE_TOKEN, NULL);
     if(a_ledger == NULL){
         dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n Items:\n", l_list_tx_any ? "(emit)" : "", l_tx_hash_user_str);
     } else {
         char buf[50];
-        dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n TS Created: %s Token ticker: %s\n Items:\n",
-                                 l_list_tx_any ? "(emit)" : "", l_tx_hash_user_str, dap_ctime_r(&l_ts_create, buf),
+        dap_string_append_printf(a_str_out, "transaction:%s hash: %s\n TS Created: %s Token ticker: %s\n Items:\n",
+                                 l_list_tx_any ? " (emit)" : "", l_tx_hash_user_str, dap_ctime_r(&l_ts_create, buf),
                                  dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, &l_tx_hash));
     }
     DAP_DELETE(l_tx_hash_user_str);
@@ -141,9 +136,7 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
     while(l_tx_items_count < l_tx_items_size){
         uint8_t *item = a_datum->tx_items + l_tx_items_count;
         size_t l_item_tx_size = dap_chain_datum_item_tx_get_size(item);
-
-        dap_chain_tx_item_type_t l_type = dap_chain_datum_tx_item_get_type(item);
-        switch(l_type){
+        switch(dap_chain_datum_tx_item_get_type(item)){
         case TX_ITEM_TYPE_IN:
             l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_in_t*)item)->header.tx_prev_hash);
             dap_string_append_printf(a_str_out, "\t IN:\nTx_prev_hash: %s\n"
@@ -156,38 +149,29 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
             dap_string_append_printf(a_str_out, "\t OUT:\n"
                                                 "\t\t Value: %s (%"DAP_UINT64_FORMAT_U")\n"
                                                 "\t\t Address: %s\n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from(
-                                                                       ((dap_chain_tx_out_t*)item)->header.value)
-                                                                   ),
+                                        dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                                                      ((dap_chain_tx_out_t*)item)->header.value)),
                                         ((dap_chain_tx_out_t*)item)->header.value,
                                         dap_chain_addr_to_str(&((dap_chain_tx_out_t*)item)->addr));
             break;
-        case TX_ITEM_TYPE_256_OUT: { // 256
+        case TX_ITEM_TYPE_OUT_256: { // 256
             dap_string_append_printf(a_str_out, "\t OUT 256_t:\n"
                                                 "\t\t Value: %s (%s)\n"
                                                 "\t\t Address: %s\n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(
-                                                                       ((dap_chain_256_tx_out_t*)item)->header.value)
-                                                                   ),
-                                        dap_chain_u256tostr(((dap_chain_256_tx_out_t*)item)->header.value),
+                                        dap_chain_balance_to_coins(((dap_chain_256_tx_out_t*)item)->header.value),
+                                        dap_chain_balance_print(((dap_chain_256_tx_out_t*)item)->header.value),
                                         dap_chain_addr_to_str(&((dap_chain_256_tx_out_t*)item)->addr));
             break;
         }
-        case TX_ITEM_TYPE_256_TOKEN:
         case TX_ITEM_TYPE_TOKEN:
             l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_token_t*)item)->header.token_emission_hash);
-            dap_string_append_printf(a_str_out, "\t TOKEN%s:\n"
+            dap_string_append_printf(a_str_out, "\t TOKEN:\n"
                                                 "\t\t ticker: %s \n"
                                                 "\t\t token_emission_hash: %s\n"
-                                                "\t\t token_emission_chain_id: 0x%016"DAP_UINT64_FORMAT_x"\n",
-                                                TX_ITEM_TYPE_256_TOKEN == l_type ? " 256_t " : "",
-                                                ((dap_chain_tx_token_t*)item)->header.ticker,
-                                                l_hash_str_tmp,
-                                                ((dap_chain_tx_token_t*)item)->header.token_emission_chain_id.uint64
-                                            );
+                                                "\t\t token_emission_chain_id: 0x%016"DAP_UINT64_FORMAT_x"\n", ((dap_chain_tx_token_t*)item)->header.ticker, l_hash_str_tmp,
+                                                ((dap_chain_tx_token_t*)item)->header.token_emission_chain_id.uint64);
             DAP_DELETE(l_hash_str_tmp);
             break;
-        case TX_ITEM_TYPE_256_TOKEN_EXT:
         case TX_ITEM_TYPE_TOKEN_EXT:
             l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_token_ext_t*)item)->header.ext_tx_hash);
             dap_string_append_printf(a_str_out, "\t TOKEN EXT:\n"
@@ -211,55 +195,26 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                 "\t sig_size: %u\n", ((dap_chain_tx_sig_t*)item)->header.sig_size);
             dap_sign_get_information(l_sign_tmp, a_str_out);
             break;
-        case TX_ITEM_TYPE_256_RECEIPT:
         case TX_ITEM_TYPE_RECEIPT:
-            if ( l_type == TX_ITEM_TYPE_256_RECEIPT) // u256_t value_datoshi
-                dap_string_append_printf(a_str_out, "\t Receipt:\n"
-                                                    "\t\t size: %u\n"
-                                                    "\t\t ext size:%u\n"
-                                                    "\t\t Info:"
-                                                    "\t\t\t   units: 0x%016"DAP_UINT64_FORMAT_x"\n"
-                                                    "\t\t\t   uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
-                                                    "\t\t\t   units type: %s \n"
-                                                    "\t\t\t   value: %s (%"DAP_UINT64_FORMAT_U")\n",
-                            ((dap_chain_datum_tx_receipt_t*)item)->size,
-                            ((dap_chain_datum_tx_receipt_t*)item)->exts_size,
-                            ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units,
-                            ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.srv_uid.uint64,
-                            serv_unit_enum_to_str(
-                                 &((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units_type.enm
-                                 ),
-                             dap_chain_balance_to_coins(
-                                 dap_chain_uint128_from_uint256(
-                                     ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi_256
-                                 )
-                             ),
-                             dap_chain_u256tostr(((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi_256)
-                        );
-            else // u64_t value_datoshi
-                dap_string_append_printf(a_str_out, "\t Receipt:\n"
-                                                    "\t\t size: %u\n"
-                                                    "\t\t ext size:%u\n"
-                                                    "\t\t Info:"
-                                                    "\t\t\t   units: 0x%016"DAP_UINT64_FORMAT_x"\n"
-                                                    "\t\t\t   uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
-                                                    "\t\t\t   units type: %s \n"
-                                                    "\t\t\t   value: %s (%"DAP_UINT64_FORMAT_U")\n",
-                            ((dap_chain_datum_tx_receipt_t*)item)->size,
-                            ((dap_chain_datum_tx_receipt_t*)item)->exts_size,
-                            ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units,
-                            ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.srv_uid.uint64,
-                            serv_unit_enum_to_str(
-                                 &((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units_type.enm
-                                 ),
-                            dap_chain_balance_to_coins(
-                                dap_chain_uint128_from(
-                                    ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi
-                                )
-                            ),
-                            ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi
-                        );
-
+            dap_string_append_printf(a_str_out, "\t Receipt:\n"
+                                                "\t\t size: %u\n"
+                                                "\t\t ext size:%u\n"
+                                                "\t\t Info:"
+                                                "\t\t\t   units: 0x%016"DAP_UINT64_FORMAT_x"\n"
+                                                "\t\t\t   uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
+                                                "\t\t\t   units type: %s \n"
+                                                "\t\t\t   value: %s (%s)\n",
+                                     ((dap_chain_datum_tx_receipt_t*)item)->size,
+                                     ((dap_chain_datum_tx_receipt_t*)item)->exts_size,
+                                     ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units,
+                                     ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.srv_uid.uint64,
+                                     serv_unit_enum_to_str(
+                                         &((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units_type.enm
+                                         ),
+                                     dap_chain_balance_to_coins(
+                                         ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi),
+                                     dap_chain_balance_print(
+                                     ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi));
             if (((dap_chain_datum_tx_receipt_t*)item)->exts_size == sizeof(dap_sign_t) + sizeof(dap_sign_t)){
                 dap_sign_t *l_provider = DAP_NEW_Z(dap_sign_t);
                 memcpy(l_provider, ((dap_chain_datum_tx_receipt_t*)item)->exts_n_signs, sizeof(dap_sign_t));
@@ -317,12 +272,11 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                 "\t\t\t value: %s (%"DAP_UINT64_FORMAT_U")\n"
                                                 "\t\t\t subtype: %s\n"
                                                 "\t\t SubType:\n",
-                                     dap_ctime_r((time_t*)((dap_chain_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf),
-                                     dap_chain_balance_to_coins(
-                                         dap_chain_uint128_from(((dap_chain_tx_out_cond_t*)item)->header.value)
-                                     ),
-                                     ((dap_chain_tx_out_cond_t*)item)->header.value,
-                                     dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_t*)item)->header.subtype));
+                                     dap_ctime_r((time_t *)&((dap_chain_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf),
+                                     dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                         ((dap_chain_tx_out_cond_old_t*)item)->header.value)),
+                                     ((dap_chain_tx_out_cond_old_t*)item)->header.value,
+                                     dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_old_t*)item)->header.subtype));
             switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) {
                 case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:
                 l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash);
@@ -330,71 +284,63 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                     "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
                                                     "\t\t\t pkey: %s\n"
                                                     "\t\t\t max price: %s (%"DAP_UINT64_FORMAT_U") \n",
-                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32,
-                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.srv_uid.uint64,
+                                         ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_pay.unit.uint32,
+                                         ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_pay.srv_uid.uint64,
                                          l_hash_str_tmp,
-                                         dap_chain_balance_to_coins(dap_chain_uint128_from(
-                                                ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)
-                                                                    ),
-                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi);
+                                         dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                             ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_pay.unit_price_max_datoshi)),
+                                         ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_pay.unit_price_max_datoshi);
                 DAP_FREE(l_hash_str_tmp);
                 break;
                 case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE:
                 dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
                                                     "\t\t\t addr: %s\n"
                                                     "\t\t\t value: %Lf",
-                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64,
+                                         ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_stake.srv_uid.uint64,
                                          dap_chain_addr_to_str(
-                                             &((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr
+                                             &((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_stake.fee_addr
                                              ),
-                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_value);
+                                         ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_stake.fee_value);
                 break;
                 case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:
                 dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
                                                     "\t\t\t net id: 0x%016"DAP_UINT64_FORMAT_x"\n"
                                                     "\t\t\t token: %s\n"
                                                     "\t\t\t value: %s (%"DAP_UINT64_FORMAT_U")\n",
-                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.srv_uid.uint64,
-                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.net_id.uint64,
-                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.token,
-                                         dap_chain_balance_to_coins(
-                                             dap_chain_uint128_from(
-                                                 ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value
-                                                 )
-                                             ),
-                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value);
+                                         ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_xchange.srv_uid.uint64,
+                                         ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_xchange.net_id.uint64,
+                                         ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_xchange.token,
+                                         dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                             ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_xchange.value)),
+                                         ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_xchange.value);
                 break;
                 default: break;
             }
             break;
-        case TX_ITEM_TYPE_256_OUT_COND: // 256
+        case TX_ITEM_TYPE_OUT_256_COND: // 256
             dap_string_append_printf(a_str_out, "\t OUT 256_t COND:\n"
                                                 "\t Header:\n"
                                                 "\t\t\t ts_expires: %s\t"
                                                 "\t\t\t value: %s (%s)\n"
                                                 "\t\t\t subtype: %s\n"
                                                 "\t\t SubType:\n",
-                                     dap_ctime_r((time_t*)((dap_chain_256_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf),
-                                     dap_chain_balance_to_coins(
-                                         dap_chain_uint128_from_uint256(((dap_chain_256_tx_out_cond_t*)item)->header.value)
-                                     ),
-                                     dap_chain_u256tostr(((dap_chain_256_tx_out_cond_t*)item)->header.value),
-                                     dap_chain_tx_out_cond_subtype_to_str(((dap_chain_256_tx_out_cond_t*)item)->header.subtype)
+                                     dap_ctime_r((time_t*)((dap_chain_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf),
+                                     dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->header.value),
+                                     dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->header.value),
+                                     dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_t*)item)->header.subtype)
             );
-            switch (((dap_chain_256_tx_out_cond_t*)item)->header.subtype) {
+            switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) {
             case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:
-                l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash);
+                l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash);
                 dap_string_append_printf(a_str_out, "\t\t\t unit: 0x%08x\n"
                                                     "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
                                                     "\t\t\t pkey: %s\n"
                                                     "\t\t\t max price: %s (%s) \n",
-                                         ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32,
-                                         ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.srv_uid.uint64,
+                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32,
+                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.srv_uid.uint64,
                                          l_hash_str_tmp,
-                                         dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(
-                                                ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)
-                                                                    ),
-                                         dap_chain_u256tostr(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)
+                                         dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi),
+                                         dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)
                 );
                 DAP_FREE(l_hash_str_tmp);
                 break;
@@ -402,11 +348,11 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                 dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
                                                     "\t\t\t addr: %s\n"
                                                     "\t\t\t value: %Lf",
-                                        ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64,
+                                        ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64,
                                         dap_chain_addr_to_str(
-                                             &((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr
+                                             &((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr
                                         ),
-                                        ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_stake.fee_value
+                                        ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_value
                 );
                 break;
             case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:
@@ -414,43 +360,24 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                     "\t\t\t net id: 0x%016"DAP_UINT64_FORMAT_x"\n"
                                                     "\t\t\t token: %s\n"
                                                     "\t\t\t value: %s (%s)\n",
-                                         ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.srv_uid.uint64,
-                                         ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.net_id.uint64,
-                                         ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.token,
-                                         dap_chain_balance_to_coins(
-                                             dap_chain_uint128_from_uint256(
-                                                 ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value
-                                                 )
-                                             ),
-                                         dap_chain_u256tostr(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value)
+                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.srv_uid.uint64,
+                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.net_id.uint64,
+                                         ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.token,
+                                         dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value),
+                                         dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value)
                 );
                 break;
             }
             break;
-        case TX_ITEM_TYPE_OUT_EXT:
-            dap_string_append_printf(a_str_out, "\t OUT EXT:\n"
-                                                "\t\t Addr: %s\n"
-                                                "\t\t Token: %s\n"
-                                                "\t\t Value: %s (%"DAP_UINT64_FORMAT_U")\n",
-                                     dap_chain_addr_to_str(&((dap_chain_tx_out_ext_t*)item)->addr),
-                                     ((dap_chain_tx_out_ext_t*)item)->token,
-                                     dap_chain_balance_to_coins(dap_chain_uint128_from(
-                                                                    ((dap_chain_tx_out_ext_t*)item)->header.value)
-                                                                ),
-                                     ((dap_chain_tx_out_ext_t*)item)->header.value
-                                );
-            break;
-        case TX_ITEM_TYPE_256_OUT_EXT: // 256
+        case TX_ITEM_TYPE_OUT_EXT: // 256
             dap_string_append_printf(a_str_out, "\t OUT 256_t EXT:\n"
                                                 "\t\t Addr: %s\n"
                                                 "\t\t Token: %s\n"
                                                 "\t\t Value: %s (%s)\n",
-                                     dap_chain_addr_to_str(&((dap_chain_256_tx_out_ext_t*)item)->addr),
-                                     ((dap_chain_256_tx_out_ext_t*)item)->token,
-                                     dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(
-                                                                    ((dap_chain_256_tx_out_ext_t*)item)->header.value)
-                                                                ),
-                                     dap_chain_u256tostr(((dap_chain_256_tx_out_ext_t*)item)->header.value)
+                                     dap_chain_addr_to_str(&((dap_chain_tx_out_ext_t*)item)->addr),
+                                     ((dap_chain_tx_out_ext_t*)item)->token,
+                                     dap_chain_balance_to_coins(((dap_chain_tx_out_ext_t*)item)->header.value),
+                                     dap_chain_balance_print(((dap_chain_tx_out_ext_t*)item)->header.value)
                                 );
             break;
         default:
@@ -464,25 +391,6 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
     dap_string_append_printf(a_str_out, "\n");
 }
 
-/*static char* dap_db_new_history_timestamp()
-{
-    static pthread_mutex_t s_mutex = PTHREAD_MUTEX_INITIALIZER;
-    // get unique key
-    pthread_mutex_lock(&s_mutex);
-    static time_t s_last_time = 0;
-    static uint64_t s_suffix = 0;
-    time_t l_cur_time = time(NULL);
-    if(s_last_time == l_cur_time)
-        s_suffix++;
-    else {
-        s_suffix = 0;
-        s_last_time = l_cur_time;
-    }
-    char *l_str = dap_strdup_printf("%lld_%lld", (uint64_t) l_cur_time, s_suffix);
-    pthread_mutex_unlock(&s_mutex);
-    return l_str;
-}*/
-
 // for dap_db_history_tx & dap_db_history_addr()
 static dap_chain_datum_t* get_prev_tx(dap_tx_data_t *a_tx_data)
 {
@@ -518,16 +426,13 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
 
         while(l_atom && l_atom_size) {
             dap_chain_datum_t *l_datum = (dap_chain_datum_t*) l_atom;
-            if(!l_datum && (l_datum->header.type_id != DAP_CHAIN_DATUM_TX && l_datum->header.type_id != DAP_CHAIN_DATUM_256_TX ) ) {
+            if (!l_datum || (l_datum->header.type_id != DAP_CHAIN_DATUM_TX)) {
                 // go to next transaction
                 l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
                 continue;
             }
 
-            bool l_type_256 = false;
 
-            if ( l_datum->header.type_id == DAP_CHAIN_DATUM_256_TX )
-                l_type_256 = true;
 
             dap_tx_data_t *l_tx_data = NULL;
 
@@ -535,22 +440,16 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
             dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
 
             // find Token items - present in emit transaction
-            // dap_list_t *l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL);
-
             dap_list_t *l_list_tx_token;
-            if ( l_type_256 ) // 256
-                l_list_tx_token =  dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_TOKEN, NULL);
-            else
-                l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL);
+            l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL);
 
             // find OUT items
-            // dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
-
-            dap_list_t *l_list_out_items;
-            if ( l_type_256 ) // 256
-                l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_OUT, NULL);
-            else
-                l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
+            bool l_type_256 = false;
+            dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
+            if (!l_list_out_items) {
+                l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_256, NULL);
+                l_type_256 = true;
+            }
 
             dap_list_t *l_list_tmp = l_list_out_items;
 
@@ -570,7 +469,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
                         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));
-                    
+
                     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;
@@ -640,7 +539,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
 
             // find all OUT items in transaction
             if ( l_type_256 )
-                l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_OUT, NULL);
+                l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_256, NULL);
             else
                 l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
             l_list_tmp = l_list_out_items;
@@ -653,13 +552,13 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
                 const char *l_token_str = NULL;
                 if(l_tx_data)
                     l_token_str = l_tx_data->token_ticker;
-                char *l_dst_to_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : 
+                char *l_dst_to_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) :
                                                 (l_tx_out_256) ? dap_chain_addr_to_str(&l_tx_out_256->addr) : NULL;
 
                 if(l_tx_out || l_tx_out_256) {
                     if ( l_type_256 ) // 256
-                        dap_string_append_printf(l_str_out, " OUT 256_t item %s %s to %s\n",
-                            dap_chain_u256tostr(l_tx_out_256->header.value),
+                        dap_string_append_printf(l_str_out, " OUT 256bit item %s %s to %s\n",
+                            dap_chain_balance_print(l_tx_out_256->header.value),
                             dap_strlen(l_token_str) > 0 ? l_token_str : "?",
                             l_dst_to_str ? l_dst_to_str : "?"
                         );
@@ -711,15 +610,15 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
                     if ( l_type_256 ) { // 256
                         // find OUT items in prev datum
                         dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev,
-                                TX_ITEM_TYPE_256_OUT, NULL);
+                                TX_ITEM_TYPE_OUT_256, NULL);
                         // find OUT item for IN item;
                         dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items,
                                 l_tx_in->header.tx_out_prev_idx);
                         dap_chain_256_tx_out_t *l_tx_prev_out =
                                 l_list_out_prev_item ? (dap_chain_256_tx_out_t*)l_list_out_prev_item->data : NULL;
                         // print value from prev out item
-                        dap_string_append_printf(l_str_out, "  prev OUT 256_t item value=%s",
-                                l_tx_prev_out ? dap_chain_u256tostr(l_tx_prev_out->header.value) : "0");
+                        dap_string_append_printf(l_str_out, "  prev OUT 256bitt item value=%s",
+                                l_tx_prev_out ? dap_chain_balance_print(l_tx_prev_out->header.value) : "0");
                     } else {
                         dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev,
                                 TX_ITEM_TYPE_OUT, NULL);
@@ -728,7 +627,7 @@ 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;
                         dap_string_append_printf(l_str_out, "  prev OUT item value=%"DAP_UINT64_FORMAT_U,
-                                l_tx_prev_out ? l_tx_prev_out->header.value : 0);                   
+                                l_tx_prev_out ? l_tx_prev_out->header.value : 0);
 
                     }
                 }
@@ -771,6 +670,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
     return l_ret_str;
 }
 
+
 /**
  * @brief dap_db_history_addr
  * Get data according the history log
@@ -786,384 +686,141 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons
     dap_string_t *l_str_out = dap_string_new(NULL);
 
     dap_tx_data_t *l_tx_data_hash = NULL;
-    dap_chain_cell_t *l_cell = a_chain->cells;
-    do {
-        // load transactions
-        dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id);
-        size_t l_atom_size=0;
-        dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size);
-        if (!l_atom) {
-            return NULL;
+    // load transactions
+    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_chain->cells->id);
+    size_t l_atom_size=0;
+    dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size);
+    if (!l_atom) {
+        return NULL;
+    }
+    while (l_atom && l_atom_size) {
+        size_t l_datums_count = 0;
+        dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums ? a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count) :
+                                                                          NULL;
+        if (!l_datums) {
+            log_it(L_WARNING, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name);
+            break;
         }
 
-        while(l_atom && l_atom_size) {
-            size_t l_datums_count =0;
-            dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums ? a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count) :
-                                                                              NULL;
-            if (! l_datums){
-                log_it(L_WARNING,"Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name);
-                break;
+        for (size_t d = 0; d < l_datums_count; d++) {
+            dap_chain_datum_t *l_datum = l_datums && l_datums_count ? l_datums[d] : NULL;
+            if (!l_datum || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) {
+                // go to next transaction
+                continue;
+            }
+            dap_tx_data_t *l_tx_data = DAP_NEW_Z(dap_tx_data_t);
+            // transaction
+            dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data;
+
+            // find Token items - present in base transaction
+            dap_list_t *l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL);
+            // save token name
+            if (l_list_tx_token) {
+                strcpy(l_tx_data->token_ticker,
+                       ((dap_chain_tx_token_t *)l_list_tx_token->data)->header.ticker);
+                dap_list_free(l_list_tx_token);
             }
 
-            for (size_t d=0; d< l_datums_count; d++){
-                dap_chain_datum_t *l_datum = l_datums && l_datums_count ? l_datums[d] :NULL;
-                if(!l_datum || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) {
-                    // go to next transaction
-                    l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
+            dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL);
+            if (!l_list_in_items) {         // a bad tx
+                DAP_DELETE(l_tx_data);
+                continue;
+            }
+            // all in items should be from the same address
+            dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)l_list_in_items->data;
+            dap_chain_hash_fast_t *l_tx_prev_hash = &l_tx_in->header.tx_prev_hash;
+            dap_chain_addr_t *l_src_addr = NULL;
+            char *l_src_addr_str = NULL;
+            if (!dap_hash_fast_is_blank(l_tx_prev_hash)) {
+                dap_tx_data_t *l_tx_data_prev = NULL;
+                HASH_FIND(hh, l_tx_data_hash, l_tx_prev_hash, sizeof(dap_chain_hash_fast_t), l_tx_data_prev);
+                if (!l_tx_data_prev) {      // prev tx not found - no info for history
+                    DAP_DELETE(l_tx_data);
                     continue;
                 }
-                // transaction
-                dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
-                dap_list_t *l_records_out = NULL;
-                // transaction time
-                char *l_time_str = NULL;
-                {
-                    if(l_tx->header.ts_created > 0) {
-                        time_t rawtime = (time_t) l_tx->header.ts_created;
-                        struct tm * timeinfo;
-                        timeinfo = localtime(&rawtime);
-                        if(timeinfo)
-                            l_time_str = dap_strdup(asctime(timeinfo));
-                    }
-                    else
-                        l_time_str = dap_strdup(" ");
-                }
-
-                // find Token items - present in emit transaction
-                dap_list_t *l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL);
-
-                // list of dap_tx_data_t*; info about OUT item in current transaction
-                dap_list_t *l_list_out_info = NULL;
-
-                // find OUT items
-                dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
-                dap_list_t *l_list_out_items_tmp = l_list_out_items;
-                while(l_list_out_items_tmp) {
-                    const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_out_items_tmp->data;
-                    // save OUT item l_tx_out
-                    {
-                        // save tx hash
-                        // info about OUT item in current transaction
-                        dap_tx_data_t *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));
-                        memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t));
-                        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->datum = DAP_NEW_SIZE(dap_chain_datum_t, l_atom_size);
-                        memcpy(l_tx_data->datum, l_datum, l_atom_size);
-                        // save token name
-                        if(l_tx_data && l_list_tx_token) {
-                            dap_chain_tx_token_t *tk = l_list_tx_token->data;
-                            memcpy(l_tx_data->token_ticker, tk->header.ticker, sizeof(l_tx_data->token_ticker));
-                        }
-                        HASH_ADD(hh, l_tx_data_hash, tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_data);
+                strncpy(l_tx_data->token_ticker, l_tx_data_prev->token_ticker, DAP_CHAIN_TICKER_SIZE_MAX);
+                dap_chain_datum_tx_t *l_tx_prev = (dap_chain_datum_tx_t *)l_tx_data_prev->datum->data;
+                dap_list_t *l_list_prev_out_items = dap_chain_datum_tx_items_get(l_tx_prev, TX_ITEM_TYPE_OUT, NULL);
+                dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_prev_out_items, l_tx_in->header.tx_out_prev_idx);
+                l_src_addr = &((dap_chain_tx_out_t *)l_list_out_prev_item->data)->addr;
+                l_src_addr_str = dap_chain_addr_to_str(l_src_addr);
+                dap_list_free(l_list_prev_out_items);
+            }
+            dap_list_free(l_list_in_items);
 
-                        // save OUT items to list
-                        l_records_out = dap_list_append(l_records_out, (void*) l_tx_out);
-                        // save info about OUT items to list
-                        l_list_out_info = dap_list_append(l_list_out_info, (void*) l_tx_data);
+            dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_data->tx_hash);
+            // transaction time
+            char *l_time_str = NULL;
+            {
+                if (l_tx->header.ts_created > 0) {
+                    time_t rawtime = (time_t)l_tx->header.ts_created;
+                    struct tm *timeinfo;
+                    timeinfo = localtime(&rawtime);
+                    if(timeinfo)
+                        l_time_str = dap_strdup(asctime(timeinfo));
+                } else
+                    l_time_str = dap_strdup(" ");
+            }
+            char *l_tx_hash_str;
+            if (!dap_strcmp(a_hash_out_type, "hex"))
+                l_tx_hash_str = dap_hash_fast_to_str_new(&l_tx_data->tx_hash);
+            else
+                l_tx_hash_str = dap_enc_base58_encode_to_str(&l_tx_data->tx_hash_str, sizeof(dap_chain_hash_fast_t));
+            // find OUT items
+            bool l_header_printed = false;
+            dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
+            for (dap_list_t *l_list_out = l_list_out_items; l_list_out; l_list_out = dap_list_next(l_list_out)) {
+                dap_chain_tx_out_t *l_tx_out = (dap_chain_tx_out_t *)l_list_out->data;
+                if (l_src_addr && !memcmp(&l_tx_out->addr, l_src_addr, sizeof(dap_chain_addr_t)))
+                    continue;   // send to self
+                if (l_src_addr && !memcmp(l_src_addr, a_addr, sizeof(dap_chain_addr_t))) {
+                    if (!l_header_printed) {
+                        dap_string_append_printf(l_str_out, "TX hash %s\n\t%s", l_tx_hash_str, l_time_str);
+                        l_header_printed = true;
                     }
-                    l_list_out_items_tmp = dap_list_next(l_list_out_items_tmp);
+                    char *l_dst_addr_str = dap_chain_addr_to_str(&l_tx_out->addr);
+                    dap_string_append_printf(l_str_out, "\tsend %"DAP_UINT64_FORMAT_U" %s to %s\n",
+                                             l_tx_out->header.value,
+                                             l_tx_data->token_ticker,
+                                             l_dst_addr_str);
+                    DAP_DELETE(l_dst_addr_str);
                 }
-
-                // find IN items
-                dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL);
-                dap_list_t *l_list_in_items_tmp = l_list_in_items;
-                // find cur addr in prev OUT items
-                //bool l_is_use_all_cur_out = false;
-                {
-                    while(l_list_in_items_tmp) {
-                        const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_in_items_tmp->data;
-                        dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash;
-
-                        //find prev OUT item
-                        dap_tx_data_t *l_tx_data_prev = NULL;
-                        HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), l_tx_data_prev);
-                        if(l_tx_data_prev != NULL) {
-                            // fill token in all l_tx_data from prev transaction
-
-                            dap_list_t *l_list_out_info_tmp = l_list_out_info;
-                            while(l_list_out_info_tmp) {
-                                dap_tx_data_t *l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data;
-                                if(l_tx_data) {
-                                    // get token from prev tx
-                                    memcpy(l_tx_data->token_ticker, l_tx_data_prev->token_ticker,
-                                            sizeof(l_tx_data->token_ticker));
-                                    dap_chain_datum_t *l_datum_prev = get_prev_tx(l_tx_data_prev);
-                                    dap_chain_datum_tx_t *l_tx_prev =
-                                            l_datum_prev ? (dap_chain_datum_tx_t*) l_datum_prev->data : NULL;
-
-                                    // find OUT items in prev datum
-                                    dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev,
-                                            TX_ITEM_TYPE_OUT, NULL);
-                                    // find OUT item for IN item;
-                                    dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items,
-                                            l_tx_in->header.tx_out_prev_idx);
-                                    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;
-                                    if(l_tx_prev_out && !memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t)))
-                                        l_tx_data->is_use_all_cur_out = true;
-
-                                }
-                                l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp);
-                            }
-                        }
-                        l_list_in_items_tmp = dap_list_next(l_list_in_items_tmp);
-                    }
-                    // find prev OUT items for IN items
-                    dap_list_t *l_list_in_items2_tmp = l_list_in_items; // go to begin of list
-                    while(l_list_in_items2_tmp) {
-                        const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_in_items2_tmp->data;
-                        dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash;
-                        // if first transaction - empty prev OUT item
-                        if(dap_hash_fast_is_blank(&tx_prev_hash)) {
-
-                            dap_tx_data_t *l_tx_data = NULL;
-                            dap_list_t *l_list_out_info_tmp = l_list_out_info;
-                            while(l_list_out_info_tmp) {
-                                l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data;
-                                if(l_tx_data->token_ticker[0])
-                                    break;
-                                l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp);
-                            }
-
-                            // add emit info to ret string
-                            if(l_tx_data && !memcmp(&l_tx_data->addr, a_addr, sizeof(dap_chain_addr_t))) {
-                                dap_list_t *l_records_tmp = l_records_out;
-                                while(l_records_tmp) {
-                                    char *tx_hash_str;
-                                    if(!dap_strcmp(a_hash_out_type,"hex"))
-                                        tx_hash_str = dap_strdup( l_tx_data->tx_hash_str);
-                                    else
-                                        tx_hash_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str);
-                                    const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_records_tmp->data;
-
-                                    if(!dap_strcmp(a_hash_out_type,"hex")){
-                                    dap_string_append_printf(l_str_out, "tx hash %s \n emit %"DAP_UINT64_FORMAT_U" %s\n",
-                                            tx_hash_str,//l_tx_data->tx_hash_str,
-                                            l_tx_out->header.value,
-                                            l_tx_data->token_ticker);
-                                    }
-                                    else {
-                                        dap_string_append_printf(l_str_out, "tx hash %s \n emit %"DAP_UINT64_FORMAT_U" %s\n",
-                                                l_tx_data->tx_hash_str,
-                                                l_tx_out->header.value,
-                                                l_tx_data->token_ticker);
-                                    }
-                                    DAP_DELETE(tx_hash_str);
-                                    l_records_tmp = dap_list_next(l_records_tmp);
-                                }
-                            }
-                            //dap_list_free(l_records_out);
-                        }
-                        // in other transactions except first one
-                        else {
-                            //find prev OUT item
-                            dap_tx_data_t *l_tx_data_prev = NULL;
-                            HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), l_tx_data_prev);
-                            if(l_tx_data_prev != NULL) {
-                                char *l_src_str = NULL;
-                                bool l_src_str_is_cur = false;
-
-                                dap_tx_data_t *l_tx_data = NULL;
-                                dap_list_t *l_list_out_info_tmp = l_list_out_info;
-                                while(l_list_out_info_tmp) {
-                                    l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data;
-                                    if(l_tx_data->token_ticker[0])
-                                        break;
-                                    l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp);
-                                }
-                                if(l_tx_data) {
-                                    // get token from prev tx
-                                    memcpy(l_tx_data->token_ticker, l_tx_data_prev->token_ticker,
-                                            sizeof(l_tx_data->token_ticker));
-
-                                    dap_chain_datum_t *l_datum_prev = get_prev_tx(l_tx_data_prev);
-                                    dap_chain_datum_tx_t *l_tx_prev =
-                                            l_datum_prev ? (dap_chain_datum_tx_t*) l_datum_prev->data : NULL;
-
-                                    // find OUT items in prev datum
-                                    dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev,
-                                            TX_ITEM_TYPE_OUT, NULL);
-                                    // find OUT item for IN item;
-                                    dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items,
-                                            l_tx_in->header.tx_out_prev_idx);
-                                    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;
-                                    // if use src addr
-                                    bool l_is_use_src_addr = false;
-                                    // find source addrs
-                                    dap_string_t *l_src_addr = dap_string_new(NULL);
-                                    {
-                                        // find IN items in prev datum - for get destination addr
-                                        dap_list_t *l_list_in_prev_items = dap_chain_datum_tx_items_get(l_tx_prev,
-                                                TX_ITEM_TYPE_IN, NULL);
-                                        dap_list_t *l_list_tmp = l_list_in_prev_items;
-                                        while(l_list_tmp) {
-                                            dap_chain_tx_in_t *l_tx_prev_in = l_list_tmp->data;
-                                            dap_chain_hash_fast_t l_tx_prev_prev_hash =
-                                                    l_tx_prev_in->header.tx_prev_hash;
-                                            //find prev OUT item
-                                            dap_tx_data_t *l_tx_data_prev_prev = NULL;
-                                            HASH_FIND(hh, l_tx_data_hash, &l_tx_prev_prev_hash,
-                                                    sizeof(dap_chain_hash_fast_t), l_tx_data_prev_prev);
-                                            if(l_tx_data_prev_prev) {
-                                                // if use src addr
-                                                if(l_tx_data_prev_prev &&
-                                                        !memcmp(&l_tx_data_prev_prev->addr, a_addr,
-                                                                sizeof(dap_chain_addr_t)))
-                                                    l_is_use_src_addr = true;
-                                                char *l_str = dap_chain_addr_to_str(&l_tx_data_prev_prev->addr);
-                                                if(l_src_addr->len > 0)
-                                                    dap_string_append_printf(l_src_addr, "\n   %s", l_str);
-                                                else
-                                                    dap_string_append_printf(l_src_addr, "%s", l_str); // first record
-                                                DAP_DELETE(l_str);
-                                            }
-                                            l_list_tmp = dap_list_next(l_list_tmp);
-                                        }
-                                    }
-
-                                    l_src_str_is_cur = l_is_use_src_addr;
-                                    if(l_src_addr->len <= 1) {
-                                        l_src_str =
-                                                (l_tx_data) ? dap_chain_addr_to_str(&l_tx_data->addr) :
-                                                NULL;
-                                        if(l_tx_prev_out && !memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t)))
-                                            l_src_str_is_cur = true;
-                                        dap_string_free(l_src_addr, true);
-                                    }
-                                    else
-                                        l_src_str = dap_string_free(l_src_addr, false);
-
-                                    if(l_tx_prev_out) {
-                                        char *l_dst_to_str = dap_chain_addr_to_str(&l_tx_prev_out->addr);
-                                        // if use dst addr
-                                        bool l_is_use_dst_addr = false;
-                                        if(!memcmp(&l_tx_prev_out->addr, a_addr, sizeof(dap_chain_addr_t)))
-                                            l_is_use_dst_addr = true;
-                                        char *tx_hash_str;
-                                        if(!dap_strcmp(a_hash_out_type, "hex"))
-                                            tx_hash_str = dap_strdup(l_tx_data->tx_hash_str);
-                                        else
-                                            tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str);
-                                        if(l_is_use_src_addr && !l_is_use_dst_addr) {
-                                            dap_string_append_printf(l_str_out,
-                                                    "tx hash %s \n %s in send  %"DAP_UINT64_FORMAT_U" %s from %s\n to %s\n",
-                                                    tx_hash_str,//l_tx_data->tx_hash_str,
-                                                    l_time_str ? l_time_str : "",
-                                                    l_tx_prev_out->header.value,
-                                                    l_tx_data->token_ticker,
-                                                    l_src_str ? l_src_str : "",
-                                                    l_dst_to_str);
-                                        } else if(l_is_use_dst_addr && !l_is_use_src_addr) {
-                                            if(!l_src_str_is_cur)
-                                                dap_string_append_printf(l_str_out,
-                                                        "tx hash %s \n %s in recv %"DAP_UINT64_FORMAT_U" %s from %s\n",
-                                                        tx_hash_str,//l_tx_data->tx_hash_str,
-                                                        l_time_str ? l_time_str : "",
-                                                        l_tx_prev_out->header.value,
-                                                        l_tx_data->token_ticker,
-                                                        l_src_str ? l_src_str : "");
-                                        }
-                                        DAP_DELETE(tx_hash_str);
-                                        DAP_DELETE(l_dst_to_str);
-                                    }
-                                    dap_list_free(l_list_out_prev_items);
-                                }
-
-                                // OUT items
-                                dap_list_t *l_records_tmp = l_records_out;
-                                while(l_records_tmp) {
-
-                                    const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_records_tmp->data;
-
-                                    if(( l_tx_data && l_tx_data->is_use_all_cur_out )
-                                            || !memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))) {
-
-                                        char *l_addr_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : NULL;
-
-                                        char *tx_hash_str;
-                                        if(!dap_strcmp(a_hash_out_type, "hex"))
-                                            tx_hash_str = dap_strdup(l_tx_data->tx_hash_str);
-                                        else
-                                            tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str);
-                                        if(l_tx_out && a_addr &&  memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))==0) {
-                                            if(!l_src_str_is_cur)
-                                                dap_string_append_printf(l_str_out,
-                                                        "tx hash %s \n %s recv %"DAP_UINT64_FORMAT_U" %s from %s\n",
-                                                        tx_hash_str,//l_tx_data->tx_hash_str,
-                                                        l_time_str ? l_time_str : "",
-                                                        l_tx_out->header.value,
-                                                        l_tx_data_prev->token_ticker,
-                                                        l_src_str ? l_src_str : "?");
-                                            // break search prev OUT items for IN items
-                                            l_list_in_items2_tmp = NULL;
-                                        }
-                                        else {
-                                            dap_string_append_printf(l_str_out,
-                                                    "tx hash %s \n %s send %"DAP_UINT64_FORMAT_U" %s to %s\n",
-                                                    tx_hash_str,//l_tx_data->tx_hash_str,
-                                                    l_time_str ? l_time_str : "",
-                                                    l_tx_out->header.value,
-                                                    l_tx_data_prev->token_ticker,
-                                                    l_addr_str ? l_addr_str : "");
-                                            l_list_in_items2_tmp = NULL;
-                                        }
-                                        DAP_DELETE(tx_hash_str);
-                                        DAP_DELETE(l_addr_str);
-                                    }
-
-                                    l_records_tmp = dap_list_next(l_records_tmp);
-                                }
-                                //dap_list_free(l_records_out);
-                                DAP_DELETE(l_src_str);
-
-                            }
-                        }
-                        l_list_in_items2_tmp = dap_list_next(l_list_in_items2_tmp);
+                if (!memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))) {
+                    if (!l_header_printed) {
+                        dap_string_append_printf(l_str_out, "TX hash %s\n\t%s", l_tx_hash_str, l_time_str);
+                        l_header_printed = true;
                     }
-        //                l_list_in_items_tmp = dap_list_next(l_list_in_items_tmp);
-        //            }
+                    dap_string_append_printf(l_str_out, "\trecv %"DAP_UINT64_FORMAT_U" %s from %s\n",
+                                             l_tx_out->header.value,
+                                             l_tx_data->token_ticker,
+                                             l_src_addr ? l_src_addr_str : "emission");
                 }
-
-                if(l_list_tx_token)
-                    dap_list_free(l_list_tx_token);
-                if(l_list_out_items)
-                    dap_list_free(l_list_out_items);
-                if(l_list_in_items)
-                    dap_list_free(l_list_in_items);
-                dap_list_free(l_records_out);
-                dap_list_free(l_list_out_info);
-                DAP_DELETE(l_time_str);
-
-                // go to next transaction
-                l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
             }
-            DAP_DELETE(l_datums);
-        }
-
-        // delete hashes
-        dap_tx_data_t *l_iter_current, *l_item_tmp;
-        HASH_ITER(hh, l_tx_data_hash , l_iter_current, l_item_tmp)
-        {
-            // delete datum
-            DAP_DELETE(l_iter_current->datum);
-            // delete struct
-            DAP_DELETE(l_iter_current);
-            HASH_DEL(l_tx_data_hash, l_iter_current);
+            dap_list_free(l_list_out_items);
+            DAP_DELETE(l_src_addr_str);
+            DAP_DELETE(l_tx_hash_str);
+            DAP_DELETE(l_time_str);
+
+            size_t l_datum_size = dap_chain_datum_tx_get_size(l_tx) + sizeof(dap_chain_datum_t);
+            l_tx_data->datum = DAP_NEW_SIZE(dap_chain_datum_t, l_datum_size);
+            memcpy(l_tx_data->datum, l_datum, l_datum_size);        // for GDB chains with data replace with each itreation
+            HASH_ADD(hh, l_tx_data_hash, tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_data);
         }
-        l_cell = l_cell->hh.next;
-    } while (l_cell);
+        DAP_DELETE(l_datums);
+        // go to next atom (event or block)
+        l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
+    }
 
+    // delete hashes
+    dap_tx_data_t *l_iter_current, *l_item_tmp;
+    HASH_ITER(hh, l_tx_data_hash , l_iter_current, l_item_tmp) {
+        HASH_DEL(l_tx_data_hash, l_iter_current);
+        // delete struct
+        DAP_DELETE(l_iter_current);
+    }
     // if no history
     if(!l_str_out->len)
-        dap_string_append(l_str_out, " empty");
+        dap_string_append(l_str_out, "\tempty");
     char *l_ret_str = l_str_out ? dap_string_free(l_str_out, false) : NULL;
     return l_ret_str;
 }
@@ -1201,7 +858,8 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke
                 // get time of create datum
                 if (dap_time_to_str_rfc822(l_time_str, 70, l_datum->header.ts_create) < 1)
                     l_time_str[0] = '\0';
-                dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
+                size_t l_token_size = l_datum->header.data_size;
+                dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(l_datum->data, &l_token_size);
                 if (!a_token_name || !dap_strcmp(l_token->ticker, a_token_name)) {
                     dap_chain_hash_fast_t l_datum_hash = {};
                     dap_hash_fast(l_datum, dap_chain_datum_size(l_datum), &l_datum_hash);
@@ -1212,13 +870,13 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke
                         l_out_hash_str = dap_enc_base58_encode_hash_to_str(&l_datum_hash);
                     dap_string_append(l_str_out, l_out_hash_str);
                     dap_string_append(l_str_out, "\n");
-                    dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str);
+                    dap_string_append_printf(l_str_out, "Token %s, created: %s\n", l_token->ticker, l_time_str);
                     switch (l_token->type) {
                         // Simple private token decl
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256
                            dap_string_append_printf(l_str_out, "  total_supply: %s(%s), signs: valid/total %02d/%02d \n",
-                                    dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)),
-                                    dap_chain_u256tostr(l_token->header_private.total_supply_256),
+                                    dap_chain_balance_to_coins(l_token->header_private.total_supply_256),
+                                    dap_chain_balance_print(l_token->header_private.total_supply_256),
                                     l_token->header_private.signs_valid, l_token->header_private.signs_total);
                             break;
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
@@ -1235,38 +893,40 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke
                             break;
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
-                            dap_string_append_printf(l_str_out, "  tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n",
-                                    l_token->header_private_update.tsd_total_size,
-                                    l_token->header_private_update.padding);
+                            dap_string_append_printf(l_str_out, "  tsd_total_size: %"DAP_UINT64_FORMAT_U"\n",
+                                    l_token->header_private_update.tsd_total_size);
                             break;
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256
                             char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address);
-                            char * l_balance = dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256));
+                            char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply_256);
                             dap_string_append_printf(l_str_out,
                                     " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                    dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)),
-                                    dap_chain_u256tostr(l_token->header_public.total_supply_256),
+                                    dap_chain_balance_to_coins(l_token->header_public.total_supply_256),
+                                    dap_chain_balance_print(l_token->header_public.total_supply_256),
                                     l_token->header_public.flags,
-                                    dap_chain_u256tostr(l_token->header_public.premine_supply_256),
+                                    dap_chain_balance_print(l_token->header_public.premine_supply_256),
                                     l_addr ? l_addr : "-");
                             DAP_DELETE(l_addr);
                             DAP_DELETE(l_balance);
                         }break;
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: {
                             char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address);
-                            char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply);
+                            char * l_balance = dap_chain_balance_to_coins(dap_chain_uint256_from_uint128(
+                                                                              l_token->header_public.total_supply));
                             dap_string_append_printf(l_str_out,
                                     " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                    dap_chain_balance_to_coins(l_token->header_public.total_supply),
-                                    dap_chain_balance_print(l_token->header_public.total_supply),
+                                    l_balance,
+                                    dap_chain_balance_print(dap_chain_uint256_from_uint128(
+                                                                l_token->header_public.total_supply)),
                                     l_token->header_public.flags,
-                                    dap_chain_balance_print(l_token->header_public.premine_supply),
+                                    dap_chain_balance_print(dap_chain_uint256_from_uint128(
+                                                                l_token->header_public.premine_supply)),
                                     l_addr ? l_addr : "-");
                             DAP_DELETE(l_addr);
                             DAP_DELETE(l_balance);
                         }break;
                         default:
-                            dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type);
+                            dap_string_append_printf(l_str_out, "Unknown token type: 0x%x\n", l_token->type);
                             break;
                     }
                     dap_string_append_printf(l_str_out, "\n");
@@ -1350,7 +1010,6 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
             switch (l_datum->header.type_id) {
 
                 // token
-                case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256
                 case DAP_CHAIN_DATUM_TOKEN_DECL: {
                     // no token necessary for addr
                     if(a_filtr_addr_base58) {
@@ -1369,9 +1028,9 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                         switch (l_token->type) {
                         // Simple private token decl
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256
-                                dap_string_append_printf(l_str_out, "  256_t total_supply: %s(%s), signs: valid/total %02d/%02d \n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)),
-                                        dap_chain_u256tostr(l_token->header_private.total_supply_256),
+                                dap_string_append_printf(l_str_out, "  256bit total_supply: %s(%s), signs: valid/total %02d/%02d \n",
+                                        dap_chain_balance_to_coins(l_token->header_private.total_supply_256),
+                                        dap_chain_balance_print(l_token->header_private.total_supply_256),
                                         l_token->header_private.signs_valid, l_token->header_private.signs_total);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
@@ -1381,7 +1040,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                                         l_token->header_private.signs_valid, l_token->header_private.signs_total);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256
-                                dap_string_append_printf(l_str_out, "256_t  tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n",
+                                dap_string_append_printf(l_str_out, "256bit  tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n",
                                         l_token->header_private_decl.tsd_total_size,
                                         l_token->header_private_decl.flags);
                                 break;
@@ -1391,37 +1050,36 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                                         l_token->header_private_decl.flags);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256
-                                dap_string_append_printf(l_str_out, "256_t  tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n",
-                                        l_token->header_private_update.tsd_total_size,
-                                        l_token->header_private_update.padding);
+                                dap_string_append_printf(l_str_out, "256bit  tsd_total_size: %"DAP_UINT64_FORMAT_U"\n",
+                                        l_token->header_private_update.tsd_total_size);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
-                                dap_string_append_printf(l_str_out, "  tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n",
-                                        l_token->header_private_update.tsd_total_size,
-                                        l_token->header_private_update.padding);
+                                dap_string_append_printf(l_str_out, "  tsd_total_size: %"DAP_UINT64_FORMAT_U"\n",
+                                        l_token->header_private_update.tsd_total_size);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256
                                 char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address);
-                                char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply);
                                 dap_string_append_printf(l_str_out,
                                         " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)),
-                                        dap_chain_u256tostr(l_token->header_public.total_supply_256),
+                                        dap_chain_balance_to_coins(l_token->header_public.total_supply_256),
+                                        dap_chain_balance_print(l_token->header_public.total_supply_256),
                                         l_token->header_public.flags,
-                                        dap_chain_u256tostr(l_token->header_public.premine_supply_256),
+                                        dap_chain_balance_print(l_token->header_public.premine_supply_256),
                                         l_addr ? l_addr : "-");
                                 DAP_DELETE(l_addr);
-                                DAP_DELETE(l_balance);
                             } break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: {
                                 char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address);
-                                char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply);
+                                char * l_balance = dap_chain_balance_to_coins(dap_chain_uint256_from_uint128(
+                                                                                  l_token->header_public.total_supply));
                                 dap_string_append_printf(l_str_out,
                                         " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                        dap_chain_balance_to_coins(l_token->header_public.total_supply),
-                                        dap_chain_balance_print(l_token->header_public.total_supply),
+                                        l_balance,
+                                        dap_chain_balance_print(dap_chain_uint256_from_uint128(
+                                                                    l_token->header_public.total_supply)),
                                         l_token->header_public.flags,
-                                        dap_chain_balance_print(l_token->header_public.premine_supply),
+                                        dap_chain_balance_print(dap_chain_uint256_from_uint128(
+                                                                    l_token->header_public.premine_supply)),
                                         l_addr ? l_addr : "-");
                                 DAP_DELETE(l_addr);
                                 DAP_DELETE(l_balance);
@@ -1438,7 +1096,6 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                     break;
 
                 // emission
-                case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256
                 case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
                     // datum out of page
                     if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) {
@@ -1455,8 +1112,8 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                         }
                         if ( l_token_em->hdr.version == 1 ) { // && l_token_em->hdr.type_256 ) { // 256
                             dap_string_append_printf(l_str_out, "emission 256: %s(%s) %s, type: %s, version: %d\n",
-                                dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->hdr.value_256)),
-                                dap_chain_u256tostr(l_token_em->hdr.value_256),
+                                dap_chain_balance_to_coins(l_token_em->hdr.value_256),
+                                dap_chain_balance_print(l_token_em->hdr.value_256),
                                 l_token_em->hdr.ticker,
                                 c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type],
                                 l_token_em->hdr.version);
@@ -1484,21 +1141,12 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                                 break;
                             // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ATOM_OWNER: // 256
                             case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER:
-                                if ( l_token_em->hdr.version == 1 ) { // && l_token_em->hdr.type_256 ) { // 256
-                                    dap_string_append_printf(l_str_out, " value_start: %s(%s), codename: %s\n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->data.type_atom_owner.value_start_256)),
-                                        dap_chain_u256tostr(l_token_em->data.type_atom_owner.value_start_256),
-                                        l_token_em->data.type_atom_owner.value_change_algo_codename
-                                    );
-                                } else {
-                                    dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n",
-                                        dap_chain_datoshi_to_coins(l_token_em->data.type_atom_owner.value_start),
-                                        l_token_em->data.type_atom_owner.value_start,
-                                        l_token_em->data.type_atom_owner.value_change_algo_codename
-                                    );
-                                }
+                                dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n",
+                                    dap_chain_datoshi_to_coins(l_token_em->data.type_atom_owner.value_start),
+                                    l_token_em->data.type_atom_owner.value_start,
+                                    l_token_em->data.type_atom_owner.value_change_algo_codename
+                                );
                             break;
-                            // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_SMART_CONTRACT:
                             case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: {
                                 char *l_addr = dap_chain_addr_to_str(&l_token_em->data.type_presale.addr);
                                 // get time of create datum
@@ -1527,20 +1175,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                     dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data;
                     //calc tx hash
                     s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num);
-                }
-                    break;
-
-                    // transaction
-                case DAP_CHAIN_DATUM_256_TX:{ // 256
-                    // datum out of page
-                    if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) {
-                        l_tx_num++;
-                        break;
-                    }
-                    dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data;
-                    s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num);
-                }
-                    break;
+                } break;
 
                 default:
                     dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id);
@@ -1613,6 +1248,7 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
         dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>");
         return -1;
     }
+
     int l_cmd = CMD_NONE;
     if (dap_chain_node_cli_find_option_val(a_argv, 1, 2, "list", NULL)){
         l_cmd = CMD_LIST;
@@ -1621,7 +1257,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
         if (dap_chain_node_cli_find_option_val(a_argv, 2, 3, "info", NULL))
             l_cmd = CMD_TX_INFO;
     }
-
     // command tx_history
     if(l_cmd == CMD_TX_HISTORY) {
         bool l_is_all = dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-all", NULL);
@@ -1705,7 +1340,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
         else
             l_chain_cur = dap_chain_enum(&l_chain_tmp);
         while(l_chain_cur) {
-
             // only selected net
             if(l_net->pub.id.uint64 == l_chain_cur->net_id.uint64) {
                 // separator between chains
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 2f599cd3b0e1b031953bce38261316f8e0f1b2da..819f9ac4e984af9cd1ae9e98eff8901e333a6fdc 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -154,7 +154,6 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
     // check for last attempt
     bool l_is_last_attempt = a_arg ? true : false;
     if (l_is_last_attempt) {
-        dap_chain_node_client_state_t l_prev_state = l_node_client->state;
         pthread_mutex_lock(&l_node_client->wait_mutex);
         l_node_client->state = NODE_CLIENT_STATE_DISCONNECTED;
 #ifndef _WIN32
@@ -165,18 +164,23 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
         pthread_mutex_unlock(&l_node_client->wait_mutex);
         l_node_client->esocket_uuid = 0;
 
-        if (l_prev_state >= NODE_CLIENT_STATE_ESTABLISHED && l_node_client->callbacks.disconnected) {
+        if (l_node_client->callbacks.disconnected) {
             l_node_client->callbacks.disconnected(l_node_client, l_node_client->callbacks_arg);
-        } else if (l_node_client->keep_connection) {
-            dap_events_socket_uuid_t *l_uuid = DAP_NEW(dap_events_socket_uuid_t);
-            memcpy(l_uuid, &l_node_client->uuid, sizeof(dap_events_socket_uuid_t));
-            dap_timerfd_start_on_worker(l_node_client->stream_worker? l_node_client->stream_worker->worker: dap_events_worker_get_auto(),s_timer_update_states*1000,s_timer_update_states_callback, l_uuid);
+        }
+        if (l_node_client->keep_connection) {
+            dap_events_socket_uuid_t *l_uuid = DAP_DUP(&l_node_client->uuid);
+            dap_timerfd_start_on_worker(l_node_client->stream_worker
+                                             ? l_node_client->stream_worker->worker
+                                             : dap_events_worker_get_auto(),
+                                        s_timer_update_states * 1000,
+                                        s_timer_update_states_callback,
+                                        l_uuid);
         }
         return;
     }
     // TODO make different error codes
     if(l_node_client->callbacks.error)
-        l_node_client->callbacks.error(l_node_client, EINVAL,l_node_client->callbacks_arg );
+        l_node_client->callbacks.error(l_node_client, EINVAL, l_node_client->callbacks_arg);
 }
 
 /**
@@ -228,7 +232,7 @@ static bool s_timer_update_states_callback(void *a_arg)
                     dap_chain_net_t * l_net = l_node_client->net;
                     assert(l_net);
                     // If we do nothing - init sync process
-                    if (l_ch_chain->state == CHAIN_STATE_IDLE ||l_ch_chain->state == CHAIN_STATE_SYNC_ALL ){
+                    if (l_ch_chain->state == CHAIN_STATE_IDLE && dap_chain_net_sync_trylock(l_net, l_me)) {
                         log_it(L_INFO, "Start synchronization process with "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr));
                         dap_stream_ch_chain_sync_request_t l_sync_gdb = {};
                         l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
@@ -246,7 +250,8 @@ static bool s_timer_update_states_callback(void *a_arg)
     l_me->state = NODE_CLIENT_STATE_DISCONNECTED;
     if (l_me->keep_connection) {
         log_it(L_INFO, "Reconnecting node client with peer "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_me->remote_node_addr));
-        dap_chain_node_client_connect_internal(l_me, "CN"); // isn't always CN here?
+        l_me->state = NODE_CLIENT_STATE_CONNECTING ;
+        dap_client_go_stage(l_me->client, STAGE_STREAM_STREAMING, s_stage_connected_callback);
     }
     DAP_DELETE(l_uuid);
     return false;
@@ -405,11 +410,12 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
             dap_chain_id_t  l_chain_id = {};
             dap_chain_cell_id_t l_cell_id = {};
             if (a_pkt_type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB) {
-                if(s_stream_ch_chain_debug_more)
-                    log_it(L_INFO,"In: Link %s."NODE_ADDR_FP_STR" synced GDB. Going to update chains", l_net->pub.name, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr ));
-                // TODO check if target net state == NET_STATE_SYNC_GDB to not synchronize chains, if it
-                l_node_client->cur_chain = l_net->pub.chains;
-                l_node_client->cur_cell = l_node_client->cur_chain ? l_node_client->cur_chain->cells : NULL;
+                if (dap_chain_net_get_target_state(l_net) != NET_STATE_SYNC_GDB) {
+                    if(s_stream_ch_chain_debug_more)
+                        log_it(L_INFO,"In: Link %s."NODE_ADDR_FP_STR" synced GDB. Going to update chains", l_net->pub.name, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr ));
+                    l_node_client->cur_chain = l_net->pub.chains;
+                    l_node_client->cur_cell = l_node_client->cur_chain ? l_node_client->cur_chain->cells : NULL;
+                }
             } else {
                 // Check if we over with it before
                 if ( ! l_node_client->cur_cell ){
@@ -451,8 +457,12 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
             }else{ // If no - over with sync process
                 dap_chain_node_addr_t * l_node_addr = dap_chain_net_get_cur_addr(l_net);
                 log_it(L_INFO, "In: State node %s."NODE_ADDR_FP_STR" is SYNCED",l_net->pub.name, NODE_ADDR_FP_ARGS(l_node_addr) );
+                dap_chain_net_sync_unlock(l_net);
                 l_node_client->state = NODE_CLIENT_STATE_SYNCED;
-                dap_chain_net_set_state(l_net, NET_STATE_ONLINE);
+                if (dap_chain_net_get_target_state(l_net) == NET_STATE_ONLINE)
+                    dap_chain_net_set_state(l_net, NET_STATE_ONLINE);
+                else
+                    dap_chain_net_state_go_to(l_net, NET_STATE_OFFLINE);
 #ifndef _WIN32
                 pthread_cond_broadcast(&l_node_client->wait_cond);
 #else
@@ -662,12 +672,11 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no
 {
     a_node_client->client = dap_client_new(a_node_client->events, s_stage_status_callback,
             s_stage_status_error_callback);
-    a_node_client->keep_connection = true;
     dap_client_set_is_always_reconnect(a_node_client->client, false);
     a_node_client->client->_inheritor = a_node_client;
     dap_client_set_active_channels_unsafe(a_node_client->client, a_active_channels);
 
-    dap_client_set_auth_cert(a_node_client->client, a_node_client->net->pub.name); // TODO provide the certificate choice
+    dap_client_set_auth_cert(a_node_client->client, a_node_client->net->pub.name);
 
     int hostlen = 128;
     char host[hostlen];
@@ -687,8 +696,6 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no
     }
     dap_client_set_uplink_unsafe(a_node_client->client, strdup(host), a_node_client->info->hdr.ext_port);
     a_node_client->state = NODE_CLIENT_STATE_CONNECTING ;
-    // ref pvt client
-    //dap_client_pvt_ref(DAP_CLIENT_PVT(a_node_client->client));
     // Handshake & connect
     dap_client_go_stage(a_node_client->client, STAGE_STREAM_STREAMING, s_stage_connected_callback);
     return true;
@@ -737,6 +744,17 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client)
         char l_node_addr_str[INET_ADDRSTRLEN] = {};
         inet_ntop(AF_INET, &a_client->info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN);
         log_it(L_INFO, "Closing node client to uplink %s:%d", l_node_addr_str, a_client->info->hdr.ext_port);
+        dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(a_client->stream_worker, a_client->ch_chain_uuid);
+        if (l_ch) {
+            dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
+            l_ch_chain->callback_notify_packet_in = NULL;
+            l_ch_chain->callback_notify_packet_out = NULL;
+        }
+        l_ch = dap_stream_ch_find_by_uuid_unsafe(a_client->stream_worker, a_client->ch_chain_net_uuid);
+        if (l_ch) {
+            dap_stream_ch_chain_net_t *l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(l_ch);
+            l_ch_chain_net->notify_callback = NULL;
+        }
         // clean client
         dap_client_pvt_t *l_client_pvt = dap_client_pvt_find(a_client->client->pvt_uuid);
         if (l_client_pvt) {
diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c
index 66090c88cf0d36d692757926c689fa92d0c1f0da..3f933f7d7b99c509775186d41163d0f5d083b1fb 100644
--- a/modules/net/dap_chain_node_dns_server.c
+++ b/modules/net/dap_chain_node_dns_server.c
@@ -310,8 +310,8 @@ dap_chain_node_info_t *dap_dns_resolve_hostname(char *str)
     if (!l_nodes_count || !l_objs)
         return NULL;
     dap_chain_node_info_t *l_node_candidate;
-    for (int i = 0; i < 5; i++) {
-        // 5 tryes for non empty address & port
+    for (int i = 0; i < 50; i++) {
+        // 50 tryes for non empty address & port
         size_t l_node_num = rand() % l_nodes_count;
         l_node_candidate = (dap_chain_node_info_t *)l_objs[l_node_num].value;
         if (l_node_candidate->hdr.ext_addr_v4.s_addr && l_node_candidate->hdr.ext_port)
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index cb12d6ecd545535deb8fc1b4fd44c91ba9b81fff..142bd80e10711d4bb0f154846e5187a7067a83c5 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -39,7 +39,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #define DAP_CHAIN_NET_NAME_MAX 32
 
 struct dap_chain_node_info;
-struct dap_chain_node_client;
+typedef struct dap_chain_node_client dap_chain_node_client_t;
 
 typedef  enum dap_chain_net_state{
     NET_STATE_OFFLINE = 0,
@@ -74,6 +74,7 @@ typedef struct dap_chain_net{
 
         // checks
         bool token_emission_signs_verify;
+        bool mempool_autoproc;
 
         dap_chain_t * chains; // double-linked list of chains
         dap_chain_t * default_chain;
@@ -89,14 +90,14 @@ void dap_chain_net_deinit(void);
 void dap_chain_net_load_all();
 
 int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state);
+dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net);
 
 inline static int dap_chain_net_start(dap_chain_net_t * a_net){ return dap_chain_net_state_go_to(a_net,NET_STATE_ONLINE); }
 inline static int dap_chain_net_stop(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_OFFLINE); }
 inline static int dap_chain_net_links_establish(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_LINKS_ESTABLISHED); }
-inline static int dap_chain_net_sync_chains(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_CHAINS); }
 inline static int dap_chain_net_sync_gdb(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_GDB); }
-inline static int dap_chain_net_sync_all(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_CHAINS); }//NET_STATE_ONLINE
-
+inline static int dap_chain_net_sync_chains(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_CHAINS); }
+inline static int dap_chain_net_sync_all(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_CHAINS); }
 void dap_chain_net_set_state ( dap_chain_net_t * l_net, dap_chain_net_state_t a_state);
 dap_chain_net_state_t dap_chain_net_get_state ( dap_chain_net_t * l_net);
 
@@ -117,6 +118,8 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net);
 void dap_chain_net_set_flag_sync_from_zero(dap_chain_net_t * a_net, bool a_flag_sync_from_zero);
 bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net);
 
+bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client);
+void dap_chain_net_sync_unlock(dap_chain_net_t *a_net);
 
 dap_chain_net_t * dap_chain_net_by_name( const char * a_name);
 dap_chain_net_t * dap_chain_net_by_id( dap_chain_net_id_t a_id);
@@ -172,7 +175,7 @@ dap_chain_net_t **dap_chain_net_list(uint16_t *a_size);
 bool dap_chain_net_get_add_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr);
 
 int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum );
-void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum, const char *a_hash_out_type);
+void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type);
 void dap_chain_net_set_srv_callback_notify(dap_global_db_obj_callback_notify_t a_callback);
 void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const char *a_group,
                                       const char *a_key, const void *a_value, const size_t a_value_len);
diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h
index 703175de5068982408b12d69a41216642fd1894e..447527b6a5835d3e632aca1c9917112219cec923 100644
--- a/modules/net/include/dap_chain_node.h
+++ b/modules/net/include/dap_chain_node.h
@@ -122,14 +122,14 @@ size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info);
 //dap_chain_node_info_t* dap_chain_node_info_deserialize(uint8_t *node_info_str, size_t size);
 
 /**
- * Generate node addr by net id
+ * Generate node addr by shard id
  */
 dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_id_t a_net_id);
 
 /**
  * Check the validity of the node address by shard id
  */
-bool dap_chain_node_check_addr(dap_chain_net_t * l_net, dap_chain_node_addr_t *a_addr);
+bool dap_chain_node_check_addr(dap_chain_net_t * l_net,dap_chain_node_addr_t *addr);
 
 dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * l_net,const char *alias);
 bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr);
@@ -144,7 +144,7 @@ inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *addre
     return a_key;
 }
 
-int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum);
+int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_datum);
 bool dap_chain_node_mempool_autoproc_init();
 void dap_chain_node_mempool_autoproc_deinit();
 void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_group,
diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h
index 4ac0d989e399f6214028df72a42f0043cdd13e4e..ea22439219fab6b73ea5258ce6e5a7bd426c6a4e 100644
--- a/modules/net/include/dap_chain_node_cli_cmd.h
+++ b/modules/net/include/dap_chain_node_cli_cmd.h
@@ -117,7 +117,7 @@ int com_tx_cond_create(int argc, char ** argv, char **str_reply);
  *
  * Verifing transaction
  */
-int com_tx_verify(int argc, char ** argv, char **str_reply);
+int com_tx_verify(int a_argc, char ** a_argv, char **a_str_reply);
 
 /**
  * tx_history command
diff --git a/modules/net/include/dap_chain_node_client.h b/modules/net/include/dap_chain_node_client.h
index 92a7ba56d3479fbf01a31fe3d3ea3f0b78142ec2..21902259e9901466c29bc498cdd74e7e562cdbeb 100644
--- a/modules/net/include/dap_chain_node_client.h
+++ b/modules/net/include/dap_chain_node_client.h
@@ -114,7 +114,7 @@ typedef struct dap_chain_node_client {
 
     bool keep_connection;
 
-    bool is_reconnecting;
+    bool is_connected;
     // callbacks
     dap_chain_node_client_callbacks_t callbacks;
     void * callbacks_arg;
diff --git a/modules/net/srv/CMakeLists.txt b/modules/net/srv/CMakeLists.txt
index 399b0a433767971f7af42388381ad7e80c303885..505a2deb8bc6634dccf8969c98e201485493d885 100644
--- a/modules/net/srv/CMakeLists.txt
+++ b/modules/net/srv/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_net_srv)
 
 file(GLOB DAP_CHAIN_NET_SRV_SRCS *.c libmaxminddb/*.c)
diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index 5206e305e18b7e83014b1641840bda9553b6ac05..19a6ea5f7acf57ebe7ac391e1ef16434092de983 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -111,13 +111,13 @@ int dap_chain_net_srv_init()
         "        -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"
             "\tStatic nodelist create/delete\n"
             "net_srv -net <chain net name> order recheck\n"
             "\tCheck the availability of orders\n"
-
+#endif
         );
 
     s_load_all();
@@ -303,7 +303,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, l_ext, l_order->ext_size);
+                        strncpy((char *)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);
@@ -365,7 +365,8 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
 
             dap_chain_net_srv_order_direction_t l_direction = SERV_DIR_UNDEFINED;
             dap_chain_net_srv_uid_t l_srv_uid={{0}};
-            uint64_t l_price_min=0, l_price_max =0 ;
+            uint256_t l_price_min = {};
+            uint256_t l_price_max = {};
             dap_chain_net_srv_price_unit_uid_t l_price_unit={{0}};
 
             if ( l_direction_str ){
@@ -379,10 +380,10 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                 l_srv_uid.uint64 = (uint64_t) atoll( l_srv_uid_str);
 
             if ( l_price_min_str )
-                l_price_min = (uint64_t) atoll ( l_price_min_str );
+                l_price_min = dap_chain_balance_scan(l_price_min_str);
 
             if ( l_price_max_str )
-                l_price_max = (uint64_t) atoll ( l_price_max_str );
+                l_price_max = dap_chain_balance_scan(l_price_max_str);
             if ( l_price_unit_str)
                 l_price_unit.uint32 = (uint32_t) atol ( l_price_unit_str );
 
@@ -423,7 +424,8 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                 dap_chain_net_srv_order_t * l_orders = NULL;
                 size_t l_orders_num =0;
                 dap_chain_net_srv_uid_t l_srv_uid={{0}};
-                uint64_t l_price_min=0, l_price_max =0 ;
+                uint256_t l_price_min = {};
+                uint256_t l_price_max = {};
                 dap_chain_net_srv_price_unit_uid_t l_price_unit={{0}};
                 dap_chain_net_srv_order_direction_t l_direction = SERV_DIR_UNDEFINED;
 
@@ -475,7 +477,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                 dap_chain_node_addr_t l_node_addr={0};
                 dap_chain_hash_fast_t l_tx_cond_hash={{0}};
                 dap_chain_time_t l_expires=0; // TS when the service expires
-                uint64_t l_price=0;
+                uint256_t l_price = {};
                 char l_price_token[DAP_CHAIN_TICKER_SIZE_MAX]={0};
                 dap_chain_net_srv_price_unit_uid_t l_price_unit={{0}};
                 dap_chain_net_srv_order_direction_t l_direction = SERV_DIR_UNDEFINED;
@@ -503,7 +505,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                 }
                 if (l_tx_cond_hash_str)
                     dap_chain_hash_fast_from_str (l_tx_cond_hash_str, &l_tx_cond_hash);
-                l_price = (uint64_t) atoll ( l_price_str );
+                l_price = dap_chain_balance_scan(l_price_str);
                 l_price_unit.uint32 = (uint32_t) atol ( l_price_unit_str );
                 strncpy(l_price_token, l_price_token_str, DAP_CHAIN_TICKER_SIZE_MAX - 1);
                 size_t l_ext_len = l_ext? strlen(l_ext) + 1 : 0;
@@ -536,11 +538,16 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
         }
 #ifdef DAP_MODULES_DYNAMIC
         else if( dap_strcmp( l_order_str, "recheck" ) == 0 ){
-            //int dap_chain_net_srv_vpn_cdb_server_list_check_orders(dap_chain_net_t *a_net);
             int (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(dap_chain_net_t *a_net);
             dap_chain_net_srv_vpn_cdb_server_list_check_orders = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_check_orders");
             int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders ? dap_chain_net_srv_vpn_cdb_server_list_check_orders(l_net) : -5;
-            ret = (l_init_res > 0) ? 0 : -10;
+            if (l_init_res >= 0) {
+                dap_string_append_printf(l_string_ret, "Orders recheck started\n");
+                ret = 0;
+            } else {
+                dap_string_append_printf(l_string_ret, "Orders recheck not started, code %d\n", l_init_res);
+                ret = -10;
+            }
 
         }else if( dap_strcmp( l_order_str, "static" ) == 0 ){
             // find the subcommand directly after the 'order' command
@@ -584,7 +591,10 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
             }
         }
 #endif
-        else {
+        else if (l_order_str) {
+            dap_string_append_printf(l_string_ret, "Unrecognized subcommand '%s'", l_order_str);
+            ret = -14;
+        } else {
             dap_string_append_printf(l_string_ret, "Command 'net_srv' requires subcommand 'order'");
             ret = -3;
         }
@@ -836,7 +846,7 @@ dap_chain_datum_tx_receipt_t * dap_chain_net_srv_issue_receipt(dap_chain_net_srv
                 )
 {
     dap_chain_datum_tx_receipt_t * l_receipt = dap_chain_datum_tx_receipt_create(
-                    a_srv->uid, a_price->units_uid, a_price->units, a_price->value_datoshi, a_ext, a_ext_size);
+                    a_srv->uid, a_price->units_uid, a_price->units, dap_chain_uint256_from(a_price->value_datoshi), a_ext, a_ext_size);
     size_t l_receipt_size = l_receipt->size; // nested receipt plus 8 bits for type
 
     // Sign with our wallet
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index 56cdef9d0ebdbfaf3be0e9342f8573e6e9dfae25..361a275c2eca7c8912d63c76e93a16bdc8630582 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -83,11 +83,13 @@ size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order)
     if (!a_order)
         return 0;
     size_t l_sign_size = 0;
+    size_t l_header_size = sizeof(dap_chain_net_srv_order_old_t);
     if (a_order->version > 1) {
-        dap_sign_t *l_sign = (dap_sign_t *)&a_order->ext[a_order->ext_size];
+        dap_sign_t *l_sign = (dap_sign_t *)&a_order->ext_n_sign[a_order->ext_size];
         l_sign_size = dap_sign_get_size(l_sign);
+        l_header_size = sizeof(dap_chain_net_srv_order_t);
     }
-    return sizeof(dap_chain_net_srv_order_t) + a_order->ext_size + l_sign_size;
+    return l_header_size + a_order->ext_size + l_sign_size;
 }
 
 /**
@@ -110,15 +112,15 @@ bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_
         l_ext_size += strlen(l_region_prev) + 1;
 
     l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_ext_size);
-    l_order->ext[0] =0x52;
+    l_order->ext_n_sign[0] =0x52;
     if(a_continent_num > 0)
-        memcpy(l_order->ext + 1, &a_continent_num, sizeof(uint8_t));
+        memcpy(l_order->ext_n_sign + 1, &a_continent_num, sizeof(uint8_t));
     else
-        memcpy(l_order->ext + 1, &l_continent_num_prev, sizeof(uint8_t));
+        memcpy(l_order->ext_n_sign + 1, &l_continent_num_prev, sizeof(uint8_t));
     if(a_region)
-        memcpy(l_order->ext + 1 + sizeof(uint8_t), a_region, strlen(a_region) + 1);
+        memcpy(l_order->ext_n_sign + 1 + sizeof(uint8_t), a_region, strlen(a_region) + 1);
     else if(l_region_prev)
-        memcpy(l_order->ext + 1 + sizeof(uint8_t), l_region_prev, strlen(l_region_prev) + 1);
+        memcpy(l_order->ext_n_sign + 1 + sizeof(uint8_t), l_region_prev, strlen(l_region_prev) + 1);
     //dap_sprintf(l_order->ext, "\52%d-%s", a_continent_num, a_region);
     l_order->ext_size = l_ext_size;
     *a_order = l_order;
@@ -133,11 +135,11 @@ bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_
  */
 bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order_static, uint8_t *a_continent_num, char **a_region)
 {
-    if(!a_order_static || !a_order_static->ext_size || a_order_static->ext[0]!=0x52)
+    if(!a_order_static || !a_order_static->ext_size || a_order_static->ext_n_sign[0]!=0x52)
         return false;
     if(a_continent_num) {
-       if((uint8_t)a_order_static->ext[1]!=0xff)
-           memcpy(a_continent_num, a_order_static->ext + 1, sizeof(uint8_t));
+       if((uint8_t)a_order_static->ext_n_sign[1]!=0xff)
+           memcpy(a_continent_num, a_order_static->ext_n_sign + 1, sizeof(uint8_t));
         else
            a_continent_num = 0;
     }
@@ -145,7 +147,7 @@ bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_o
         size_t l_size = a_order_static->ext_size - sizeof(uint8_t) - 1;
         if(l_size > 0) {
             *a_region = DAP_NEW_SIZE(char, l_size);
-            memcpy(*a_region, a_order_static->ext + 1 + sizeof(uint8_t), l_size);
+            memcpy(*a_region, a_order_static->ext_n_sign + 1 + sizeof(uint8_t), l_size);
         }
         else
             *a_region = NULL;
@@ -224,7 +226,7 @@ char * dap_chain_net_srv_order_create(
         dap_chain_net_srv_uid_t a_srv_uid, // Service UID
         dap_chain_node_addr_t a_node_addr, // Node address that servs the order (if present)
         dap_chain_hash_fast_t a_tx_cond_hash, // Hash index of conditioned transaction attached with order
-        uint64_t a_price, //  service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT  for one unit.
+        uint256_t a_price, //  service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT  for one unit.
         dap_chain_net_srv_price_unit_uid_t a_price_unit, // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
         const char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
         dap_chain_time_t a_expires, // TS when the service expires
@@ -240,7 +242,7 @@ char * dap_chain_net_srv_order_create(
         dap_chain_net_srv_order_t *l_order;
         if (a_ext_size) {
             l_order = (dap_chain_net_srv_order_t *)DAP_NEW_Z_SIZE(void, sizeof(dap_chain_net_srv_order_t) + a_ext_size);
-            memcpy(l_order->ext, a_ext, a_ext_size);
+            memcpy(l_order->ext_n_sign, a_ext, a_ext_size);
             l_order->ext_size = a_ext_size;
         }
         else {
@@ -249,7 +251,7 @@ char * dap_chain_net_srv_order_create(
         }
 
         dap_chain_hash_fast_t l_order_hash;
-        l_order->version = a_key ? 2 : 1;
+        l_order->version = 2;
         l_order->srv_uid = a_srv_uid;
         l_order->direction = a_direction;
         l_order->ts_created = (dap_chain_time_t) time(NULL);
@@ -271,7 +273,7 @@ char * dap_chain_net_srv_order_create(
             }
             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[l_order->ext_size], l_sign, l_sign_size);
+            memcpy(&l_order->ext_n_sign[l_order->ext_size], l_sign, l_sign_size);
             DAP_DELETE(l_sign);
         }
         size_t l_order_size = dap_chain_net_srv_order_get_size(l_order);
@@ -353,7 +355,7 @@ dap_chain_net_srv_order_t * dap_chain_net_srv_order_find_by_hash_str(dap_chain_n
 int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_net_srv_order_direction_t a_direction,
                                         const dap_chain_net_srv_uid_t a_srv_uid,
                                         const dap_chain_net_srv_price_unit_uid_t a_price_unit,const char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-                                        const uint64_t a_price_min, const uint64_t a_price_max,
+                                        const uint256_t a_price_min, const uint256_t a_price_max,
                                         dap_chain_net_srv_order_t ** a_output_orders, size_t * a_output_orders_count)
 {
     if ( a_net && a_output_orders && a_output_orders_count ){
@@ -368,7 +370,7 @@ lb_order_pass:
         l_order_passed_index = 0;
         l_orders_size = 0;
         for (size_t i=0; i< l_orders_count; i++){
-            dap_chain_net_srv_order_t * l_order = (dap_chain_net_srv_order_t *) l_orders[i].value;
+            dap_chain_net_srv_order_t * l_order = (dap_chain_net_srv_order_t *)l_orders[i].value;
             if (l_order->version > 2 || l_order->direction > SERV_DIR_SELL ||
                     dap_chain_net_srv_order_get_size(l_order) != l_orders[i].value_len) {
                 continue; // order is corrupted
@@ -387,12 +389,10 @@ lb_order_pass:
                 if ( a_price_unit.uint32 != l_order->price_unit.uint32 )
                     continue;
             // Check price minimum
-            if ( a_price_min )
-                if ( l_order->price < a_price_min )
+            if (!IS_ZERO_256(a_price_min) && compare256(l_order->price, a_price_min) == -1)
                     continue;
             // Check price maximum
-            if ( a_price_max )
-                if ( l_order->price > a_price_max )
+            if (!IS_ZERO_256(a_price_max) && compare256(l_order->price, a_price_max) == 1)
                     continue;
             // Check ticker
             if ( a_price_ticker )
@@ -472,7 +472,7 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d
         }
 
         dap_string_append_printf(a_str_out, "  srv_uid:          0x%016"DAP_UINT64_FORMAT_X"\n", a_order->srv_uid.uint64 );
-        dap_string_append_printf(a_str_out, "  price:            %.7Lf (%"DAP_UINT64_FORMAT_U")\n", dap_chain_datoshi_to_coins(a_order->price) , a_order->price);
+        dap_string_append_printf(a_str_out, "  price:            %s (%s)\n", dap_chain_balance_to_coins(a_order->price), dap_chain_balance_print(a_order->price));
         if( a_order->price_unit.uint32 )
             dap_string_append_printf(a_str_out, "  price_unit:       %s\n", dap_chain_net_srv_price_unit_uid_to_str(a_order->price_unit) );
         if ( a_order->node_addr.uint64)
@@ -494,7 +494,7 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d
         //dap_chain_hash_fast_to_str(&a_order->tx_cond_hash,l_hash_str, sizeof(l_hash_str)-1);
         dap_string_append_printf(a_str_out, "  tx_cond_hash:     %s\n", l_hash_str );
         char *l_ext_out = a_order->ext_size ? DAP_NEW_Z_SIZE(char, a_order->ext_size * 2 + 1) : NULL;
-        dap_bin2hex(l_ext_out, a_order->ext, a_order->ext_size);
+        dap_bin2hex(l_ext_out, a_order->ext_n_sign, a_order->ext_size);
         if(l_ext_out)
             dap_string_append_printf(a_str_out, "  ext:              0x%s\n", l_ext_out);
         else
@@ -531,7 +531,7 @@ static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const
         if (l_order->version != 2) {
             dap_chain_global_db_gr_del(dap_strdup(a_key), a_group);
         } else {
-            dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext[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) {
                 dap_chain_global_db_gr_del(dap_strdup(a_key), a_group);
@@ -546,9 +546,8 @@ static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const
             }
             dap_chain_addr_t l_addr = {};
             dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, l_net->pub.id);
-            // uint128_t l_balance = dap_chain_ledger_calc_balance(l_net->pub.ledger, &l_addr, l_order->price_ticker);
-            uint256_t l_balance = dap_chain_ledger_calc_balance(l_net->pub.ledger, &l_addr, l_order->price_ticker);
-            uint64_t l_solvency = dap_chain_uint256_to(l_balance);
+            uint128_t l_balance = dap_chain_ledger_calc_balance(l_net->pub.ledger, &l_addr, l_order->price_ticker);
+            uint64_t l_solvency = dap_chain_uint128_to(l_balance);
             if (l_solvency < l_order->price && !dap_chain_net_srv_stake_key_delegated(&l_addr)) {
                 dap_chain_global_db_gr_del(dap_strdup(a_key), a_group);
             }*/
diff --git a/modules/net/srv/include/dap_chain_net_srv_common.h b/modules/net/srv/include/dap_chain_net_srv_common.h
index a6ab4bf0838149ef687ecf8428623b05e75f979a..9c56f4dc38f75c29522b61b74d8ac808c37f54a5 100755
--- a/modules/net/srv/include/dap_chain_net_srv_common.h
+++ b/modules/net/srv/include/dap_chain_net_srv_common.h
@@ -37,11 +37,12 @@
 
 
 //Service direction
-typedef enum dap_chain_net_srv_order_direction{
+enum dap_chain_net_srv_order_direction{
     SERV_DIR_BUY = 1,
     SERV_DIR_SELL = 2,
     SERV_DIR_UNDEFINED = 0
-} dap_chain_net_srv_order_direction_t;
+};
+typedef byte_t dap_chain_net_srv_order_direction_t;
 
 
 typedef struct dap_chain_net_srv_abstract
diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h
index 809305a7cfe03d28ee240ca2f710f6b12ec51e2e..5a4d496e0071aa9726dbb2eab5e41b00f13a52a5 100644
--- a/modules/net/srv/include/dap_chain_net_srv_order.h
+++ b/modules/net/srv/include/dap_chain_net_srv_order.h
@@ -29,12 +29,12 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_chain_common.h"
 #include "dap_chain_net_srv_common.h"
 
-typedef struct dap_chain_net_srv_order
+typedef struct dap_chain_net_srv_order_old
 {
     uint16_t version;
     dap_chain_net_srv_uid_t srv_uid; // Service UID
     byte_t padding; // some padding
-    dap_chain_net_srv_order_direction_t direction:8; // Order direction - SELL or PURCHASE
+    dap_chain_net_srv_order_direction_t direction; // Order direction - SELL or PURCHASE
     dap_chain_node_addr_t node_addr; // Node address that servs the order (if present)
     dap_chain_hash_fast_t tx_cond_hash; // Hash index of conditioned transaction attached with order
     dap_chain_net_srv_price_unit_uid_t price_unit; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
@@ -46,6 +46,24 @@ typedef struct dap_chain_net_srv_order
     //char region[32];
     uint32_t ext_size;
     uint8_t ext[];
+} DAP_ALIGN_PACKED dap_chain_net_srv_order_old_t;
+
+typedef struct dap_chain_net_srv_order
+{
+    uint16_t version;
+    dap_chain_net_srv_uid_t srv_uid; // Service UID
+    byte_t padding; // some padding
+    dap_chain_net_srv_order_direction_t direction; // Order direction - SELL or PURCHASE
+    dap_chain_node_addr_t node_addr; // Node address that servs the order (if present)
+    dap_chain_hash_fast_t tx_cond_hash; // Hash index of conditioned transaction attached with order
+    dap_chain_net_srv_price_unit_uid_t price_unit; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
+    dap_chain_time_t ts_created;
+    dap_chain_time_t ts_expires;
+    uint256_t price; //  service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT  for one unit.
+    char price_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; // Token ticker to pay for service
+    byte_t free_space[128];  // for future changes
+    uint32_t ext_size;
+    uint8_t ext_n_sign[];
 } DAP_ALIGN_PACKED dap_chain_net_srv_order_t;
 
 // Init/deinit should be call only if private
@@ -74,8 +92,8 @@ DAP_STATIC_INLINE dap_chain_net_srv_order_t * dap_chain_net_srv_order_find_by_ha
     return NULL;
 }
 
-int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_net_srv_order_direction_t a_direction, const dap_chain_net_srv_uid_t a_srv_uid,
-                                        const dap_chain_net_srv_price_unit_uid_t a_price_unit, const char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX],const uint64_t a_price_min, const uint64_t a_price_max,
+int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net, const dap_chain_net_srv_order_direction_t a_direction, const dap_chain_net_srv_uid_t a_srv_uid,
+                                        const dap_chain_net_srv_price_unit_uid_t a_price_unit, const char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX], const uint256_t a_price_min, const uint256_t a_price_max,
                                         dap_chain_net_srv_order_t ** a_output_orders, size_t * a_output_orders_count);
 int dap_chain_net_srv_order_delete_by_hash_str( dap_chain_net_t * a_net,const char * a_hash_str );
 
@@ -97,7 +115,7 @@ char *dap_chain_net_srv_order_create(dap_chain_net_t * a_net,
         dap_chain_net_srv_uid_t a_srv_uid, // Service UID
         dap_chain_node_addr_t a_node_addr, // Node address that servs the order (if present)
         dap_chain_hash_fast_t a_tx_cond_hash, // Hash index of conditioned transaction attached with order
-        uint64_t a_price, //  service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT  for one unit.
+        uint256_t a_price, //  service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT  for one unit.
         dap_chain_net_srv_price_unit_uid_t a_price_unit, // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
         const char a_price_ticker[],
         dap_chain_time_t a_expires, // TS when the service expires
diff --git a/modules/service/app-db/CMakeLists.txt b/modules/service/app-db/CMakeLists.txt
index 66ca6ade4273ae9e2e34d8d15795c869529401dc..b4126024c981d5b9f6626c906d6edac2744e9b5f 100644
--- a/modules/service/app-db/CMakeLists.txt
+++ b/modules/service/app-db/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_net_srv_app_db)
   
 file(GLOB DAP_CHAIN_NET_SRV_APP_DB_SRCS *.c)
diff --git a/modules/service/app/CMakeLists.txt b/modules/service/app/CMakeLists.txt
index 210374c2f42c6e5a616714fabdd788da5235e848..6b36635629648f54fd13a8fd30add481f16115ff 100644
--- a/modules/service/app/CMakeLists.txt
+++ b/modules/service/app/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_net_srv_app)
   
 file(GLOB DAP_CHAIN_NET_SRV_APP_SRCS  *.c)
diff --git a/modules/service/datum/CMakeLists.txt b/modules/service/datum/CMakeLists.txt
index 62ad4a0ba48cf1603be5e5a9d22959f881683498..6e00de0ce3e876786a73a34a57d6f97a93271783 100644
--- a/modules/service/datum/CMakeLists.txt
+++ b/modules/service/datum/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_net_srv_datum)
   
 file(GLOB DAP_CHAIN_NET_SRV_DATUM_SRCS *.c)
diff --git a/modules/service/mining-pool/CMakeLists.txt b/modules/service/mining-pool/CMakeLists.txt
index 7db0c520a52b763772d313a21ec2d1a0ff55540e..e11093c3358acf2c27226ea4630ac0baba9d4aaa 100644
--- a/modules/service/mining-pool/CMakeLists.txt
+++ b/modules/service/mining-pool/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_net_srv_datum_pool)
   
 file(GLOB DAP_CHAIN_NET_SRV_DATUM_POOL_SRCS *.c)
diff --git a/modules/service/stake/CMakeLists.txt b/modules/service/stake/CMakeLists.txt
index 99474583910ad884edbd0326202522816a11ced1..c5153d762654201ccba0c6a30a8c535c3e1e9151 100644
--- a/modules/service/stake/CMakeLists.txt
+++ b/modules/service/stake/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_net_srv_stake)
 
 file(GLOB DAP_SRV_STAKE_SRCS *.c)
diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c
index 89f9534e1988fc9fc4ef7b7df5f772270b76a6c7..856f9c9a82a2bd0dea9af91e83c5cb1935a9fb6f 100644
--- a/modules/service/stake/dap_chain_net_srv_stake.c
+++ b/modules/service/stake/dap_chain_net_srv_stake.c
@@ -282,7 +282,7 @@ bool dap_chain_net_srv_stake_validator(dap_chain_addr_t *a_addr, dap_chain_datum
     dap_sign_get_pkey_hash(l_sign, &l_pkey_hash);
     dap_chain_addr_t l_owner_addr = {};
     dap_chain_addr_fill(&l_owner_addr, l_sign->header.type, &l_pkey_hash, a_addr->net_id);
-    uint64_t l_outs_sum = 0, l_fee_sum = 0;
+    uint256_t l_outs_sum = {}, l_fee_sum = {};
     dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_ALL, NULL);
     uint32_t l_out_idx_tmp = 0; // current index of 'out' item
     for (dap_list_t *l_list_tmp = l_list_out_items; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_out_idx_tmp++) {
@@ -290,22 +290,31 @@ bool dap_chain_net_srv_stake_validator(dap_chain_addr_t *a_addr, dap_chain_datum
         if (l_type == TX_ITEM_TYPE_OUT) {
             dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data;
             if (!memcmp(&l_stake->addr_fee, &l_out->addr, sizeof(dap_chain_addr_t))) {
-                l_fee_sum += l_out->header.value;
+                SUM_256_256(l_fee_sum, dap_chain_uint256_from(l_out->header.value), &l_fee_sum);
             } else if (memcmp(&l_owner_addr, &l_out->addr, sizeof(dap_chain_addr_t))) {
-                l_outs_sum += l_out->header.value;
+                SUM_256_256(l_outs_sum, dap_chain_uint256_from(l_out->header.value), &l_outs_sum);
+            }
+        }
+        if (l_type == TX_ITEM_TYPE_OUT_256) {
+            dap_chain_256_tx_out_t *l_out = (dap_chain_256_tx_out_t *)l_list_tmp->data;
+            if (!memcmp(&l_stake->addr_fee, &l_out->addr, sizeof(dap_chain_addr_t))) {
+                SUM_256_256(l_fee_sum, l_out->header.value, &l_fee_sum);
+            } else if (memcmp(&l_owner_addr, &l_out->addr, sizeof(dap_chain_addr_t))) {
+                SUM_256_256(l_outs_sum, l_out->header.value, &l_outs_sum);
             }
         }
         if (l_type == TX_ITEM_TYPE_OUT_EXT) {
             dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data;
             if (!memcmp(&l_stake->addr_fee, &l_out_ext->addr, sizeof(dap_chain_addr_t))) {
-                l_fee_sum += l_out_ext->header.value;
+                SUM_256_256(l_fee_sum, l_out_ext->header.value, &l_fee_sum);
             } else if (memcmp(&l_owner_addr, &l_out_ext->addr, sizeof(dap_chain_addr_t))) {
-                l_outs_sum += l_out_ext->header.value;
+                SUM_256_256(l_outs_sum, l_out_ext->header.value, &l_outs_sum);
             }
         }
     }
     dap_list_free(l_list_out_items);
-    if (l_fee_sum < l_outs_sum * l_stake->fee_value / 100.0) {
+    uint256_t l_fee = MULT_256_FLOAT(l_outs_sum, l_stake->fee_value / 100.0);
+    if (compare256(l_fee_sum, l_fee) == -1) {
         return false;
     }
     return true;
@@ -328,7 +337,7 @@ static dap_chain_datum_tx_t *s_stake_tx_create(dap_chain_net_srv_stake_item_t *a
         return NULL;
     }
     dap_enc_key_t *l_owner_key = dap_chain_wallet_get_key(a_wallet, 0);
-    uint64_t l_value_sell = 0; // how many coins to transfer
+    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_stake->token, l_owner_addr, a_stake->value, &l_value_sell);
     if(!l_list_used_out) {
@@ -339,9 +348,9 @@ static dap_chain_datum_tx_t *s_stake_tx_create(dap_chain_net_srv_stake_item_t *a
     }
 
     // add 'in' items to sell
-    uint64_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
+    uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
     dap_list_free_full(l_list_used_out, free);
-    if (l_value_to_items != l_value_sell) {
+    if (!EQUAL_256(l_value_to_items,l_value_sell)) {
         dap_chain_datum_tx_delete(l_tx);
         DAP_DELETE(l_owner_addr);
         log_it(L_ERROR, "Can't compose the transaction input");
@@ -363,8 +372,9 @@ static dap_chain_datum_tx_t *s_stake_tx_create(dap_chain_net_srv_stake_item_t *a
         dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *)l_tx_out);
         DAP_DELETE(l_tx_out);
         // coin back
-        uint64_t l_value_back = l_value_sell - a_stake->value;
-        if (l_value_back) {
+        uint256_t l_value_back = {};
+        SUBTRACT_256_256(l_value_sell, a_stake->value, &l_value_back);
+        if (!IS_ZERO_256(l_value_back)) {
             if (dap_chain_datum_tx_add_out_item(&l_tx, l_owner_addr, l_value_back) != 1) {
                 dap_chain_datum_tx_delete(l_tx);
                 DAP_DELETE(l_owner_addr);
@@ -431,7 +441,7 @@ static dap_chain_datum_tx_t *s_stake_tx_approve(dap_chain_net_srv_stake_item_t *
         log_it(L_WARNING, "Requested conditional transaction is already used out");
         return NULL;
     }
-    assert(l_tx_out_cond->header.value == a_stake->value);
+    assert(EQUAL_256(l_tx_out_cond->header.value, a_stake->value));
     dap_chain_datum_tx_add_in_cond_item(&l_tx, &a_stake->tx_hash, l_prev_cond_idx, 0);
 
     // add 'out_cond' item
@@ -537,9 +547,9 @@ dap_chain_net_srv_stake_item_t *s_stake_item_from_order(dap_chain_net_t *a_net,
         log_it(L_WARNING, "Order is unsigned");
         return NULL;
     }
-    dap_srv_stake_order_ext_t *l_ext = (dap_srv_stake_order_ext_t *)a_order->ext;
-    dap_sign_t *l_sign = (dap_sign_t *)(&a_order->ext[a_order->ext_size]);
-    if (!dap_sign_verify(l_sign, a_order, dap_chain_net_srv_order_get_size(a_order))) {
+    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]);
+    if (dap_sign_verify(l_sign, a_order, dap_chain_net_srv_order_get_size(a_order)) != 1) {
         log_it(L_WARNING, "Order sign is invalid");
         return NULL;
     }
@@ -609,9 +619,9 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'order create' required parameter -coins");
                 return -7;
             }
-            uint64_t l_value = strtoull(l_coins_str, NULL, 10); // TODO add possibility to work with 256-bit format
-            if (!l_value) {
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
+            uint256_t l_value = dap_chain_balance_scan(l_coins_str);
+            if (IS_ZERO_256(l_value)) {
+                dap_chain_node_cli_set_reply_text(a_str_reply, "Format -coins <256 bit integer>");
                 return -8;
             }
             dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-addr_hldr", &l_addr_hldr_str);
@@ -695,9 +705,9 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'order declare' required parameter -coins");
                 return -7;
             }
-            uint64_t l_value = strtoull(l_coins_str, NULL, 10); // TODO add possibility to work with 256-bit format
-            if (!l_value) {
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
+            uint256_t l_value = dap_chain_balance_scan(l_coins_str);
+            if (IS_ZERO_256(l_value)) {
+                dap_chain_node_cli_set_reply_text(a_str_reply, "Format -coins <256 bit integer>");
                 return -8;
             }
             dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-wallet", &l_wallet_str);
@@ -720,8 +730,8 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Format -fee_percent <long double>(%)");
                 return -12;
             }
-            uint64_t l_balance = dap_chain_uint256_to(dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_token_str));
-            if (l_balance < l_value) {
+            uint256_t l_balance = dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_token_str);
+            if (compare256(l_balance, l_value) == -1) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Insufficient coins for token %s in wallet '%s'", l_token_str, l_wallet_str);
                 return -13;
             }
@@ -839,8 +849,8 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
             }
             dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-coins", &l_coins_str);
             if (l_coins_str) {
-                uint64_t l_value = strtoull(l_coins_str, NULL, 10); // TODO add possibility to work with 256-bit format
-                if (!l_value) {
+                uint256_t l_value = dap_chain_balance_scan(l_coins_str);
+                if (IS_ZERO_256(l_value)) {
                     dap_chain_node_cli_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
                     DAP_DELETE(l_stake);
                     return -8;
@@ -893,8 +903,8 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
                     dap_chain_node_cli_set_reply_text(a_str_reply, "Specified wallet not found");
                     return -18;
                 }
-                uint64_t l_balance = dap_chain_uint256_to(dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_stake->token));
-                if (l_balance < l_stake->value) {
+                uint256_t l_balance = dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_stake->token);
+                if (compare256(l_balance, l_stake->value) == -1) {
                     dap_chain_node_cli_set_reply_text(a_str_reply, "Insufficient coins for token %s in wallet '%s'", l_token_str, l_wallet_str);
                     return -11;
                 }
@@ -952,8 +962,8 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
                 // TODO add filters to list (token, address, etc.)
                 l_stake = s_stake_item_from_order(l_net, l_order);
                 char *l_addr = dap_chain_addr_to_str(&l_stake->signing_addr);
-                dap_string_append_printf(l_reply_str, "%s %"DAP_UINT64_FORMAT_U" %s %s %Lf\n", l_orders[i].key, l_stake->value, l_stake->token,
-                                         l_addr, l_stake->fee_value);
+                dap_string_append_printf(l_reply_str, "%s %s %s %s %Lf\n", l_orders[i].key, dap_chain_balance_print(l_stake->value),
+                                                                           l_stake->token, l_addr, l_stake->fee_value);
                 DAP_DELETE(l_addr);
                 DAP_DELETE(l_stake);
             }
@@ -1155,9 +1165,9 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply)
                 char *l_addr_hldr_str = dap_chain_addr_to_str(&l_stake->addr_hldr);
                 char *l_signing_addr_str = dap_chain_addr_to_str(&l_stake->signing_addr);
                 char *l_addr_fee_str = dap_chain_addr_to_str(&l_stake->addr_fee);
-                dap_string_append_printf(l_reply_str, "%s %s %"DAP_UINT64_FORMAT_U" %s %s %s %Lf\n", l_tx_hash_str, l_stake->token,
-                                         l_stake->value, l_addr_hldr_str, l_signing_addr_str,
-                                         l_addr_fee_str, l_stake->fee_value);
+                dap_string_append_printf(l_reply_str, "%s %s %s %s %s %s %Lf\n", l_tx_hash_str, l_stake->token,
+                                                                                 dap_chain_balance_print(l_stake->value), l_addr_hldr_str,
+                                                                                 l_signing_addr_str, l_addr_fee_str, l_stake->fee_value);
                 DAP_DELETE(l_tx_hash_str);
                 DAP_DELETE(l_addr_hldr_str);
                 DAP_DELETE(l_signing_addr_str);
diff --git a/modules/service/stake/include/dap_chain_net_srv_stake.h b/modules/service/stake/include/dap_chain_net_srv_stake.h
index c539cee32af31515178a85a6355857e404ee3e55..a29606126b3f099cb0aa47cbe5a8bd945791765c 100644
--- a/modules/service/stake/include/dap_chain_net_srv_stake.h
+++ b/modules/service/stake/include/dap_chain_net_srv_stake.h
@@ -33,7 +33,7 @@ typedef struct dap_chain_net_srv_stake_item {
     bool is_active;
     dap_chain_net_t *net;
     char token[DAP_CHAIN_TICKER_SIZE_MAX];
-    uint64_t value;
+    uint256_t value;
     dap_chain_addr_t addr_hldr;
     dap_chain_addr_t addr_fee;
     dap_chain_addr_t signing_addr;
diff --git a/modules/service/vpn/CMakeLists.txt b/modules/service/vpn/CMakeLists.txt
index 30e2258599f8a27aaac447963f2206034dbe6b67..973d4f0de12a4991ab6db17daf20989ce80582a5 100644
--- a/modules/service/vpn/CMakeLists.txt
+++ b/modules/service/vpn/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_net_srv_vpn)
   
 file(GLOB DAP_CHAIN_NET_SRV_VPN_SRCS *.c)
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index 5c280e7e697c21e01d0aff944d401f2d0228166e..85226074bb64d509a0447aebe0c71c3cdf05c21a 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -58,7 +58,7 @@
 #include <time.h>
 #include <errno.h>
 #include <signal.h>
-
+#include <stddef.h>
 
 #include "uthash.h"
 #include "utlist.h"
@@ -120,7 +120,7 @@ typedef struct tun_socket_msg{
     } type;
     dap_chain_net_srv_ch_vpn_t * ch_vpn;
     dap_events_socket_t * esocket;
-    uint128_t esocket_uuid;
+    dap_events_socket_uuid_t esocket_uuid;
     bool is_reassigned_once;
     union{
         struct{ // Esocket reassigment
@@ -192,6 +192,7 @@ static void s_es_tun_new(dap_events_socket_t * a_es, void * arg);
 static void s_es_tun_delete(dap_events_socket_t * a_es, void * arg);
 static void s_es_tun_read(dap_events_socket_t * a_es, void * arg);
 static void s_es_tun_error(dap_events_socket_t * a_es,int arg);
+static void s_es_tun_write(dap_events_socket_t *a_es, void *arg);
 
 static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void * a_msg );
 static void s_tun_send_msg_ip_assigned(uint32_t a_worker_id, dap_chain_net_srv_ch_vpn_t * a_ch_vpn, struct in_addr a_addr);
@@ -204,9 +205,11 @@ static int s_tun_attach_queue(int fd);
 
 
 static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * a_ch_vpn_info, const void * a_data, size_t a_data_size);
-static size_t s_stream_session_esocket_send(dap_chain_net_srv_stream_session_t * l_srv_session, dap_events_socket_t * l_es, const void * a_data, size_t a_data_size );
 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);
 
+static void s_tun_fifo_write(dap_chain_net_srv_vpn_tun_socket_t *a_tun, ch_vpn_pkt_t *a_pkt);
+static ch_vpn_pkt_t *s_tun_fifo_read(dap_chain_net_srv_vpn_tun_socket_t *a_tun);
+
 
 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)
 {
@@ -471,7 +474,7 @@ static void s_tun_send_msg_ip_unassigned_all(dap_chain_net_srv_ch_vpn_t * a_ch_v
  */
 static void s_tun_send_msg_esocket_reasigned_inter(dap_chain_net_srv_vpn_tun_socket_t * a_tun_socket,
                                                    dap_chain_net_srv_ch_vpn_t * a_ch_vpn, dap_events_socket_t * a_esocket,
-                                                   uint128_t a_esocket_uuid,    struct in_addr a_addr, uint32_t a_esocket_worker_id)
+                                                   dap_events_socket_uuid_t a_esocket_uuid, struct in_addr a_addr, uint32_t a_esocket_worker_id)
 {
     struct tun_socket_msg * l_msg = DAP_NEW_Z(struct tun_socket_msg);
     l_msg->type = TUN_SOCKET_MSG_ESOCKET_REASSIGNED ;
@@ -497,7 +500,7 @@ static void s_tun_send_msg_esocket_reasigned_inter(dap_chain_net_srv_vpn_tun_soc
  * @param a_worker_id
  */
 static void s_tun_send_msg_esocket_reasigned_all_inter(dap_chain_net_srv_ch_vpn_t * a_ch_vpn, dap_events_socket_t * a_esocket,
-                                                       uint128_t a_esocket_uuid, struct in_addr a_addr, uint32_t a_worker_id)
+                                                       dap_events_socket_uuid_t a_esocket_uuid, struct in_addr a_addr, uint32_t a_worker_id)
 {
     for( uint32_t i=0; i< s_tun_sockets_count; i++)
         s_tun_send_msg_esocket_reasigned_inter(s_tun_sockets[i] , a_ch_vpn, a_esocket, a_esocket_uuid, a_addr, a_worker_id);
@@ -519,10 +522,12 @@ static dap_events_socket_t * s_tun_event_stream_create(dap_worker_t * a_worker,
     l_s_callbacks.read_callback = s_es_tun_read;
     l_s_callbacks.error_callback = s_es_tun_error;
     l_s_callbacks.delete_callback = s_es_tun_delete;
+    l_s_callbacks.write_callback = s_es_tun_write;
 
     dap_events_socket_t * l_es = dap_events_socket_wrap_no_add(a_worker->events ,
                                           a_tun_fd, &l_s_callbacks);
     l_es->type = DESCRIPTOR_TYPE_FILE;
+    l_es->no_close = true;
     dap_events_socket_assign_on_worker_mt(l_es, a_worker);
 
     return l_es;
@@ -1454,23 +1459,46 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
             // for client only
             case VPN_PACKET_OP_CODE_VPN_RECV:{
                 a_ch->stream->esocket->last_ping_request = time(NULL); // not ping, but better  ;-)
-                //ch_sf_tun_client_send(CH_VPN(a_ch), l_vpn_pkt->data, l_vpn_pkt->header.op_data.data_size);
                 dap_events_socket_t *l_es = dap_chain_net_vpn_client_tun_get_esock();
                 // Find tun socket for current worker
                 dap_chain_net_srv_vpn_tun_socket_t *l_tun =  l_es ? l_es->_inheritor : NULL;
                 //ch_sf_tun_socket_t * l_tun = s_tun_sockets[a_ch->stream_worker->worker->id];
                 assert(l_tun);
-                s_stream_session_esocket_send(l_srv_session, l_tun->es, l_vpn_pkt->data, l_vpn_pkt->header.op_data.data_size);
+                size_t l_ret = dap_events_socket_write_unsafe(l_tun->es, l_vpn_pkt->data, l_vpn_pkt->header.op_data.data_size);
+                if (l_ret == l_vpn_pkt->header.op_data.data_size) {
+                    l_srv_session->stats.packets_sent++;
+                    l_srv_session->stats.bytes_sent += l_ret;
+                } else if (l_ret > 0) {
+                    log_it (L_WARNING, "Lost %zd bytes, buffer overflow", l_vpn_pkt->header.op_data.data_size - l_ret);
+                    l_srv_session->stats.bytes_sent_lost += (l_vpn_pkt->header.op_data.data_size - l_ret);
+                    l_srv_session->stats.packets_sent_lost++;
+                }
             } break;
 
             // for server only
             case VPN_PACKET_OP_CODE_VPN_SEND: {
                 dap_chain_net_srv_vpn_tun_socket_t * l_tun = s_tun_sockets[a_ch->stream_worker->worker->id];
                 assert(l_tun);
-                // Unsafely send it
-                size_t l_ret = s_stream_session_esocket_send(l_srv_session, l_tun->es, l_vpn_pkt->data, l_vpn_pkt->header.op_data.data_size);
-                if( l_ret)
-                    s_update_limits (a_ch, l_srv_session, l_usage,l_ret );
+                size_t l_size_to_send = l_vpn_pkt->header.op_data.data_size;
+                ssize_t l_ret = write(l_tun->es->fd, l_vpn_pkt->data, l_size_to_send);
+                if (l_ret > 0) {
+                    s_update_limits(a_ch, l_srv_session, l_usage, l_ret);
+                    if (l_ret == l_size_to_send) {
+                        l_srv_session->stats.packets_sent++;
+                        l_srv_session->stats.bytes_sent += l_ret;
+                    } else {
+                        log_it (L_WARNING, "Lost %zd bytes", l_size_to_send - l_ret);
+                        l_srv_session->stats.bytes_sent_lost += (l_size_to_send - l_ret);
+                        l_srv_session->stats.packets_sent_lost++;
+                    }
+                } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
+                    s_tun_fifo_write(l_tun, l_vpn_pkt);
+                    dap_events_socket_set_writable_unsafe(l_tun->es, true);
+                } else {
+                    char l_errbuf[128];
+                    strerror_r(errno, l_errbuf, sizeof (l_errbuf));
+                    log_it(L_WARNING,"Error with data sent: \"%s\" code %d", l_errbuf, errno);
+                }
             } break;
             default:
                 log_it(L_WARNING, "Can't process SF type 0x%02x", l_vpn_pkt->header.op_code);
@@ -1478,59 +1506,6 @@ void s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
     }
 }
 
-/**
- * @brief s_stream_session_esocket_send
- * @param l_srv_session
- * @param l_es
- * @param a_data
- * @param a_data_size
- */
-static size_t s_stream_session_esocket_send(dap_chain_net_srv_stream_session_t * l_srv_session, dap_events_socket_t * l_es, const void * a_data, size_t a_data_size )
-{
-    // Lets first try to send it directly with write() call
-    ssize_t l_direct_wrote;
-    size_t l_ret = 0;
-    if (l_es->type == DESCRIPTOR_TYPE_FILE )
-        l_direct_wrote =  write(l_es->fd, a_data, a_data_size);
-    else
-        l_direct_wrote =  send(l_es->fd, a_data, a_data_size, MSG_DONTWAIT | MSG_NOSIGNAL);
-    int l_errno = errno;
-
-    size_t l_data_left_to_send=0;
-    if (l_direct_wrote > 0){
-        l_ret += l_direct_wrote;
-        if((size_t) l_direct_wrote < a_data_size){ // If we sent not all - lets put tail in buffer
-           l_data_left_to_send = a_data_size-l_direct_wrote;
-        }else{
-            l_srv_session->stats.packets_sent++;
-            l_srv_session->stats.bytes_sent+= l_direct_wrote;
-        }
-    }else{
-        l_data_left_to_send = a_data_size;
-        l_direct_wrote=0;
-        if(l_errno != EAGAIN && l_errno != EWOULDBLOCK){
-            char l_errbuf[128];
-            strerror_r(l_errno, l_errbuf, sizeof (l_errbuf));
-            log_it(L_WARNING,"Error with data sent: \"%s\" code %d",l_errbuf, l_errno);
-        }
-    }
-
-    if(l_data_left_to_send){
-        //if ( dap_events_socket_write_unsafe( l_es, a_data +l_direct_wrote,l_data_left_to_send
-        //                                     ) < l_data_left_to_send ){
-            //log_it(L_WARNING,"Loosing data, probably buffers are overfilling, lost %zd bytes", l_data_left_to_send);
-            log_it(L_WARNING,"Loosing data, lost %zd bytes", l_data_left_to_send);
-            l_srv_session->stats.bytes_sent_lost += l_data_left_to_send;
-            l_srv_session->stats.packets_sent_lost++;
-        /*}else{
-            l_ret += l_data_left_to_send;
-            l_srv_session->stats.packets_sent++;
-            l_srv_session->stats.bytes_sent+= l_direct_wrote;
-        }*/
-    }
-    return l_ret;
-}
-
 /**
  * @brief stream_sf_packet_out Packet Out Ch callback
  * @param ch
@@ -1572,6 +1547,25 @@ static void s_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
 
 }
 
+static void s_tun_fifo_write(dap_chain_net_srv_vpn_tun_socket_t *a_tun, ch_vpn_pkt_t *a_pkt)
+{
+    if (!a_tun || !a_pkt)
+        return;
+    a_tun->fifo = dap_list_append(a_tun->fifo, DAP_DUP_SIZE(a_pkt,
+                                                            a_pkt->header.op_data.data_size + sizeof(a_pkt->header)));
+}
+
+static ch_vpn_pkt_t *s_tun_fifo_read(dap_chain_net_srv_vpn_tun_socket_t *a_tun)
+{
+    if (!a_tun || !a_tun->fifo)
+        return NULL;
+    ch_vpn_pkt_t *l_ret = (ch_vpn_pkt_t *)a_tun->fifo->data;
+    dap_list_t *l_to_delete = a_tun->fifo;
+    a_tun->fifo = a_tun->fifo->next;
+    DAP_DELETE(l_to_delete);
+    return l_ret;
+}
+
 /**
  * @brief m_es_tun_delete
  * @param a_es
@@ -1580,9 +1574,34 @@ static void s_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
 static void s_es_tun_delete(dap_events_socket_t * a_es, void * arg)
 {
     (void) arg;
-    s_tun_sockets[a_es->worker->id] = NULL;
-    dap_events_socket_remove_and_delete_unsafe(s_tun_sockets_queue_msg[a_es->worker->id],false);
-    log_it(L_NOTICE,"Destroyed TUN event socket");
+    if (a_es->worker) {
+        s_tun_sockets[a_es->worker->id] = NULL;
+        dap_events_socket_remove_and_delete_unsafe(s_tun_sockets_queue_msg[a_es->worker->id],false);
+        log_it(L_NOTICE,"Destroyed TUN event socket");
+    }
+}
+
+/**
+ * @brief s_es_tun_write
+ * @param a_es
+ * @param arg
+ */
+static void s_es_tun_write(dap_events_socket_t *a_es, void *arg)
+{
+    (void) arg;
+    dap_chain_net_srv_vpn_tun_socket_t *l_tun = CH_SF_TUN_SOCKET(a_es);
+    assert(l_tun);
+    ch_vpn_pkt_t *l_vpn_pkt = (ch_vpn_pkt_t *)l_tun->fifo->data;
+    if (!l_vpn_pkt)
+        return;
+    a_es->buf_out_zero_count = 0;
+    size_t l_size_to_send = l_vpn_pkt->header.op_data.data_size;
+    ssize_t l_ret = write(l_tun->es->fd, l_vpn_pkt->data, l_size_to_send);
+    if (l_ret < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+        return;
+    }
+    s_tun_fifo_read(l_tun);
+    DAP_DELETE(l_vpn_pkt);
 }
 
 /**
diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c
index 8383b3203c0535bf3af4f7d90b6e755a08f8b88e..5b14c54079f4daebb088547b7e63aa5f63a5c707 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client.c
@@ -240,8 +240,9 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne
         dap_chain_addr_t *l_addr_from = dap_chain_wallet_get_addr(l_wallet_from, a_net->pub.id);
         dap_chain_net_srv_price_unit_uid_t l_price_unit = { .enm = SERV_UNIT_SEC };
         dap_chain_net_srv_uid_t l_srv_uid = { .uint64 = DAP_CHAIN_NET_SRV_VPN_ID };
+        uint256_t l_value = dap_chain_uint256_from(a_value_datoshi);
         l_tx_cond_hash = dap_chain_proc_tx_create_cond(a_net, l_key_from, l_client_key, l_addr_from,
-                a_token_ticker, a_value_datoshi, 0, l_price_unit, l_srv_uid, 0, l_pub_key_data, l_pub_key_data_size);
+                a_token_ticker, l_value, uint256_0, l_price_unit, l_srv_uid, uint256_0, l_pub_key_data, l_pub_key_data_size);
         //char *l_addr_from_str = dap_chain_addr_to_str(l_addr_from);
         DAP_DELETE(l_addr_from);
         if(!l_tx_cond_hash) {
@@ -356,7 +357,8 @@ char *dap_chain_net_vpn_client_check_result(dap_chain_net_t *a_net, const char*
     dap_chain_net_srv_order_t * l_orders = NULL;
     size_t l_orders_num = 0;
     dap_chain_net_srv_uid_t l_srv_uid = { { 0 } };
-    uint64_t l_price_min = 0, l_price_max = 0;
+    uint256_t l_price_min = {};
+    uint256_t l_price_max = {};
     dap_chain_net_srv_price_unit_uid_t l_price_unit = { { 0 } };
     dap_chain_net_srv_order_direction_t l_direction = SERV_DIR_UNDEFINED;
     dap_string_t *l_string_ret = dap_string_new("");
diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn.h b/modules/service/vpn/include/dap_chain_net_srv_vpn.h
index 810330bb7b254f9dde8bb34a31a4b9db14fd1382..a576bc5ca2b1d35298d2e17addf9f5d9c061352d 100644
--- a/modules/service/vpn/include/dap_chain_net_srv_vpn.h
+++ b/modules/service/vpn/include/dap_chain_net_srv_vpn.h
@@ -112,6 +112,7 @@ typedef struct dap_chain_net_srv_vpn_tun_socket {
     dap_events_socket_t * es;
     dap_chain_net_srv_ch_vpn_info_t * clients; // Remote clients identified by destination address
     dap_events_socket_t ** queue_tun_msg_input;
+    dap_list_t *fifo;
     //UT_hash_handle hh;
 }dap_chain_net_srv_vpn_tun_socket_t;
 
@@ -149,7 +150,7 @@ typedef struct dap_chain_net_srv_ch_vpn_info
     dap_events_socket_t * queue_msg; // Message queue
     dap_worker_t * worker;
     dap_events_socket_t * esocket;
-    uint64_t esocket_uuid;
+    dap_events_socket_uuid_t esocket_uuid;
     UT_hash_handle hh;
 }dap_chain_net_srv_ch_vpn_info_t;
 
diff --git a/modules/service/xchange/CMakeLists.txt b/modules/service/xchange/CMakeLists.txt
index c6b509051eb664c3ea4dba7b4939eda69681aca8..b3ee5a1c988275abd4e389a0f520f01640b2a54a 100644
--- a/modules/service/xchange/CMakeLists.txt
+++ b/modules/service/xchange/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_net_srv_xchange)
   
 file(GLOB DAP_SRV_XCHANGE_SRCS *.c)
diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c
index 45662257bd4190e85330d488f3b1963fa0b1f055..35173aa639a780b440d034d4ee4fe7bc5f4770bb 100644
--- a/modules/service/xchange/dap_chain_net_srv_xchange.c
+++ b/modules/service/xchange/dap_chain_net_srv_xchange.c
@@ -109,8 +109,7 @@ bool dap_chain_net_srv_xchange_verificator(dap_chain_tx_out_cond_t *a_cond, dap_
      * a_cond.srv_xchange.rate >= a_tx.out.rate
      */
     dap_list_t *l_list_out = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT_EXT, NULL);
-    long double l_seller_rate = (long double)a_cond->header.value / a_cond->subtype.srv_xchange.value;
-    uint64_t l_out_val = 0, l_back_val = 0;
+    uint256_t l_out_val = {}, l_back_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;
@@ -122,13 +121,18 @@ bool dap_chain_net_srv_xchange_verificator(dap_chain_tx_out_cond_t *a_cond, dap_
                 return false;   // too many tokens
             }
             l_ticker_ctrl = l_tx_out->token;
-            l_back_val += l_tx_out->header.value;
+            SUM_256_256(l_back_val, l_tx_out->header.value, &l_back_val);
         } else {                // buying token
-            l_out_val += l_tx_out->header.value;
+            SUM_256_256(l_out_val, l_tx_out->header.value, &l_out_val);
         }
     }
-    long double l_buyer_rate = (a_cond->header.value - l_back_val) / (long double)l_out_val;
-    if (l_seller_rate < l_buyer_rate) {
+    //long double l_buyer_rate = (a_cond->header.value - l_back_val) / (long double)l_out_val;
+    //long double l_seller_rate = (long double)a_cond->header.value / a_cond->subtype.srv_xchange.value;
+    uint256_t l_buyer_val = {}, l_buyer_mul = {}, l_seller_mul = {};
+    SUBTRACT_256_256(a_cond->header.value, l_back_val, &l_buyer_val);
+    MULT_256_256(l_buyer_val, a_cond->subtype.srv_xchange.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) {
         return false;           // wrong changing rate
     }
     return true;
@@ -136,11 +140,11 @@ bool dap_chain_net_srv_xchange_verificator(dap_chain_tx_out_cond_t *a_cond, dap_
 
 static dap_chain_datum_tx_receipt_t *s_xchage_receipt_create(dap_chain_net_srv_xchange_price_t *a_price)
 {
-    uint32_t l_ext_size = sizeof(uint64_t) + DAP_CHAIN_TICKER_SIZE_MAX;
+    uint32_t l_ext_size = sizeof(uint256_t) + DAP_CHAIN_TICKER_SIZE_MAX;
     uint8_t *l_ext = DAP_NEW_SIZE(uint8_t, l_ext_size);
-    uint64_t l_datoshi_buy = (long double)a_price->datoshi_sell / a_price->rate;
-    dap_lendian_put64(l_ext, l_datoshi_buy);
-    strcpy((char *)&l_ext[sizeof(uint64_t)], a_price->token_buy);
+    uint256_t l_datoshi_buy = MULT_256_FLOAT(a_price->datoshi_sell, 1 / a_price->rate);
+    memcpy(l_ext, &l_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};
     dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_XCHANGE_ID };
     dap_chain_datum_tx_receipt_t *l_receipt =  dap_chain_datum_tx_receipt_create(l_uid, l_unit, 0, a_price->datoshi_sell,
@@ -160,7 +164,7 @@ static dap_chain_datum_tx_t *s_xchange_tx_create_request(dap_chain_net_srv_xchan
     dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(a_price->net_sell->pub.name);
     dap_chain_addr_t *l_seller_addr = (dap_chain_addr_t *)dap_chain_wallet_get_addr(a_wallet, a_price->net_sell->pub.id);
     dap_enc_key_t *l_seller_key = dap_chain_wallet_get_key(a_wallet, 0);
-    uint64_t l_value_sell = 0; // how many coins to transfer
+    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);
@@ -172,9 +176,9 @@ static dap_chain_datum_tx_t *s_xchange_tx_create_request(dap_chain_net_srv_xchan
     }
 
     // add 'in' items to sell
-    uint64_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
+    uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
     dap_list_free_full(l_list_used_out, free);
-    if (l_value_to_items != l_value_sell) {
+    if (compare256(l_value_to_items, l_value_sell) != 0) {
         dap_chain_datum_tx_delete(l_tx);
         DAP_DELETE(l_seller_addr);
         log_it(L_ERROR, "Can't compose the transaction input");
@@ -196,8 +200,9 @@ static dap_chain_datum_tx_t *s_xchange_tx_create_request(dap_chain_net_srv_xchan
         dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *)l_tx_out);
         DAP_DELETE(l_tx_out);
         // coin back
-        uint64_t l_value_back = l_value_sell - a_price->datoshi_sell;
-        if (l_value_back) {
+        uint256_t l_value_back = {};
+        SUBTRACT_256_256(l_value_sell, a_price->datoshi_sell, &l_value_back);
+        if (!IS_ZERO_256(l_value_back)) {
             if (dap_chain_datum_tx_add_out_item(&l_tx, l_seller_addr, l_value_back) != 1) {
                 dap_chain_datum_tx_delete(l_tx);
                 DAP_DELETE(l_seller_addr);
@@ -230,9 +235,9 @@ static dap_chain_datum_tx_t *s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
     dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(a_price->net_buy->pub.name);
     dap_chain_addr_t *l_seller_addr = (dap_chain_addr_t *)dap_chain_wallet_get_addr(a_wallet, a_price->net_buy->pub.id);
     dap_enc_key_t *l_seller_key = dap_chain_wallet_get_key(a_wallet, 0);
-    uint64_t l_value_buy = 0; // how many coins to transfer
+    uint256_t l_value_buy = {}; // how many coins to transfer
     // list of transaction with 'out' items to sell
-    uint64_t l_datoshi_buy = ceill(a_price->datoshi_sell / a_price->rate);
+    uint256_t l_datoshi_buy = MULT_256_FLOAT(a_price->datoshi_sell, 1 / a_price->rate);
     dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_price->token_buy,
                                                                              l_seller_addr, l_datoshi_buy, &l_value_buy);
     if(!l_list_used_out) {
@@ -246,9 +251,9 @@ static dap_chain_datum_tx_t *s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
     dap_chain_datum_tx_add_item(&l_tx, (byte_t *)l_receipt);
     DAP_DELETE(l_receipt);
     // add 'in' items to sell
-    uint64_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
+    uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out);
     dap_list_free_full(l_list_used_out, free);
-    if (l_value_to_items != l_value_buy) {
+    if (compare256(l_value_to_items, l_value_buy) != 0) {
         dap_chain_datum_tx_delete(l_tx);
         DAP_DELETE(l_seller_addr);
         log_it(L_ERROR, "Can't compose the transaction input");
@@ -278,8 +283,9 @@ static dap_chain_datum_tx_t *s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
             return NULL;
         }
         // coin back
-        uint64_t l_value_back = l_value_buy - l_datoshi_buy;
-        if (l_value_back) {
+        uint256_t l_value_back = {};
+        SUBTRACT_256_256(l_value_buy, l_datoshi_buy, &l_value_back);
+        if (!IS_ZERO_256(l_value_back)) {
             if (dap_chain_datum_tx_add_out_ext_item(&l_tx, l_seller_addr, l_value_back, a_price->token_buy) == -1) {
                 dap_chain_datum_tx_delete(l_tx);
                 DAP_DELETE(l_seller_addr);
@@ -296,9 +302,8 @@ static dap_chain_datum_tx_t *s_xchange_tx_create_exchange(dap_chain_net_srv_xcha
         }
         DAP_DELETE(l_seller_addr);
         //transfer unbuying coins (partial exchange)
-        uint64_t l_buying_value = l_tx_out_cond->header.value;
-        l_value_back = l_buying_value - a_price->datoshi_sell;
-        if (l_value_back) {
+        SUBTRACT_256_256(l_tx_out_cond->header.value, a_price->datoshi_sell, &l_value_back);
+        if (!IS_ZERO_256(l_value_back)) {
             if (dap_chain_datum_tx_add_out_ext_item(&l_tx, l_buyer_addr, l_value_back, a_price->token_sell) == -1) {
                 log_it(L_WARNING, "Can't add buying coins back output (cashback)");
                 return NULL;
@@ -397,14 +402,14 @@ char *s_xchange_order_create(dap_chain_net_srv_xchange_price_t *a_price, dap_cha
     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;
-    dap_lendian_put64((uint8_t *)&l_ext.net_sell_id, a_price->net_sell->pub.id.uint64);
-    dap_lendian_put64((uint8_t *)&l_ext.datoshi_sell, a_price->datoshi_sell);
+    l_ext.net_sell_id = a_price->net_sell->pub.id.uint64;
+    l_ext.datoshi_sell = a_price->datoshi_sell;
     strcpy(l_ext.token_sell, a_price->token_sell);
     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_sell);
     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 };
-    uint64_t l_datoshi_buy = ceill(a_price->datoshi_sell / a_price->rate);
+    uint256_t l_datoshi_buy = MULT_256_FLOAT(a_price->datoshi_sell, 1 / a_price->rate);
     char *l_order_hash_str = dap_chain_net_srv_order_create(a_price->net_buy, SERV_DIR_SELL, 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, NULL);
@@ -414,14 +419,14 @@ char *s_xchange_order_create(dap_chain_net_srv_xchange_price_t *a_price, dap_cha
 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;
+    dap_srv_xchange_order_ext_t *l_ext = (dap_srv_xchange_order_ext_t *)a_order->ext_n_sign;
     dap_chain_net_id_t l_net_buy_id = { .uint64 = dap_lendian_get64((uint8_t *)&l_ext->net_sell_id) };
     l_price->net_sell = dap_chain_net_by_id(l_net_buy_id);
-    l_price->datoshi_sell = dap_lendian_get64((uint8_t *)&l_ext->datoshi_sell);
+    l_price->datoshi_sell = l_ext->datoshi_sell;
     strcpy(l_price->token_sell, l_ext->token_sell);
     l_price->net_buy = a_net;
     strcpy(l_price->token_buy, a_order->price_ticker);
-    l_price->rate = (long double)l_price->datoshi_sell / a_order->price;
+    l_price->rate = 1; // TODO (long double)l_price->datoshi_sell / a_order->price;
     return l_price;
 }
 
@@ -547,8 +552,8 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'price create' required parameter -coins");
                 return -8;
             }
-            uint64_t l_datoshi_sell = strtoull(l_val_sell_str, NULL, 10);
-            if (!l_datoshi_sell) {
+            uint256_t l_datoshi_sell = dap_chain_balance_scan(l_val_sell_str);
+            if (IS_ZERO_256(l_datoshi_sell)) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
                 return -9;
             }
@@ -572,9 +577,8 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Specified wallet not found");
                 return -11;
             }
-            uint256_t l_balance = dap_chain_wallet_get_balance(l_wallet, l_net_sell->pub.id, l_token_sell_str);
-            uint64_t l_value = dap_chain_uint256_to(l_balance);
-            if (l_value < l_datoshi_sell) {
+            uint256_t l_value = dap_chain_wallet_get_balance(l_wallet, l_net_sell->pub.id, l_token_sell_str);
+            if (compare256(l_value, l_datoshi_sell) == -1) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Not enough cash in specified wallet");
                 dap_chain_wallet_close(l_wallet);
                 return -12;
@@ -666,13 +670,13 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c
                 *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;
-                uint64_t l_datoshi_sell = 0;
+                uint256_t l_datoshi_sell = {};
                 long double l_rate = 0;
                 dap_chain_wallet_t *l_wallet = NULL;
                 dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-coins", &l_val_sell_str);
                 if (l_val_sell_str) {
-                    l_datoshi_sell = strtoull(l_val_sell_str, NULL, 10);
-                    if (!l_datoshi_sell) {
+                    l_datoshi_sell = dap_chain_balance_scan(l_val_sell_str);
+                    if (IS_ZERO_256(l_datoshi_sell)) {
                         dap_chain_node_cli_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
                         return -9;
                     }
@@ -696,9 +700,8 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c
                     dap_chain_node_cli_set_reply_text(a_str_reply, "At least one of updating parameters is mandatory");
                     return -13;
                 }
-                uint256_t l_balance = dap_chain_wallet_get_balance(l_wallet, l_net_sell->pub.id, l_token_sell_str);
-                uint64_t l_value = dap_chain_uint256_to(l_balance);
-                if (l_datoshi_sell && l_value < l_datoshi_sell) {
+                uint256_t l_value = dap_chain_wallet_get_balance(l_wallet, l_net_sell->pub.id, l_token_sell_str);
+                if (!IS_ZERO_256(l_datoshi_sell) && compare256(l_value, l_datoshi_sell) == -1) {
                         dap_chain_node_cli_set_reply_text(a_str_reply, "Not enough cash in specified wallet");
                         dap_chain_wallet_close(l_wallet);
                         return -12;
@@ -768,9 +771,9 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c
             dap_string_t *l_reply_str = dap_string_new("");
             HASH_ITER(hh, s_srv_xchange->pricelist, l_price, l_tmp) {
                 char *l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_price->order_hash);
-                dap_string_append_printf(l_reply_str, "%s %s %s %s %s %"DAP_UINT64_FORMAT_U" %Lf %s\n", l_order_hash_str, l_price->token_sell,
+                dap_string_append_printf(l_reply_str, "%s %s %s %s %s %s %Lf %s\n", l_order_hash_str, l_price->token_sell,
                                          l_price->net_sell->pub.name, l_price->token_buy, l_price->net_buy->pub.name,
-                                         l_price->datoshi_sell, l_price->rate, l_price->wallet_str);
+                                         dap_chain_balance_print(l_price->datoshi_sell), l_price->rate, l_price->wallet_str);
                 DAP_DELETE(l_order_hash_str);
             }
             if (!l_reply_str->len) {
@@ -835,9 +838,9 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply)
                     continue;
                 // TODO add filters to list (tokens, network, etc.)
                 l_price = s_xchange_price_from_order(l_net, l_order);
-                dap_string_append_printf(l_reply_str, "%s %s %s %s %s %"DAP_UINT64_FORMAT_U" %Lf\n", l_orders[i].key, l_price->token_sell,
+                dap_string_append_printf(l_reply_str, "%s %s %s %s %s %s %Lf\n", l_orders[i].key, l_price->token_sell,
                                          l_price->net_sell->pub.name, l_price->token_buy, l_price->net_buy->pub.name,
-                                         l_price->datoshi_sell, l_price->rate);
+                                         dap_chain_balance_print(l_price->datoshi_sell), l_price->rate);
                 DAP_DELETE(l_price);
             }
             dap_chain_global_db_objs_delete(l_orders, l_orders_count);
@@ -880,8 +883,8 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply)
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'purchase' required parameter -coins");
                 return -8;
             }
-            uint64_t l_datoshi_sell = strtoull(l_val_sell_str, NULL, 10);
-            if (!l_datoshi_sell) {
+            uint256_t l_datoshi_sell = dap_chain_balance_scan(l_val_sell_str);
+            if (IS_ZERO_256(l_datoshi_sell)) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "Format -coins <unsigned long long>");
                 return -9;
             }
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 0e098f7c67445ac7dfcca10a0ef964fc24feb3e8..f7ffaafed5d505832743cf338ae6f91f9151b0b5 100644
--- a/modules/service/xchange/include/dap_chain_net_srv_xchange.h
+++ b/modules/service/xchange/include/dap_chain_net_srv_xchange.h
@@ -34,7 +34,7 @@ typedef struct dap_chain_net_srv_xchange_price {
     char *wallet_str;
     dap_chain_net_t *net_sell;
     char token_sell[DAP_CHAIN_TICKER_SIZE_MAX];
-    uint64_t datoshi_sell;
+    uint256_t datoshi_sell;
     dap_chain_net_t *net_buy;
     char token_buy[DAP_CHAIN_TICKER_SIZE_MAX];
     long double rate;
@@ -50,7 +50,7 @@ typedef struct dap_chain_net_srv_xchange_db_item {
     uint8_t padding[4];
     uint64_t net_sell_id;
     uint64_t net_buy_id;
-    uint64_t datoshi_sell;
+    uint256_t datoshi_sell;
     long double rate;
     dap_chain_hash_fast_t tx_hash;
     dap_chain_hash_fast_t order_hash;
@@ -59,7 +59,7 @@ typedef struct dap_chain_net_srv_xchange_db_item {
 
 typedef struct dap_srv_xchange_order_ext {
     uint64_t net_sell_id;
-    uint64_t datoshi_sell;
+    uint256_t datoshi_sell;
     char token_sell[DAP_CHAIN_TICKER_SIZE_MAX];
 } dap_srv_xchange_order_ext_t;
 
diff --git a/modules/test/CMakeLists.txt b/modules/test/CMakeLists.txt
index b48617d0f087fa6a5e14e6113595548353fe63cb..0f12e79311ce376b646fefa2097a757b110f9d6e 100644
--- a/modules/test/CMakeLists.txt
+++ b/modules/test/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 if(TARGET dap_test)
     return() # The project has already been built.
 endif()
diff --git a/modules/type/blocks/CMakeLists.txt b/modules/type/blocks/CMakeLists.txt
index 0c377cec8c870d5b1959ac79eadfad106d78e0a6..cc15e054ac95f21b59e3c0d371823d43f222f65d 100644
--- a/modules/type/blocks/CMakeLists.txt
+++ b/modules/type/blocks/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_cs_blocks)
   
 file(GLOB DAP_CHAIN_BLOCK_SRCS *.c)
diff --git a/modules/type/blocks/dap_chain_block.c b/modules/type/blocks/dap_chain_block.c
index 4bc564e15eb26fe7d0e5691dfaf8902ae829b98a..cd45d3bf89248d2d0d6564934a813a668b4dfcd9 100644
--- a/modules/type/blocks/dap_chain_block.c
+++ b/modules/type/blocks/dap_chain_block.c
@@ -22,10 +22,10 @@
 */
 #include <stddef.h>
 #include "string.h"
+#include "dap_chain_net.h"
 #include "dap_common.h"
 #include "dap_config.h"
 #include "dap_hash.h"
-#include "dap_chain_net.h"
 #include "dap_chain_block.h"
 #include "dap_chain_block_cache.h"
 
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index 192b6211fb370cc1a792388ab7737ae8903068ed..61ba34df74265bd78efa982cd3d8c3758d134346 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -105,7 +105,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t * a_chain,
 //    Get block header size
 static size_t s_callback_atom_get_static_hdr_size(void);
 
-static dap_chain_atom_iter_t* s_callback_atom_iter_create(dap_chain_t * a_chain , dap_chain_cell_id_t a_cell_id);
+static dap_chain_atom_iter_t *s_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id);
 static dap_chain_atom_iter_t* s_callback_atom_iter_create_from(dap_chain_t *  ,
                                                                      dap_chain_atom_ptr_t , size_t);
 
@@ -456,13 +456,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply)
             size_t l_block_size = 0;
             dap_chain_hash_fast_t l_block_hash={0};
             dap_enc_base58_hex_to_hash( l_subcmd_str_arg, &l_block_hash); // Convert argument to hash
-            dap_chain_cell_t *l_cell = l_chain->cells;
-            do {
-                l_block = (dap_chain_block_t *)dap_chain_get_atom_by_hash(l_chain, &l_block_hash, &l_block_size, l_cell->id);
-                if (l_block)
-                    break;
-                l_cell = l_cell->hh.next;
-            } while (l_cell);
+            l_block = (dap_chain_block_t*) dap_chain_get_atom_by_hash( l_chain, &l_block_hash, &l_block_size);
             if ( l_block){
                 dap_chain_block_cache_t *l_block_cache = dap_chain_block_cs_cache_get_by_hash(l_blocks, &l_block_hash);
                 if ( l_block_cache ){
@@ -527,7 +521,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply)
                         ctime_r(&l_datum_ts_create, buf);
                         dap_string_append_printf(l_str_tmp,"\t\t\t\tts_create=%s\n", buf);
                         dap_string_append_printf(l_str_tmp,"\t\t\t\tdata_size=%u\n", l_datum->header.data_size);
-                        dap_chain_net_dump_datum(l_str_tmp, l_datum, "hex" );
+                        dap_chain_net_dump_datum(l_str_tmp, l_datum, "hex");
                     }
                     // Signatures
                     dap_string_append_printf(l_str_tmp,"\t\tsignatures:\tcount: %zu\n",l_block_cache->sign_count );
@@ -624,17 +618,12 @@ static int  s_add_atom_to_ledger(dap_chain_cs_blocks_t * a_blocks, dap_ledger_t
     for(size_t i=0; i<a_block_cache->datum_count; i++){
         dap_chain_datum_t *l_datum = a_block_cache->datum[i];
         switch (l_datum->header.type_id) {
-            case DAP_CHAIN_DATUM_256_TOKEN_DECL:
             case DAP_CHAIN_DATUM_TOKEN_DECL: {
                 dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
-                l_ret=dap_chain_ledger_token_load(a_ledger, l_token, l_datum->header.data_size);
+                l_ret = dap_chain_ledger_token_load(a_ledger, l_token, l_datum->header.data_size);
             } break;
-            case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256
             case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
-                // dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data;
-                // l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ?
-                //                                true : false;
-                l_ret=dap_chain_ledger_token_emission_load(a_ledger, (dap_chain_datum_token_emission_t*) l_datum->data, l_datum->header.data_size);
+                l_ret = dap_chain_ledger_token_emission_load(a_ledger, l_datum->data, l_datum->header.data_size);
             } break;
             case DAP_CHAIN_DATUM_TX: {
                 dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
@@ -909,11 +898,11 @@ static size_t s_callback_atom_get_static_hdr_size(void)
  * @param a_chain
  * @return
  */
-static dap_chain_atom_iter_t* s_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id)
+static dap_chain_atom_iter_t *s_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id)
 {
     dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
     l_atom_iter->chain = a_chain;
-    l_atom_iter->cell_id.uint64 = a_cell_id.uint64;
+    l_atom_iter->cell_id = a_cell_id;
     l_atom_iter->_inheritor = DAP_NEW_Z(dap_chain_cs_blocks_iter_t);
     ITER_PVT(l_atom_iter)->blocks = DAP_CHAIN_CS_BLOCKS(a_chain);
 
@@ -1163,6 +1152,7 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_
     pthread_rwlock_wrlock(&l_blocks_pvt->datums_lock);
     if (!l_blocks->block_new) {
         l_blocks->block_new = dap_chain_block_new(&l_blocks_pvt->block_cache_last->block_hash, &l_blocks->block_new_size);
+        dap_chain_net_t *l_net = dap_chain_net_by_id(l_blocks->chain->net_id);
         l_blocks->block_new->hdr.cell_id.uint64 = a_chain->cells->id.uint64;
         l_blocks->block_new->hdr.chain_id.uint64 = l_blocks->chain->id.uint64;
     }
diff --git a/modules/type/dag/CMakeLists.txt b/modules/type/dag/CMakeLists.txt
index d4912385dcf81e7f0630642cecb0109f70bf244a..f77a32ffac6a681c92b26e62e90c7dd84a6c9a45 100644
--- a/modules/type/dag/CMakeLists.txt
+++ b/modules/type/dag/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_cs_dag)
   
 file(GLOB DAP_CHAIN_DAG_SRCS *.c)
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index e46648a74c18018bc198c1beeccfed11059353c6..6ca63a0cbd2448d3185ca5779091ac0185749ce3 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -203,6 +203,13 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 
     a_chain->callback_add_datums = s_chain_callback_datums_pool_proc;
 
+    // Datum operations callbacks
+/*
+    a_chain->callback_datum_iter_create = s_chain_callback_datum_iter_create; // Datum iterator create
+    a_chain->callback_datum_iter_delete = s_chain_callback_datum_iter_delete; // Datum iterator delete
+    a_chain->callback_datum_iter_get_first = s_chain_callback_datum_iter_get_first; // Get the fisrt datum from chain
+    a_chain->callback_datum_iter_get_next = s_chain_callback_datum_iter_get_next; // Get the next datum from chain from the current one
+*/
     // Others
     a_chain->_inheritor = l_dag;
 
@@ -291,21 +298,15 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger
     dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size);
     pthread_rwlock_t * l_events_rwlock = &PVT(a_dag)->events_rwlock;
     switch (l_datum->header.type_id) {
-        case DAP_CHAIN_DATUM_256_TOKEN_DECL:
         case DAP_CHAIN_DATUM_TOKEN_DECL: {
             dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
             return dap_chain_ledger_token_load(a_ledger, l_token, l_datum->header.data_size);
         }
         break;
-        case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256
         case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
-            // dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data;
-            // l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ?
-            //                                     true : false;
-            return dap_chain_ledger_token_emission_load(a_ledger, (dap_chain_datum_token_emission_t*) l_datum->data, l_datum->header.data_size);
+            return dap_chain_ledger_token_emission_load(a_ledger, l_datum->data, l_datum->header.data_size);
         }
         break;
-        case DAP_CHAIN_DATUM_256_TX: // 256
         case DAP_CHAIN_DATUM_TX: {
             dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
             // don't save bad transactions to base
@@ -493,6 +494,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_add_from_treshold(dap_chain_t
  */
 static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_count)
 {
+
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain);
     size_t l_datum_processed =0;
     size_t l_events_round_new_size = 0;
@@ -523,7 +525,10 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
         // Verify for correctness
         dap_chain_net_t * l_net = dap_chain_net_by_id( a_chain->net_id);
         int l_verify_datum= dap_chain_net_verify_datum_for_add( l_net, l_datum) ;
-        if (l_verify_datum != 0){
+        if (l_verify_datum != 0 &&
+                l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS &&
+                l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION &&
+                l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN){
             log_it(L_WARNING, "Datum doesn't pass verifications (code %d)",
                                      l_verify_datum);
             continue;
@@ -583,10 +588,9 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
         if (l_hashes_linked || s_seed_mode ) {
             dap_chain_cs_dag_event_t * l_event = NULL;
             size_t l_event_size = 0;
-            if(l_dag->callback_cs_event_create) {
+            if(l_dag->callback_cs_event_create)
                 l_event = l_dag->callback_cs_event_create(l_dag,l_datum,l_hashes,l_hashes_linked,&l_event_size);
-	    }
-            if ( l_event&&l_event_size){ // Event is created
+            if (l_event&&l_event_size) { // Event is created
                 if (l_dag->is_add_directy) {
                     l_cell = a_chain->cells;
                     if (s_chain_callback_atom_add(a_chain, l_event, l_event_size) == ATOM_ACCEPT) {
@@ -595,6 +599,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
                             log_it(L_ERROR, "Can't add new event to the file '%s'", l_cell->file_storage_path);
                             continue;
                         }
+
                         // add all atoms from treshold
                         {
                             dap_chain_atom_ptr_t l_atom_treshold;
@@ -604,7 +609,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
                                 l_atom_treshold = s_chain_callback_atom_add_from_treshold(a_chain, &l_atom_treshold_size);
                                 // add into file
                                 if(l_atom_treshold) {
-                                    int l_res = dap_chain_cell_file_append(a_chain->cells, l_atom_treshold, l_atom_treshold_size);
+                                    int l_res = dap_chain_cell_file_append(l_cell, l_atom_treshold, l_atom_treshold_size);
                                     if(l_res < 0) {
                                         log_it(L_ERROR, "Can't save event %p from treshold to the file '%s'",
                                                 l_atom_treshold, l_cell ? l_cell->file_storage_path : "[null]");
@@ -663,8 +668,9 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
         }
     }
     DAP_DELETE(l_hashes);
-    if (l_cell)
+    if (l_cell) {
         dap_chain_cell_close(l_cell);
+    }
     dap_chain_global_db_objs_delete(l_events_round_new, l_events_round_new_size);
     return  l_datum_processed;
 }
@@ -980,7 +986,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t
  * @param a_chain
  * @return
  */
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id)
+static dap_chain_atom_iter_t *s_chain_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id)
 {
     dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
     l_atom_iter->chain = a_chain;
@@ -992,6 +998,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_
     return l_atom_iter;
 }
 
+
 /**
  * @brief s_chain_callback_atom_get_datum Get the datum from event
  * @param a_atom_iter
@@ -1052,6 +1059,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
     return a_atom_iter->cur;
 }
 
+
 /**
  * @brief s_chain_callback_atom_iter_get_lasts
  * @param a_atom_iter
@@ -1200,6 +1208,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_
     return a_atom_iter->cur;
 }
 
+
 /**
  * @brief s_chain_callback_atom_iter_delete Delete dag event iterator
  * @param a_atom_iter
diff --git a/modules/wallet/CMakeLists.txt b/modules/wallet/CMakeLists.txt
index 4d61a3b9f8bb7201f8ac88c5cc54a4549f817732..4feeb32d5872d7fa6d33d657452044dd6cb4376a 100644
--- a/modules/wallet/CMakeLists.txt
+++ b/modules/wallet/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.10)
 project (dap_chain_wallet)
   
 file(GLOB DAP_CHAIN_WALLET_SRCS *.c)
diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c
index cd71a2ceff67e4d164b37a981f206167082efa5a..c8395ff5df541fba301e02648480d290b4af239a 100644
--- a/modules/wallet/dap_chain_wallet.c
+++ b/modules/wallet/dap_chain_wallet.c
@@ -427,12 +427,7 @@ uint256_t dap_chain_wallet_get_balance(dap_chain_wallet_t *a_wallet, dap_chain_n
 {
     dap_chain_net_t *l_net = dap_chain_net_by_id(a_net_id);
     dap_chain_addr_t *l_addr =dap_chain_wallet_get_addr(a_wallet, a_net_id);
-// #ifdef DAP_GLOBAL_IS_INT128
-//     uint128_t l_balance = 0;
-// #else
-//     uint128_t l_balance = {};
-// #endif
-    uint256_t l_balance = uint256_0;
+    uint256_t l_balance = {};
     if (l_net)
     {
         dap_ledger_t *l_ledger = l_net->pub.ledger;