diff --git a/.gitignore b/.gitignore
index e97c609120476289487b69ea8f5b1a53eeaab3bc..3420055ff2b5d17db4c10b82f92d09f7b3533026 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
 # Prerequisites
 build/*
+cmake-build-*/
 build_stretch/*
 test/build
 *.txt.user
@@ -67,4 +68,9 @@ Makefile
 cmake_install.cmake
 
 # Editor's temp files
-*~
\ No newline at end of file
+*~
+.idea/
+
+# OS files
+.DS_Store
+
diff --git a/3rdparty/cuttdb/CMakeLists.txt b/3rdparty/cuttdb/CMakeLists.txt
index 85118d55603a3f1ca1ff87cf1975ad36a793c625..8cf9f34ac98198a42100658743882ac0b31a3bba 100755
--- a/3rdparty/cuttdb/CMakeLists.txt
+++ b/3rdparty/cuttdb/CMakeLists.txt
@@ -29,7 +29,7 @@ add_library(${PROJECT_NAME} STATIC ${cuttdb_src} ${cuttdb_h})
 set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C)
 set_target_properties(${PROJECT_NAME} PROPERTIES COMPILER_LANGUAGE C)
 
-set_target_properties(dap_cuttdb PROPERTIES LINKER_LANGUAGE C)
+set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C)
 
 target_link_libraries(${PROJECT_NAME})
 
diff --git a/3rdparty/json-c-darwin/CMakeLists.txt b/3rdparty/json-c-darwin/CMakeLists.txt
index 087c1f19bbd2e2854807660f25f0f5be4633145b..455c70f283a430a482d5350b6a8e9e0fceddecdf 100644
--- a/3rdparty/json-c-darwin/CMakeLists.txt
+++ b/3rdparty/json-c-darwin/CMakeLists.txt
@@ -5,4 +5,4 @@ file(GLOB JSON_C_SRCS FILES *.c)
 file(GLOB JSON_C_HEADERS FILES *.h)
 
 add_library(${PROJECT_NAME} STATIC ${JSON_C_SRCS} ${JSON_C_HEADERS})
-target_include_directories(json-c PUBLIC . )
+target_include_directories(${PROJECT_NAME} PUBLIC . )
diff --git a/3rdparty/json-c/CMakeLists.txt b/3rdparty/json-c/CMakeLists.txt
index 087c1f19bbd2e2854807660f25f0f5be4633145b..455c70f283a430a482d5350b6a8e9e0fceddecdf 100644
--- a/3rdparty/json-c/CMakeLists.txt
+++ b/3rdparty/json-c/CMakeLists.txt
@@ -5,4 +5,4 @@ file(GLOB JSON_C_SRCS FILES *.c)
 file(GLOB JSON_C_HEADERS FILES *.h)
 
 add_library(${PROJECT_NAME} STATIC ${JSON_C_SRCS} ${JSON_C_HEADERS})
-target_include_directories(json-c PUBLIC . )
+target_include_directories(${PROJECT_NAME} PUBLIC . )
diff --git a/3rdparty/monero_crypto/CMakeLists.txt b/3rdparty/monero_crypto/CMakeLists.txt
index 34af01cb61fa4499f5fa863e4e87d835447432f7..8b18872212178b42ad5fa354d383e561caec5f15 100755
--- a/3rdparty/monero_crypto/CMakeLists.txt
+++ b/3rdparty/monero_crypto/CMakeLists.txt
@@ -384,7 +384,7 @@ endif()
 
 
 add_library(${PROJECT_NAME} STATIC ${monero_crypto_sources})
-target_include_directories(monero_crypto INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 
 
 set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 489778264cdd06011a861d071d0795a99d453722..efe32c7df4701740435185f10fabd5b06eb7bfab 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,6 +5,22 @@ set(CMAKE_C_STANDARD 11)
 set(CELLFRAME_SDK_NATIVE_VERSION "3.1-0")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 set(DAPSDK_MODULES "")
+
+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()
+
 message("Cellframe modules: ${CELLFRAME_MODULES}")
 
 if (CELLFRAME_MODULES MATCHES "modules-dynamic")
diff --git a/dap-sdk/CMakeLists.txt b/dap-sdk/CMakeLists.txt
index 9a6f3fa6394bd90cbc3d3d93c2aae300b843a209..f1b30e0ed0b169065f03f9b01d38c9ae34a4d3c9 100644
--- a/dap-sdk/CMakeLists.txt
+++ b/dap-sdk/CMakeLists.txt
@@ -1,4 +1,4 @@
-set(DAP_SDK_NATIVE_VERSION "2.2-2")
+set(DAP_SDK_NATIVE_VERSION "2.3-0")
 
 # We switch off SSL until its not switched on back
 if(DAPSDK_MODULES MATCHES "ssl-support")
diff --git a/dap-sdk/core/src/dap_strfuncs.c b/dap-sdk/core/src/dap_strfuncs.c
index c95ff68bb8aa653fa4004d0c1f9f86f1dd997a88..08b7058d71bfc1fd22c3656f41dc049d01b8e8e8 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
  */
 
-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/crypto/src/dap_cert.c b/dap-sdk/crypto/src/dap_cert.c
index 4b9d0e35a417f366e8e95f35f8b5a94a00eb0f40..f813c276d6c9b3d1b66f57a20bc04ca374bf1bd2 100755
--- a/dap-sdk/crypto/src/dap_cert.c
+++ b/dap-sdk/crypto/src/dap_cert.c
@@ -82,11 +82,13 @@ int dap_cert_init()
 }
 
 /**
- * @brief dap_cert_parse_str_list
- * @param a_certs_str
- * @param a_certs
- * @param a_certs_size_t
- * @return summary size for signatures of all certs in list
+ * @brief 
+ * parse list of certificate from config file (if it is presented)
+ * in current implementation this function is used when node certificate (node-addr.dcert) is not generated 
+ * @param a_certs_str const char * string with certificate name (node-addr)
+ * @param a_certs dap_cert_t *** array with certificates
+ * @param a_certs_size size of certificate
+ * @return size_t 
  */
 size_t dap_cert_parse_str_list(const char * a_certs_str, dap_cert_t *** a_certs, size_t * a_certs_size)
 {
@@ -134,10 +136,11 @@ size_t dap_cert_parse_str_list(const char * a_certs_str, dap_cert_t *** a_certs,
 
 
 /**
- * @brief dap_cert_sign_output_size
- * @param a_cert
- * @param a_size_wished
- * @return
+ * @brief 
+ * simply call dap_sign_create_output_unserialized_calc_size( a_cert->enc_key,a_size_wished)
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_size_wished wished data size (don't used in current implementation)
+ * @return size_t 
  */
 size_t dap_cert_sign_output_size(dap_cert_t * a_cert, size_t a_size_wished)
 {
@@ -160,12 +163,13 @@ size_t dap_cert_sign_output_size(dap_cert_t * a_cert, size_t a_size_wished)
 }*/
 
 /**
- * @brief dap_cert_sign
- * @param a_cert
- * @param a_data
- * @param a_data_size
- * @param a_output_size_wished
- * @return
+ * @brief 
+ * sign data by encryption key from certificate
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_data data for signing
+ * @param a_data_size data size
+ * @param a_output_size_wished wished data size (don't used in current implementation)
+ * @return dap_sign_t* 
  */
 dap_sign_t * dap_cert_sign(dap_cert_t * a_cert, const void * a_data
                                        , size_t a_data_size, size_t a_output_size_wished )
@@ -176,10 +180,11 @@ dap_sign_t * dap_cert_sign(dap_cert_t * a_cert, const void * a_data
 }
 
 /**
- * @brief dap_cert_add_cert_sign
- * @param a_cert
- * @param a_cert_signer
- * @return
+ * @brief 
+ * sign certificate with another certificate (a_cert->signs)
+ * @param a_cert dap_cert_t certificate object
+ * @param a_cert_signer dap_cert_t certificate object, which signs a_cert
+ * @return int 
  */
 int dap_cert_add_cert_sign(dap_cert_t * a_cert, dap_cert_t * a_cert_signer)
 {
@@ -196,10 +201,13 @@ int dap_cert_add_cert_sign(dap_cert_t * a_cert, dap_cert_t * a_cert_signer)
 
 
 /**
- * @brief dap_cert_generate_mem
- * @param a_cert_name
- * @param a_key_type
- * @return
+ * @brief generate certificate in memory with specified seed
+ * 
+ * @param a_cert_name const char * name of certificate
+ * @param a_key_type dap_enc_key_type_t key type
+ * @param a_seed const void* seed for certificate generation
+ * @param a_seed_size size_t size of seed
+ * @return dap_cert_t* 
  */
 dap_cert_t * dap_cert_generate_mem_with_seed(const char * a_cert_name, dap_enc_key_type_t a_key_type,
         const void* a_seed, size_t a_seed_size)
@@ -222,10 +230,11 @@ dap_cert_t * dap_cert_generate_mem_with_seed(const char * a_cert_name, dap_enc_k
 }
 
 /**
- * @brief dap_cert_generate_mem
- * @param a_cert_name
- * @param a_key_type
- * @return
+ * @brief generate certificate in memory
+ * 
+ * @param a_cert_name const char * certificate name
+ * @param a_key_type encryption key type
+ * @return dap_cert_t* 
  */
 dap_cert_t * dap_cert_generate_mem(const char * a_cert_name, dap_enc_key_type_t a_key_type)
 {
@@ -233,11 +242,12 @@ dap_cert_t * dap_cert_generate_mem(const char * a_cert_name, dap_enc_key_type_t
 }
 
 /**
- * @brief dap_cert_generate
- * @param a_cert_name
- * @param a_file_path
- * @param a_key_type
- * @return
+ * @brief generate certificate and save it to file
+ * 
+ * @param a_cert_name const char * certificate name
+ * @param a_file_path const char * path to certificate file
+ * @param a_key_type dap_enc_key_type_t key_type
+ * @return dap_cert_t* 
  */
 dap_cert_t * dap_cert_generate(const char * a_cert_name
                                            , const char * a_file_path,dap_enc_key_type_t a_key_type )
@@ -259,7 +269,8 @@ dap_cert_t * dap_cert_generate(const char * a_cert_name
 
 /**
  * @brief dap_cert_delete_by_name
- * @param a_cert_name
+ * delete certificate object, finding by name
+ * @param a_cert_name const char * certificate name
  */
 void dap_cert_delete_by_name(const char * a_cert_name)
 {
@@ -271,8 +282,9 @@ void dap_cert_delete_by_name(const char * a_cert_name)
 }
 
 /**
- * @brief dap_cert_find_by_name
- * @param a_cert_name
+ * @brief
+ * find certificate by name in path, which is configured ca_folders parameter in chain config 
+ * @param a_cert_name const char *
  * @return
  */
 dap_cert_t * dap_cert_find_by_name(const char * a_cert_name)
@@ -313,7 +325,8 @@ dap_list_t *dap_cert_get_all_mem()
 
 /**
  * @brief dap_cert_new
- * @param a_name
+ * create certificate object with specified name
+ * @param a_name const char *
  * @return
  */
 dap_cert_t * dap_cert_new(const char * a_name)
@@ -332,7 +345,8 @@ dap_cert_t * dap_cert_new(const char * a_name)
 
 /**
  * @brief s_cert_delete
- * @param a_cert
+ * delete certificate object
+ * @param a_cert dap_cert_t *
  */
 void dap_cert_delete(dap_cert_t * a_cert)
 {
@@ -354,9 +368,10 @@ void dap_cert_delete(dap_cert_t * a_cert)
 
 /**
  * @brief dap_cert_add_file
- * @param a_cert_name
- * @param a_folder_path
- * @return
+ * load certificate file from folder (specified in chain config)
+ * @param a_cert_name const char * certificate name
+ * @param a_folder_path const char * certificate path
+ * @return dap_cert_t
  */
 dap_cert_t * dap_cert_add_file(const char * a_cert_name,const char *a_folder_path)
 {
@@ -378,9 +393,11 @@ dap_cert_t * dap_cert_add_file(const char * a_cert_name,const char *a_folder_pat
 }
 
 /**
- * @brief dap_cert_save_to_folder
- * @param a_cert
- * @param a_file_dir_path
+ * @brief save certitificate to folder
+ * 
+ * @param a_cert dap_cert_t * certiticate object
+ * @param a_file_dir_path const char * path to directory with certificate
+ * @return int 
  */
 int dap_cert_save_to_folder(dap_cert_t * a_cert, const char *a_file_dir_path)
 {
@@ -396,8 +413,10 @@ int dap_cert_save_to_folder(dap_cert_t * a_cert, const char *a_file_dir_path)
 
 /**
  * @brief dap_cert_to_pkey
- * @param a_cert
- * @return
+ * get public key from certificate 
+ *  dap_pkey_from_enc_key( a_cert->enc_key )
+ * @param a_cert dap_cert_t certificate object
+ * @return dap_pkey_t
  */
 dap_pkey_t * dap_cert_to_pkey(dap_cert_t * a_cert)
 {
@@ -408,10 +427,11 @@ dap_pkey_t * dap_cert_to_pkey(dap_cert_t * a_cert)
 }
 
 /**
- * @brief dap_cert_compare_with_sign
- * @param a_cert
- * @param a_sign
- * @return
+ * @brief 
+ * compare certificate encryption key with key, which was used for event or block signing
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_sign dap_sign_t * dap_sign_t object (signed block or event)
+ * @return int 
  */
 int dap_cert_compare_with_sign (dap_cert_t * a_cert,const dap_sign_t * a_sign)
 {
@@ -434,8 +454,8 @@ int dap_cert_compare_with_sign (dap_cert_t * a_cert,const dap_sign_t * a_sign)
 
 
 /**
- * @brief dap_cert_count_cert_sign
- * @param a_cert
+ * @brief Certificates signatures chain size
+ * @param a_cert dap_cert_t certificate object
  * @return
  */
 size_t dap_cert_count_cert_sign(dap_cert_t * a_cert)
@@ -448,8 +468,8 @@ size_t dap_cert_count_cert_sign(dap_cert_t * a_cert)
 
 
 /**
- * @brief dap_cert_dump
- * @param a_cert
+ * @brief show certificate information
+ * @param a_cert dap_cert_t certificate object
  */
 void dap_cert_dump(dap_cert_t * a_cert)
 {
@@ -491,8 +511,10 @@ void dap_cert_dump(dap_cert_t * a_cert)
 }
 
 /**
- * @brief dap_cert_get_folder
- * @param a_folder_path
+ * @brief get certificate folder path
+ * usage example: dap_cert_get_folder(0) 
+ * @param a_n_folder_path 
+ * @return const char* 
  */
 const char* dap_cert_get_folder(int a_n_folder_path)
 {
@@ -511,8 +533,9 @@ const char* dap_cert_get_folder(int a_n_folder_path)
 
 
 /**
- * @brief dap_cert_add_folder
- * @param a_folder_path
+ * @brief load certificates from specified folder
+ * 
+ * @param a_folder_path const char *
  */
 void dap_cert_add_folder(const char *a_folder_path)
 {
@@ -551,6 +574,15 @@ void dap_cert_add_folder(const char *a_folder_path)
         log_it(L_WARNING, "Can't add folder %s to cert manager",a_folder_path);
 }
 
+/**
+ * @brief 
+ * 
+ * @param a_key const char *
+ * @param a_type dap_cert_metadata_type_t
+ * @param a_value void *
+ * @param a_value_size size_t
+ * @return dap_cert_metadata_t* 
+ */
 dap_cert_metadata_t *dap_cert_new_meta(const char *a_key, dap_cert_metadata_type_t a_type, void *a_value, size_t a_value_size)
 {
     if (!a_key || a_type > DAP_CERT_META_CUSTOM || (!a_value && a_value_size)) {
@@ -568,12 +600,13 @@ dap_cert_metadata_t *dap_cert_new_meta(const char *a_key, dap_cert_metadata_type
 }
 
 /**
- * @brief dap_cert_add_meta Add metadata to certificate
- * @param a_cert
- * @param a_key
- * @param a_type
- * @param a_value
- * @param a_value_size
+ * @brief Add metadata to certificate
+ * action for command "cellframe-node cert add_metadata <cert name> <key:type:length:value>"
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_key const char * key
+ * @param a_type dap_cert_metadata_type_t type
+ * @param a_value void * value
+ * @param a_value_size size_t length
  */
 void dap_cert_add_meta(dap_cert_t *a_cert, const char *a_key, dap_cert_metadata_type_t a_type, void *a_value, size_t a_value_size)
 {
@@ -588,6 +621,15 @@ void dap_cert_add_meta(dap_cert_t *a_cert, const char *a_key, dap_cert_metadata_
     }
 }
 
+/**
+ * @brief Add metadata to certificate with additional value modification
+ * 
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_key const char * key
+ * @param a_type dap_cert_metadata_type_t type
+ * @param a_value void * value
+ * @param a_value_size size_t length
+ */
 void dap_cert_add_meta_scalar(dap_cert_t *a_cert, const char *a_key, dap_cert_metadata_type_t a_type, uint64_t a_value, size_t a_value_size)
 {
     void *l_value;
@@ -627,15 +669,24 @@ void dap_cert_add_meta_scalar(dap_cert_t *a_cert, const char *a_key, dap_cert_me
 }
 
 /**
- * @brief dap_cert_get_meta
- * @param a_cert
- * @param a_field
+ * @brief get specified metadata from certificate
+ * 
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_field const char * field, which will be gotten from metadata
+ * @return dap_cert_metadata_t* 
  */
 dap_cert_metadata_t *dap_cert_get_meta(dap_cert_t *a_cert, const char *a_field)
 {
     return dap_binary_tree_search(a_cert->metadata, a_field);
 }
 
+/**
+ * @brief get specified metadata from certificate in string (DAP_CERT_META_STRING) format
+ * 
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_field const char * field, which will be gotten from metadata
+ * @return char* 
+ */
 char *dap_cert_get_meta_string(dap_cert_t *a_cert, const char *a_field)
 {
     dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field);
@@ -649,6 +700,14 @@ char *dap_cert_get_meta_string(dap_cert_t *a_cert, const char *a_field)
     return strndup((char *)&l_meta->value[0], l_meta->length);
 }
 
+/**
+ * @brief get metadata from certificate with boolean (DAP_CERT_META_BOOL) type
+ * 
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_field const char * field, which will be gotten from metadata
+ * @return true 
+ * @return false 
+ */
 bool dap_cert_get_meta_bool(dap_cert_t *a_cert, const char *a_field)
 {
     dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field);
@@ -665,6 +724,13 @@ bool dap_cert_get_meta_bool(dap_cert_t *a_cert, const char *a_field)
     return *(bool *)&l_meta->value[0];
 }
 
+/**
+ * @brief get metadata from certificate with int (DAP_CERT_META_INT) type
+ * 
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_field const char * field, which will be gotten from metadata
+ * @return int 
+ */
 int dap_cert_get_meta_int(dap_cert_t *a_cert, const char *a_field)
 {
     dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field);
@@ -681,6 +747,13 @@ int dap_cert_get_meta_int(dap_cert_t *a_cert, const char *a_field)
     return *(int *)&l_meta->value[0];
 }
 
+/**
+ * @brief get metadata from certificate with datetime (DAP_CERT_META_DATETIME) type
+ * 
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_field const char * field, which will be gotten from metadata
+ * @return time_t 
+ */
 time_t dap_cert_get_meta_time(dap_cert_t *a_cert, const char *a_field)
 {
     dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field);
@@ -697,6 +770,13 @@ time_t dap_cert_get_meta_time(dap_cert_t *a_cert, const char *a_field)
     return *(time_t *)&l_meta->value[0];
 }
 
+/**
+ * @brief get metadata from certificate with datetime (DAP_CERT_META_DATETIME_PERIOD) type
+ * 
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_field const char * field, which will be gotten from metadata
+ * @return time_t 
+ */
 time_t dap_cert_get_meta_period(dap_cert_t *a_cert, const char *a_field)
 {
     dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field);
@@ -713,6 +793,13 @@ time_t dap_cert_get_meta_period(dap_cert_t *a_cert, const char *a_field)
     return *(time_t *)&l_meta->value[0];
 }
 
+/**
+ * @brief get metadata from certificate with dap_sign_t (DAP_CERT_META_SIGN) type
+ * 
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_field const char * field, which will be gotten from metadata
+ * @return dap_sign_t* 
+ */
 dap_sign_t *dap_cert_get_meta_sign(dap_cert_t *a_cert, const char *a_field)
 {
     dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field);
@@ -730,6 +817,14 @@ dap_sign_t *dap_cert_get_meta_sign(dap_cert_t *a_cert, const char *a_field)
     return l_ret;
 }
 
+/**
+ * @brief get metadata from certificate with custom (DAP_CERT_META_CUSTOM) type
+ * 
+ * @param a_cert dap_cert_t * certificate object
+ * @param a_field const char * field, which will be gotten from metadata
+ * @param a_meta_size_out size_t size of recieved data
+ * @return void* 
+ */
 void *dap_cert_get_meta_custom(dap_cert_t *a_cert, const char *a_field, size_t *a_meta_size_out)
 {
     dap_cert_metadata_t *l_meta = dap_cert_get_meta(a_cert, a_field);
@@ -748,8 +843,9 @@ void *dap_cert_get_meta_custom(dap_cert_t *a_cert, const char *a_field, size_t *
 
 /**
  * @brief dap_cert_deinit
+ * empty function
  */
 void dap_cert_deinit()
 {
 
-}
+}
\ No newline at end of file
diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c
index dd1625e88f0215082e14f7330ec070a28b8e8b66..2582d4b1c3a29452a9c377a8c96ef986ae510074 100755
--- a/dap-sdk/crypto/src/dap_sign.c
+++ b/dap-sdk/crypto/src/dap_sign.c
@@ -38,7 +38,13 @@
 //static dap_sign_t * s_sign_null = NULL;
 static bliss_signature_t s_sign_bliss_null = {0};
 
-// calc signature size
+/**
+ * @brief get signature size (different for specific crypto algorithm)
+ * 
+ * @param a_key dap_enc_key_t * encryption key object
+ * @param a_output_wish_size size_t output size
+ * @return size_t 
+ */
 size_t dap_sign_create_output_unserialized_calc_size(dap_enc_key_t * a_key, size_t a_output_wish_size )
 {
     (void)a_output_wish_size;
@@ -60,8 +66,8 @@ size_t dap_sign_create_output_unserialized_calc_size(dap_enc_key_t * a_key, size
 
 
 /**
- * @brief dap_sign_type_from_key_type
- * @param a_key_type
+ * @brief get sign type (dap_sign_type_t) type from key type (dap_enc_key_type_t)
+ * @param a_key_type dap_enc_key_type_t key type
  * @return
  */
 dap_sign_type_t dap_sign_type_from_key_type( dap_enc_key_type_t a_key_type)
@@ -79,9 +85,9 @@ dap_sign_type_t dap_sign_type_from_key_type( dap_enc_key_type_t a_key_type)
 }
 
 /**
- * @brief dap_sign_type_to_key_type
- * @param a_chain_sign_type
- * @return
+ * @brief convert chain sign type (dap_sign_type_t) to encryption key type (dap_enc_key_type_t)
+ * @param a_chain_sign_type dap_enc_key_type_t signature type
+ * @return dap_enc_key_type_t
  */
 dap_enc_key_type_t  dap_sign_type_to_key_type(dap_sign_type_t  a_chain_sign_type)
 {
@@ -97,9 +103,10 @@ dap_enc_key_type_t  dap_sign_type_to_key_type(dap_sign_type_t  a_chain_sign_type
 
 
 /**
- * @brief dap_sign_type_to_str
- * @param a_chain_sign_type
- * @return
+ * @brief convert sign type (dap_sign_type_t) to string format
+ * [sig_bliss,sig_tesla,sig_picnic,sig_dil,sig_multi2,sig_multi]
+ * @param a_chain_sign_type sign type dap_sign_type_t
+ * @return const char* 
  */
 const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type)
 {
@@ -116,9 +123,10 @@ const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type)
 }
 
 /**
- * @brief dap_pkey_type_from_sign
- * @param a_pkey_type
- * @return
+ * @brief convert public key type (dap_pkey_type_t) to dap_sign_type_t type
+ * 
+ * @param a_pkey_type dap_pkey_type_t key type
+ * @return dap_sign_type_t 
  */
 dap_sign_type_t dap_pkey_type_from_sign( dap_pkey_type_t a_pkey_type)
 {
@@ -136,9 +144,10 @@ dap_sign_type_t dap_pkey_type_from_sign( dap_pkey_type_t a_pkey_type)
 
 
 /**
- * @brief dap_sign_type_from_str
- * @param a_type_str
- * @return
+ * @brief convert string to dap_sign_type_t type
+ * 
+ * @param a_type_str const char * algorithm type [sig_bliss,sig_tesla,sig_picnic,sig_dil,sig_multi2,sig_multi]
+ * @return dap_sign_type_t 
  */
 dap_sign_type_t dap_sign_type_from_str(const char * a_type_str)
 {
@@ -162,12 +171,14 @@ dap_sign_type_t dap_sign_type_from_str(const char * a_type_str)
 }
 
 /**
- * @brief dap_sign_create_output
- * @param a_key
- * @param a_data
- * @param a_data_size
- * @param a_output [in/out]
- * @return
+ * @brief encrypt data
+ * call a_key->enc_na or dap_enc_sig_bliss_get_sign
+ * @param a_key dap_enc_key_t key object
+ * @param a_data const void * data
+ * @param a_data_size const size_t size of data
+ * @param a_output void * output buffer
+ * @param a_output_size size_t size of output buffer
+ * @return int 
  */
 static int dap_sign_create_output(dap_enc_key_t *a_key, const void * a_data, const size_t a_data_size,
         void * a_output, size_t *a_output_size)
@@ -194,12 +205,13 @@ static int dap_sign_create_output(dap_enc_key_t *a_key, const void * a_data, con
 }
 
 /**
- * @brief dap_sign_create
- * @param a_key
- * @param a_data
- * @param a_data_size
- * @param a_output_wish_size
- * @return
+ * @brief sign data with specified key
+ * 
+ * @param a_key dap_enc_key_t key object
+ * @param a_data const void * buffer with data
+ * @param a_data_size const size_t buffer size
+ * @param a_output_wish_size size_t output buffer size
+ * @return dap_sign_t* 
  */
 dap_sign_t * dap_sign_create(dap_enc_key_t *a_key, const void * a_data,
         const size_t a_data_size, size_t a_output_wish_size)
@@ -243,14 +255,16 @@ dap_sign_t * dap_sign_create(dap_enc_key_t *a_key, const void * a_data,
     }
     return NULL;
 }
+
 /**
- * @brief dap_sign_pack
- * @param a_key
- * @param a_sign_ser
- * @param a_sign_ser_size
- * @param a_pkey
- * @param a_pub_key_size
- * @return dap_sign_t*
+ * @brief create signed object header (dap_sign_t) from variables
+ * 
+ * @param a_key dap_enc_key_t key object
+ * @param a_sign_ser signed data buffer
+ * @param a_sign_ser_size buffer size
+ * @param a_pkey public key
+ * @param a_pub_key_size pulic key size
+ * @return dap_sign_t* 
  */
 dap_sign_t * dap_sign_pack(dap_enc_key_t *a_key, const void * a_sign_ser, const size_t a_sign_ser_size, const void * a_pkey, const size_t a_pub_key_size)
 {
@@ -266,10 +280,11 @@ dap_sign_t * dap_sign_pack(dap_enc_key_t *a_key, const void * a_sign_ser, const
 }
 
 /**
- * @brief dap_sign_get_sign
- * @param a_sign
- * @param a_sign_out
- * @return
+ * @brief 
+ * get a_sign->pkey_n_sign + a_sign->header.sign_pkey_size
+ * @param a_sign dap_sign_t object (header + raw signature data)
+ * @param a_sign_out  a_sign->header.sign_size
+ * @return uint8_t* 
  */
 uint8_t* dap_sign_get_sign(dap_sign_t *a_sign, size_t *a_sign_out)
 {
@@ -281,10 +296,11 @@ uint8_t* dap_sign_get_sign(dap_sign_t *a_sign, size_t *a_sign_out)
 }
 
 /**
- * @brief dap_sign_get_pkey
- * @param a_sign
- * @param a_pub_key_out
- * @return
+ * @brief get a_sign->pkey_n_sign and a_sign->header.sign_pkey_size (optionally)
+ * 
+ * @param a_sign dap_sign_t sign object
+ * @param a_pub_key_out [option] output pointer to a_sign->header.sign_pkey_size
+ * @return uint8_t* 
  */
 uint8_t* dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out)
 {
@@ -296,10 +312,12 @@ uint8_t* dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out)
 }
 
 /**
- * @brief dap_sign_get_pkey_hash
- * @param a_sign
- * @param a_sign_hash
- * @return
+ * @brief get SHA3 hash of buffer (a_sign), storing in output buffer a_sign_hash
+ * 
+ * @param a_sign input buffer
+ * @param a_sign_hash output buffer
+ * @return true 
+ * @return false 
  */
 bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_hash)
 {
@@ -314,7 +332,14 @@ bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_h
     return dap_hash_fast( a_sign->pkey_n_sign,a_sign->header.sign_pkey_size,a_sign_hash );
 }
 
-
+/**
+ * @brief verify, if a_sign->header.sign_pkey_size and a_sign->header.sign_size bigger, then a_max_key_size
+ * 
+ * @param a_sign signed data object 
+ * @param a_max_key_size max size of key
+ * @return true 
+ * @return false 
+ */
 bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_key_size)
 {
     if (a_sign->header.sign_pkey_size > a_max_key_size)
@@ -325,9 +350,10 @@ bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_key_size)
 }
 
 /**
- * @brief dap_sign_to_enc_key
- * @param a_chain_sign
- * @return
+ * @brief get deserealized pub key from dap_sign_t 
+ * 
+ * @param a_chain_sign dap_sign_t object
+ * @return dap_enc_key_t* 
  */
 dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign)
 {
@@ -343,10 +369,10 @@ dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign)
 }
 
 /**
- * @brief dap_sign_verify
- * @param a_chain_sign
- * @param a_data
- * @param a_data_size
+ * @brief dap_sign_verify data signature
+ * @param a_chain_sign dap_sign_t a_chain_sign object
+ * @param a_data const void * buffer with data
+ * @param a_data_size const size_t  buffer size
  * @return 1 valid signature, 0 invalid signature, -1 unsupported sign type
  */
 int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t a_data_size)
@@ -403,8 +429,12 @@ int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t
     return l_ret;
 }
 
+
 /**
- * Get size of struct dap_sign_t
+ * @brief Get size of struct dap_sign_t
+ * 
+ * @param a_chain_sign dap_sign_t object
+ * @return size_t 
  */
 size_t dap_sign_get_size(dap_sign_t * a_chain_sign)
 {
diff --git a/dap-sdk/net/client/dap_client.c b/dap-sdk/net/client/dap_client.c
index d992fe2d8ec45b19c64b2f9581ff6a9cfdad7db0..d9d364beaf5d2bb1c498295604df628dcb1548f2 100644
--- a/dap-sdk/net/client/dap_client.c
+++ b/dap-sdk/net/client/dap_client.c
@@ -177,6 +177,46 @@ 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){
diff --git a/dap-sdk/net/client/include/dap_client.h b/dap-sdk/net/client/include/dap_client.h
index 8457e838b7cfd55a0c0ca6eabdce765d5d20e815..0173b8cc673cb8db251c47f18b0bf3f78b308cb0 100644
--- a/dap-sdk/net/client/include/dap_client.h
+++ b/dap-sdk/net/client/include/dap_client.h
@@ -139,6 +139,7 @@ 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/modules/chain/CMakeLists.txt b/modules/chain/CMakeLists.txt
index 2c8a19c4eccc17aa4e1b6d4ec75d6af4ca321061..fc43ed57b2c79b37f3089e46a481d739373c15c3 100644
--- a/modules/chain/CMakeLists.txt
+++ b/modules/chain/CMakeLists.txt
@@ -10,7 +10,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_SRCS} ${DAP_CHAIN_HEADERS})
 #find_package(PkgConfig REQUIRED)
 #pkg_search_module(GLIB REQUIRED glib-2.0)
 
-target_link_libraries(dap_chain dap_core dap_chain_common dap_chain_mempool dap_chain_global_db ${GLIB_LDFLAGS})
-target_include_directories(dap_chain INTERFACE . include/ ${GLIB_INCLUDE_DIRS})
+target_link_libraries(${PROJECT_NAME} dap_core dap_chain_common dap_chain_mempool dap_chain_global_db ${GLIB_LDFLAGS})
+target_include_directories(${PROJECT_NAME} INTERFACE . include/ ${GLIB_INCLUDE_DIRS})
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/uthash/src)
diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index 2fad608e9886a178a77c7fcd4d3053db41318cf0..edda63085b9aa08e4508c50ef460ee9ffd2a5bfa 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -209,9 +209,9 @@ 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_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_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain);
+    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);
     return l_ret;
@@ -580,10 +580,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)
+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 l_ret = false;
-    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
+    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_cell_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_cell.c b/modules/chain/dap_chain_cell.c
index 833697d368db7f3974aa6c173f9dcf68256b67e8..5d8756db08e9c0b3192169a873a21f218cf8613f 100644
--- a/modules/chain/dap_chain_cell.c
+++ b/modules/chain/dap_chain_cell.c
@@ -297,7 +297,7 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s
     // if no atom provided in arguments, we flush all the atoms in given chain
     size_t l_atom_size = a_atom_size ? a_atom_size : 0;
     size_t l_total_wrote_bytes = 0, l_count = 0;
-    dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain);
+    dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain, a_cell->id);
     if (!a_atom) {
         fseek(a_cell->file_storage, sizeof(dap_chain_cell_file_header_t), SEEK_SET);
     }
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 40899a1088a99ad4a96319f4ab98ebdbd0e30ef3..6925d627291f1202e534e3f0040bdb36412dec0a 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -47,6 +47,7 @@ typedef struct dap_chain_atom_iter{
     dap_chain_t * chain;
     dap_chain_atom_ptr_t cur;
     dap_chain_hash_fast_t *cur_hash;
+    dap_chain_cell_id_t cell_id;
     size_t cur_size;
     void * cur_item;
     void * _inheritor;
@@ -70,7 +71,7 @@ typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_form_treshold_t)(dap_chai
 typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_verify_t)(dap_chain_t *, dap_chain_atom_ptr_t , size_t);
 typedef size_t (*dap_chain_callback_atom_get_hdr_size_t)(void);
 
-typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t * );
+typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t *, dap_chain_cell_id_t);
 typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_from_t)(dap_chain_t * ,dap_chain_atom_ptr_t, size_t);
 typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_first_t)(dap_chain_atom_iter_t * , size_t*);
 typedef dap_chain_datum_t** (*dap_chain_callback_atom_get_datum_t)(dap_chain_atom_ptr_t, size_t, size_t * );
@@ -185,5 +186,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);
-bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash);
+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);
diff --git a/modules/channel/chain-net-srv/CMakeLists.txt b/modules/channel/chain-net-srv/CMakeLists.txt
index 5b511f0528c7cf6bc52c5139b7f2fe72464d2458..99175488200aa2962f42c06c1e8628b57a8731b2 100644
--- a/modules/channel/chain-net-srv/CMakeLists.txt
+++ b/modules/channel/chain-net-srv/CMakeLists.txt
@@ -6,7 +6,7 @@ file(GLOB DAP_STREAM_CH_CHAIN_NET_SRV_HDRS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_NET_SRV_SRCS} ${DAP_STREAM_CH_CHAIN_NET_SRV_HDRS})
 
-target_link_libraries(dap_stream_ch_chain_net_srv dap_core dap_crypto dap_chain_common dap_chain dap_chain_mempool dap_chain_net dap_chain_net_srv dap_server_core dap_stream dap_stream_ch dap_stream_ch_chain dap_stream_ch_chain_net)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain_common dap_chain dap_chain_mempool dap_chain_net dap_chain_net_srv dap_server_core dap_stream dap_stream_ch dap_stream_ch_chain dap_stream_ch_chain_net)
 
-target_include_directories(dap_stream_ch_chain_net_srv INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
diff --git a/modules/channel/chain-net/CMakeLists.txt b/modules/channel/chain-net/CMakeLists.txt
index 90b038e903c5cc5eb25487fbe19ba0d5ba7c1861..c7166b01ad46da9f45d0921c93ecac3a75e952af 100644
--- a/modules/channel/chain-net/CMakeLists.txt
+++ b/modules/channel/chain-net/CMakeLists.txt
@@ -6,9 +6,9 @@ file(GLOB DAP_STREAM_CH_CHAIN_NET_HDRS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_NET_SRCS} ${DAP_STREAM_CH_CHAIN_NET_HDRS})
 
-target_link_libraries(dap_stream_ch_chain_net dap_core dap_crypto dap_stream dap_stream_ch dap_stream_ch_chain
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_stream dap_stream_ch dap_stream_ch_chain
                                                dap_chain_net)
 
-target_include_directories(dap_stream_ch_chain_net INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/uthash/src)
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 c54f1ae14aa4f12b7c27117565461b329b8e8736..26ad6039af414d7ecac28bf899e8c6c095ddad43 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_net, &l_net->pub.cell_id );
+                        dap_chain_node_addr_t *l_addr_new = dap_chain_node_gen_addr(l_ch_chain_net_pkt->hdr.net_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 048805b30881b55e65ca563fe723cdeb1c492d6c..e5a850a5c789c625579eae5b7a10a7b34a78f699 100644
--- a/modules/channel/chain/CMakeLists.txt
+++ b/modules/channel/chain/CMakeLists.txt
@@ -6,8 +6,8 @@ file(GLOB DAP_STREAM_CH_CHAIN_HDRS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_SRCS} ${DAP_STREAM_CH_CHAIN_HDRS})
 
-target_link_libraries(dap_stream_ch_chain dap_core dap_crypto dap_chain dap_stream dap_stream_ch)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_stream dap_stream_ch)
 
-target_include_directories(dap_stream_ch_chain INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/uthash/src)
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 85bcc06fe19016aafcf0adff7d61d053a83d17e8..006c0cbc372571a976aabc7167a90de6b342fdde 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -288,7 +288,7 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a
     dap_chain_t * l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id);
     assert(l_chain);
     //pthread_rwlock_rdlock(&l_chain->atoms_rwlock);
-    l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain);
+    l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_sync_request->request_hdr.cell_id);
     size_t l_first_size = 0;
     dap_chain_atom_ptr_t l_iter = l_chain->callback_atom_iter_get_first(l_sync_request->chain.request_atom_iter, &l_first_size);
     if (l_iter && l_first_size) {
@@ -478,7 +478,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)) {
+    if (dap_chain_get_atom_by_hash(l_chain, &l_atom_hash, &l_atom_size, l_sync_request->request_hdr.cell_id)) {
         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 );
@@ -1035,7 +1035,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 if(s_debug_more)
                     log_it(L_INFO, "Out: UPDATE_CHAINS_START pkt: net %s chain %s cell 0x%016"DAP_UINT64_FORMAT_X, l_chain->name,
                                         l_chain->net_name, l_chain_pkt->hdr.cell_id.uint64);
-                l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain);
+                l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_chain_pkt->hdr.cell_id);
                 l_chain->callback_atom_iter_get_first(l_ch_chain->request_atom_iter, NULL);
                 memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_hdr_t));
                 dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START,
@@ -1276,7 +1276,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 dap_stream_ch_chain_sync_request_t l_request={};
                 dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
                 if( l_chain){
-                    dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from); // Move away from i/o reactor to callback processor
+                    dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from, l_chain_pkt->hdr.cell_id); // Move away from i/o reactor to callback processor
                     if( dap_log_level_get()<= L_INFO){
                         char l_hash_from_str[70]={[0]='\0'};
                         dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_from_str,sizeof (l_hash_from_str)-1);
diff --git a/modules/common/CMakeLists.txt b/modules/common/CMakeLists.txt
index 1a4670336869329ba4f7dff0936354b4ad674119..7689148fe4e70b39da308ebeb5a88cb3f1bc875b 100644
--- a/modules/common/CMakeLists.txt
+++ b/modules/common/CMakeLists.txt
@@ -6,5 +6,5 @@ file(GLOB DAP_CHAIN_COMMON_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_COMMON_SRCS} ${DAP_CHAIN_COMMON_HEADERS})
 
-target_link_libraries(dap_chain_common dap_core dap_crypto )
-target_include_directories(dap_chain_common PUBLIC include/ )
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto )
+target_include_directories(${PROJECT_NAME} PUBLIC include/ )
diff --git a/modules/consensus/block-poa/CMakeLists.txt b/modules/consensus/block-poa/CMakeLists.txt
index d54c77b2d6de9a7bded5e2f4413b1791d87fb394..086591aba66c41d3e17a19d4b725cb1fea19e9a5 100644
--- a/modules/consensus/block-poa/CMakeLists.txt
+++ b/modules/consensus/block-poa/CMakeLists.txt
@@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_BLOCK_CS_POA_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_BLOCK_CS_POA_SRCS} ${DAP_CHAIN_BLOCK_CS_POA_HEADERS})
 
-target_link_libraries(dap_chain_cs_block_poa dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake)
-target_include_directories(dap_chain_cs_block_poa INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
diff --git a/modules/consensus/block-pos/CMakeLists.txt b/modules/consensus/block-pos/CMakeLists.txt
index 2417e6529e529168867e0f383b60606f07463e1a..587d3b2d0219d463bef78a67f7d2ed8dfc62016f 100644
--- a/modules/consensus/block-pos/CMakeLists.txt
+++ b/modules/consensus/block-pos/CMakeLists.txt
@@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_CS_BLOCK_POS_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CS_BLOCK_POS_SRCS} ${DAP_CHAIN_CS_BLOCK_POS_HEADERS})
 
-target_link_libraries(dap_chain_cs_block_pos dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake)
-target_include_directories(dap_chain_cs_block_pos INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
diff --git a/modules/consensus/block-pow/CMakeLists.txt b/modules/consensus/block-pow/CMakeLists.txt
index 334d6eb6a932e22561749a8c14863ac1f7ca81d2..9f3cc01638bae46853fde94ac5cf5fe0a237561e 100644
--- a/modules/consensus/block-pow/CMakeLists.txt
+++ b/modules/consensus/block-pow/CMakeLists.txt
@@ -7,6 +7,6 @@ file(GLOB DAP_CHAIN_BLOCK_CS_POW_HEADERS include/*.h)
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_BLOCK_CS_POW_SRCS} ${DAP_CHAIN_BLOCK_CS_POW_HEADERS})
 
 
-target_link_libraries(dap_chain_cs_block_pow dap_core dap_crypto dap_chain dap_chain_cs_block )
-target_include_directories(dap_chain_block_cs_pow INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_block )
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 
diff --git a/modules/consensus/dag-poa/CMakeLists.txt b/modules/consensus/dag-poa/CMakeLists.txt
index 12a35ad6a4d8dbf26282473857fc694eb38d5ce6..457d52f9abf7243c6903838c650ec0b595d85a51 100644
--- a/modules/consensus/dag-poa/CMakeLists.txt
+++ b/modules/consensus/dag-poa/CMakeLists.txt
@@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_DAG_CS_POA_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DAG_CS_POA_SRCS} ${DAP_CHAIN_DAG_CS_POA_HEADERS})
 
-target_link_libraries(dap_chain_cs_dag_poa dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake)
-target_include_directories(dap_chain_cs_dag_poa INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
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 ef2ef81218e97053e8e3bc658673289036518f8b..6b763948e957d283f07c21107deffb15819687d2 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -352,14 +352,13 @@ 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");
         return  NULL;
     }
     if ( s_seed_mode || (a_hashes && a_hashes_count) ){
-        dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new( a_dag->chain->id, l_net->pub.cell_id, a_datum,
+        dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new( a_dag->chain->id, a_dag->chain->cells->id, a_datum,
                                                          PVT(l_poa)->events_sign_cert->enc_key, a_hashes, a_hashes_count,a_event_size);
         return l_event;
     }else
diff --git a/modules/consensus/dag-pos/CMakeLists.txt b/modules/consensus/dag-pos/CMakeLists.txt
index 8b8dff9976790e5c248009bed61dd6736fe6b216..33b2032af8fdda1b7e8f751d0c06ebb0899b0e00 100644
--- a/modules/consensus/dag-pos/CMakeLists.txt
+++ b/modules/consensus/dag-pos/CMakeLists.txt
@@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_CS_DAG_POS_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CS_DAG_POS_SRCS} ${DAP_CHAIN_CS_DAG_POS_HEADERS})
 
-target_link_libraries(dap_chain_cs_dag_pos dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake)
-target_include_directories(dap_chain_cs_dag_pos INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
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 5a98adfca649e6f5c3350516aebe572741f40bcb..72e5876bf81ac50f72f8c5bc5ee13cf57c9a6b4a 100644
--- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
+++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
@@ -27,6 +27,7 @@
 #include "dap_common.h"
 #include "dap_string.h"
 #include "dap_strfuncs.h"
+#include "dap_chain_cell.h"
 #include "dap_chain_cs.h"
 #include "dap_chain_cs_dag.h"
 #include "dap_chain_cs_dag_pos.h"
@@ -204,7 +205,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
         return NULL;
     }
     if(a_datum || (a_hashes && a_hashes_count)) {
-        dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, l_net->pub.cell_id, a_datum,
+        dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_datum,
                                                                         PVT(l_pos)->events_sign_key, a_hashes, a_hashes_count, a_dag_event_size);
         return l_event;
     } else
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c
index 41ca84f3ce86d6a9a90036a053d600d9a035036f..415910ef4d43c9b4cb2e4f153d464d3d13cec7c3 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/consensus/none/dap_chain_cs_none.c
@@ -33,6 +33,7 @@
 #include "dap_strfuncs.h"
 #include "dap_config.h"
 #include "dap_hash.h"
+#include "dap_chain_cell.h"
 #include "dap_chain_ledger.h"
 #include "dap_chain_global_db.h"
 #include "dap_chain_global_db_driver.h"
@@ -70,7 +71,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
 static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); //    Verify new event in gdb
 static size_t s_chain_callback_atom_get_static_hdr_size(void); //    Get gdb event header size
 
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain);
+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_from(dap_chain_t * a_chain,
         dap_chain_atom_ptr_t a, size_t a_atom_size);
 
@@ -96,7 +97,11 @@ static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain
 
 
 /**
- * Stub for consensus
+ * @brief stub for consensus
+ * 
+ * @param a_chain chain object
+ * @param a_chain_cfg chain config object
+ * @return int 
  */
 static int s_cs_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 {
@@ -119,14 +124,14 @@ int dap_chain_gdb_init(void)
 }
 
 /**
- * @brief s_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 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
  */
 static void s_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_size)
@@ -141,15 +146,22 @@ static void s_history_callback_notify(void * a_arg, const char a_op_code, const
     }
 }
 
+/**
+ * @brief set PVT(DAP_CHAIN_GDB(a_chain))->is_load_mode = true
+ * 
+ * @param a_chain dap_chain_t object
+ */
 static void s_dap_chain_gdb_callback_purge(dap_chain_t *a_chain)
 {
     PVT(DAP_CHAIN_GDB(a_chain))->is_load_mode = true;
 }
 
 /**
- * @brief dap_chain_gdb_new
- * @param a_chain
- * @param a_chain_cfg
+ * @brief configure chain gdb
+ * Set atom element callbacks
+ * @param a_chain dap_chain_t chain object
+ * @param a_chain_cfg dap_config_t config object 
+ * @return int 
  */
 int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 {
@@ -165,12 +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-%016llX",l_net->pub.name,
+        l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X,l_net->pub.name,
                                                   a_chain->id.uint64);
     }else {
-        // 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, l_net->pub.cell_id.uint64);
+        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,
+                                                  a_chain->id.uint64, a_chain->cells->id.uint64);
     }
 
     // Add group prefix that will be tracking all changes
@@ -208,9 +219,9 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 }
 
 /**
- * @brief dap_chain_cs_gdb_delete
- * @param a_chain
- * @return
+ * @brief clear dap_chain_gdb_t object
+ * 
+ * @param a_chain dap_chain_t chain object
  */
 void dap_chain_gdb_delete(dap_chain_t * a_chain)
 {
@@ -224,9 +235,10 @@ void dap_chain_gdb_delete(dap_chain_t * a_chain)
 }
 
 /**
- * @brief dap_chain_gdb_get_group
- * @param a_chain
- * @return group name for ledger
+ * @brief get group name for ledger
+ * 
+ * @param a_chain dap_chain_t * chain object
+ * @return const char*
  */
 const char* dap_chain_gdb_get_group(dap_chain_t * a_chain)
 {
@@ -257,9 +269,11 @@ const char* dap_chain_gdb_get_group(dap_chain_t * a_chain)
 }*/
 
 /**
- * Load ledger from mempool
- *
- * return 0 if OK otherwise  negative error code
+ * @brief Load ledger from mempool
+ * 
+ * @param a_gdb_group a_gdb_group char gdb group name
+ * @param a_chain chain dap_chain_t object
+ * @return int return 0 if OK otherwise  negative error code
  */
 int dap_chain_gdb_ledger_load(char *a_gdb_group, dap_chain_t *a_chain)
 {
@@ -276,10 +290,12 @@ int dap_chain_gdb_ledger_load(char *a_gdb_group, dap_chain_t *a_chain)
 }
 
 /**
- * @brief s_chain_callback_datums_add
- * @param a_chain
- * @param a_datums
- * @param a_datums_size
+ * @brief call s_chain_callback_atom_add for every dap_chain_datum_t objects in a_datums array
+ * 
+ * @param a_chain dap_chain_t chain object (f.e. plasma)
+ * @param a_datums dap_chain_datum array with dap_chain_datum objects
+ * @param a_datums_count object counts in datums array
+ * @return size_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)
@@ -291,6 +307,15 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
     return a_datums_count;
 }
 
+/**
+ * @brief call s_chain_callback_atom_add for every dap_chain_datum_t objects in a_datums array only if chain contains specific group (chain-gdb.home21-network.chain-F)
+ * 
+ * @param a_chain dap_chain_t chain object (f.e. plasma)
+ * @param a_datums dap_chain_datum array with dap_chain_datum objects
+ * @param a_datums_count object counts in datums array
+ * @param a_group group name
+ * @return size_t 
+ */
 static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums,
         size_t a_datums_count, const char *a_group)
 {
@@ -300,10 +325,12 @@ static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain
 }
 
 /**
- * @brief s_chain_callback_datums_add
- * @param a_chain
- * @param a_datums
- * @param a_datums_size
+ * @brief add atom to DB
+ * 
+ * @param a_chain chaon object
+ * @param a_atom pointer to atom
+ * @param a_atom_size atom size
+ * @return dap_chain_atom_verify_res_t 
  */
 static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
 {
@@ -359,10 +386,12 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
 }
 
 /**
- * @brief s_chain_callback_atom_verify Verify atomic element
- * @param a_chain
- * @param a_atom
- * @return
+ * @brief Verify atomic element (currently simply return ATOM_ACCEPT)
+ * 
+ * @param a_chain chain object
+ * @param a_atom pointer to atom
+ * @param a_atom_size size of atom
+ * @return dap_chain_atom_verify_res_t 
  */
 static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
 {
@@ -374,9 +403,9 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_
 
 
 /**
- * @brief s_chain_callback_atom_get_static_hdr_size
- * @param a_chain
- * @return
+ * @brief return size of dap_chain_datum_t l_datum_null->header
+ * 
+ * @return size_t 
  */
 static size_t s_chain_callback_atom_get_static_hdr_size()
 {
@@ -385,22 +414,26 @@ static size_t s_chain_callback_atom_get_static_hdr_size()
 }
 
 /**
- * @brief s_chain_callback_atom_iter_create Create atomic element iterator
- * @param a_chain
- * @return
+ * @brief Create atomic element iterator
+ * 
+ * @param a_chain dap_chain_t a_chain
+ * @return dap_chain_atom_iter_t* 
  */
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain)
+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_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
     l_iter->chain = a_chain;
+    l_iter->cell_id = a_cell_id;
     return l_iter;
 }
 
 /**
- * @brief s_chain_callback_atom_iter_create_from
- * @param a_chain
- * @param a_atom
- * @return
+ * @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* 
  */
 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)
@@ -413,8 +446,9 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t
 }
 
 /**
- * @brief s_chain_callback_atom_iter_delete Delete dag event iterator
- * @param a_atom_iter
+ * @brief Delete dag event iterator
+ * execute DAP_DELETE(a_atom_iter)
+ * @param a_atom_iter dap_chain_atom_iter_t object
  */
 static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter)
 {
@@ -422,11 +456,12 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite
 }
 
 /**
- * @brief s_chain_callback_atom_iter_find_by_hash
- * @details Searchs by datum data hash, not for datum's hash itself
- * @param a_atom_iter
- * @param a_atom_hash
- * @return
+ * @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 
+ * @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 
  */
 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)
@@ -442,9 +477,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at
 }
 
 /**
- * @brief s_chain_callback_atom_iter_get_first Get the first dag event
- * @param a_atom_iter
- * @return
+ * @brief Get the first dag event from database
+ * 
+ * @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 
  */
 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)
 {
@@ -467,9 +504,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
 }
 
 /**
- * @brief s_chain_callback_atom_iter_get_next Get the next dag event
- * @param a_atom_iter
- * @return
+ * @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 
  */
 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)
 {
@@ -491,10 +530,12 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_i
 }
 
 /**
- * @brief s_chain_callback_atom_iter_get_links
- * @param a_atom_iter
- * @param a_links_size_ptr
- * @return
+ * @brief return null in current implementation
+ * 
+ * @param a_atom_iter 
+ * @param a_links_size_ptr 
+ * @param a_links_sizes_ptr 
+ * @return dap_chain_atom_ptr_t* 
  */
 static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter,
         size_t * a_links_size_ptr, size_t **a_links_sizes_ptr)
@@ -506,10 +547,12 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom
 }
 
 /**
- * @brief s_chain_callback_atom_iter_get_lasts
- * @param a_atom_iter
- * @param a_lasts_size_ptr
- * @return
+ * @brief return null in current implementation
+ * 
+ * @param a_atom_iter 
+ * @param a_lasts_size_ptr 
+ * @param a_links_sizes_ptr 
+ * @return dap_chain_atom_ptr_t* 
  */
 static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter,
         size_t * a_lasts_size_ptr,  size_t **a_links_sizes_ptr)
@@ -520,6 +563,14 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom
     return NULL;
 }
 
+/**
+ * @brief get new datum object from atom
+ * 
+ * @param a_atom atom object
+ * @param a_atom_size atom size
+ * @param a_datums_count count of datums
+ * @return dap_chain_datum_t** 
+ */
 static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count)
 {
     UNUSED(a_atom_size);
diff --git a/modules/dht/CMakeLists.txt b/modules/dht/CMakeLists.txt
index bbdec344aedccb617eb268dd679fd2f88e308f85..d1c37c570e7f993b87413a06d65d8b27488caa7a 100644
--- a/modules/dht/CMakeLists.txt
+++ b/modules/dht/CMakeLists.txt
@@ -13,6 +13,6 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DHT_SRC} ${DAP_CHAIN_DHT_HDR})
 
 target_link_libraries(${PROJECT_NAME}  ${DAP_CHAIN_DHT_LIBS})
 
-target_include_directories(dap_chain_dht INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 
diff --git a/modules/global-db/CMakeLists.txt b/modules/global-db/CMakeLists.txt
index 1be3f9836b5bc6c6cb5ab89e00c59cc274fc1214..1d22fa8fc7419a150c632feda51d79d4085baf46 100644
--- a/modules/global-db/CMakeLists.txt
+++ b/modules/global-db/CMakeLists.txt
@@ -20,7 +20,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_GLOBAL_DB_SRC} ${DAP_CHAIN_GLOBAL
 
 target_link_libraries(${PROJECT_NAME}  ${DAP_CHAIN_GLOBAL_DB_LIBS})
 
-target_include_directories(dap_chain_global_db INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdparty/uthash/src)
 
diff --git a/modules/mempool/CMakeLists.txt b/modules/mempool/CMakeLists.txt
index f2d0ede23294b502d943b706cbcc2273f1242944..b337f93df4d86b0d331ad9c9ba7cbaed078a5d21 100644
--- a/modules/mempool/CMakeLists.txt
+++ b/modules/mempool/CMakeLists.txt
@@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_MEMPOOL_HDR include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_MEMPOOL_SRC} ${DAP_CHAIN_MEMPOOL_HDR})
 
-target_link_libraries(dap_chain_mempool dap_http_server dap_client dap_chain_net dap_chain_global_db dap_core)
-target_include_directories(dap_chain_mempool INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_http_server dap_client dap_chain_net dap_chain_global_db dap_core)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
diff --git a/modules/mining/CMakeLists.txt b/modules/mining/CMakeLists.txt
index 3e4e88edd39b4acd5e3154d799278b2d20b83112..5950015428d51b7a2359c33fdfe4241b75508844 100644
--- a/modules/mining/CMakeLists.txt
+++ b/modules/mining/CMakeLists.txt
@@ -12,7 +12,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CRYPTO_SRCS} ${DAP_CHAIN_CRYPTO_H
 
 target_include_directories(dap_chain_crypto INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
-target_link_libraries(dap_chain_crypto dap_core dap_crypto dap_chain monero_crypto)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain monero_crypto)
 
 set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
 set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index e2548f03a57de335cf8b54a4f443304c0bb15b17..ac3dbf15c4ef6ae3f5a052ae48b077c7fcdcb362 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -341,7 +341,8 @@ 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;
@@ -349,7 +350,7 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c
             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_net->pub.cell_id.uint64, l_data_out,
+                                                 l_chain_id.uint64, l_cell_id.uint64, l_data_out,
                                                  sizeof(dap_store_obj_pkt_t) + l_data_out->data_size);
         }
         pthread_rwlock_unlock(&PVT(l_net)->rwlock);
@@ -1962,8 +1963,6 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                            NODE_ADDR_FP_ARGS(l_node_addr),
                            l_net_pvt->node_info->hdr.links_number,
                            l_net_pvt->node_info->hdr.cell_id.uint64);
-                    // save cell_id
-                    l_net->pub.cell_id.uint64 = l_net_pvt->node_info->hdr.cell_id.uint64;
                 }
             }
             else{
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index c4f73594b6b4d1e1a59d7f398fb2c398b29eab27..bf92f61f6bd6b2d22c27bf859fa61800f06bb324 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -51,32 +51,31 @@
 /**
  * Generate node address by shard id
  */
-dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_t * a_net,dap_chain_cell_id_t *shard_id)
+dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_id_t a_net_id)
 {
-    if(!shard_id)
-        return NULL;
-    dap_chain_node_addr_t *a_addr = DAP_NEW_Z(dap_chain_node_addr_t);
-    dap_chain_hash_fast_t a_hash;
-    dap_hash_fast(shard_id, sizeof(dap_chain_cell_id_t), &a_hash);
+    dap_chain_node_addr_t *l_addr = DAP_NEW_Z(dap_chain_node_addr_t);
+    dap_chain_hash_fast_t l_hash;
+    dap_hash_fast(&a_net_id, sizeof(dap_chain_net_id_t), &l_hash);
     // first 4 bytes is last 4 bytes of shard id hash
-    memcpy(a_addr->raw, a_hash.raw + sizeof(a_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2);
+    memcpy(l_addr->raw, l_hash.raw + sizeof(l_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2);
     // last 4 bytes is random
-    randombytes(a_addr->raw + sizeof(uint64_t) / 2, sizeof(uint64_t) / 2);
+    randombytes(l_addr->raw + sizeof(uint64_t) / 2, sizeof(uint64_t) / 2);
     // for LITTLE_ENDIAN (Intel), do nothing, otherwise swap bytes
-    a_addr->uint64 = le64toh(a_addr->uint64); // a_addr->raw the same a_addr->uint64
-    return a_addr;
+    l_addr->uint64 = le64toh(l_addr->uint64); // l_addr->raw the same l_addr->uint64
+    return l_addr;
 }
 
 /**
  * Check the validity of the node address by cell id
  */
-bool dap_chain_node_check_addr(dap_chain_net_t * a_net,dap_chain_node_addr_t *addr, dap_chain_cell_id_t *shard_id)
+bool dap_chain_node_check_addr(dap_chain_net_t *a_net, dap_chain_node_addr_t *a_addr)
 {
-    bool ret = false;
-    if(!addr || !shard_id)
-        ret= false;
-
-    return ret;
+    if (!a_addr || !a_net)
+        return false;
+    dap_chain_hash_fast_t l_hash;
+    dap_hash_fast(&a_net->pub.id, sizeof(dap_chain_net_id_t), &l_hash);
+    // first 4 bytes is last 4 bytes of shard id hash
+    return !memcmp(a_addr->raw, l_hash.raw + sizeof(l_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2);
 }
 
 /**
@@ -225,7 +224,7 @@ dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_cha
     return node_info;
 }*/
 
-bool 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_node_role_t a_role, 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,21 +234,18 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t
         }
     }
     if (!l_need_process)
-        return false;
+        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 false;
+                return -1;
             }
         }
     }
-    if (a_chain->callback_add_datums(a_chain, &a_datum, 1) != 1) {
-        return false;
-    }
-    return true;
+    return (int)a_chain->callback_add_datums(a_chain, &a_datum, 1);
 }
 
 static bool s_mempool_auto = false;
@@ -291,12 +287,13 @@ bool dap_chain_node_mempool_autoproc_init()
                 dap_global_db_obj_t *l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size);
                 if (l_objs_size) {
                     for (size_t i = 0; i < l_objs_size; i++) {
-                        // Delete processed objects
-                        dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
                         if (!l_objs[i].value_len)
                             continue;
                         dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value;
-                        dap_chain_node_mempool_process(l_chain, l_role, l_datum);
+                        if (dap_chain_node_mempool_process(l_chain, l_role, l_datum) > 0) {
+                            // Delete processed objects
+                            dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
+                        }
                     }
                     dap_chain_global_db_objs_delete(l_objs, l_objs_size);
                 }
@@ -333,7 +330,7 @@ void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, c
         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)) {
+            if (dap_chain_node_mempool_process(l_chain, l_role, 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_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index a910f232d0b3e19084e0a30cf8dec5588e492fde..7fb56397a1f65f2911732a3eb67ff22b72b94d63 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -27,6 +27,7 @@
 #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"
@@ -508,250 +509,260 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
 
     bool l_tx_hash_found = false;
     dap_tx_data_t *l_tx_data_hash = NULL;
-    // load transactions
-    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
-    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);
+    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);
+
+        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 ) ) {
+                // go to next transaction
+                l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
+                continue;
+            }
 
-    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 ) ) {
-            // 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;
 
-        bool l_type_256 = false;
+            if ( l_datum->header.type_id == DAP_CHAIN_DATUM_256_TX )
+                l_type_256 = true;
 
-        if ( l_datum->header.type_id == DAP_CHAIN_DATUM_256_TX )
-            l_type_256 = true;
+            dap_tx_data_t *l_tx_data = NULL;
 
-        dap_tx_data_t *l_tx_data = NULL;
+            // transaction
+            dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
 
-        // transaction
-        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);
 
-        // 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);
 
-        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);
+            // find OUT items
+            // dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, 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);
 
-        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);
-
-        dap_list_t *l_list_tmp = l_list_out_items;
-        while(l_list_tmp) {
-
-            const dap_chain_256_tx_out_t *l_tx_out_256  = (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;
-
-            // save OUT item l_tx_out - only for first OUT item
-            if(!l_tx_data) {
-                // save tx hash
-                l_tx_data = DAP_NEW_Z(dap_tx_data_t);
-                dap_chain_hash_fast_t l_tx_hash;
-                dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash);
-                memcpy(&l_tx_data->tx_hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t));
-                if ( l_type_256 ) // 256
-                    memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t));
-                else
-                    memcpy(&l_tx_data->addr, &l_tx_out_256->addr, sizeof(dap_chain_addr_t));
-                
-                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;
-                //l_tx_data->datum = l_datum;
-                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_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));
-                }
-                // take token from prev out item
-                else {
+            dap_list_t *l_list_tmp = l_list_out_items;
 
-                    // 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_tmp_in = l_list_in_items;
-                    // find token_ticker in prev OUT items
-                    while(l_list_tmp_in) {
-                        const dap_chain_tx_in_t *l_tx_in =
-                                (const dap_chain_tx_in_t*) l_list_tmp_in->data;
-                        dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash;
+            while(l_list_tmp) {
 
-                        //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 l_tx_data from prev transaction
-                            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));
-                                break;
+                const dap_chain_256_tx_out_t *l_tx_out_256  = (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;
+
+                // save OUT item l_tx_out - only for first OUT item
+                if(!l_tx_data) {
+                    // save tx hash
+                    l_tx_data = DAP_NEW_Z(dap_tx_data_t);
+                    dap_chain_hash_fast_t l_tx_hash;
+                    dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash);
+                    memcpy(&l_tx_data->tx_hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t));
+                    if ( l_type_256 ) // 256
+                        memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t));
+                    else
+                        memcpy(&l_tx_data->addr, &l_tx_out_256->addr, sizeof(dap_chain_addr_t));
+                    
+                    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;
+                    //l_tx_data->datum = l_datum;
+                    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_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));
+                    }
+                    else {
+
+                        // 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_tmp_in = l_list_in_items;
+                        // find token_ticker in prev OUT items
+                        while(l_list_tmp_in) {
+                            const dap_chain_tx_in_t *l_tx_in =
+                                    (const dap_chain_tx_in_t*) l_list_tmp_in->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 l_tx_data from prev transaction
+                                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));
+                                    break;
+                                }
+                                l_list_tmp_in = dap_list_next(l_list_tmp_in);
                             }
-                            l_list_tmp_in = dap_list_next(l_list_tmp_in);
                         }
+                        if(l_list_in_items)
+                            dap_list_free(l_list_in_items);
                     }
-                    if(l_list_in_items)
-                        dap_list_free(l_list_in_items);
+                    HASH_ADD(hh, l_tx_data_hash, tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_data);
                 }
-                HASH_ADD(hh, l_tx_data_hash, tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_data);
+                l_list_tmp = dap_list_next(l_list_tmp);
             }
-            l_list_tmp = dap_list_next(l_list_tmp);
-        }
-        if(l_list_out_items)
-            dap_list_free(l_list_out_items);
 
-        // calc hash
-        dap_chain_hash_fast_t l_tx_hash;
-        dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash);
-        // search tx with a_tx_hash
-        if(!dap_hash_fast_compare(a_tx_hash, &l_tx_hash)) {
-            // go to next transaction
-            l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
-            continue;
-        }
-        // found a_tx_hash now
-
-        // transaction time
-        if(l_tx->header.ts_created > 0) {
-            time_t rawtime = (time_t) l_tx->header.ts_created;
-            struct tm l_timeinfo = {0};
-            localtime_r(&rawtime, &l_timeinfo);
-            dap_string_append_printf(l_str_out, " %s", asctime(&l_timeinfo));
-        }
+            if(l_list_out_items)
+                dap_list_free(l_list_out_items);
 
-        // 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);
-        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;
-        while(l_list_tmp) {
-            const dap_chain_256_tx_out_t *l_tx_out_256 = (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;
-            //dap_tx_data_t *l_tx_data_prev = NULL;
-
-            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) : 
-                                            (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_strlen(l_token_str) > 0 ? l_token_str : "?",
-                        l_dst_to_str ? l_dst_to_str : "?"
-                    );
-                else
-                    dap_string_append_printf(l_str_out, " OUT item %"DAP_UINT64_FORMAT_U" %s to %s\n",
-                        l_tx_out->header.value,
-                        dap_strlen(l_token_str) > 0 ? l_token_str : "?",
-                        l_dst_to_str ? l_dst_to_str : "?"
-                    );
-            }
-            DAP_DELETE(l_dst_to_str);
-            l_list_tmp = dap_list_next(l_list_tmp);
-        }
-        // find all IN items in transaction
-        dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL);
-        l_list_tmp = l_list_in_items;
-        // find cur addr in prev OUT items
-        while(l_list_tmp) {
-            const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_tmp->data;
-            dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash;
-            char l_tx_hash_str[70];
-            char *tx_hash_base58_str = NULL;
-            if(!dap_hash_fast_is_blank(&tx_prev_hash)){
-                tx_hash_base58_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str);
-                dap_chain_hash_fast_to_str(&tx_prev_hash, l_tx_hash_str, sizeof(l_tx_hash_str));
+            // calc hash
+            dap_chain_hash_fast_t l_tx_hash;
+            dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash);
+            // search tx with a_tx_hash
+            if(!dap_hash_fast_compare(a_tx_hash, &l_tx_hash)) {
+                // go to next transaction
+                l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
+                continue;
             }
-            else{
-                strcpy(l_tx_hash_str, "Null");
-                tx_hash_base58_str = dap_strdup("Null");
+            // found a_tx_hash now
+
+            // transaction time
+            if(l_tx->header.ts_created > 0) {
+                time_t rawtime = (time_t) l_tx->header.ts_created;
+                struct tm l_timeinfo = {0};
+                localtime_r(&rawtime, &l_timeinfo);
+                dap_string_append_printf(l_str_out, " %s", asctime(&l_timeinfo));
             }
-            if(!dap_strcmp(a_hash_out_type,"hex"))
-                dap_string_append_printf(l_str_out, " IN item \n  prev tx_hash %s\n", l_tx_hash_str);
+
+            // 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);
             else
-                dap_string_append_printf(l_str_out, " IN item \n  prev tx_hash %s\n", tx_hash_base58_str);
-            DAP_DELETE(tx_hash_base58_str);
-
-            //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) {
-
-                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;
-
-                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);
-                    // 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");
-                } else {
-                    dap_list_t *l_list_out_prev_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_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;
-                    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_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
+            l_list_tmp = l_list_out_items;
+
+            while(l_list_tmp) {
+                const dap_chain_256_tx_out_t *l_tx_out_256 = (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;
+                //dap_tx_data_t *l_tx_data_prev = NULL;
+
+                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) : 
+                                                (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_strlen(l_token_str) > 0 ? l_token_str : "?",
+                            l_dst_to_str ? l_dst_to_str : "?"
+                        );
+                    else
+                        dap_string_append_printf(l_str_out, " OUT item %"DAP_UINT64_FORMAT_U" %s to %s\n",
+                            l_tx_out->header.value,
+                            dap_strlen(l_token_str) > 0 ? l_token_str : "?",
+                            l_dst_to_str ? l_dst_to_str : "?"
+                        );
                 }
+                DAP_DELETE(l_dst_to_str);
+                l_list_tmp = dap_list_next(l_list_tmp);
             }
-            dap_string_append_printf(l_str_out, "\n");
-            l_list_tmp = dap_list_next(l_list_tmp);
-        }
 
-        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);
-        l_tx_hash_found = true;
-        break;
-
-        // go to next transaction
-        //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter);
-        //l_atom_size = a_chain->callback_atom_get_size(l_atom);
-    }
-    a_chain->callback_atom_iter_delete(l_atom_iter);
-
-    // 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 datum
-        DAP_DELETE(l_iter_current->datum);
-        // delete struct
-        DAP_DELETE(l_iter_current);
-    }
+            // find all IN items in transaction
+            dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL);
+            l_list_tmp = l_list_in_items;
+            // find cur addr in prev OUT items
+            while(l_list_tmp) {
+                const dap_chain_tx_in_t *l_tx_in = (const dap_chain_tx_in_t*) l_list_tmp->data;
+                dap_chain_hash_fast_t tx_prev_hash = l_tx_in->header.tx_prev_hash;
+                char l_tx_hash_str[70];
+                char *tx_hash_base58_str = NULL;
+                if(!dap_hash_fast_is_blank(&tx_prev_hash)){
+                    tx_hash_base58_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str);
+                    dap_chain_hash_fast_to_str(&tx_prev_hash, l_tx_hash_str, sizeof(l_tx_hash_str));
+
+                }
+                else{
+                    strcpy(l_tx_hash_str, "Null");
+                    tx_hash_base58_str = dap_strdup("Null");
+                }
+                if(!dap_strcmp(a_hash_out_type,"hex"))
+                    dap_string_append_printf(l_str_out, " IN item \n  prev tx_hash %s\n", l_tx_hash_str);
+                else
+                    dap_string_append_printf(l_str_out, " IN item \n  prev tx_hash %s\n", tx_hash_base58_str);
+                DAP_DELETE(tx_hash_base58_str);
+
+
+                //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) {
+
+                    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;
+
+                    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);
+                        // 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");
+                    } else {
+                        dap_list_t *l_list_out_prev_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_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;
+                        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);                   
+
+                    }
+                }
+                dap_string_append_printf(l_str_out, "\n");
+                l_list_tmp = dap_list_next(l_list_tmp);
+            }
+
+            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);
+            l_tx_hash_found = true;
+            break;
+
+            // go to next transaction
+            //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter);
+            //l_atom_size = a_chain->callback_atom_get_size(l_atom);
+        }
+        a_chain->callback_atom_iter_delete(l_atom_iter);
+
+        // 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 datum
+            DAP_DELETE(l_iter_current->datum);
+            // delete struct
+            DAP_DELETE(l_iter_current);
+        }
+        l_cell = l_cell->hh.next;
+    } while (l_cell);
 
     // if no history
     if(!l_str_out->len)
@@ -775,185 +786,140 @@ 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;
-    // load transactions
-    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
-    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;
+    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;
         }
 
-        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);
-                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(" ");
+        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;
             }
 
-            // 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
+            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);
+                    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;
                 {
-                    // 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));
+                    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));
                     }
-                    HASH_ADD(hh, l_tx_data_hash, tx_hash, sizeof(dap_chain_hash_fast_t), l_tx_data);
-
-                    // 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);
+                    else
+                        l_time_str = dap_strdup(" ");
                 }
-                l_list_out_items_tmp = dap_list_next(l_list_out_items_tmp);
-            }
-
-            // 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);
+                // 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);
+
+                        // 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);
                     }
-                    l_list_in_items_tmp = dap_list_next(l_list_in_items_tmp);
+                    l_list_out_items_tmp = dap_list_next(l_list_out_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 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) {
-                            char *l_src_str = NULL;
-                            bool l_src_str_is_cur = false;
+                            // 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;
@@ -963,188 +929,238 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons
                                     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);
+
+                            // 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);
                                 }
-
-                                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);
+                            }
+                            //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);
                                 }
-                                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);
+                                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
-                                        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)
+                                        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 recv %"DAP_UINT64_FORMAT_U" %s from %s\n",
+                                                    "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_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_DELETE(tx_hash_str);
-                                    DAP_DELETE(l_dst_to_str);
+                                    dap_list_free(l_list_out_prev_items);
                                 }
-                                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)
+                                // 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 recv %"DAP_UINT64_FORMAT_U" %s from %s\n",
+                                                    "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_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;
+                                                    l_addr_str ? l_addr_str : "");
+                                            l_list_in_items2_tmp = NULL;
+                                        }
+                                        DAP_DELETE(tx_hash_str);
+                                        DAP_DELETE(l_addr_str);
                                     }
-                                    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_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);
                     }
-                    l_list_in_items2_tmp = dap_list_next(l_list_in_items2_tmp);
+        //                l_list_in_items_tmp = dap_list_next(l_list_in_items_tmp);
+        //            }
                 }
-    //                l_list_in_items_tmp = dap_list_next(l_list_in_items_tmp);
-    //            }
-            }
 
-            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);
+                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);
+                // go to next transaction
+                l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
+            }
+            DAP_DELETE(l_datums);
         }
-        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);
-    }
+        // 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);
+        }
+        l_cell = l_cell->hh.next;
+    } while (l_cell);
+
     // if no history
     if(!l_str_out->len)
         dap_string_append(l_str_out, " empty");
@@ -1166,102 +1182,102 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke
     dap_string_t *l_str_out = dap_string_new(NULL);
     *a_token_num  = 0;
     size_t l_atom_size = 0;
-    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
-    if(!a_chain->callback_atom_get_datums) {
-        log_it(L_DEBUG, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name);
-        return NULL ;
-    }
-    for (dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size);
-        l_atom && l_atom_size; l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size)) {
-        size_t l_datums_count = 0;
-        dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count);
-        for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) {
-            dap_chain_datum_t *l_datum = l_datums[l_datum_n];
-            if (!l_datum || (l_datum->header.type_id != DAP_CHAIN_DATUM_256_TOKEN_DECL && l_datum->header.type_id != DAP_CHAIN_DATUM_TOKEN_DECL) )
-                continue;
-            char l_time_str[70];
-            // 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;
-            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);
-                char *l_out_hash_str;
-                if (!strcmp(a_hash_out_type, "hex"))
-                    l_out_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash);
-                else
-                    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 %s, created: %s\n",
-                            l_token->ticker, 
-                            dap_chain_datum_token_is_old(l_token->type) ? "" : " 256_t ",
-                            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),
-                                l_token->header_private.signs_valid, l_token->header_private.signs_total);
-                        break;
-                    case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
-                        dap_string_append_printf(l_str_out, "  total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n",
-                                dap_chain_datoshi_to_coins(l_token->header_private.total_supply),
-                                l_token->header_private.total_supply,
-                                l_token->header_private.signs_valid, l_token->header_private.signs_total);
-                        break;
-                    case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256
-                    case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL:
-                        dap_string_append_printf(l_str_out, "  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;
-                    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);
-                        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));
-                        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),
-                                l_token->header_public.flags,
-                                dap_chain_u256tostr(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);
-                        dap_string_append_printf(l_str_out,
-                                " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                dap_chain_datoshi_to_coins(l_token->header_public.total_supply),
-                                dap_chain_balance_print(l_token->header_public.total_supply),
-                                l_token->header_public.flags,
-                                dap_chain_balance_print(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);
-                        break;
+    dap_chain_cell_t *l_cell = a_chain->cells;
+    do {
+        dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id);
+        if(!a_chain->callback_atom_get_datums) {
+            log_it(L_DEBUG, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name);
+            return NULL ;
+        }
+        for (dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size);
+            l_atom && l_atom_size; l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size)) {
+            size_t l_datums_count = 0;
+            dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count);
+            for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) {
+                dap_chain_datum_t *l_datum = l_datums[l_datum_n];
+                if (!l_datum || l_datum->header.type_id != DAP_CHAIN_DATUM_TOKEN_DECL)
+                    continue;
+                char l_time_str[70];
+                // 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;
+                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);
+                    char *l_out_hash_str;
+                    if (!strcmp(a_hash_out_type, "hex"))
+                        l_out_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash);
+                    else
+                        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);
+                    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),
+                                    l_token->header_private.signs_valid, l_token->header_private.signs_total);
+                            break;
+                        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
+                            dap_string_append_printf(l_str_out, "  total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n",
+                                    dap_chain_datoshi_to_coins(l_token->header_private.total_supply),
+                                    l_token->header_private.total_supply,
+                                    l_token->header_private.signs_valid, l_token->header_private.signs_total);
+                            break;
+                        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256
+                        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL:
+                            dap_string_append_printf(l_str_out, "  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;
+                        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);
+                            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));
+                            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),
+                                    l_token->header_public.flags,
+                                    dap_chain_u256tostr(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);
+                            dap_string_append_printf(l_str_out,
+                                    " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
+                                    dap_chain_datoshi_to_coins(l_token->header_public.total_supply),
+                                    dap_chain_balance_print(l_token->header_public.total_supply),
+                                    l_token->header_public.flags,
+                                    dap_chain_balance_print(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);
+                            break;
+                    }
+                    dap_string_append_printf(l_str_out, "\n");
+                    (*a_token_num)++;
                 }
-                dap_string_append_printf(l_str_out, "\n");
-                (*a_token_num)++;
             }
+            DAP_DELETE(l_datums);
         }
-        DAP_DELETE(l_datums);
-    }
-    a_chain->callback_atom_iter_delete(l_atom_iter);
+        a_chain->callback_atom_iter_delete(l_atom_iter);
+        l_cell = l_cell->hh.next;
+    } while (l_cell);
     char *l_ret_str = l_str_out ? dap_string_free(l_str_out, false) : NULL;
     return l_ret_str;
 }
@@ -1286,281 +1302,278 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke
 static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger, const char *a_filter_token_name, const char *a_filtr_addr_base58, const char *a_hash_out_type, long a_datum_start, long a_datum_end, long *a_total_datums, dap_chain_tx_hash_processed_ht_t *a_tx_hash_processed)
 {
     dap_string_t *l_str_out = dap_string_new(NULL);
-    bool l_tx_hash_found = false;
     // list all transactions
     dap_tx_data_t *l_tx_data_hash = NULL;
-    // load transactions
-    size_t l_atom_size = 0;
-    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
-    dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size);
-    size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0;
-    size_t l_datum_num_global = a_total_datums ? *a_total_datums : 0;
-    while(l_atom && l_atom_size) {
-    size_t l_datums_count = 0;
-    dap_chain_datum_t **l_datums =
-            (a_chain->callback_atom_get_datums && l_atom && l_atom_size) ?
-                    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);
-        return NULL ;
-    }
-    for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) {
-        dap_chain_datum_t *l_datum = l_datums[l_datum_n];
-        if(!l_datum) { // || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) {
-            // go to next atom
-            //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
-            continue;
+    dap_chain_cell_t *l_cell = a_chain->cells;
+    do {
+        // load transactions
+        size_t l_atom_size = 0;
+        dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id);
+        dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size);
+        size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0;
+        size_t l_datum_num_global = a_total_datums ? *a_total_datums : 0;
+        while(l_atom && l_atom_size) {
+        size_t l_datums_count = 0;
+        dap_chain_datum_t **l_datums =
+                (a_chain->callback_atom_get_datums && l_atom && l_atom_size) ?
+                        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);
+            return NULL ;
         }
-
-    /*dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
-    dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter);
-    size_t l_atom_size = a_chain->callback_atom_get_size(l_atom);
-    size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0;
-    while(l_atom && l_atom_size) {
-        dap_chain_datum_t *l_datum =
-                a_chain->callback_atom_get_datum ?
-                        a_chain->callback_atom_get_datum(l_atom) : (dap_chain_datum_t*) l_atom;
-        if(!l_datum) {
-            // go to next transaction
-            l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter);
-            l_atom_size = a_chain->callback_atom_get_size(l_atom);
-            log_it(L_ERROR, "datum=NULL for atom=0x%x", l_atom);
-            continue;
-        }*/
-        char l_time_str[70];
-        // get time of create datum
-        if(dap_time_to_str_rfc822(l_time_str, 71, l_datum->header.ts_create) < 1)
-            l_time_str[0] = '\0';
-
-
-        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) {
-                    break;
-            }
-
-            dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
-            //if(a_datum_start < 0 || (l_datum_num >= a_datum_start && l_datum_num < a_datum_end))
-            // 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_token_num++;
-                break;
+        for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) {
+            dap_chain_datum_t *l_datum = l_datums[l_datum_n];
+            if(!l_datum) { // || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) {
+                // go to next atom
+                //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
+                continue;
             }
+        /*dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
+        dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter);
+        size_t l_atom_size = a_chain->callback_atom_get_size(l_atom);
+        size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0;
+        while(l_atom && l_atom_size) {
+            dap_chain_datum_t *l_datum =
+                    a_chain->callback_atom_get_datum ?
+                            a_chain->callback_atom_get_datum(l_atom) : (dap_chain_datum_t*) l_atom;
+            if(!l_datum) {
+                // go to next transaction
+                l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter);
+                l_atom_size = a_chain->callback_atom_get_size(l_atom);
+                log_it(L_ERROR, "datum=NULL for atom=0x%x", l_atom);
+                continue;
+            }*/
+            char l_time_str[70];
+            // get time of create datum
+            if(dap_time_to_str_rfc822(l_time_str, 71, l_datum->header.ts_create) < 1)
+                l_time_str[0] = '\0';
+            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) {
+                            break;
+                    }
 
-            if(!a_filter_token_name || !dap_strcmp(l_token->ticker, a_filter_token_name)) {
-                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, "  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),
-                                l_token->header_private.signs_valid, l_token->header_private.signs_total);
-                        break;
-                    case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
-                        dap_string_append_printf(l_str_out, "  total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n",
-                                dap_chain_datoshi_to_coins(l_token->header_private.total_supply),
-                                l_token->header_private.total_supply,
-                                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",
-                                l_token->header_private_decl.tsd_total_size,
-                                l_token->header_private_decl.flags);
-                        break;
-                    case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL:
-                        dap_string_append_printf(l_str_out, "  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);
+                    dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
+                    //if(a_datum_start < 0 || (l_datum_num >= a_datum_start && l_datum_num < a_datum_end))
+                    // 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_token_num++;
                         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);
-                        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);
-                        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),
-                                l_token->header_public.flags,
-                                dap_chain_u256tostr(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);
-                        dap_string_append_printf(l_str_out,
-                                " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                dap_chain_datoshi_to_coins(l_token->header_public.total_supply),
-                                dap_chain_balance_print(l_token->header_public.total_supply),
-                                l_token->header_public.flags,
-                                dap_chain_balance_print(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);
-                        break;
-
-                }
-                dap_string_append_printf(l_str_out, "\n");
-                l_token_num++;
-            }
-        }
-            break;
+                    }
+                    if(!a_filter_token_name || !dap_strcmp(l_token->ticker, a_filter_token_name)) {
+                        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, "  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),
+                                        l_token->header_private.signs_valid, l_token->header_private.signs_total);
+                                break;
+                            case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
+                                dap_string_append_printf(l_str_out, "  total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n",
+                                        dap_chain_datoshi_to_coins(l_token->header_private.total_supply),
+                                        l_token->header_private.total_supply,
+                                        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",
+                                        l_token->header_private_decl.tsd_total_size,
+                                        l_token->header_private_decl.flags);
+                                break;
+                            case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL:
+                                dap_string_append_printf(l_str_out, "  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;
+                            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);
+                                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);
+                                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),
+                                        l_token->header_public.flags,
+                                        dap_chain_u256tostr(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);
+                                dap_string_append_printf(l_str_out,
+                                        " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
+                                        dap_chain_datoshi_to_coins(l_token->header_public.total_supply),
+                                        dap_chain_balance_print(l_token->header_public.total_supply),
+                                        l_token->header_public.flags,
+                                        dap_chain_balance_print(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);
+                                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)) {
-                 l_token_num++;
-                 break;
-            }
-            size_t l_emission_size = dap_chain_datum_emission_get_size(l_datum->data);
-            dap_chain_datum_token_emission_t *l_token_em = dap_chain_datum_emission_read(l_datum->data, &l_emission_size);
-            if(!a_filter_token_name || !dap_strcmp(l_token_em->hdr.ticker, a_filter_token_name)) {
-                char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_em->hdr.address));
-                // filter for addr
-                if(dap_strcmp(a_filtr_addr_base58,l_token_emission_address_str)) {
-                     break;
+                        }
+                        dap_string_append_printf(l_str_out, "\n");
+                        l_token_num++;
+                    }
                 }
+                    break;
 
-                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),
-                        l_token_em->hdr.ticker,
-                        c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type],
-                        l_token_em->hdr.version);
-                } else
-                    dap_string_append_printf(l_str_out, "emission: %.0Lf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n",
-                        dap_chain_datoshi_to_coins(l_token_em->hdr.value),
-                        l_token_em->hdr.value,
-                        l_token_em->hdr.ticker,
-                        c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type],
-                        l_token_em->hdr.version);
-                
-                dap_string_append_printf(l_str_out, "  to addr: %s\n", l_token_emission_address_str);
-
-                DAP_DELETE(l_token_emission_address_str);
-                switch (l_token_em->hdr.type) {
-                    // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_UNDEFINED: // 256
-                    case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED:
-                        break;
-                    // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH: // 256
-                    case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH:
-                        dap_string_append_printf(l_str_out, "  signs_count: %d\n", l_token_em->data.type_auth.signs_count);
-                        break;
-                    // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ALGO: // 256
-                    case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO:
-                        dap_string_append_printf(l_str_out, "  codename: %s\n", l_token_em->data.type_algo.codename);
-                        break;
-                    // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ATOM_OWNER: // 256
-                    case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER:
+                // 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)) {
+                         l_token_num++;
+                         break;
+                    }
+                    size_t l_emission_size = dap_chain_datum_emission_get_size(l_datum->data);
+                    dap_chain_datum_token_emission_t *l_token_em = dap_chain_datum_emission_read(l_datum->data, &l_emission_size);
+                    if(!a_filter_token_name || !dap_strcmp(l_token_em->hdr.ticker, a_filter_token_name)) {
+                        char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_em->hdr.address));
+                        // filter for addr
+                        if(dap_strcmp(a_filtr_addr_base58,l_token_emission_address_str)) {
+                             break;
+                        }
                         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, "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),
+                                l_token_em->hdr.ticker,
+                                c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type],
+                                l_token_em->hdr.version);
+                        } else
+                            dap_string_append_printf(l_str_out, "emission: %.0Lf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n",
+                                dap_chain_datoshi_to_coins(l_token_em->hdr.value),
+                                l_token_em->hdr.value,
+                                l_token_em->hdr.ticker,
+                                c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type],
+                                l_token_em->hdr.version);
+                        dap_string_append_printf(l_str_out, "  to addr: %s\n", l_token_emission_address_str);
+
+                        DAP_DELETE(l_token_emission_address_str);
+                        switch (l_token_em->hdr.type) {
+                            // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_UNDEFINED: // 256
+                            case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED:
+                                break;
+                            // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH: // 256
+                            case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH:
+                                dap_string_append_printf(l_str_out, "  signs_count: %d\n", l_token_em->data.type_auth.signs_count);
+                                break;
+                            // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ALGO: // 256
+                            case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO:
+                                dap_string_append_printf(l_str_out, "  codename: %s\n", l_token_em->data.type_algo.codename);
+                                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
+                                    );
+                                }
+                            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
+                                if(dap_time_to_str_rfc822(l_time_str, 71, l_token_em->data.type_presale.lock_time) < 1)
+                                        l_time_str[0] = '\0';
+                                dap_string_append_printf(l_str_out, "  flags: 0x%x, lock_time: %s\n", l_token_em->data.type_presale.flags, l_time_str);
+                                dap_string_append_printf(l_str_out, "  addr: %s\n", l_addr);
+                                DAP_DELETE(l_addr);
+                            }
+                            break;
                         }
-                    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
-                        if(dap_time_to_str_rfc822(l_time_str, 71, l_token_em->data.type_presale.lock_time) < 1)
-                                l_time_str[0] = '\0';
-                        dap_string_append_printf(l_str_out, "  flags: 0x%x, lock_time: %s\n", l_token_em->data.type_presale.flags, l_time_str);
-                        dap_string_append_printf(l_str_out, "  addr: %s\n", l_addr);
-                        DAP_DELETE(l_addr);
+                        dap_string_append_printf(l_str_out, "\n");
+                        l_emission_num++;
                     }
-                    break;
+                    DAP_DELETE(l_token_em);
+                } break;
+
+                // transaction
+                case DAP_CHAIN_DATUM_TX:{
+                    // 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;
+                    //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);
                 }
-                dap_string_append_printf(l_str_out, "\n");
-                l_emission_num++;
-            }
-            DAP_DELETE(l_token_em);
-        } break;
-
-        // transaction
-        case DAP_CHAIN_DATUM_TX:{
-            // 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;
-            }
+                    break;
 
-            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;
 
-            // 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;
+                default:
+                    dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id);
+                    break;
+                }
+                l_datum_num++;
             }
-            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);
+            // go to next transaction
+            l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
+            //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter);
+            //l_atom_size = a_chain->callback_atom_get_size(l_atom);
         }
-            break;
-
-        default:
-            dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id);
-            break;
+        a_chain->callback_atom_iter_delete(l_atom_iter);
+        //total
+        dap_string_append_printf(l_str_out,
+                "---------------\ntokens: %zu\nemissions: %zu\ntransactions: %zu\ntotal datums: %zu", l_token_num,
+                l_emission_num, l_tx_num, l_datum_num);
+
+        // return total datums
+        if(a_total_datums)
+            *a_total_datums = l_datum_num;
+        // 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 datum
+            DAP_DELETE(l_iter_current->datum);
+            // delete struct
+            DAP_DELETE(l_iter_current);
         }
-        l_datum_num++;
-    }
-        // go to next transaction
-        l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
-        //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter);
-        //l_atom_size = a_chain->callback_atom_get_size(l_atom);
-    }
-    a_chain->callback_atom_iter_delete(l_atom_iter);
-    //total
-    dap_string_append_printf(l_str_out,
-            "---------------\ntokens: %zu\nemissions: %zu\ntransactions: %zu\ntotal datums: %zu", l_token_num,
-            l_emission_num, l_tx_num, l_datum_num);
-
-    // return total datums
-    if(a_total_datums)
-        *a_total_datums = l_datum_num;
-    // 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 datum
-        DAP_DELETE(l_iter_current->datum);
-        // delete struct
-        DAP_DELETE(l_iter_current);
-    }
+        l_cell = l_cell->hh.next;
+    } while (l_cell);
 
     // if no history
     if(!l_str_out->len)
@@ -1623,7 +1636,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
             dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-all' or '-addr' or '-w'");
             return -1;
         }
-
         // Select chain network
         if(!l_net_str) {
             dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-net'");
@@ -1635,7 +1647,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
                 return -3;
             }
         }
-
         //Select chain emission
         if(!l_chain_str) { // chain may be null -> then all chain use
             //dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-chain'");
@@ -1650,7 +1661,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
         }
         //char *l_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
         //const char *l_chain_group = dap_chain_gdb_get_group(l_chain);
-
         dap_chain_hash_fast_t l_tx_hash;
         if(l_tx_hash_str) {
             if(dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) {
@@ -1662,7 +1672,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
 //        dap_chain_hash_fast_to_str(&l_tx_hash, hash_str,99);
 //        int gsdgsd=523;
         }
-
         dap_chain_addr_t *l_addr = NULL;
         // if need addr
         if(l_wallet_name || l_addr_base58) {
@@ -1685,7 +1694,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
                 return -1;
             }
         }
-
         dap_string_t *l_str_ret = dap_string_new(NULL); //char *l_str_ret = NULL;
         dap_chain_t *l_chain_cur;
         void *l_chain_tmp = (void*)0x1;
@@ -1696,7 +1704,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
         // all chain
         else
             l_chain_cur = dap_chain_enum(&l_chain_tmp);
-
         while(l_chain_cur) {
 
             // only selected net
@@ -1708,18 +1715,15 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
                 char *l_str_out = NULL;
                 dap_string_append_printf(l_str_ret, "chain: %s\n", l_chain_cur->name);
                 dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(l_net_str);
-
                 if(l_is_all) {
                     // without filters
                     l_str_out = dap_db_history_filter(l_chain_cur, l_ledger, NULL, NULL, l_hash_out_type, -1, 0, NULL, l_list_tx_hash_processd);
                     dap_string_append_printf(l_str_ret, "all history:\n%s\n", l_str_out ? l_str_out : " empty");
                 }
                 else {
-
                     l_str_out = l_tx_hash_str ?
                                                 dap_db_history_tx(&l_tx_hash, l_chain_cur, l_hash_out_type) :
                                                 dap_db_history_addr(l_addr, l_chain_cur, l_hash_out_type);
-
                     if(l_tx_hash_str) {
                         dap_string_append_printf(l_str_ret, "history for tx hash %s:\n%s\n", l_tx_hash_str,
                                 l_str_out ? l_str_out : " empty");
@@ -1740,8 +1744,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
             dap_chain_enum_unlock();
             l_chain_cur = dap_chain_enum(&l_chain_tmp);
         }
-
-
         DAP_DELETE(l_addr);
         _dap_chain_tx_hash_processed_ht_free(l_list_tx_hash_processd);
         // all chain
@@ -1752,7 +1754,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
         return 0;
     }
     else if(l_cmd == CMD_LIST){
-
         enum {SUBCMD_NONE, SUBCMD_LIST_COIN};
         int l_sub_cmd = SUBCMD_NONE;
         if (dap_chain_node_cli_find_option_val(a_argv, 2, 3, "coins", NULL ))
@@ -1778,7 +1779,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
         dap_string_free(l_str_ret, true);
         return 0;
     } else if (l_cmd == CMD_TX_INFO){
-
         //GET hash
         dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-hash", &l_tx_hash_str);
         //get net
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 111f7fd5ab4b7d39508055e081e71e2315b5f446..2f599cd3b0e1b031953bce38261316f8e0f1b2da 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -233,7 +233,7 @@ static bool s_timer_update_states_callback(void *a_arg)
                         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);
                         dap_stream_ch_chain_pkt_write_unsafe(l_node_client->ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ,
-                                                             l_net->pub.id.uint64, 0, l_net->pub.cell_id.uint64,
+                                                             l_net->pub.id.uint64, 0, 0,
                                                              &l_sync_gdb, sizeof(l_sync_gdb));
                     }
                     return true;
@@ -667,7 +667,7 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no
     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, dap_cert_find_by_name("auth")); // TODO provide the certificate choice
+    dap_client_set_auth_cert(a_node_client->client, a_node_client->net->pub.name); // TODO provide the certificate choice
 
     int hostlen = 128;
     char host[hostlen];
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index e7e40be7532b8207727a0bd53802a41410b9b4cc..cb12d6ecd545535deb8fc1b4fd44c91ba9b81fff 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -67,7 +67,6 @@ static const char * g_net_state_str[]={
 typedef struct dap_chain_net{
     struct {
         dap_chain_net_id_t id;
-        dap_chain_cell_id_t cell_id; // Cell where the node is connected to. {{0}} if not celled(sharded) blockchain
         char * name;
         char * gdb_groups_prefix;
         char * gdb_nodes_aliases;
diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h
index 216d6a4261c130a77397d44fc5eecd8cc75856af..703175de5068982408b12d69a41216642fd1894e 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 shard id
+ * Generate node addr by net id
  */
-dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_t * l_net,dap_chain_cell_id_t *a_cell_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 *addr, dap_chain_cell_id_t *a_cell_id);
+bool dap_chain_node_check_addr(dap_chain_net_t * l_net, dap_chain_node_addr_t *a_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;
 }
 
-bool 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_node_role_t a_role, 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/srv/CMakeLists.txt b/modules/net/srv/CMakeLists.txt
index b6661c7f1b94abb872d0e6f63babbdaa7a086a32..399b0a433767971f7af42388381ad7e80c303885 100644
--- a/modules/net/srv/CMakeLists.txt
+++ b/modules/net/srv/CMakeLists.txt
@@ -18,6 +18,6 @@ endif()
 #endif()
 
 target_link_libraries(${NET_SRV_LIBS})
-target_include_directories(dap_chain_net_srv INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/uthash/src)
diff --git a/modules/service/app-db/CMakeLists.txt b/modules/service/app-db/CMakeLists.txt
index f6a7a7977d843e1bdf10796aa8c237534a916ec5..66ca6ade4273ae9e2e34d8d15795c869529401dc 100644
--- a/modules/service/app-db/CMakeLists.txt
+++ b/modules/service/app-db/CMakeLists.txt
@@ -7,7 +7,7 @@ file(GLOB DAP_CHAIN_NET_SRV_APP_DB_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_APP_DB_SRCS} ${DAP_CHAIN_NET_SRV_APP_DB_HEADERS})
 
-target_link_libraries(dap_chain_net_srv_app_db dap_chain_net_srv dap_chain_net_srv_app)
-target_include_directories(dap_chain_net_srv_app_db INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_chain_net_srv dap_chain_net_srv_app)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 
diff --git a/modules/service/app/CMakeLists.txt b/modules/service/app/CMakeLists.txt
index e69756a8d304d41eb5e220462288a86aead5c742..210374c2f42c6e5a616714fabdd788da5235e848 100644
--- a/modules/service/app/CMakeLists.txt
+++ b/modules/service/app/CMakeLists.txt
@@ -7,6 +7,6 @@ file(GLOB DAP_CHAIN_NET_SRV_APP_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_APP_SRCS} ${DAP_CHAIN_NET_SRV_APP_HEADERS})
 
-target_link_libraries(dap_chain_net_srv_app dap_core dap_crypto dap_chain dap_chain_net dap_chain_net_srv)
-target_include_directories(dap_chain_net_srv_app INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_net dap_chain_net_srv)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
diff --git a/modules/service/datum/CMakeLists.txt b/modules/service/datum/CMakeLists.txt
index dc38274497865096fdd8e21bb576dc99cf373ef0..62ad4a0ba48cf1603be5e5a9d22959f881683498 100644
--- a/modules/service/datum/CMakeLists.txt
+++ b/modules/service/datum/CMakeLists.txt
@@ -7,7 +7,7 @@ file(GLOB DAP_CHAIN_NET_SRV_DATUM_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_DATUM_SRCS} ${DAP_CHAIN_NET_SRV_DATUM_HEADERS})
 
-target_link_libraries(dap_chain_net_srv_datum dap_chain_net_srv)
-target_include_directories(dap_chain_net_srv_datum INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_chain_net_srv)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 
diff --git a/modules/service/mining-pool/CMakeLists.txt b/modules/service/mining-pool/CMakeLists.txt
index 6a66f485f3affa09480ab6930c8b3f153c44afd5..7db0c520a52b763772d313a21ec2d1a0ff55540e 100644
--- a/modules/service/mining-pool/CMakeLists.txt
+++ b/modules/service/mining-pool/CMakeLists.txt
@@ -6,7 +6,7 @@ file(GLOB DAP_CHAIN_NET_SRV_DATUM_POOL_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_DATUM_POOL_SRCS} ${DAP_CHAIN_NET_SRV_DATUM_POOL_HEADERS})
 
-target_link_libraries(dap_chain_net_srv_datum_pool dap_chain_net_srv dap_chain_net_srv_datum)
-target_include_directories(dap_chain_net_srv_datum_pool INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_chain_net_srv dap_chain_net_srv_datum)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 
diff --git a/modules/service/stake/CMakeLists.txt b/modules/service/stake/CMakeLists.txt
index e6217cf00995e909380b99444018ef70a5235501..99474583910ad884edbd0326202522816a11ced1 100644
--- a/modules/service/stake/CMakeLists.txt
+++ b/modules/service/stake/CMakeLists.txt
@@ -7,6 +7,6 @@ file(GLOB DAP_SRV_STAKE_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_SRV_STAKE_SRCS} ${DAP_SRV_STAKE_HEADERS})
 
-target_include_directories(dap_chain_crypto INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv dap_chain_cs_dag_poa dap_chain_cs_block_poa)
diff --git a/modules/service/xchange/CMakeLists.txt b/modules/service/xchange/CMakeLists.txt
index 82d036e96bc5d37317cd91cb7ad5d5df4bc53515..c6b509051eb664c3ea4dba7b4939eda69681aca8 100644
--- a/modules/service/xchange/CMakeLists.txt
+++ b/modules/service/xchange/CMakeLists.txt
@@ -7,6 +7,6 @@ file(GLOB DAP_SRV_XCHANGE_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_SRV_XCHANGE_SRCS} ${DAP_SRV_XCHANGE_HEADERS})
 
-target_include_directories(dap_chain_crypto INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv)
diff --git a/modules/test/CMakeLists.txt b/modules/test/CMakeLists.txt
index 70e543e45b934bcc5d43a765db96d620a4af9280..b48617d0f087fa6a5e14e6113595548353fe63cb 100644
--- a/modules/test/CMakeLists.txt
+++ b/modules/test/CMakeLists.txt
@@ -6,4 +6,4 @@ project(dap_test)
 
 add_library(${PROJECT_NAME} STATIC dap_test.h dap_test.c dap_test_generator.h dap_test_generator.c)
 
-target_include_directories(dap_test INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
diff --git a/modules/type/blocks/CMakeLists.txt b/modules/type/blocks/CMakeLists.txt
index 44f0787add4f670f935894cffad47fbe58c4a33b..0c377cec8c870d5b1959ac79eadfad106d78e0a6 100644
--- a/modules/type/blocks/CMakeLists.txt
+++ b/modules/type/blocks/CMakeLists.txt
@@ -7,6 +7,6 @@ file(GLOB DAP_CHAIN_BLOCK_HEADERS include/*.h)
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_BLOCK_SRCS} ${DAP_CHAIN_BLOCK_HEADERS})
 
 
-target_link_libraries(dap_chain_cs_blocks dap_core dap_crypto dap_chain )
-target_include_directories(dap_chain_cs_blocks INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain )
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index b001560403b5fdb3e0663f522bee85936afae056..192b6211fb370cc1a792388ab7737ae8903068ed 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 );
+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,7 +456,13 @@ 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
-            l_block = (dap_chain_block_t*) dap_chain_get_atom_by_hash( l_chain, &l_block_hash, &l_block_size);
+            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);
             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 ){
@@ -903,10 +909,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 )
+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->_inheritor = DAP_NEW_Z(dap_chain_cs_blocks_iter_t);
     ITER_PVT(l_atom_iter)->blocks = DAP_CHAIN_CS_BLOCKS(a_chain);
 
@@ -925,7 +932,7 @@ static dap_chain_atom_iter_t* s_callback_atom_iter_create_from(dap_chain_t * a_c
     if (a_atom && a_atom_size){
         dap_chain_hash_fast_t l_atom_hash;
         dap_hash_fast(a_atom, a_atom_size, &l_atom_hash);
-        dap_chain_atom_iter_t * l_atom_iter = s_callback_atom_iter_create(a_chain);
+        dap_chain_atom_iter_t * l_atom_iter = s_callback_atom_iter_create(a_chain, a_chain->cells->id);
         if (l_atom_iter){
             dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain);
             l_atom_iter->cur_item = ITER_PVT(l_atom_iter)->cache = dap_chain_block_cs_cache_get_by_hash(l_blocks, &l_atom_hash);
@@ -1156,8 +1163,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 = l_net->pub.cell_id.uint64;
+        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;
     }
     for (size_t i = 0; i < a_datums_count; i++) {
diff --git a/modules/type/dag/CMakeLists.txt b/modules/type/dag/CMakeLists.txt
index 7ba78b85c68258118ad2b67a6b64c8ff1052c7be..d4912385dcf81e7f0630642cecb0109f70bf244a 100644
--- a/modules/type/dag/CMakeLists.txt
+++ b/modules/type/dag/CMakeLists.txt
@@ -5,7 +5,7 @@ file(GLOB DAP_CHAIN_DAG_SRCS *.c)
 file(GLOB DAP_CHAIN_DAG_HEADERS include/*.h)
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DAG_SRCS} ${DAP_CHAIN_DAG_HEADERS})
 
-target_link_libraries(dap_chain_cs_dag dap_core dap_crypto dap_chain dap_chain_net dap_chain_global_db)
-target_include_directories(dap_chain_cs_dag INTERFACE .)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_net dap_chain_global_db)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../3rdparty/uthash/src)
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index dbccc2d4d5e2a7685a65d484b9ab6ce92f88b116..c9b8a95cbe473211080b0d48e85cb415eda38ac2 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -89,7 +89,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_add_from_treshold(dap_chain_t
 static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t , size_t);                   //    Verify new event in dag
 static size_t s_chain_callback_atom_get_static_hdr_size(void);                               //    Get dag event header size
 
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain );
+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_from(dap_chain_t *  ,
                                                                      dap_chain_atom_ptr_t , size_t);
 
@@ -203,13 +203,6 @@ 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;
 
@@ -513,12 +506,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
     dap_chain_hash_fast_t * l_hashes = l_hashes_size ?DAP_NEW_Z_SIZE(dap_chain_hash_fast_t,
                                              sizeof(dap_chain_hash_fast_t) * l_hashes_size) : NULL;
     size_t l_hashes_linked = 0;
-    dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id);
-    dap_chain_cell_id_t l_cell_id = {
-        .uint64 = l_net ? l_net->pub.cell_id.uint64 : 0
-    };
-    dap_chain_cell_t *l_cell = dap_chain_cell_find_by_id(a_chain, l_cell_id);
-
+    dap_chain_cell_t *l_cell = NULL;
     for (size_t d = 0; d <a_datums_count ; d++){
         dap_chain_datum_t * l_datum = a_datums[d];
         if(l_datum == NULL){ // Was wrong datum thats not passed checks
@@ -594,11 +582,9 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
                 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_dag->is_add_directy) {
+                    l_cell = a_chain->cells;
                     if (s_chain_callback_atom_add(a_chain, l_event, l_event_size) == ATOM_ACCEPT) {
                         // add events to file
-                        if (!l_cell) {
-                            l_cell = dap_chain_cell_create_fill(a_chain, l_cell_id);
-                        }
                         if (dap_chain_cell_file_append(l_cell, l_event, l_event_size )  < 0) {
                             log_it(L_ERROR, "Can't add new event to the file '%s'", l_cell->file_storage_path);
                             continue;
@@ -612,7 +598,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(l_cell, l_atom_treshold, l_atom_treshold_size);
+                                    int l_res = dap_chain_cell_file_append(a_chain->cells, 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]");
@@ -671,9 +657,8 @@ 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;
 }
@@ -989,10 +974,11 @@ 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 )
+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;
+    l_atom_iter->cell_id = a_cell_id;
     pthread_rwlock_rdlock(&a_chain->atoms_rwlock);
 #ifdef WIN32
     log_it(L_DEBUG, "! Create caller id %lu", GetThreadId(GetCurrentThread()));
@@ -1037,7 +1023,14 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
     assert(l_dag);
     dap_chain_cs_dag_pvt_t *l_dag_pvt = PVT(l_dag);
     assert(l_dag_pvt);
-    a_atom_iter->cur_item = l_dag_pvt->events;
+    a_atom_iter->cur_item = NULL;
+    dap_chain_cs_dag_event_item_t *l_item_tmp, *l_item_cur;
+    HASH_ITER(hh, l_dag_pvt->events, l_item_cur, l_item_tmp) {
+        if (l_item_cur->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) {
+            a_atom_iter->cur_item = l_item_cur;
+            break;
+        }
+    }
     if ( a_atom_iter->cur_item ){
         a_atom_iter->cur = ((dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item)->event;
         a_atom_iter->cur_size = ((dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item)->event_size;
@@ -1185,21 +1178,20 @@ static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chai
  */
 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 )
 {
-    if (a_atom_iter->cur ){
-        //dap_chain_cs_dag_pvt_t* l_dag_pvt = PVT(DAP_CHAIN_CS_DAG(a_atom_iter->chain));
-        dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item;
-        a_atom_iter->cur_item = l_event_item->hh.next;
-        l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item;
-        // if l_event_item=NULL then items are over
-        a_atom_iter->cur = l_event_item ? l_event_item->event : NULL;
-        a_atom_iter->cur_size = a_atom_iter->cur ? l_event_item->event_size : 0;
-        a_atom_iter->cur_hash = l_event_item ? &l_event_item->hash : NULL;
-        if(a_atom_size)
-            *a_atom_size = a_atom_iter->cur_size;
-        return a_atom_iter->cur;
-    }else
-        return NULL;
-
+    dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item;
+    while (l_event_item) {
+        l_event_item = (dap_chain_cs_dag_event_item_t *)l_event_item->hh.next;
+        if (l_event_item && l_event_item->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64)
+            break;
+    }
+    // if l_event_item=NULL then items are over
+    a_atom_iter->cur_item = l_event_item;
+    a_atom_iter->cur = l_event_item ? l_event_item->event : NULL;
+    a_atom_iter->cur_size = a_atom_iter->cur ? l_event_item->event_size : 0;
+    a_atom_iter->cur_hash = l_event_item ? &l_event_item->hash : NULL;
+    if(a_atom_size)
+        *a_atom_size = a_atom_iter->cur_size;
+    return a_atom_iter->cur;
 }
 
 /**
@@ -1350,24 +1342,16 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply)
             }
             // write events to file and delete events from db
             if(l_list_to_del) {
-                dap_chain_cell_id_t l_cell_id = {
-                    .uint64 = l_net ? l_net->pub.cell_id.uint64 : 0
-                };
-                dap_chain_cell_t *l_cell = dap_chain_cell_find_by_id(l_chain, l_cell_id);
-                if (!l_cell)
-                    l_cell = dap_chain_cell_create_fill(l_chain, l_cell_id);
-                if(l_cell) {
-                    if(dap_chain_cell_file_update(l_cell) > 0) {
-                        // delete events from db
-                        dap_list_t *l_list_tmp = l_list_to_del;
-                        while(l_list_tmp) {
-                            char *l_key = strdup((char*) l_list_tmp->data);
-                            dap_chain_global_db_gr_del(l_key, l_dag->gdb_group_events_round_new);
-                            l_list_tmp = dap_list_next(l_list_tmp);
-                        }
+                if (dap_chain_cell_file_update(l_chain->cells) > 0) {
+                    // delete events from db
+                    dap_list_t *l_list_tmp = l_list_to_del;
+                    while(l_list_tmp) {
+                        char *l_key = strdup((char*) l_list_tmp->data);
+                        dap_chain_global_db_gr_del(l_key, l_dag->gdb_group_events_round_new);
+                        l_list_tmp = dap_list_next(l_list_tmp);
                     }
                 }
-                dap_chain_cell_close(l_cell);
+                dap_chain_cell_close(l_chain->cells);
                 dap_list_free(l_list_to_del);
             }
 
diff --git a/modules/wallet/CMakeLists.txt b/modules/wallet/CMakeLists.txt
index 65e9b46203484dadf47906ee5895639539a9d70f..4d61a3b9f8bb7201f8ac88c5cc54a4549f817732 100644
--- a/modules/wallet/CMakeLists.txt
+++ b/modules/wallet/CMakeLists.txt
@@ -6,7 +6,7 @@ file(GLOB DAP_CHAIN_WALLET_HEADERS include/*.h)
 
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_WALLET_SRCS} ${DAP_CHAIN_WALLET_HEADERS})
 
-target_link_libraries(dap_chain_wallet dap_core dap_crypto dap_chain dap_chain_net)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_net)
 
-target_include_directories(dap_chain_wallet INTERFACE .)
+target_include_directories(${PROJECT_NAME} INTERFACE .)
 target_include_directories(${PROJECT_NAME} PUBLIC include)