diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h
index c40a3791fd59dddad6d5c92ac320d8623aa972b2..c1389199a3785207478d4d94f0faf1efa61d2ea8 100755
--- a/dap-sdk/core/include/dap_common.h
+++ b/dap-sdk/core/include/dap_common.h
@@ -162,6 +162,20 @@ DAP_STATIC_INLINE void _dap_aligned_free( void *ptr )
 
 #define DAP_PROTOCOL_VERSION  22
 
+#if __SIZEOF_LONG__==8
+#define DAP_UINT64_FORMAT_X  "lX"
+#define     DAP_UINT64_FORMAT_x  "lx"
+#define DAP_UINT64_FORMAT_u  "lu"
+#define DAP_UINT64_FORMAT_U  "lU"
+#elif __SIZEOF_LONG__==4
+#define DAP_UINT64_FORMAT_X  "llX"
+#define DAP_UINT64_FORMAT_x  "llx"
+#define DAP_UINT64_FORMAT_u  "llu"
+#define DAP_UINT64_FORMAT_U  "llU"
+#else
+#error "DAP_UINT64_FORMAT_* are undefined for your platform"
+#endif
+
 #ifndef LOWORD
   #define LOWORD( l ) ((uint16_t) (((uintptr_t) (l)) & 0xFFFF))
   #define HIWORD( l ) ((uint16_t) ((((uintptr_t) (l)) >> 16) & 0xFFFF))
diff --git a/dap-sdk/crypto/src/dap_enc_base58.c b/dap-sdk/crypto/src/dap_enc_base58.c
index a8538a9b97132b8758bf6d5819c6d7d8872e01d4..acbfe8fcc550e359a81542ea00ab35564fe77636 100755
--- a/dap-sdk/crypto/src/dap_enc_base58.c
+++ b/dap-sdk/crypto/src/dap_enc_base58.c
@@ -27,6 +27,8 @@
 #include <stdint.h>
 #include <string.h>
 #include "dap_common.h"
+#include "dap_strfuncs.h"
+#include "dap_string.h"
 #include "dap_enc_base58.h"
 
 #define LOG_TAG "dap_enc_base58"
@@ -225,7 +227,7 @@ char* dap_enc_base58_from_hex_str_to_str(const char *a_in_str)
         return NULL;
     // from "0x..." to binary
     char *l_out_str = DAP_NEW_Z_SIZE(char, a_in_hash_len / 2 + 1);
-    size_t len = dap_hex2bin(l_out_str, a_in_str+2, a_in_hash_len-2);
+    size_t len = dap_hex2bin((uint8_t*)l_out_str, a_in_str+2, a_in_hash_len-2);
     // from binary to base58
     char *l_base58_out = dap_enc_base58_encode_to_str(l_out_str, len/2);
     DAP_DELETE(l_out_str);
diff --git a/dap-sdk/crypto/src/dap_enc_base64.c b/dap-sdk/crypto/src/dap_enc_base64.c
index b0f1351cead5ee1bb8329ec6fd6b50dbddbfa74d..b8d0c05783fca79606da4e7d5ecc6d3f86a26626 100755
--- a/dap-sdk/crypto/src/dap_enc_base64.c
+++ b/dap-sdk/crypto/src/dap_enc_base64.c
@@ -288,7 +288,7 @@ char * dap_enc_strdup_from_base64(const char * a_string_base64){
     if(!l_string_base64_len)
         return NULL;
 
-    char * l_string = DAP_NEW_Z_SIZE(byte_t, l_string_base64_len * 2);
+    char * l_string = DAP_NEW_Z_SIZE(char, l_string_base64_len * 2);
     size_t l_string_len = dap_enc_base64_decode(a_string_base64, l_string_base64_len, l_string, DAP_ENC_DATA_TYPE_B64_URLSAFE);
 
     if(!l_string_len){
diff --git a/dap-sdk/crypto/src/dap_enc_iaes.c b/dap-sdk/crypto/src/dap_enc_iaes.c
index 0e4df9e74a1add551155ec2a531c2b0d27f5e567..29ef751860de7e58f12962727451d8b7b8d6981f 100755
--- a/dap-sdk/crypto/src/dap_enc_iaes.c
+++ b/dap-sdk/crypto/src/dap_enc_iaes.c
@@ -105,8 +105,8 @@ size_t dap_enc_iaes256_cbc_decrypt_fast(struct dap_enc_key * a_key, const void *
     memcpy(&feedback[0], DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE);
     memcpy(priv_key_swapped_endian, a_key->priv_key_data, sizeof(priv_key_swapped_endian));
 
-    swap_endian(priv_key_swapped_endian, sizeof(priv_key_swapped_endian)/sizeof(uint32_t));
-    Key_Shedule_for_decrypT(priv_key_swapped_endian, round_decrypt_key);
+    swap_endian((uint32_t*)priv_key_swapped_endian, sizeof(priv_key_swapped_endian)/sizeof(uint32_t));
+    Key_Shedule_for_decrypT((uint32_t*)priv_key_swapped_endian, round_decrypt_key);
 
     void *data = buf_out;
     const void *cdata = a_in;
diff --git a/dap-sdk/net/client/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c
index 3ca5ee9ddd49a2fc02c56ee10ffb654de1bab29d..6b6e39d2dbde4e15fd0626db98e5f0f5a8c7b0c8 100644
--- a/dap-sdk/net/client/dap_client_http.c
+++ b/dap-sdk/net/client/dap_client_http.c
@@ -219,7 +219,7 @@ static void s_http_read(dap_events_socket_t * a_es, void * arg)
  * @param a_es
  * @param arg
  */
-static void s_http_error(dap_events_socket_t * a_es, void * arg)
+static void s_http_error(dap_events_socket_t * a_es, int arg)
 {
     log_it(L_INFO, "http client error");
     dap_client_http_internal_t * l_client_http_internal = DAP_CLIENT_HTTP(a_es);
@@ -228,7 +228,7 @@ static void s_http_error(dap_events_socket_t * a_es, void * arg)
         return;
     }
     if(l_client_http_internal->error_callback)
-        l_client_http_internal->error_callback((int)arg, l_client_http_internal->obj);
+        l_client_http_internal->error_callback(arg, l_client_http_internal->obj);
 
     // close connection
     a_es->kill_signal = true;
diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c
index 674e6b5e9858bc643e701abd89d2e514ac5b44f2..1404f7e32f9289dd13e6e782969a0e7199362909 100644
--- a/dap-sdk/net/client/dap_client_pvt.c
+++ b/dap-sdk/net/client/dap_client_pvt.c
@@ -99,7 +99,7 @@ void m_request_error(int, void *);
 void m_es_stream_delete(dap_events_socket_t * a_es, void * arg);
 void m_es_stream_read(dap_events_socket_t * a_es, void * arg);
 void m_es_stream_write(dap_events_socket_t * a_es, void * arg);
-void m_es_stream_error(dap_events_socket_t * a_es, void * arg);
+void m_es_stream_error(dap_events_socket_t * a_es, int a_arg);
 
 /**
  * @brief dap_client_internal_init
@@ -1313,7 +1313,7 @@ void m_es_stream_write(dap_events_socket_t * a_es, void * arg)
     }
 }
 
-void m_es_stream_error(dap_events_socket_t * a_es, void * arg)
+void m_es_stream_error(dap_events_socket_t * a_es, int a_arg)
 {
     //dap_client_t * l_client = DAP_CLIENT(a_es);
     //dap_client_pvt_t * l_client_pvt = (l_client) ? DAP_CLIENT_PVT(l_client) : NULL;
@@ -1322,6 +1322,6 @@ void m_es_stream_error(dap_events_socket_t * a_es, void * arg)
         log_it(L_ERROR, "m_es_stream_error: l_client_pvt is NULL!");
         return;
     }
-    log_it(L_INFO, "m_es_stream_error");
+    log_it(L_INFO, "m_es_stream_error: code %d", a_arg);
 }
 
diff --git a/dap-sdk/net/client/include/dap_client_http.h b/dap-sdk/net/client/include/dap_client_http.h
index ebf0df092b03f074debaa5d35b05249998485cb8..ec17cdbae2c758b2f40896b1ab2b0ac2517ea314 100644
--- a/dap-sdk/net/client/include/dap_client_http.h
+++ b/dap-sdk/net/client/include/dap_client_http.h
@@ -22,7 +22,7 @@
 #pragma once
 
 #include <stdint.h>
-
+#include <stddef.h>
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c
index 5f5f5e417b4cad383d6ce69206617df9a4db50f7..064a1fa693cf7961fc9c75c01442d2e0c47b0590 100644
--- a/dap-sdk/net/core/dap_server.c
+++ b/dap-sdk/net/core/dap_server.c
@@ -59,7 +59,7 @@
 #define LOG_TAG "dap_server"
 
 static void s_es_server_accept(dap_events_socket_t *a_es, int a_remote_socket, struct sockaddr* a_remote_addr);
-static void s_es_server_error(dap_events_socket_t *a_es, void * a_arg);
+static void s_es_server_error(dap_events_socket_t *a_es, int a_arg);
 static void s_es_server_new(dap_events_socket_t *a_es, void * a_arg);
 
 static void s_server_delete(dap_server_t * a_server);
@@ -193,6 +193,8 @@ static void s_es_server_new(dap_events_socket_t *a_es, void * a_arg)
 {
     log_it(L_DEBUG, "Created server socket %p on worker %u", a_es, a_es->worker->id);
     dap_server_t *l_server = (dap_server_t*) a_es->_inheritor;
+    pthread_mutex_lock( &l_server->started_mutex);
+    pthread_mutex_unlock( &l_server->started_mutex);
     pthread_cond_broadcast( &l_server->started_cond);
 }
 
@@ -201,7 +203,7 @@ static void s_es_server_new(dap_events_socket_t *a_es, void * a_arg)
  * @param a_es
  * @param a_arg
  */
-static void s_es_server_error(dap_events_socket_t *a_es, void * a_arg)
+static void s_es_server_error(dap_events_socket_t *a_es, int a_arg)
 {
     (void) a_arg;
     (void) a_es;
diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c
index 420057c06a31abe110435b465c86b313639a626f..f849d65513dfe62920877654d0710b7e3b921fef 100644
--- a/dap-sdk/net/core/dap_worker.c
+++ b/dap-sdk/net/core/dap_worker.c
@@ -150,7 +150,7 @@ void *dap_worker_thread(void *arg)
                     default: ;
                 }
                 l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE;
-                l_cur->callbacks.error_callback(l_cur, NULL); // Call callback to process error event
+                l_cur->callbacks.error_callback(l_cur, 0); // Call callback to process error event
             }
 
             if (l_epoll_events[n].events & EPOLLRDHUP) {
@@ -494,7 +494,7 @@ static void s_socket_all_check_activity( void * a_arg)
             if ( !l_es->kill_signal && l_curtime >=  (time_t)l_es->last_time_active + s_connection_timeout && !l_es->no_close ) {
                 log_it( L_INFO, "Socket %u timeout, closing...", l_es->socket );
                 if (l_es->callbacks.error_callback) {
-                    l_es->callbacks.error_callback(l_es, (void *)ETIMEDOUT);
+                    l_es->callbacks.error_callback(l_es, ETIMEDOUT);
                 }
                 dap_events_socket_remove_and_delete_mt( l_worker, l_es);
             }
diff --git a/dap-sdk/net/core/include/dap_events.h b/dap-sdk/net/core/include/dap_events.h
index deb9b0e516e6f4f6c834344b2d4f81c371246e92..4ba95b55293f78c93945887eb2cd7429d1e48c1d 100644
--- a/dap-sdk/net/core/include/dap_events.h
+++ b/dap-sdk/net/core/include/dap_events.h
@@ -22,7 +22,7 @@
     along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
 */
 #pragma once
-
+#include <pthread.h>
 #include "uthash.h"
 #include "dap_events_socket.h"
 #include "dap_server.h"
diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h
index 83f6627ab7ecffa5e4ab64594999748a3db10c08..a5a0c39890592820b3fb48574387135282c037ab 100644
--- a/dap-sdk/net/core/include/dap_events_socket.h
+++ b/dap-sdk/net/core/include/dap_events_socket.h
@@ -72,6 +72,7 @@ typedef struct dap_worker dap_worker_t;
 
 typedef struct dap_server dap_server_t;
 typedef void (*dap_events_socket_callback_t) (dap_events_socket_t *,void * ); // Callback for specific client operations
+typedef void (*dap_events_socket_callback_error_t) (dap_events_socket_t *, int ); // Callback for specific client operations
 typedef void (*dap_events_socket_callback_queue_t) (dap_events_socket_t *,const void * , size_t); // Callback for specific client operations
 typedef void (*dap_events_socket_callback_event_t) (dap_events_socket_t *, uint64_t); // Callback for specific client operations
 typedef void (*dap_events_socket_callback_pipe_t) (dap_events_socket_t *,const void * , size_t); // Callback for specific client operations
@@ -95,7 +96,7 @@ typedef struct dap_events_socket_callbacks {
     dap_events_socket_callback_t delete_callback; // Delete client callback
     dap_events_socket_callback_t read_callback; // Read function
     dap_events_socket_callback_t write_callback; // Write function
-    dap_events_socket_callback_t error_callback; // Error processing function
+    dap_events_socket_callback_error_t error_callback; // Error processing function
 
     dap_events_socket_worker_callback_t worker_assign_callback; // After successful worker assign
     dap_events_socket_worker_callback_t worker_unassign_callback; // After successful worker unassign
diff --git a/dap-sdk/net/server/http_server/dap_http.c b/dap-sdk/net/server/http_server/dap_http.c
index 5246f0b5fe7183cd6aadc618fff7cd7cf89cd82a..d28c653537df9cd4a78b4d8b1d61fe121fa7eaa6 100644
--- a/dap-sdk/net/server/http_server/dap_http.c
+++ b/dap-sdk/net/server/http_server/dap_http.c
@@ -144,7 +144,7 @@ void dap_http_add_proc(dap_http_t *sh, const char *url_path, void *internal
                       ,dap_http_client_callback_t headers_write_callback
                       ,dap_http_client_callback_t data_read_callback
                       ,dap_http_client_callback_t data_write_callback
-                      ,dap_http_client_callback_t error_callback
+                      ,dap_http_client_callback_error_t error_callback
 
                       )
 {
diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_client.c b/dap-sdk/net/server/http_server/http_client/dap_http_client.c
index ac0b171d04854632575f29e8c53cfe045d823b2f..9d10fffe5d7b69d629b2614d7c29da1bf6e34ece 100644
--- a/dap-sdk/net/server/http_server/http_client/dap_http_client.c
+++ b/dap-sdk/net/server/http_server/http_client/dap_http_client.c
@@ -635,7 +635,7 @@ void dap_http_client_out_header_generate(dap_http_client_t *cl_ht)
  * @param cl HTTP Client instance
  * @param arg Additional argument (usualy not used)
  */
-void dap_http_client_error( dap_events_socket_t *cl, void *arg )
+void dap_http_client_error( dap_events_socket_t *cl, int arg )
 {
   (void) arg;
 
diff --git a/dap-sdk/net/server/http_server/http_client/include/dap_http_client.h b/dap-sdk/net/server/http_server/http_client/include/dap_http_client.h
index f0e42c77b068588b9986951a0650923c96b54860..864233216d48cfb1fda03baacfcb1c1b2f909bb7 100644
--- a/dap-sdk/net/server/http_server/http_client/include/dap_http_client.h
+++ b/dap-sdk/net/server/http_server/http_client/include/dap_http_client.h
@@ -35,6 +35,7 @@ typedef enum dap_http_client_state{
 } dap_http_client_state_t;
 
 typedef void (*dap_http_client_callback_t) (struct dap_http_client *,void * arg); // Callback for specific client operations
+typedef void (*dap_http_client_callback_error_t) (struct dap_http_client *,int); // Callback for specific client operations
 
 typedef struct dap_http_client
 {
@@ -88,7 +89,7 @@ void dap_http_client_delete( dap_events_socket_t * cl,void *arg ); // Free memor
 
 void dap_http_client_read( dap_events_socket_t * cl,void *arg ); // Process read event
 void dap_http_client_write( dap_events_socket_t * cl,void *arg ); // Process write event
-void dap_http_client_error( dap_events_socket_t * cl,void *arg ); // Process error event
+void dap_http_client_error( dap_events_socket_t * cl,int arg ); // Process error event
 void dap_http_client_out_header_generate( dap_http_client_t *cl_ht );
 
 #ifdef __cplusplus
diff --git a/dap-sdk/net/server/http_server/include/dap_http.h b/dap-sdk/net/server/http_server/include/dap_http.h
index 0dd9e5bd0e6ae227513db9a14e3e77478e9a5cc6..0d1fcfb84f5ff0d6ddc30451e8f225c2537cc974 100644
--- a/dap-sdk/net/server/http_server/include/dap_http.h
+++ b/dap-sdk/net/server/http_server/include/dap_http.h
@@ -45,7 +45,7 @@ typedef struct dap_http_url_proc{
 
     dap_http_client_callback_t data_read_callback;
     dap_http_client_callback_t data_write_callback;
-    dap_http_client_callback_t error_callback;
+    dap_http_client_callback_error_t error_callback;
 
     dap_http_client_callback_t access_callback;
 
@@ -75,5 +75,5 @@ void dap_http_add_proc(dap_http_t *sh, const char *url_path, void *internal
                              ,dap_http_client_callback_t headers_write_callback
                              ,dap_http_client_callback_t data_read_callback
                              ,dap_http_client_callback_t data_write_callback
-                             ,dap_http_client_callback_t error_callback ); // Add custom procesor for the HTTP server
+                             ,dap_http_client_callback_error_t error_callback ); // Add custom procesor for the HTTP server
 
diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index dd0910e8f6d156746a39d7f02766a4ed672533ac..b7d05539b15f8fd2de45a09918ff039f52b82cfa 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -24,7 +24,7 @@
 #include <dap_chain_ledger.h>
 #include <sys/types.h>
 #include <dirent.h>
-
+#include <stdc-predef.h>
 #include <unistd.h>
 
 #include "dap_common.h"
@@ -255,9 +255,9 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha
 
             // Recognize chains id
             if ( (l_chain_id_str = dap_config_get_item_str(l_cfg,"chain","id")) != NULL ){
-                if ( sscanf(l_chain_id_str,"0x%016llX",& l_chain_id_u ) !=1 ){
-                    if ( sscanf(l_chain_id_str,"0x%016llx",&l_chain_id_u) !=1 ) {
-                        if ( sscanf(l_chain_id_str,"%llu",&l_chain_id_u ) !=1 ){
+                if ( sscanf(l_chain_id_str,"0x%"DAP_UINT64_FORMAT_X,& l_chain_id_u ) !=1 ){
+                    if ( sscanf(l_chain_id_str,"0x%"DAP_UINT64_FORMAT_x,&l_chain_id_u) !=1 ) {
+                        if ( sscanf(l_chain_id_str,"%"DAP_UINT64_FORMAT_u,&l_chain_id_u ) !=1 ){
                             log_it (L_ERROR,"Can't recognize '%s' string as chain net id, hex or dec",l_chain_id_str);
                             dap_config_close(l_cfg);
                             return NULL;
@@ -269,7 +269,7 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha
 
 
             if (l_chain_id_str ) {
-                log_it (L_NOTICE, "Chain id 0x%016lX  ( \"%s\" )",l_chain_id.uint64 , l_chain_id_str) ;
+                log_it (L_NOTICE, "Chain id 0x%016"DAP_UINT64_FORMAT_x"  ( \"%s\" )",l_chain_id.uint64 , l_chain_id_str) ;
             }else {
                 log_it (L_ERROR,"Wasn't recognized '%s' string as chain net id, hex or dec",l_chain_id_str);
                 dap_config_close(l_cfg);
diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c
index 4d7f76f0aa01c735677f9d345b2e5ccd78bfb01a..cb84cba7ab0887ef6f28847e2e6d44d04e95df0d 100644
--- a/modules/chain/dap_chain_cell.c
+++ b/modules/chain/dap_chain_cell.c
@@ -134,7 +134,7 @@ int dap_chain_cell_load(dap_chain_t * a_chain, const char * a_cell_file_path)
                         if ( l_element_size > 0 ){
                             dap_chain_atom_ptr_t * l_element = DAP_NEW_Z_SIZE (dap_chain_atom_ptr_t, l_element_size );
                             if ( fread( l_element,1,l_element_size,l_cell->file_storage ) == l_element_size ) {
-                                a_chain->callback_atom_add (a_chain, l_element );
+                                a_chain->callback_atom_add (a_chain, l_element, l_element_size);
                             }
                         } else {
                             log_it (L_ERROR, "Zero element size, file is corrupted");
@@ -270,13 +270,12 @@ int dap_chain_cell_file_update( dap_chain_cell_t * a_cell)
     if ( a_cell->file_storage ){
         dap_chain_t * l_chain = a_cell->chain;
         dap_chain_atom_iter_t *l_atom_iter = l_chain->callback_atom_iter_create (l_chain);
-        dap_chain_atom_ptr_t *l_atom = l_chain->callback_atom_iter_get_first(l_atom_iter);
-        size_t l_atom_size = l_chain->callback_atom_get_size(l_atom);
+        size_t l_atom_size = 0;
+        dap_chain_atom_ptr_t *l_atom = l_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size);
         while ( l_atom  && l_atom_size){
             if ( dap_chain_cell_file_append (a_cell,l_atom, l_atom_size) <0 )
                 break;
-            l_atom = l_chain->callback_atom_iter_get_next( l_atom_iter );
-            l_atom_size = l_chain->callback_atom_get_size(l_atom);
+            l_atom = l_chain->callback_atom_iter_get_next( l_atom_iter, &l_atom_size );
         }
     }else {
             log_it (L_ERROR,"Can't write cell 0x%016X file \"%s\"",a_cell->id.uint64, a_cell->file_storage_path);
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 0888d5eaa2a8de225cb84c9666365042581c0872..77ade0bd80fce0512faed6f5f607fa3b5a9c4dc4 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -45,6 +45,7 @@ typedef void * dap_chain_atom_ptr_t;
 typedef struct dap_chain_atom_iter{
     dap_chain_t * chain;
     dap_chain_atom_ptr_t cur;
+    size_t cur_size;
     void * cur_item;
     void * _inheritor;
 } dap_chain_atom_iter_t;
@@ -62,22 +63,20 @@ typedef void (*dap_chain_callback_t)(dap_chain_t *);
 typedef int (*dap_chain_callback_new_cfg_t)(dap_chain_t*, dap_config_t *);
 typedef void (*dap_chain_callback_ptr_t)(dap_chain_t *, void * );
 
-typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_t)(dap_chain_t *, dap_chain_atom_ptr_t );
-typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_verify_t)(dap_chain_t *, dap_chain_atom_ptr_t );
-typedef int (*dap_chain_callback_atom_size_t)(dap_chain_t *, dap_chain_atom_ptr_t ,size_t);
+typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_t)(dap_chain_t *, dap_chain_atom_ptr_t, size_t );
+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 size_t (*dap_chain_callback_atom_hdr_get_size_t)(dap_chain_atom_ptr_t );
 
 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_from_t)(dap_chain_t * ,dap_chain_atom_ptr_t);
-typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_first_t)(dap_chain_atom_iter_t * );
-typedef dap_chain_datum_t* (*dap_chain_callback_atom_get_datum)(dap_chain_atom_ptr_t );
-typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_find_by_hash_t)(dap_chain_atom_iter_t * ,dap_chain_hash_fast_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)(dap_chain_atom_ptr_t, size_t );
+typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_find_by_hash_t)(dap_chain_atom_iter_t * ,dap_chain_hash_fast_t *,size_t*);
 typedef dap_chain_datum_tx_t* (*dap_chain_callback_tx_find_by_hash_t)(dap_chain_t * ,dap_chain_hash_fast_t *);
 
-typedef dap_chain_atom_ptr_t * (*dap_chain_callback_atom_iter_get_atoms_t)(dap_chain_atom_iter_t * ,size_t * );
+typedef dap_chain_atom_ptr_t * (*dap_chain_callback_atom_iter_get_atoms_t)(dap_chain_atom_iter_t * ,size_t* ,size_t**);
 
-typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_next_t)(dap_chain_atom_iter_t *  );
+typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_next_t)(dap_chain_atom_iter_t *  ,size_t*);
 typedef void (*dap_chain_callback_atom_iter_delete_t)(dap_chain_atom_iter_t *  );
 
 typedef size_t (*dap_chain_datum_callback_datum_pool_proc_add_t)(dap_chain_t * , dap_chain_datum_t **, size_t );
@@ -126,7 +125,6 @@ typedef struct dap_chain{
     dap_chain_datum_callback_datum_pool_proc_add_with_group_t callback_datums_pool_proc_with_group;
 
     dap_chain_callback_atom_get_hdr_size_t callback_atom_get_hdr_static_size; // Get atom header's size
-    dap_chain_callback_atom_hdr_get_size_t callback_atom_get_size; // Get atom's size from header
 
     dap_chain_callback_atom_iter_create_t callback_atom_iter_create;
     dap_chain_callback_atom_iter_create_from_t callback_atom_iter_create_from;
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 119cc5b7ba7317d6969e05139939a9af9a77efd0..b24e58fdc6a6cc80ecca8792b046c487cd7bad03 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -203,15 +203,16 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                         }
 
                         dap_chain_atom_ptr_t * l_lasts = NULL;
-                        size_t l_lasts_size = 0;
+                        size_t *l_lasts_sizes = NULL;
+                        size_t l_lasts_count = 0;
                         dap_chain_atom_iter_t* l_iter = l_chain->callback_atom_iter_create(l_chain);
                         l_ch_chain->request_atom_iter = l_iter;
-                        l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_size);
-                        if(l_lasts) {
-                            for(size_t i = 0; i < l_lasts_size; i++) {
+                        l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_count, &l_lasts_sizes);
+                        if(l_lasts&& l_lasts_sizes) {
+                            for(size_t i = 0; i < l_lasts_count; i++) {
                                 dap_chain_atom_item_t * l_item = NULL;
                                 dap_chain_hash_fast_t l_atom_hash;
-                                dap_hash_fast(l_lasts[i], l_chain->callback_atom_get_size(l_lasts[i]),
+                                dap_hash_fast(l_lasts[i], l_lasts_sizes[i],
                                         &l_atom_hash);
                                 pthread_mutex_lock(&l_ch_chain->mutex);
                                 HASH_FIND(hh, l_ch_chain->request_atoms_lasts, &l_atom_hash, sizeof(l_atom_hash),
@@ -238,8 +239,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                         }
                         else {
                             // last packet
-                            dap_stream_ch_chain_sync_request_t l_request = { { 0 } };
-                            l_request.id_start = 0;//dap_db_log_get_last_id_remote(l_ch_chain->request.node_addr.uint64);
+                            dap_stream_ch_chain_sync_request_t l_request;
+                            memset(&l_request,0,sizeof (l_request));
                             dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS,
                                     l_ch_chain->request_net_id, l_ch_chain->request_chain_id,
                                     l_ch_chain->request_cell_id, &l_request, sizeof(l_request));
@@ -356,10 +357,11 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                         dap_chain_hash_fast_t l_atom_hash = {};
                         dap_hash_fast(l_chain_pkt->data, l_chain_pkt_data_size, &l_atom_hash);
                         dap_chain_atom_iter_t *l_atom_iter = l_chain->callback_atom_iter_create(l_chain);
-                        if (!l_chain->callback_atom_find_by_hash(l_atom_iter, &l_atom_hash)) {
+                        size_t l_atom_size =0;
+                        if ( l_chain->callback_atom_find_by_hash(l_atom_iter, &l_atom_hash, &l_atom_size) != NULL ) {
                             dap_chain_atom_ptr_t l_atom_copy = DAP_CALLOC(1, l_chain_pkt_data_size);
                             memcpy(l_atom_copy, l_chain_pkt->data, l_chain_pkt_data_size);
-                            dap_chain_atom_verify_res_t l_atom_add_res = l_chain->callback_atom_add(l_chain, l_atom_copy);
+                            dap_chain_atom_verify_res_t l_atom_add_res = l_chain->callback_atom_add(l_chain, l_atom_copy,l_chain_pkt_data_size);
                             if(l_atom_add_res == ATOM_ACCEPT && dap_chain_has_file_store(l_chain)) {
                                 // append to file
                                 dap_chain_cell_id_t l_cell_id;
@@ -468,10 +470,12 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                         // apply received transaction
                         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) {
-                            if(l_chain->callback_datums_pool_proc_with_group)
+                            if(l_chain->callback_datums_pool_proc_with_group){
+                                void * restrict l_store_obj_value = l_store_obj->value;
                                 l_chain->callback_datums_pool_proc_with_group(l_chain,
-                                        (dap_chain_datum_t**) &(l_store_obj->value), 1,
+                                        (dap_chain_datum_t** restrict) l_store_obj_value, 1,
                                         l_store_obj[i].group);
+                            }
                         }
                         // save data to global_db
                         if(!dap_chain_global_db_obj_save(l_obj, 1)) {
@@ -698,7 +702,8 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
 
             dap_chain_atom_item_t * l_atom_item = NULL, *l_atom_item_tmp = NULL;//, *l_chains_lasts_new = NULL;
             if(l_ch_chain->request_atoms_lasts == NULL) { // All chains synced
-                dap_stream_ch_chain_sync_request_t l_request = { { 0 } };
+                dap_stream_ch_chain_sync_request_t l_request;
+                memset(&l_request,0,sizeof (l_request));
                 uint8_t l_send_pkt_type = l_ch_chain->state == CHAIN_STATE_SYNC_CHAINS ?
                         DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS :
                         DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_ALL;
@@ -729,7 +734,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
                                 l_atom_item_proc);
 
                         // Then flush it out to the remote
-                        size_t l_atom_size = l_chain->callback_atom_get_size(l_atom_item->atom);
+                        size_t l_atom_size = l_atom_item->atom_size;
                         dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, l_ch_chain->request_net_id,
                                 l_ch_chain->request_chain_id, l_ch_chain->request_cell_id,
                                 l_atom_item->atom, l_atom_size);
@@ -737,31 +742,33 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
                         // Then parse links and populate new lasts
                         size_t l_lasts_size = 0;
                         dap_chain_atom_ptr_t * l_links = NULL;
+                        size_t *l_links_sizes = NULL;
 
-                        dap_chain_atom_iter_t* l_iter = l_chain->callback_atom_iter_create_from(l_chain, l_atom_item->atom);
-                        l_links = l_chain->callback_atom_iter_get_links(l_iter, &l_lasts_size);
-                        //DAP_DELETE(l_atom_item->atom);
+                        dap_chain_atom_iter_t* l_iter = l_chain->callback_atom_iter_create_from(l_chain, l_atom_item->atom, l_atom_item->atom_size);
+                        l_links = l_chain->callback_atom_iter_get_links(l_iter, &l_lasts_size,&l_links_sizes);
                         DAP_DELETE(l_iter);
-                        //l_links = l_chain->callback_atom_iter_get_links(l_atom_item->atom, &l_lasts_size);
-
-                        for(size_t i = 0; i < l_lasts_size; i++) { // Find links
-                            dap_chain_atom_item_t * l_link_item = NULL;
-                            dap_chain_hash_fast_t l_link_hash;
-                            dap_hash_fast(l_links[i], l_chain->callback_atom_get_size(l_links[i]),
-                                    &l_link_hash);
-                            // Check link in processed atims
-                            HASH_FIND(hh, l_ch_chain->request_atoms_processed, &l_link_hash, sizeof(l_link_hash), l_link_item);
-                            if(l_link_item == NULL) { // Not found, add new lasts
-                                l_link_item = DAP_NEW_Z(dap_chain_atom_item_t);
-                                l_link_item->atom = l_links[i];// do not use memory cause it will be deleted
-                                memcpy(&l_link_item->atom_hash, &l_link_hash, sizeof(l_link_hash));
-                                //HASH_ADD(hh, l_chains_lasts_new, atom_hash, sizeof(l_link_hash), l_link_item);
-                                HASH_ADD(hh, l_ch_chain->request_atoms_lasts, atom_hash, sizeof(l_link_hash), l_link_item);
+                        if( l_links&&l_links_sizes){
+                            //DAP_DELETE(l_atom_item->atom);
+                            //l_links = l_chain->callback_atom_iter_get_links(l_atom_item->atom, &l_lasts_size);
+
+                            for(size_t i = 0; i < l_lasts_size; i++) { // Find links
+                                dap_chain_atom_item_t * l_link_item = NULL;
+                                dap_chain_hash_fast_t l_link_hash;
+                                dap_hash_fast(l_links[i], l_links_sizes[i], &l_link_hash);
+                                // Check link in processed atims
+                                HASH_FIND(hh, l_ch_chain->request_atoms_processed, &l_link_hash, sizeof(l_link_hash), l_link_item);
+                                if(l_link_item == NULL) { // Not found, add new lasts
+                                    l_link_item = DAP_NEW_Z(dap_chain_atom_item_t);
+                                    l_link_item->atom = l_links[i];// do not use memory cause it will be deleted
+                                    memcpy(&l_link_item->atom_hash, &l_link_hash, sizeof(l_link_hash));
+                                    //HASH_ADD(hh, l_chains_lasts_new, atom_hash, sizeof(l_link_hash), l_link_item);
+                                    HASH_ADD(hh, l_ch_chain->request_atoms_lasts, atom_hash, sizeof(l_link_hash), l_link_item);
+                                }
+                                //else
+                                //    DAP_DELETE(l_links[i]);
                             }
-                            //else
-                            //    DAP_DELETE(l_links[i]);
+                            DAP_DELETE(l_links);
                         }
-                        DAP_DELETE(l_links);
                         HASH_DEL(l_ch_chain->request_atoms_lasts, l_atom_item);
                         break;
                     }
diff --git a/modules/channel/chain/include/dap_stream_ch_chain.h b/modules/channel/chain/include/dap_stream_ch_chain.h
index 0e5e6793752fb76e882827b48c986ca4c75ed039..989a7ea97a43467bdcaa330d3e39314ad095f820 100644
--- a/modules/channel/chain/include/dap_stream_ch_chain.h
+++ b/modules/channel/chain/include/dap_stream_ch_chain.h
@@ -41,6 +41,7 @@ typedef void (*dap_stream_ch_chain_callback_packet_t)(dap_stream_ch_chain_t*, ui
 typedef struct dap_chain_atom_item{
     dap_chain_hash_fast_t atom_hash;
     dap_chain_atom_ptr_t atom;
+    size_t atom_size;
     UT_hash_handle hh;
 } dap_chain_atom_item_t;
 
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 ac632bf6be2fc51c38ce3ee651cd95e6abffeba6..a2599f189e91e56e16315892d19ae7d49243a8ca 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -66,9 +66,9 @@ typedef struct dap_chain_cs_dag_poa_pvt
 static void s_callback_delete(dap_chain_cs_dag_t * a_dag);
 static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
 static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_cfg);
-static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event);
+static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size);
 static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum,
-                                                          dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count);
+                                                          dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size);
 // CLI commands
 static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **str_reply);
 
@@ -109,6 +109,7 @@ void dap_chain_cs_dag_poa_deinit(void)
  */
 static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_reply)
 {
+    (void) arg_func;
     int ret = -666;
     int arg_index = 1;
     dap_chain_net_t * l_chain_net = NULL;
@@ -165,9 +166,9 @@ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_re
                                                   l_event_hash_str);
                 ret = -30;
             }else {
-                dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event,l_poa_pvt->events_sign_cert->enc_key );
+                dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size,l_poa_pvt->events_sign_cert->enc_key );
                 dap_chain_hash_fast_t l_event_new_hash;
-                dap_chain_cs_dag_event_calc_hash(l_event_new,&l_event_new_hash);
+                dap_chain_cs_dag_event_calc_hash(l_event_new, l_event_size,&l_event_new_hash);
                 //size_t l_event_new_size = dap_chain_cs_dag_event_calc_size(l_event_new);
                 char * l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash);
                 char * l_event_new_hash_base58_str = dap_enc_base58_encode_hash_to_str(&l_event_new_hash);
@@ -319,7 +320,7 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag)
  * @return
  */
 static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum,
-                                                          dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count)
+                                                          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 );
@@ -330,7 +331,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
     }
     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,
-                                                         PVT(l_poa)->events_sign_cert->enc_key, a_hashes, a_hashes_count);
+                                                         PVT(l_poa)->events_sign_cert->enc_key, a_hashes, a_hashes_count,a_event_size);
         return l_event;
     }else
         return NULL;
@@ -344,17 +345,29 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
  * @param a_dag_event
  * @return
  */
-static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event)
+static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size)
 {
     dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT ( DAP_CHAIN_CS_DAG_POA( a_dag ) );
+    size_t l_offset_from_beginning = dap_chain_cs_dag_event_calc_size_excl_signs(a_dag_event,a_dag_event_size);
+    if( l_offset_from_beginning > a_dag_event_size){
+        log_it(L_WARNING,"Incorrect size with event %p", a_dag_event);
+        return -7; // Incorrest size
+    }
     if ( a_dag_event->header.signs_count >= l_poa_pvt->auth_certs_count_verify ){
         size_t l_verified = 0;
         for ( uint16_t i = 0; i < a_dag_event->header.signs_count; i++ ) {
-            dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, 0);
+            if (l_offset_from_beginning == a_dag_event_size)
+                break;
+            dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event,a_dag_event_size , 0);
             if ( l_sign == NULL){
                 log_it(L_WARNING, "Event is NOT signed with anything");
                 return -4;
             }
+            l_offset_from_beginning += dap_sign_get_size( l_sign);
+            if (l_offset_from_beginning > a_dag_event_size){
+                log_it(L_WARNING,"Incorrect size with event %p", a_dag_event);
+                return -7;
+            }
             for (uint16_t j = 0; j < l_poa_pvt->auth_certs_count; j++) {
                 if (dap_cert_compare_with_sign ( l_poa_pvt->auth_certs[j], l_sign) == 0)
                     l_verified++;
@@ -367,10 +380,11 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_
                 }
                 dap_chain_addr_t l_addr = {};
                 dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, a_dag->chain->net_id);
-                dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event);
+                dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event, a_dag_event_size);
                 if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) {
                     dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data;
                     if (!dap_chain_net_srv_stake_validator(&l_addr, l_tx)) {
+                        log_it(L_WARNING,"Not passed stake validator event %p", a_dag_event);
                         return -6;
                     }
                 }
@@ -378,7 +392,9 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_
 
         }
         return l_verified >= l_poa_pvt->auth_certs_count_verify ? 0 : -1;
-    }else
-       return -2; // Wrong signatures number
+    }else{
+        log_it(L_WARNING,"Wrong signatures number with event %p", a_dag_event);
+        return -2; // Wrong signatures number
+    }
 }
 
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 fc3337dcef13d408ac1a63ed4e7f89dc3a0e9c21..597ea51c63afaf5db0f92c5567c1fc847866389c 100644
--- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
+++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c
@@ -49,9 +49,9 @@ typedef struct dap_chain_cs_dag_pos_pvt
 static void s_callback_delete(dap_chain_cs_dag_t * a_dag);
 static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
 static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_cfg);
-static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event);
+static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size);
 static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum,
-                                                          dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count);
+                                                          dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t *a_dag_event_size);
 
 /**
  * @brief dap_chain_cs_dag_pos_init
@@ -186,7 +186,8 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag)
  * @return
  */
 static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum,
-                                                          dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count)
+                                                          dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count,
+                                                          size_t *a_dag_event_size)
 {
     dap_return_val_if_fail(a_dag && a_dag->chain && DAP_CHAIN_CS_DAG_POS(a_dag) && a_datum, NULL);
     dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name );
@@ -198,7 +199,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
     }
     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,
-        PVT(l_pos)->events_sign_wallet->enc_key, a_hashes, a_hashes_count);
+        PVT(l_pos)->events_sign_wallet->enc_key, a_hashes, a_hashes_count, a_dag_event_size);
         return l_event;
     } else
         return NULL;
@@ -210,21 +211,27 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
  * @param a_dag_event
  * @return
  */
-static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event)
+static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size)
 {
 
     dap_chain_cs_dag_pos_t * l_pos =DAP_CHAIN_CS_DAG_POS( a_dag ) ;
     dap_chain_cs_dag_pos_pvt_t * l_pos_pvt = PVT ( DAP_CHAIN_CS_DAG_POS( a_dag ) );
 
-    if(a_dag->chain->ledger == NULL)
+    if(a_dag->chain->ledger == NULL){
+        log_it(L_CRITICAL,"Ledger is NULL can't check PoS on this chain %s", a_dag->chain->name);
         return -3;
+    }
 
+    if (sizeof (a_dag_event->header)>= a_dag_event_size){
+        log_it(L_WARNING,"Incorrect size with event %p on chain %s", a_dag_event, a_dag->chain->name);
+        return  -7;
+    }
     if ( a_dag_event->header.signs_count >= l_pos_pvt->confirmations_minimum ){
         uint16_t l_verified_num = 0;
         dap_chain_addr_t l_addr = { 0 };
 
         for ( size_t l_sig_pos=0; l_sig_pos < a_dag_event->header.signs_count; l_sig_pos++ ){
-            dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, 0);
+            dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, 0,a_dag_event_size);
             if ( l_sign == NULL){
                 log_it(L_WARNING, "Event is NOT signed with anything");
                 return -4;
@@ -238,10 +245,11 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_
             dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, a_dag->chain->net_id);
 
             if (l_sig_pos == 0) {
-                dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event);
+                dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event,a_dag_event_size);
                 if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) {
                     dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data;
                     if (!dap_chain_net_srv_stake_validator(&l_addr, l_tx)) {
+                        log_it(L_WARNING,"Not passed stake validator with event %p on chain %s", a_dag_event, a_dag->chain->name);
                         return -6;
                     }
                 }
@@ -287,6 +295,8 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_
             log_it(L_WARNING, "Wrong event: only %su/%su signs are valid", l_verified_num, l_pos_pvt->confirmations_minimum );
             return -2;
         }
-    }else
-       return -2; // Wrong signatures number
+    }else{
+        log_it(L_WARNING,"Wrong signature number with event %p on chain %s", a_dag_event, a_dag->chain->name);
+        return -2; // Wrong signatures number
+    }
 }
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c
index 5086bc7adea914a2e9a423db8feeea8bec9a4572..f68ce988c17733f7bc2ef0354ae48308afc0ba96 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/consensus/none/dap_chain_cs_none.c
@@ -68,30 +68,29 @@ typedef struct dap_chain_gdb_private
 static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_net);
 
 // Atomic element organization callbacks
-static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t); //    Accept new event in gdb
-static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t); //    Verify new event in gdb
-static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t); //    Get gdb event size
+static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); //    Accept new event in gdb
+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_from(dap_chain_t * a_chain,
-        dap_chain_atom_ptr_t a);
+        dap_chain_atom_ptr_t a, size_t a_atom_size);
 
 // Delete iterator
 static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter); //    Get the fisrt event from gdb
 
 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);
+        dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
 static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_tx_hash(dap_chain_atom_iter_t * a_atom_iter ,
-                                                                       dap_chain_hash_fast_t * a_atom_hash);
+                                                                       dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
 
 // Get event(s) from gdb
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter); //    Get the fisrt event from gdb
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter); //    Get the next event from gdb
+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); //    Get the fisrt event from gdb
+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); //    Get the next event from gdb
 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); //    Get list of linked events
+        size_t * a_links_size_ptr, size_t ** a_lasts_sizes_ptr); //    Get list of linked events
 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); //    Get list of linked events
+        size_t * a_lasts_size_ptr, size_t ** a_lasts_sizes_ptr); //    Get list of linked events
 
 static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums,
         size_t a_datums_size);
@@ -185,7 +184,6 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     // Atom element callbacks
     a_chain->callback_atom_add = s_chain_callback_atom_add; // Accept new element in chain
     a_chain->callback_atom_verify = s_chain_callback_atom_verify; // Verify new element in chain
-    a_chain->callback_atom_get_size = s_chain_callback_atom_hdr_get_size; // Get dag event size
     a_chain->callback_atom_get_hdr_static_size = s_chain_callback_atom_get_static_hdr_size; // Get dag event hdr size
 
     a_chain->callback_atom_iter_create = s_chain_callback_atom_iter_create;
@@ -263,7 +261,6 @@ const char* dap_chain_gdb_get_group(dap_chain_t * a_chain)
 static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_net)
 {
     dap_chain_gdb_private_t *l_gdb_priv = PVT(a_gdb);
-    dap_list_t *l_datum_list = NULL, *l_list_tmp = NULL;
     // protect from reloading
     if(dap_chain_ledger_count( a_net->pub.ledger ) > 0)
         return 0;
@@ -275,19 +272,10 @@ static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_
     dap_global_db_obj_t *data = dap_chain_global_db_gr_load(l_gdb_priv->group_datums , &l_data_size);
     // make list of datums
     for(size_t i = 0; i < l_data_size; i++) {
-        l_datum_list = dap_list_append(l_datum_list, data[i].value);
-    }
-    // sort list by time
-    //l_datum_list = dap_list_sort(l_datum_list, (dap_callback_compare_t) compare_datum_items);
-    l_list_tmp = l_datum_list;
-    // add datum_tx from list to ledger
-    while(l_list_tmp) {
-        dap_chain_datum_t *l_datum = (dap_chain_datum_t*) l_list_tmp->data;
-        s_chain_callback_atom_add(a_gdb->chain,l_datum);
-        l_list_tmp = dap_list_next(l_list_tmp);
+        s_chain_callback_atom_add(a_gdb->chain,data[i].value, data[i].value_len);
+
     }
     dap_chain_global_db_objs_delete(data, l_data_size);
-    dap_list_free(l_datum_list);
     return 0;
 }
 
@@ -302,7 +290,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
 {
     for(size_t i = 0; i < a_datums_count; i++) {
         dap_chain_datum_t * l_datum = a_datums[i];
-        s_chain_callback_atom_add(a_chain, l_datum );
+        s_chain_callback_atom_add(a_chain, l_datum,dap_chain_datum_size(l_datum) );
     }
     return a_datums_count;
 }
@@ -321,11 +309,16 @@ static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain
  * @param a_datums
  * @param a_datums_size
  */
-static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom)
+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)
 {
     dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain);
     dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb);
     dap_chain_datum_t *l_datum = (dap_chain_datum_t*) a_atom;
+    if ( a_atom_size < l_datum->header.data_size+ sizeof (l_datum->header) ){
+        log_it(L_INFO,"Corrupted atom rejected: wrong size %zd not equel or less atom size %zd",l_datum->header.data_size+ sizeof (l_datum->header),
+               a_atom_size);
+        return ATOM_REJECT;
+    }
     switch (l_datum->header.type_id) {
         case DAP_CHAIN_DATUM_TOKEN_DECL:{
             dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
@@ -369,22 +362,14 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
  * @param a_atom
  * @return
  */
-static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom)
+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)
 {
     (void) a_chain;
     (void) a_atom;
+    (void) a_atom_size;
     return ATOM_ACCEPT;
 }
 
-/**
- * @brief s_chain_callback_atom_get_size Get size of atomic element
- * @param a_atom
- * @return
- */
-static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t a_atom)
-{
-    return ((dap_chain_datum_t *) a_atom)->header.data_size +sizeof (((dap_chain_datum_t *) a_atom)->header);
-}
 
 /**
  * @brief s_chain_callback_atom_get_static_hdr_size
@@ -416,7 +401,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_
  * @return
  */
 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)
+        dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
 {
     dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
     l_iter->chain = a_chain;
@@ -441,7 +426,7 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite
  * @return
  */
 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)
+        dap_chain_hash_fast_t * a_atom_hash, size_t *a_atom_size)
 {
     char * l_key = dap_chain_hash_fast_to_str_new(a_atom_hash);
     size_t l_ret_size;
@@ -449,6 +434,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at
     dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_atom_iter->chain );
     l_ret = dap_chain_global_db_gr_get(l_key,&l_ret_size,
                                        PVT ( l_gdb )->group_datums  );
+    *a_atom_size = l_ret_size;
     return l_ret;
 }
 
@@ -457,7 +443,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at
  * @param a_atom_iter
  * @return
  */
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter)
+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)
 {
     dap_chain_datum_t * l_datum = NULL;
     a_atom_iter->cur_item = PVT ( DAP_CHAIN_GDB(a_atom_iter->chain) )->hash_items;
@@ -468,7 +454,9 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
         if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it
             DAP_DELETE( a_atom_iter->cur);
         a_atom_iter->cur = l_datum;
-    }
+        *a_atom_size = l_datum_size;
+    }else
+        *a_atom_size = 0;
     return l_datum;
 }
 
@@ -477,7 +465,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
  * @param a_atom_iter
  * @return
  */
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter)
+static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter,size_t *a_atom_size)
 {
     dap_chain_datum_t * l_datum = NULL;
     a_atom_iter->cur_item = a_atom_iter->cur_item?
@@ -490,7 +478,9 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_i
         if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it
             DAP_DELETE( a_atom_iter->cur);
         a_atom_iter->cur = l_datum;
-    }
+        *a_atom_size = l_datum_size;
+    }else
+        *a_atom_size = 0;
     return l_datum;
 }
 
@@ -501,10 +491,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_i
  * @return
  */
 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_size_ptr, size_t **a_links_sizes_ptr)
 {
     (void) a_atom_iter;
     (void) a_links_size_ptr;
+    (void) a_links_sizes_ptr;
     return NULL;
 }
 
@@ -515,10 +506,11 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom
  * @return
  */
 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_lasts_size_ptr,  size_t **a_links_sizes_ptr)
 {
     (void) a_atom_iter;
     (void) a_lasts_size_ptr;
+    (void) a_links_sizes_ptr;
     return NULL;
 }
 
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 887be69c07e3d2ce86ff94194262325b0bcc61c4..37b0b25d47ec8e6019c5961ad0ebcb3e57401e71 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -23,11 +23,12 @@
     along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-
 #include <stdlib.h>
-#define _XOPEN_SOURCE       /* See feature_test_macros(7) */
+#include <stdint.h>
+#include <stddef.h>
 #include <stdio.h>
-#include <time.h>
+
+
 #include <stdlib.h>
 #include <stddef.h>
 #include <stdint.h>
@@ -88,7 +89,9 @@
 #include <dirent.h>
 
 #define _XOPEN_SOURCE       /* See feature_test_macros(7) */
+#ifndef __USE_XOPEN
 #define __USE_XOPEN
+#endif
 #define _GNU_SOURCE
 #include <time.h>
 
@@ -757,8 +760,7 @@ static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name ,
     PVT(ret)->state_proc_cond = CreateEventA( NULL, FALSE, FALSE, NULL );
 #endif
 
-    //    if ( sscanf(a_id,"0x%016lx", &ret->pub.id.uint64 ) == 1 ){
-    if ( sscanf(a_id,"0x%016llx", &ret->pub.id.uint64 ) == 1 ){
+    if ( sscanf(a_id,"0x%016lx", &ret->pub.id.uint64 ) == 1 ){
         if (strcmp (a_node_role, "root_master")==0){
             PVT(ret)->node_role.enums = NODE_ROLE_ROOT_MASTER;
             log_it (L_NOTICE, "Node role \"root master\" selected");
@@ -1530,7 +1532,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
             else{
                 l_node_addr = DAP_NEW_Z(dap_chain_node_addr_t);
                 bool parse_succesfully = false;
-                if ( sscanf(l_node_addr_str, "0x%016llx",&l_node_addr->uint64 ) == 1 ){
+                if ( sscanf(l_node_addr_str, "0x%016" DAP_UINT64_FORMAT_x ,&l_node_addr->uint64 ) == 1 ){
                     log_it(L_DEBUG, "Parse node address with format 0x016llx");
                     parse_succesfully = true;
                 }
@@ -1684,7 +1686,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                 char ** l_proc_chains = dap_config_get_array_str(l_cfg,"role-master" , "proc_chains", &l_proc_chains_count );
                 for ( size_t i = 0; i< l_proc_chains_count ; i++){
                     dap_chain_id_t l_chain_id = {{0}};
-                    if(dap_sscanf( l_proc_chains[i], "0x%16llX",  &l_chain_id.uint64) ==1 || dap_scanf("0x%16llx",  &l_chain_id.uint64) == 1){
+                    if(dap_sscanf( l_proc_chains[i], "0x%16"DAP_UINT64_FORMAT_X,  &l_chain_id.uint64) ==1 || dap_scanf("0x%16"DAP_UINT64_FORMAT_x,  &l_chain_id.uint64) == 1){
                         dap_chain_t * l_chain = dap_chain_find_by_id(l_net->pub.id, l_chain_id );
                         if ( l_chain ){
                             l_chain->is_datum_pool_proc = true;
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index edd503ee2fc05db4695eba355144bcbcd6ef75f4..6c3f58918094a1439dc9d335ea7d3d682f56caec 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -2001,7 +2001,7 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re
     }
 }
 
-void s_com_mempool_list_print_for_chain(const dap_chain_net_t * a_net, const dap_chain_t * a_chain, dap_string_t * a_str_tmp, const char *a_hash_out_type){
+void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a_chain, dap_string_t * a_str_tmp, const char *a_hash_out_type){
     char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(a_chain);
     if(!l_gdb_group_mempool){
         dap_string_append_printf(a_str_tmp, "%s.%s: chain not found\n", a_net->pub.name, a_chain->name);
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index c34c4e7e817e7b5ea945fdadd717d4e4b9c8a01a..7838fc19203efa50aca9f8872f2f8f8d41a798e5 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -94,15 +94,14 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
     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);
-    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_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) {
             // 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);
+            l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
             continue;
         }
         dap_tx_data_t *l_tx_data = NULL;
@@ -181,8 +180,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
         // 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 = a_chain->callback_atom_get_size(l_atom);
+            l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
             continue;
         }
         // found a_tx_hash now
@@ -200,7 +198,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
         l_list_tmp = l_list_out_items;
         while(l_list_tmp) {
             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;
+            //dap_tx_data_t *l_tx_data_prev = NULL;
 
             const char *l_token_str = NULL;
             if(l_tx_data)
@@ -311,18 +309,18 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons
     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);
-    dap_chain_atom_ptr_t *l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter);
+    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;
     }
-    size_t l_atom_size = a_chain->callback_atom_get_size(l_atom);
 
     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;
+        dap_chain_datum_t *l_datum = a_chain->callback_atom_get_datum ? a_chain->callback_atom_get_datum(l_atom, l_atom_size) :
+                                                                        (dap_chain_datum_t*)l_atom;
         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 = a_chain->callback_atom_get_size(l_atom);
+            l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
             continue;
         }
         // transaction
@@ -656,8 +654,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons
         DAP_DELETE(l_time_str);
 
         // 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_get_size(l_atom) : 0;
+        l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
     }
 
     // delete hashes
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 1721ea01210137059b81437b876058a15908f3c7..11a8c3a0dd8f9455586d1cd22e0bf472db7b70ad 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -288,7 +288,7 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
                     dap_db_log_list_t *l_db_log = NULL;
                     // If the current global_db has been truncated, but the remote node has not known this
                     uint64_t l_last_id = dap_db_log_get_last_id();
-                    if(l_request->id_start > a_ch_chain->request_last_ts){
+                    if(l_request->id_start > (uint64_t) a_ch_chain->request_last_ts){
                         dap_chain_net_t *l_net = dap_chain_net_by_id(a_pkt->hdr.net_id);
                         dap_list_t *l_add_groups = dap_chain_net_get_add_gdb_group(l_net, a_ch_chain->request.node_addr);
                         l_db_log = dap_db_log_list_start(l_start_item + 1, l_add_groups);
@@ -330,12 +330,13 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
 
                                 dap_chain_atom_ptr_t * l_lasts = NULL;
                                 size_t l_lasts_size = 0;
-                                l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_size);
+                                size_t *l_lasts_sizes = NULL;
+                                l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_size, &l_lasts_sizes);
                                 if ( l_lasts){
                                     for(size_t i = 0; i < l_lasts_size; i++) {
                                         dap_chain_atom_item_t * l_item = NULL;
                                         dap_chain_hash_fast_t l_atom_hash;
-                                        dap_hash_fast(l_lasts[i], l_chain->callback_atom_get_size(l_lasts[i]), &l_atom_hash);
+                                        dap_hash_fast(l_lasts[i], l_lasts_sizes[i], &l_atom_hash);
                                         pthread_mutex_lock(&a_ch_chain->mutex);
                                         HASH_FIND(hh, a_ch_chain->request_atoms_lasts, &l_atom_hash, sizeof(l_atom_hash), l_item);
                                         if(l_item == NULL) { // Not found, add new lasts
diff --git a/modules/net/srv/dap_chain_net_srv_client.c b/modules/net/srv/dap_chain_net_srv_client.c
index c9f43454f35b06cfe2e9e6b5e58bb4337d21ae66..595a2802107b989c6d0c02a0a9c5a4d27b07934e 100644
--- a/modules/net/srv/dap_chain_net_srv_client.c
+++ b/modules/net/srv/dap_chain_net_srv_client.c
@@ -42,7 +42,7 @@ int dap_chain_net_srv_client_init(dap_chain_net_srv_uid_t a_uid,
         dap_chain_net_srv_callback_data_t a_callback_response_error,
         dap_chain_net_srv_callback_data_t a_callback_receipt_next_success,
         dap_chain_net_srv_callback_data_t a_callback_client_success,
-        dap_chain_net_srv_callback_data_t a_callback_client_sign_request,
+        dap_chain_net_srv_callback_sign_request_t a_callback_client_sign_request,
         void *a_inhertor) {
 
     dap_chain_net_srv_t *l_srv_custom = dap_chain_net_srv_get(a_uid);
diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h
index 4673bff67e3f8f40ad79a4e242221446feb59792..c7de7e8f0c988d173597e837c08dffc02c2ad979 100755
--- a/modules/net/srv/include/dap_chain_net_srv.h
+++ b/modules/net/srv/include/dap_chain_net_srv.h
@@ -33,6 +33,7 @@ typedef struct dap_chain_net_srv dap_chain_net_srv_t;
 
 typedef void (*dap_chain_net_srv_callback_t)(dap_chain_net_srv_t *, dap_chain_net_srv_client_t *);
 typedef int (*dap_chain_net_srv_callback_data_t)(dap_chain_net_srv_t *, uint32_t, dap_chain_net_srv_client_t *, const void *, size_t );
+typedef int (*dap_chain_net_srv_callback_sign_request_t)(dap_chain_net_srv_t *, uint32_t, dap_chain_net_srv_client_t *, dap_chain_datum_tx_receipt_t **, size_t );
 typedef void (*dap_chain_net_srv_callback_ch_t)(dap_chain_net_srv_t *, dap_stream_ch_t *);
 
 typedef struct dap_chain_net_srv
@@ -63,7 +64,7 @@ typedef struct dap_chain_net_srv
     // Client have to start service
     dap_chain_net_srv_callback_data_t callback_client_success;
     // Client have to sign receipt
-    dap_chain_net_srv_callback_data_t callback_client_sign_request;
+    dap_chain_net_srv_callback_sign_request_t callback_client_sign_request;
 
     // Pointer to inheritor object
     void * _inhertor;
@@ -108,5 +109,5 @@ int dap_chain_net_srv_client_init(dap_chain_net_srv_uid_t a_uid,
         dap_chain_net_srv_callback_data_t a_callback_response_error,
         dap_chain_net_srv_callback_data_t a_callback_receipt_next_success,
         dap_chain_net_srv_callback_data_t a_callback_client_success,
-        dap_chain_net_srv_callback_data_t a_callback_client_sign_request,
+        dap_chain_net_srv_callback_sign_request_t a_callback_client_sign_request,
         void *a_inhertor);
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index 3ea6b437aa2f5b61d716bce86835b8805de5b666..2605ef012bd46451c4e7c281f0a75946796adb10 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -147,7 +147,7 @@ static void s_update_limits(dap_stream_ch_t * a_ch ,
 static void m_es_tun_new(dap_events_socket_t * a_es, void * arg);
 static void m_es_tun_delete(dap_events_socket_t * a_es, void * arg);
 static void m_es_tun_read(dap_events_socket_t * a_es, void * arg);
-static void m_es_tun_error(dap_events_socket_t * a_es, void * arg);
+static void m_es_tun_error(dap_events_socket_t * a_es,int arg);
 
 pthread_rwlock_t s_tun_sockets_rwlock = PTHREAD_RWLOCK_INITIALIZER;
 ch_sf_tun_socket_t * s_tun_sockets = NULL;
@@ -158,7 +158,8 @@ int s_tun_attach_queue(int fd);
 dap_events_socket_t * s_tun_event_stream_create(dap_worker_t * a_worker, int a_tun_fd)
 {
     assert(a_worker);
-    static dap_events_socket_callbacks_t l_s_callbacks = {{ 0 }};
+    dap_events_socket_callbacks_t l_s_callbacks;
+    memset(&l_s_callbacks,0,sizeof (l_s_callbacks));
     l_s_callbacks.new_callback = m_es_tun_new;
     l_s_callbacks.read_callback = m_es_tun_read;
     l_s_callbacks.error_callback = m_es_tun_error;
@@ -259,11 +260,11 @@ static int s_callback_client_success(dap_chain_net_srv_t * a_srv, uint32_t a_usa
 }
 
 static int callback_client_sign_request(dap_chain_net_srv_t * a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_t * a_srv_client,
-                    const void **a_receipt, size_t a_receipt_size)
+                    dap_chain_datum_tx_receipt_t **a_receipt, size_t a_receipt_size)
 {
-    dap_chain_datum_tx_receipt_t *l_receipt = (dap_chain_datum_tx_receipt_t*)*a_receipt;
+    dap_chain_datum_tx_receipt_t *l_receipt = *a_receipt;
     char *l_gdb_group = dap_strdup_printf("local.%s", DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX);
-    char *l_wallet_name = dap_chain_global_db_gr_get(dap_strdup("wallet_name"), NULL, l_gdb_group);
+    char *l_wallet_name = (char*) dap_chain_global_db_gr_get(dap_strdup("wallet_name"), NULL, l_gdb_group);
 
     dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_name, dap_chain_wallet_get_path(g_config));
     if(l_wallet) {
@@ -1665,7 +1666,7 @@ void m_es_tun_read(dap_events_socket_t * a_es, void * arg)
     dap_events_socket_set_readable_unsafe(a_es, true);
 }
 
-void m_es_tun_error(dap_events_socket_t * a_es, void * arg)
+void m_es_tun_error(dap_events_socket_t * a_es, int arg)
 {
     if (! a_es->_inheritor)
         return;
diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c
index dd3936e554c566866b0d46dd46ca26f566599948..4c117f905baac62d13705094d8775a3f111f6473 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c
@@ -299,9 +299,9 @@ static void m_client_tun_read(dap_events_socket_t * a_es, void * arg)
     dap_events_socket_set_readable_unsafe(a_es, true);
 }
 
-static void m_client_tun_error(dap_events_socket_t * a_es, void * arg)
+static void m_client_tun_error(dap_events_socket_t * a_es, int a_arg)
 {
-  log_it(L_DEBUG, __PRETTY_FUNCTION__);
+  log_it(L_WARNING, " TUN client problems: code %d", a_arg);
 }
 
 int dap_chain_net_vpn_client_tun_create(const char *a_ipv4_addr_str, const char *a_ipv4_gw_str)
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index a2250e0abd53ce2b8ac181c44d596ace2e723d9c..60e793599598fdfa84fa2bf3964bf0039e63fe7d 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -56,6 +56,7 @@ typedef struct dap_chain_cs_dag_event_item {
     dap_chain_hash_fast_t hash;
     time_t ts_added;
     dap_chain_cs_dag_event_t *event;
+    size_t event_size;
     UT_hash_handle hh;
 } dap_chain_cs_dag_event_item_t;
 
@@ -78,29 +79,28 @@ typedef struct dap_chain_cs_dag_pvt {
 #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt )
 
 // Atomic element organization callbacks
-static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t );                      //    Accept new event in dag
-static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t );                   //    Verify new event in dag
-static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t );                                 //    Get dag event size
+static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t , size_t);                      //    Accept new event in dag
+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_from(dap_chain_t * a_chain ,
-                                                                     dap_chain_atom_ptr_t a);
+static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t *  ,
+                                                                     dap_chain_atom_ptr_t , size_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);
+                                                                       dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
 static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chain_t * a_chain ,
                                                                        dap_chain_hash_fast_t * a_atom_hash);
 
-static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event);
+static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event, size_t a_atom_size);
 //    Get event(s) from dag
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter ); //    Get the fisrt event from dag
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter );  //    Get the next event from dag
-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 );  //    Get list of linked events
-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 );  //    Get list of linked events
+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 ); //    Get the fisrt event from dag
+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 );  //    Get the next event from dag
+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,
+                                                                  size_t ** a_links_size_ptr );  //    Get list of linked events
+static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts( dap_chain_atom_iter_t * a_atom_iter ,size_t *a_links_size,
+                                                                  size_t ** a_lasts_size_ptr );  //    Get list of linked events
 
 // Delete iterator
 static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter );                  //    Get the fisrt event from dag
@@ -172,7 +172,6 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     // Atom element callbacks
     a_chain->callback_atom_add = s_chain_callback_atom_add ;  // Accept new element in chain
     a_chain->callback_atom_verify = s_chain_callback_atom_verify ;  // Verify new element in chain
-    a_chain->callback_atom_get_size  = s_chain_callback_atom_hdr_get_size; // Get dag event size
     a_chain->callback_atom_get_hdr_static_size = s_chain_callback_atom_get_static_hdr_size; // Get dag event hdr size
 
     a_chain->callback_atom_iter_create = s_chain_callback_atom_iter_create;
@@ -248,7 +247,7 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain)
 
 static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item){
 
-  dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event);
+  dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size);
   switch (l_datum->header.type_id) {
     case DAP_CHAIN_DATUM_TOKEN_DECL: {
       dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
@@ -265,6 +264,7 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger
       dap_chain_cs_dag_event_item_t * l_tx_event= DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
       l_tx_event->ts_added = a_event_item->ts_added;
       l_tx_event->event = a_event_item->event;
+      l_tx_event->event_size = a_event_item->event_size;
       memcpy(&l_tx_event->hash, &a_event_item->hash, sizeof (l_tx_event->hash) );
 
       HASH_ADD(hh,PVT(a_dag)->tx_events,hash,sizeof (l_tx_event->hash),l_tx_event);
@@ -282,15 +282,21 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger
 }
 
 static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item ){
-    int res = a_dag->callback_cs_verify(a_dag,a_event_item->event);
+    int res = a_dag->callback_cs_verify(a_dag,a_event_item->event, a_event_item->event_size);
 
     if(res == 0){
+        char l_buf_hash[128];
+        dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1);
+        log_it(L_DEBUG,"Dag event %s checked, add it to ledger", a_event_item->hash);
         res = s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item);
 
         HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (a_event_item->hash), a_event_item);
         s_dag_events_lasts_process_new_last_event(a_dag, a_event_item);
+    }else{
+        char l_buf_hash[128];
+        dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1);
+        log_it(L_WARNING,"Dag event %s check failed: code %d", l_buf_hash,  res );
     }
-
     return res;
 }
 
@@ -312,9 +318,10 @@ static bool s_dap_chain_check_if_event_is_present(dap_chain_cs_dag_event_item_t
  * @brief s_chain_callback_atom_add Accept new event in dag
  * @param a_chain DAG object
  * @param a_atom
+ * @param a_atom_size
  * @return 0 if verified and added well, otherwise if not
  */
-static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom)
+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)
 {
     dap_chain_atom_verify_res_t ret = ATOM_ACCEPT;
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain);
@@ -323,11 +330,12 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
     dap_chain_cs_dag_event_item_t * l_event_item = DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
     pthread_rwlock_t * l_events_rwlock = &PVT(l_dag)->events_rwlock ;
     l_event_item->event = l_event;
+    l_event_item->event_size = a_atom_size;
     l_event_item->ts_added = time(NULL);
 
-    dap_hash_fast(l_event, dap_chain_cs_dag_event_calc_size(l_event),&l_event_item->hash );
+    dap_hash_fast(l_event, a_atom_size,&l_event_item->hash );
     dap_chain_hash_fast_t l_event_hash;
-    dap_chain_cs_dag_event_calc_hash(l_event,&l_event_hash);
+    dap_chain_cs_dag_event_calc_hash(l_event, a_atom_size,&l_event_hash);
 
     char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash);
     log_it(L_DEBUG, "Processing event: %s...", l_event_hash_str);
@@ -344,8 +352,10 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
     }
 
     // verify hashes and consensus
-    if(ret == ATOM_ACCEPT)
-        ret = s_chain_callback_atom_verify (a_chain, a_atom);
+    if(ret == ATOM_ACCEPT){
+        ret = s_chain_callback_atom_verify (a_chain, a_atom, a_atom_size);
+        log_it(L_DEBUG, "Accepted atom %p", a_atom);
+    }
 
     if( ret == ATOM_MOVE_TO_THRESHOLD){
         HASH_ADD(hh, PVT(l_dag)->events_treshold,hash,sizeof (l_event_item->hash),  l_event_item);
@@ -427,7 +437,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
                 int l_index = rand() % (int) l_events_round_new_size;
                 dap_chain_hash_fast_t l_hash;
                 dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) l_events_round_new[l_index].value;
-                size_t l_event_size = dap_chain_cs_dag_event_calc_size(l_event);
+                size_t l_event_size = l_events_round_new[l_index].value_len;
                 dap_hash_fast(l_event, l_event_size,&l_hash);
 
                 bool l_is_already_in_event = false;
@@ -468,12 +478,13 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
 
         if (l_hashes_linked || s_seed_mode ) {
             dap_chain_cs_dag_event_t * l_event = NULL;
+            size_t l_event_size = 0;
             if(l_dag->callback_cs_event_create)
-                l_event = l_dag->callback_cs_event_create(l_dag,l_datum,l_hashes,l_hashes_linked);
-            if ( l_event){ // Event is created
+                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) {
-                    if (s_chain_callback_atom_add(a_chain, l_event) == ATOM_ACCEPT) {
+                    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();
@@ -486,7 +497,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
                             l_cell->id.uint64 = l_net ? l_net->pub.cell_id.uint64 : 0;
                             l_cell->file_storage_path = dap_strdup_printf("%0llx.dchaincell", l_cell->id.uint64);
                         }
-                        if (dap_chain_cell_file_append(l_cell, l_event, a_chain->callback_atom_get_size(l_event)) < 0) {
+                        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;
                         }
@@ -500,10 +511,10 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
                 // add to new round into global_db
                 else {
                     dap_chain_hash_fast_t l_event_hash;
-                    dap_chain_cs_dag_event_calc_hash(l_event, &l_event_hash);
+                    dap_chain_cs_dag_event_calc_hash(l_event,l_event_size, &l_event_hash);
                     char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash);
                     if(dap_chain_global_db_gr_set(dap_strdup(l_event_hash_str), (uint8_t *) l_event,
-                            dap_chain_cs_dag_event_calc_size(l_event),
+                            l_event_size,
                             l_dag->gdb_group_events_round_new)) {
                         log_it(L_INFO, "Event %s placed in the new forming round", l_event_hash_str);
                         DAP_DELETE(l_event_hash_str);
@@ -570,12 +581,14 @@ dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t
  * @param a_atom
  * @return
  */
-static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t  a_atom)
+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)
 {
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain);
     dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom;
     dap_chain_atom_verify_res_t res = ATOM_ACCEPT;
 
+    if(sizeof (l_event->header)<= a_atom_size)
+        return  ATOM_REJECT;
     // genesis or seed mode
     if (l_event->header.hash_count == 0){
       if(s_seed_mode && !PVT(l_dag)->events)
@@ -583,7 +596,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_
 
       if (l_dag->is_static_genesis_event ){
         dap_chain_hash_fast_t l_event_hash;
-        dap_chain_cs_dag_event_calc_hash(l_event,&l_event_hash);
+        dap_chain_cs_dag_event_calc_hash(l_event,a_atom_size, &l_event_hash);
         if ( memcmp( &l_event_hash, &l_dag->static_genesis_event_hash, sizeof(l_event_hash) ) != 0 ){
           char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash);
           char * l_genesis_event_hash_str = dap_chain_hash_fast_to_str_new(&l_dag->static_genesis_event_hash);
@@ -618,7 +631,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_
 
     //consensus
     if(res == ATOM_ACCEPT)
-        if(l_dag->callback_cs_verify ( l_dag, l_event ))
+        if(l_dag->callback_cs_verify ( l_dag, l_event,a_atom_size ))
             res = ATOM_REJECT;
 
     return res;
@@ -661,7 +674,7 @@ void s_dag_events_lasts_process_new_last_event(dap_chain_cs_dag_t * a_dag, dap_c
     dap_chain_cs_dag_event_item_t * l_event_last= DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
     l_event_last->ts_added = a_event_item->ts_added;
     l_event_last->event = a_event_item->event;
-    dap_hash_fast(l_event_last->event, dap_chain_cs_dag_event_calc_size(l_event_last->event),&l_event_last->hash );
+    dap_hash_fast(l_event_last->event, a_event_item->event_size,&l_event_last->hash );
     HASH_ADD(hh,PVT(a_dag)->events_lasts_unlinked,hash, sizeof(l_event_last->hash),l_event_last);
 }
 
@@ -749,17 +762,6 @@ bool dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a
     return res;
 }
 
-
-/**
- * @brief s_chain_callback_atom_get_size Get size of atomic element
- * @param a_atom
- * @return
- */
-static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t  a_atom)
-{
-    return dap_chain_cs_dag_event_calc_size( (dap_chain_cs_dag_event_t * ) a_atom);
-}
-
 /**
  * @brief s_chain_callback_atom_get_static_hdr_size
  * @param a_chain
@@ -777,7 +779,7 @@ static size_t s_chain_callback_atom_get_static_hdr_size()
  * @return
  */
 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)
+                                                                     dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
 {
     dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
     l_atom_iter->chain = a_chain;
@@ -785,7 +787,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t
 
     if ( a_atom ){
         dap_chain_hash_fast_t l_atom_hash;
-        dap_hash_fast(a_atom, a_chain->callback_atom_get_size(a_atom), &l_atom_hash );
+        dap_hash_fast(a_atom, a_atom_size, &l_atom_hash );
 
         dap_chain_cs_dag_event_item_t  * l_atom_item;
         HASH_FIND(hh, PVT(DAP_CHAIN_CS_DAG(a_chain))->events, &l_atom_hash, sizeof(l_atom_hash),l_atom_item );
@@ -812,10 +814,10 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_
  * @param a_atom_iter
  * @return
  */
-static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event)
+static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event, size_t a_atom_size)
 {
     if(a_event)
-        return dap_chain_cs_dag_event_get_datum((dap_chain_cs_dag_event_t*) a_event);
+        return dap_chain_cs_dag_event_get_datum((dap_chain_cs_dag_event_t*) a_event, a_atom_size);
     return NULL;
 }
 
@@ -824,16 +826,19 @@ static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a
  * @param a_atom_iter
  * @return
  */
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter )
+static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t * a_ret_size )
 {
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_atom_iter->chain);
     dap_chain_cs_dag_pvt_t *l_dag_pvt = l_dag ? PVT(l_dag) : NULL;
     a_atom_iter->cur_item = l_dag_pvt->events;
     a_atom_iter->cur = (dap_chain_cs_dag_event_t*) (l_dag_pvt->events ? l_dag_pvt->events->event : NULL);
+    a_atom_iter->cur_size =l_dag_pvt->events->event_size;
 
 //    a_atom_iter->cur =  a_atom_iter->cur ?
 //                (dap_chain_cs_dag_event_t*) PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events->event : NULL;
 //    a_atom_iter->cur_item = PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events;
+    if (a_ret_size)
+        *a_ret_size = a_atom_iter->cur_size;
     return a_atom_iter->cur;
 }
 
@@ -843,21 +848,24 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
  * @param a_lasts_size_ptr
  * @return
  */
-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 )
+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,
+                                                                  size_t ** a_lasts_size_array )
 {
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_atom_iter->chain );
 
-    *a_lasts_size_ptr = HASH_COUNT( PVT(l_dag)->events_lasts_unlinked );
-    if ( *a_lasts_size_ptr > 0 ) {
+    if ( HASH_COUNT( PVT(l_dag)->events_lasts_unlinked ) > 0 ) {
+        if( a_lasts_size)
+            *a_lasts_size = HASH_COUNT( PVT(l_dag)->events_lasts_unlinked );
         dap_chain_atom_ptr_t * l_ret = DAP_NEW_Z_SIZE( dap_chain_atom_ptr_t,
-                                           sizeof (dap_chain_atom_ptr_t*) * (*a_lasts_size_ptr) );
+                                           sizeof (dap_chain_atom_ptr_t*) * HASH_COUNT( PVT(l_dag)->events_lasts_unlinked ) );
 
         dap_chain_cs_dag_event_item_t * l_event_item = NULL, *l_event_item_tmp = NULL;
         size_t i = 0;
         pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock);
+        *a_lasts_size_array = DAP_NEW_Z_SIZE(size_t,sizeof (size_t)* HASH_CNT(hh,PVT(l_dag)->events_lasts_unlinked));
         HASH_ITER(hh,PVT(l_dag)->events_lasts_unlinked, l_event_item,l_event_item_tmp){
             l_ret[i] = l_event_item->event;
+            (*a_lasts_size_array)[i] = l_event_item->event_size;
             i++;
         }
         pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
@@ -872,8 +880,8 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts( dap_chain_ato
  * @param a_links_size_ptr
  * @return
  */
-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 )
+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,
+                                                                  size_t ** a_links_size_array )
 {
     if ( a_atom_iter->cur && a_atom_iter->chain){
         dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_atom_iter->chain );
@@ -886,7 +894,9 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_ato
         if ( l_event->header.hash_count > 0){
             dap_chain_atom_ptr_t * l_ret = DAP_NEW_Z_SIZE(dap_chain_atom_ptr_t,
                                                sizeof (dap_chain_atom_ptr_t*) * l_event->header.hash_count );
-            *a_links_size_ptr = l_event->header.hash_count;
+            if( a_links_size)
+                *a_links_size = l_event->header.hash_count;
+            *a_links_size_array = DAP_NEW_Z_SIZE(size_t, l_event->header.hash_count*sizeof (size_t));
             for (uint16_t i = 0; i < l_event->header.hash_count; i++){
                 dap_chain_cs_dag_event_item_t * l_link_item = NULL;
                 dap_chain_hash_fast_t * l_link_hash = (dap_chain_hash_fast_t *)
@@ -895,16 +905,17 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_ato
                 HASH_FIND(hh, PVT(l_dag)->events,l_link_hash,sizeof(*l_link_hash),l_link_item);
                 if ( l_link_item ){
                     l_ret[i] = l_link_item->event;
+                    (*a_links_size_array)[i] = l_link_item->event_size;
                 }else {
                     char * l_link_hash_str = dap_chain_hash_fast_to_str_new(l_link_hash);
                     char * l_event_hash_str = l_event_item ? dap_chain_hash_fast_to_str_new(&l_event_item->hash) : NULL;
                     log_it(L_ERROR,"Can't find %s->%s links", l_event_hash_str ? l_event_hash_str : "[null]", l_link_hash_str);
                     DAP_DELETE(l_event_hash_str);
                     DAP_DELETE(l_link_hash_str);
-                    (*a_links_size_ptr)--;
+                    (*a_links_size_array)--;
                 }
             }
-            if(!(*a_links_size_ptr)){
+            if(!(*a_links_size_array)){
                 DAP_DELETE(l_ret);
                 l_ret = NULL;
             }
@@ -921,7 +932,7 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_ato
  * @return
  */
 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)
+                                                                       dap_chain_hash_fast_t * a_atom_hash,size_t *a_atom_size)
 {
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_atom_iter->chain );
     dap_chain_cs_dag_event_item_t * l_event_item = NULL;
@@ -929,6 +940,9 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at
     if ( l_event_item ){
         a_atom_iter->cur_item = l_event_item;
         a_atom_iter->cur = l_event_item->event;
+        a_atom_iter->cur_size= l_event_item->event_size;
+        if(a_atom_size)
+            *a_atom_size = l_event_item->event_size;
         return  l_event_item->event;
     }else
         return NULL;
@@ -942,7 +956,7 @@ static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chai
     dap_chain_cs_dag_event_item_t * l_event_item = NULL;
     HASH_FIND(hh, PVT(l_dag)->tx_events,a_atom_hash,sizeof(*a_atom_hash),l_event_item);
     if ( l_event_item ){
-        dap_chain_datum_t * l_datum = dap_chain_cs_dag_event_get_datum(l_event_item->event) ;
+        dap_chain_datum_t * l_datum = dap_chain_cs_dag_event_get_datum(l_event_item->event, l_event_item->event_size) ;
         return l_datum ? l_datum->header.data_size ? (dap_chain_datum_tx_t*) l_datum->data : NULL :NULL;
     }else
         return NULL;
@@ -953,7 +967,7 @@ static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chai
  * @param a_atom_iter
  * @return
  */
-static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter )
+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_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item;
@@ -962,6 +976,10 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_
         // 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?a_atom_iter->cur_size: 0;
+    if(a_atom_size)
+        *a_atom_size = a_atom_iter->cur_size;
+
     return a_atom_iter->cur;
 }
 
@@ -984,6 +1002,7 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite
  */
 static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
 {
+    (void) arg_func;
     enum {
         SUBCMD_EVENT_CREATE,
         SUBCMD_EVENT_CANCEL,
@@ -992,13 +1011,13 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
         SUBCMD_UNDEFINED
     } l_event_subcmd={0};
 
-    const char* l_event_subcmd_str[]={
+    /*const char* l_event_subcmd_str[]={
         [SUBCMD_EVENT_CREATE]="create",
         [SUBCMD_EVENT_CANCEL]="cancel",
         [SUBCMD_EVENT_LIST]="list",
         [SUBCMD_EVENT_DUMP]="dump",
         [SUBCMD_UNDEFINED]="UNDEFINED"
-    };
+    };*/
 
 
     int arg_index = 1;
@@ -1082,7 +1101,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
                 dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t*) l_objs[i].value;
                 size_t l_event_size = l_objs[i].value_len;
                 int l_ret_event_verify;
-                if ( ( l_ret_event_verify = l_dag->callback_cs_verify (l_dag,l_event) ) !=0 ){// if consensus accept the event
+                if ( ( l_ret_event_verify = l_dag->callback_cs_verify (l_dag,l_event,l_event_size) ) !=0 ){// if consensus accept the event
                     dap_string_append_printf( l_str_ret_tmp,
                             "Error! Event %s is not passing consensus verification, ret code %d\n",
                                               l_objs[i].key, l_ret_event_verify );
@@ -1092,9 +1111,9 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
                     dap_string_append_printf( l_str_ret_tmp, "Event %s verification passed\n", l_objs[i].key);
                     // If not verify only mode we add
                     if ( ! l_verify_only ){
-                        dap_chain_atom_ptr_t l_new_atom = (dap_chain_atom_ptr_t)dap_chain_cs_dag_event_copy(l_event); // produce deep copy of event;
+                        dap_chain_atom_ptr_t l_new_atom = (dap_chain_atom_ptr_t)dap_chain_cs_dag_event_copy(l_event, l_event_size); // produce deep copy of event;
                         memcpy(l_new_atom, l_event, l_event_size);
-                        if(s_chain_callback_atom_add(l_chain, l_new_atom) < 0) { // Add new atom in chain
+                        if(s_chain_callback_atom_add(l_chain, l_new_atom,l_event_size) < 0) { // Add new atom in chain
                             DAP_DELETE(l_new_atom);
                             dap_string_append_printf(l_str_ret_tmp, "Event %s not added in chain\n", l_objs[i].key);
                         }
@@ -1297,7 +1316,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
 
                     }else if ( strcmp(l_from_events_str,"events_lasts") == 0){
                         dap_chain_cs_dag_event_item_t * l_event_item = NULL;
-                        pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock);
+                        pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock);
                         HASH_FIND(hh,PVT(l_dag)->events_lasts_unlinked,&l_event_hash,sizeof(l_event_hash),l_event_item);
                         pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
                         if ( l_event_item )
@@ -1310,7 +1329,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
                         }
                     }else if ( strcmp(l_from_events_str,"events") == 0){
                         dap_chain_cs_dag_event_item_t * l_event_item = NULL;
-                        pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock);
+                        pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock);
                         HASH_FIND(hh,PVT(l_dag)->events,&l_event_hash,sizeof(l_event_hash),l_event_item);
                         pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
                         if ( l_event_item )
diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c
index edf2b6621705cece4659efc2ddae1e91063a979d..a9d1d755b57b6591a1c395fe59d05aeebc0c3e34 100644
--- a/modules/type/dag/dap_chain_cs_dag_event.c
+++ b/modules/type/dag/dap_chain_cs_dag_event.c
@@ -45,8 +45,9 @@
  */
 dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum
                                                 ,dap_enc_key_t * a_key ,
-                                                dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count)
+                                                dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t * a_event_size)
 {
+    assert(a_event_size);
     size_t l_hashes_size = sizeof(*a_hashes)*a_hashes_count;
     size_t l_datum_size =  dap_chain_datum_size(a_datum);
     dap_chain_cs_dag_event_t * l_event_new = NULL;
@@ -58,11 +59,15 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id,
     l_event_new->header.cell_id.uint64 = a_cell_id.uint64;
     l_event_new->header.chain_id.uint64 = a_chain_id.uint64;
     l_event_new->header.hash_count = a_hashes_count;
+    *a_event_size = sizeof (l_event_new->header);
 
-    if ( l_hashes_size )
+    if ( l_hashes_size ){
         memcpy(l_event_new->hashes_n_datum_n_signs, a_hashes, l_hashes_size );
+        *a_event_size += l_hashes_size;
+    }
 
     memcpy(l_event_new->hashes_n_datum_n_signs+l_hashes_size, a_datum,l_datum_size );
+    *a_event_size += l_datum_size;
 
     if ( a_key ){
         dap_sign_t * l_sign = dap_sign_create(a_key,l_event_new,
@@ -72,6 +77,7 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id,
             size_t l_sign_size = dap_sign_get_size(l_sign);
             l_event_new = (dap_chain_cs_dag_event_t* )DAP_REALLOC(l_event_new,l_event_size+l_sign_size );
             memcpy(l_event_new->hashes_n_datum_n_signs + l_hashes_size + l_datum_size, l_sign, l_sign_size);
+            *a_event_size += l_sign_size;
             l_event_size += l_sign_size;
             l_event_new->header.signs_count++;
             DAP_DELETE(l_sign);
@@ -91,13 +97,12 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id,
  * @param a_event_src
  * @return
  */
-dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t *a_event_src)
+dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t *a_event_src,size_t a_event_size)
 {
     if(!a_event_src)
         return NULL;
-    size_t l_event_size = dap_chain_cs_dag_event_calc_size(a_event_src);
-    dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, l_event_size);
-    memcpy(l_event_new, a_event_src, l_event_size);
+    dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, a_event_size);
+    memcpy(l_event_new, a_event_src, a_event_size);
     return l_event_new;
 }
 
@@ -107,16 +112,15 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t
  * @param l_key
  * @return
  */
-dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event,
+dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event, size_t a_event_size,
                                                                       dap_enc_key_t * l_key)
 {
-    size_t l_event_size = dap_chain_cs_dag_event_calc_size( a_event );
-    size_t l_event_signing_size = dap_chain_cs_dag_event_calc_size_excl_signs( a_event );
+    size_t l_event_signing_size = dap_chain_cs_dag_event_calc_size_excl_signs( a_event ,a_event_size);
     dap_sign_t * l_sign = dap_sign_create(l_key,a_event,l_event_signing_size,0);
     size_t l_sign_size = dap_sign_get_size(l_sign);
-    dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, l_event_size+l_sign_size);
-    memcpy(l_event_new, a_event,l_event_size);
-    memcpy(l_event_new+l_event_size,l_sign,l_sign_size);
+    dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, a_event_size+l_sign_size);
+    memcpy(l_event_new, a_event,a_event_size);
+    memcpy(l_event_new+a_event_size,l_sign,l_sign_size);
     l_event_new->header.signs_count++;
     return l_event_new;
 }
@@ -127,16 +131,23 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_
  * @param a_sign_number
  * @return
  */
-dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, uint16_t a_sign_number)
+dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, uint16_t a_sign_number)
 {
+    size_t l_offset_passed = sizeof (a_event->header);
     if (a_event->header.signs_count > a_sign_number ){
-        size_t l_offset_to_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_event);
+        size_t l_offset_to_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_event,a_event_size);
+        l_offset_passed += l_offset_to_sign;
+        if ( l_offset_passed >= a_event_size)
+            return NULL;
         uint8_t * l_signs = ((uint8_t*) a_event)+l_offset_to_sign;
         uint16_t l_signs_offset = 0;
         uint16_t l_signs_passed;
         for ( l_signs_passed=0;  l_signs_passed < a_sign_number; l_signs_passed++){
             dap_sign_t * l_sign = (dap_sign_t *) (l_signs+l_signs_offset);
             l_signs_offset+=l_sign->header.sign_pkey_size+l_sign->header.sign_size+sizeof(l_sign->header);
+            l_offset_passed += l_offset_to_sign;
+            if ( l_offset_passed >= a_event_size)
+                return NULL;
         }
         return (dap_sign_t*) l_signs + l_signs_offset;
     }else
diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h
index 74a974b5a6d1a568c0cb1915da15f52cc3798144..6befe38ae351a1f4d04298ef2a8b8f588ca3a3de 100644
--- a/modules/type/dag/include/dap_chain_cs_dag.h
+++ b/modules/type/dag/include/dap_chain_cs_dag.h
@@ -28,14 +28,14 @@
 typedef struct dap_chain_cs_dag dap_chain_cs_dag_t;
 
 typedef void (*dap_chain_cs_dag_callback_t)(dap_chain_cs_dag_t *);
-typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *);
+typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *,size_t);
 
 
 
 typedef dap_chain_cs_dag_event_t * (*dap_chain_cs_dag_callback_event_create_t)(dap_chain_cs_dag_t *,
                                                                                dap_chain_datum_t *,
                                                                                dap_chain_hash_fast_t *,
-                                                                               size_t);
+                                                                               size_t, size_t*);
 
 typedef struct dap_chain_cs_dag
 {
diff --git a/modules/type/dag/include/dap_chain_cs_dag_event.h b/modules/type/dag/include/dap_chain_cs_dag_event.h
index 39b898d9b1e9123e8ed62b068287a85a0c31d3e6..14e2d7850659cd50a81d7af39338f3111e9a4ba9 100644
--- a/modules/type/dag/include/dap_chain_cs_dag_event.h
+++ b/modules/type/dag/include/dap_chain_cs_dag_event.h
@@ -49,7 +49,7 @@ typedef struct dap_chain_cs_dag_event {
 
 dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum,
                                                 dap_enc_key_t * a_key,
-                                                dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count);
+                                                dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t * a_event_size);
 
 
 /**
@@ -57,23 +57,25 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id,
  * @param a_event
  * @return
  */
-static inline dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event)
+static inline dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event,size_t a_event_size)
 {
-    return (dap_chain_datum_t* ) (a_event->hashes_n_datum_n_signs
-            +a_event->header.hash_count*sizeof(dap_chain_hash_fast_t));
+    return  a_event->header.hash_count*sizeof(dap_chain_hash_fast_t)<=a_event_size?(dap_chain_datum_t* ) (a_event->hashes_n_datum_n_signs
+            +a_event->header.hash_count*sizeof(dap_chain_hash_fast_t)): NULL;
 }
 
-dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t *a_event_src);
+dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t *a_event_src, size_t a_event_size);
 
 // Important: returns new deep copy of event
-dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event, dap_enc_key_t * l_key);
-dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, uint16_t a_sign_number);
+dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event,size_t a_event_size, dap_enc_key_t * l_key);
+dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, uint16_t a_sign_number);
 
 /**
  * @brief dap_chain_cs_dag_event_calc_size
  * @param a_event
  * @return
  */
+
+/**
 static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t * a_event)
 {
     if(!a_event)
@@ -93,14 +95,16 @@ static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t *
 
     return sizeof( a_event->header ) + l_hashes_size +l_signs_offset +l_datum_size;
 }
-
+**/
 /**
  * @brief dap_chain_cs_dag_event_calc_size_excl_signs
  * @param a_event
  * @return
  */
-static inline size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t * a_event)
+static inline ssize_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t * a_event,size_t a_event_size)
 {
+    if (a_event_size> sizeof (a_event->header))
+        return -1;
     size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);
     dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size);
     size_t l_datum_size = dap_chain_datum_size(l_datum);
@@ -113,7 +117,7 @@ static inline size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_da
  * @param a_event
  * @param a_event_hash
  */
-static inline void dap_chain_cs_dag_event_calc_hash(dap_chain_cs_dag_event_t * a_event,dap_chain_hash_fast_t * a_event_hash)
+static inline void dap_chain_cs_dag_event_calc_hash(dap_chain_cs_dag_event_t * a_event,size_t a_event_size, dap_chain_hash_fast_t * a_event_hash)
 {
-    dap_hash_fast(a_event, dap_chain_cs_dag_event_calc_size (a_event) , a_event_hash);
+    dap_hash_fast(a_event, a_event_size , a_event_hash);
 }