From 302ca1891e0d2e8eb49e29a740f8cfb5f5348816 Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Tue, 7 Jun 2022 18:35:41 +0000
Subject: [PATCH] bugs-6279

---
 CMakeLists.txt                                |   2 +-
 dap-sdk/io/dap_context.c                      |  14 ++-
 dap-sdk/io/dap_events.c                       |   4 +-
 dap-sdk/io/dap_events_socket.c                |  12 +-
 dap-sdk/io/dap_proc_thread.c                  |  30 ++---
 dap-sdk/io/dap_worker.c                       |  12 +-
 dap-sdk/io/include/dap_context.h              |   1 +
 dap-sdk/io/include/dap_events_socket.h        |   3 +-
 dap-sdk/io/include/dap_proc_thread.h          |   1 +
 dap-sdk/io/include/dap_worker.h               |   3 -
 dap-sdk/net/client/dap_client_pvt.c           |   2 +-
 dap-sdk/net/stream/ch/include/dap_stream_ch.h |  13 +--
 .../net/stream/ch/include/dap_stream_ch_pkt.h |   7 +-
 .../net/stream/stream/include/dap_stream.h    |  18 +--
 modules/channel/chain/dap_stream_ch_chain.c   |   6 +-
 .../consensus/dag-poa/dap_chain_cs_dag_poa.c  |  43 ++------
 modules/global-db/dap_chain_global_db.c       |   9 +-
 .../dap_chain_global_db_driver_cdb.c          |   2 +
 modules/net/dap_chain_net.c                   |  12 +-
 modules/net/dap_chain_node_cli.c              |   2 +-
 modules/net/dap_chain_node_cli_cmd.c          |  33 +++---
 modules/net/include/dap_chain_net.h           |   4 +-
 modules/service/vpn/dap_chain_net_srv_vpn.c   |  41 ++++---
 .../vpn/dap_chain_net_vpn_client_tun.c        |   4 +-
 modules/type/dag/dap_chain_cs_dag.c           |   5 +-
 modules/type/dag/dap_chain_cs_dag_event.c     | 103 +++++++-----------
 modules/type/dag/include/dap_chain_cs_dag.h   |   3 -
 .../type/dag/include/dap_chain_cs_dag_event.h |   5 +-
 modules/wallet/dap_chain_wallet.c             |   4 +-
 29 files changed, 162 insertions(+), 236 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a8b1295351..8f3f2e6fce 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
-project(cellframe-sdk C)
 cmake_minimum_required(VERSION 3.10)
+project(cellframe-sdk C)
 
 set(CMAKE_C_STANDARD 11)
 set(CELLFRAME_SDK_NATIVE_VERSION "3.2-0")
diff --git a/dap-sdk/io/dap_context.c b/dap-sdk/io/dap_context.c
index 3c7b735846..2d635d83e4 100644
--- a/dap-sdk/io/dap_context.c
+++ b/dap-sdk/io/dap_context.c
@@ -789,8 +789,11 @@ int dap_context_thread_loop(dap_context_t * a_context)
                                      * generation of unexpected I/O events like POLLOUT and consuming CPU by this.
                                      */
                                     dap_events_socket_set_writable_unsafe(l_cur, false);/* Clear "enable write flag" */
-                                    if ( l_cur->callbacks.write_finished_callback )     /* Optionaly call I/O completion routine */
+                                    if ( l_cur->callbacks.write_finished_callback ) {    /* Optionaly call I/O completion routine */
+                                        if (l_errno == EWOULDBLOCK || l_errno == EAGAIN || l_errno == EINTR)
+                                            l_errno = 0;
                                         l_cur->callbacks.write_finished_callback(l_cur, l_cur->callbacks.arg, l_errno);
+                                    }
                                 }
                             }else{
                                 log_it(L_ERROR, "Wrong bytes sent, %zd more then was in buffer %zd",l_bytes_sent, l_cur->buf_out_size);
@@ -1112,7 +1115,12 @@ int dap_context_add_esocket(dap_context_t * a_context, dap_events_socket_t * a_e
 #else
 #error "Unimplemented new esocket on context callback for current platform"
 #endif
-
+    // Add in context HT
+    a_esocket->me = a_esocket;
+    if (a_esocket->socket!=0 && a_esocket->socket != INVALID_SOCKET){
+        HASH_ADD(hh, a_context->esockets, uuid, sizeof(a_esocket->uuid), a_esocket );
+        a_context->event_sockets_count++;
+    }
 }
 
 
@@ -1131,7 +1139,7 @@ dap_events_socket_t *dap_context_esocket_find_by_uuid(dap_context_t * a_context,
     dap_events_socket_t * l_ret = NULL;
     if(a_context->esockets ) {
         //HASH_FIND_PTR( a_worker->context->esockets, &a_es_uuid,l_ret );
-        HASH_FIND(hh_worker, a_context->esockets, &a_es_uuid, sizeof(a_es_uuid), l_ret );
+        HASH_FIND(hh, a_context->esockets, &a_es_uuid, sizeof(a_es_uuid), l_ret );
     }
     return l_ret;
 }
diff --git a/dap-sdk/io/dap_events.c b/dap-sdk/io/dap_events.c
index 64f75ff883..1e8e4cb026 100644
--- a/dap-sdk/io/dap_events.c
+++ b/dap-sdk/io/dap_events.c
@@ -438,7 +438,7 @@ uint32_t dap_events_worker_get_index_min( )
         log_it(L_CRITICAL, "Event socket reactor has not been fired, use dap_events_init() first");
 
     for( uint32_t i = 1; i < s_threads_count; i++ ) {
-        if ( s_workers[min]->event_sockets_count > s_workers[i]->event_sockets_count )
+        if ( s_workers[min]->context->event_sockets_count > s_workers[i]->context->event_sockets_count )
             min = i;
     }
 
@@ -484,6 +484,6 @@ void dap_events_worker_print_all( )
         log_it(L_CRITICAL, "Event socket reactor has not been fired, use dap_events_init() first");
 
     for( uint32_t i = 0; i < s_threads_count; i ++ ) {
-        log_it( L_INFO, "Worker: %d, count open connections: %d", s_workers[i]->id, s_workers[i]->event_sockets_count );
+        log_it( L_INFO, "Worker: %d, count open connections: %d", s_workers[i]->id, s_workers[i]->context->event_sockets_count );
     }
 }
diff --git a/dap-sdk/io/dap_events_socket.c b/dap-sdk/io/dap_events_socket.c
index 7ea684c728..ffa87b084f 100644
--- a/dap-sdk/io/dap_events_socket.c
+++ b/dap-sdk/io/dap_events_socket.c
@@ -1244,10 +1244,10 @@ void dap_events_socket_remove_and_delete_unsafe( dap_events_socket_t *a_es, bool
     assert(a_es);
 
 #ifdef DAP_EVENTS_CAPS_POLL
-    if(a_es->worker){
+    if(a_es->context->worker){
         assert (a_es->poll_index>=0);
-        a_es->worker->poll[a_es->poll_index].fd=-1;
-        a_es->worker->poll_esocket[a_es->poll_index]=NULL;
+        a_es->context->poll[a_es->poll_index].fd=-1;
+        a_es->context->poll_esocket[a_es->poll_index]=NULL;
     }
 #endif
 
@@ -1316,8 +1316,8 @@ void dap_events_socket_remove_from_worker_unsafe( dap_events_socket_t *a_es, dap
         return;
     }
 
-    a_worker->event_sockets_count--;
-    HASH_DELETE(hh_worker,a_worker->context->esockets, a_es);
+    a_worker->context->event_sockets_count--;
+    HASH_DELETE(hh,a_worker->context->esockets, a_es);
 
 #if defined(DAP_EVENTS_CAPS_EPOLL)
 
@@ -1374,7 +1374,7 @@ void dap_events_socket_remove_from_worker_unsafe( dap_events_socket_t *a_es, dap
         a_worker->context->poll[a_es->poll_index].fd = -1;
         a_worker->context->poll_compress = true;
     }else{
-        log_it(L_ERROR, "Wrong poll index when remove from worker (unsafe): %u when total count %u", a_es->poll_index, a_worker->poll_count);
+        log_it(L_ERROR, "Wrong poll index when remove from worker (unsafe): %u when total count %u", a_es->poll_index, a_worker->context->poll_count);
     }
 #else
 #error "Unimplemented new esocket on worker callback for current platform"
diff --git a/dap-sdk/io/dap_proc_thread.c b/dap-sdk/io/dap_proc_thread.c
index 70d2e1653f..bc40962fdd 100644
--- a/dap-sdk/io/dap_proc_thread.c
+++ b/dap-sdk/io/dap_proc_thread.c
@@ -291,26 +291,18 @@ int dap_proc_thread_assign_esocket_unsafe(dap_proc_thread_t * a_thread, dap_even
     a_esocket->proc_thread = a_thread;
 
 #ifdef DAP_EVENTS_CAPS_EPOLL
-        // Init events for EPOLL
-        a_esocket->ev.events = a_esocket->ev_base_flags ;
-        if(a_esocket->flags & DAP_SOCK_READY_TO_READ )
-            a_esocket->ev.events |= EPOLLIN;
-        if(a_esocket->flags & DAP_SOCK_READY_TO_WRITE )
-            a_esocket->ev.events |= EPOLLOUT;
-        a_esocket->ev.data.ptr = a_esocket;
-        return epoll_ctl(a_thread->epoll_ctl, EPOLL_CTL_ADD, a_esocket->socket, &a_esocket->ev);
+    // Init events for EPOLL
+    a_esocket->ev.events = a_esocket->ev_base_flags ;
+    if(a_esocket->flags & DAP_SOCK_READY_TO_READ )
+        a_esocket->ev.events |= EPOLLIN;
+    if(a_esocket->flags & DAP_SOCK_READY_TO_WRITE )
+        a_esocket->ev.events |= EPOLLOUT;
+    a_esocket->ev.data.ptr = a_esocket;
+    return epoll_ctl(a_thread->epoll_ctl, EPOLL_CTL_ADD, a_esocket->socket, &a_esocket->ev);
 #elif defined (DAP_EVENTS_CAPS_POLL)
-    if (  a_thread->poll_count == a_thread->poll_count_max ){ // realloc
-        a_thread->poll_count_max *= 2;
-        log_it(L_WARNING, "Too many descriptors (%zu), resizing array twice to %zu", a_thread->poll_count, a_thread->poll_count_max);
-        a_thread->poll =DAP_REALLOC(a_thread->poll, a_thread->poll_count_max * sizeof(*a_thread->poll));
-        a_thread->esockets =DAP_REALLOC(a_thread->esockets, a_thread->poll_count_max * sizeof(*a_thread->esockets));
-    }
-
-    a_thread->poll[a_thread->poll_count].fd = a_thread->proc_queue->esocket->fd;
-    a_thread->poll[a_thread->poll_count].events = a_thread->proc_queue->esocket->poll_base_flags;
-    a_thread->esockets[a_thread->poll_count] = a_thread->proc_queue->esocket;
-    a_thread->poll_count++;
+    int l_ret = dap_context_add_esocket(a_thread->context, a_esocket);
+    if (l_ret)
+        log_it(L_CRITICAL,"Can't add event socket's handler to worker i/o poll mechanism with error %d", errno);
 #elif defined (DAP_EVENTS_CAPS_KQUEUE)
 /*    u_short l_flags = a_esocket->kqueue_base_flags;
     u_int   l_fflags = a_esocket->kqueue_base_fflags;
diff --git a/dap-sdk/io/dap_worker.c b/dap-sdk/io/dap_worker.c
index 7c5293241a..2c57f62382 100644
--- a/dap-sdk/io/dap_worker.c
+++ b/dap-sdk/io/dap_worker.c
@@ -195,20 +195,13 @@ static void s_queue_add_es_callback( dap_events_socket_t * a_es, void * a_arg)
         l_es_new->is_initalized = true;
     }
 
-    int l_ret =dap_context_add_esocket(l_context,l_es_new);
+    int l_ret = dap_context_add_esocket(l_context, l_es_new);
     if (  l_ret != 0 ){
         log_it(L_CRITICAL,"Can't add event socket's handler to worker i/o poll mechanism with error %d", errno);
     }else{
-        // Add in worker
-        l_es_new->me = l_es_new;
-        if (l_es_new->socket!=0 && l_es_new->socket != INVALID_SOCKET){
-            HASH_ADD(hh_worker, l_worker->context->esockets, uuid, sizeof(l_es_new->uuid), l_es_new );
-            l_worker->event_sockets_count++;
-        }
         //log_it(L_DEBUG, "Added socket %d on worker %u", l_es_new->socket, w->id);
         if (l_es_new->callbacks.worker_assign_callback)
             l_es_new->callbacks.worker_assign_callback(l_es_new, l_worker);
-
     }
 }
 
@@ -343,11 +336,10 @@ static bool s_socket_all_check_activity( void * a_arg)
     dap_worker_t *l_worker = (dap_worker_t*) a_arg;
     assert(l_worker);
     dap_events_socket_t *l_es = NULL, *tmp = NULL;
-    char l_curtimebuf[64];
     time_t l_curtime= time(NULL);
     //dap_ctime_r(&l_curtime, l_curtimebuf);
     //log_it(L_DEBUG,"Check sockets activity on worker #%u at %s", l_worker->id, l_curtimebuf);
-    HASH_ITER(hh_worker, l_worker->context->esockets, l_es, tmp ) {
+    HASH_ITER(hh, l_worker->context->esockets, l_es, tmp ) {
         if (l_es->type == DESCRIPTOR_TYPE_SOCKET_CLIENT){
             if ( !(l_es->flags & DAP_SOCK_SIGNAL_CLOSE) &&
                  (  l_curtime >=  (l_es->last_time_active + s_connection_timeout) ) && !l_es->no_close ) {
diff --git a/dap-sdk/io/include/dap_context.h b/dap-sdk/io/include/dap_context.h
index 182a1fb421..fc8bf2a837 100644
--- a/dap-sdk/io/include/dap_context.h
+++ b/dap-sdk/io/include/dap_context.h
@@ -63,6 +63,7 @@ typedef struct dap_context {
 #error "Not defined worker for your platform"
 #endif
 
+    atomic_uint event_sockets_count;
     dap_events_socket_t *esockets; // Hashmap of event sockets
 
     // Signal to exit
diff --git a/dap-sdk/io/include/dap_events_socket.h b/dap-sdk/io/include/dap_events_socket.h
index 52086076a9..2731c37c9b 100644
--- a/dap-sdk/io/include/dap_events_socket.h
+++ b/dap-sdk/io/include/dap_events_socket.h
@@ -279,8 +279,7 @@ typedef struct dap_events_socket {
     void *_inheritor; // Inheritor data to specific client type, usualy states for state machine
     void *_pvt; //Private section, different for different types
     struct dap_events_socket * me; // pointer on itself
-    UT_hash_handle hh;
-    UT_hash_handle hh_worker; // Handle for local CPU storage on worker
+    UT_hash_handle hh; // Handle for local CPU storage on worker or proc_thread
 } dap_events_socket_t; // Node of bidirectional list of clients
 
 #define SSL(a) (a ? (WOLFSSL *) (a)->_pvt : NULL)
diff --git a/dap-sdk/io/include/dap_proc_thread.h b/dap-sdk/io/include/dap_proc_thread.h
index e2b1e9fb5e..044b7de01a 100644
--- a/dap-sdk/io/include/dap_proc_thread.h
+++ b/dap-sdk/io/include/dap_proc_thread.h
@@ -76,3 +76,4 @@ void dap_proc_thread_worker_exec_callback_inter(dap_proc_thread_t * a_thread, si
 int dap_proc_thread_assign_esocket_unsafe(dap_proc_thread_t * a_thread, dap_events_socket_t * a_esocket);
 
 
+#define dap_proc_thread_esocket_update_poll_flags(a, b) dap_context_poll_update(b)
diff --git a/dap-sdk/io/include/dap_worker.h b/dap-sdk/io/include/dap_worker.h
index c9cf8201d4..f26167879d 100644
--- a/dap-sdk/io/include/dap_worker.h
+++ b/dap-sdk/io/include/dap_worker.h
@@ -30,7 +30,6 @@
 #include "dap_events.h"
 #include "dap_context.h"
 
-typedef struct dap_context dap_context_t;
 //typedef struct dap_proc_queue dap_proc_queue_t;
 typedef struct dap_timerfd dap_timerfd_t;
 typedef struct dap_worker
@@ -40,8 +39,6 @@ typedef struct dap_worker
     dap_proc_queue_t* proc_queue;
     dap_events_socket_t *proc_queue_input;
 
-    atomic_uint event_sockets_count;
-
     // worker control queues
     dap_events_socket_t *queue_es_new; // Queue socket for new socket
     dap_events_socket_t **queue_es_new_input; // Queue socket for new socket
diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c
index 56a7fdae61..dddf6f8bae 100644
--- a/dap-sdk/net/client/dap_client_pvt.c
+++ b/dap-sdk/net/client/dap_client_pvt.c
@@ -486,7 +486,7 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt)
                     a_client_pvt->stream_es = dap_events_socket_wrap_no_add(a_client_pvt->events,
                             (int)a_client_pvt->stream_socket, &l_s_callbacks);
                     a_client_pvt->stream_es->flags |= DAP_SOCK_CONNECTING ; // To catch non-blocking error when connecting we should up WRITE flag
-                    //a_client_pvt->stream_es->flags |= DAP_SOCK_READY_TO_WRITE;
+                    a_client_pvt->stream_es->flags |= DAP_SOCK_READY_TO_WRITE;
                     a_client_pvt->stream_es->_inheritor = a_client_pvt;
                     a_client_pvt->stream = dap_stream_new_es_client(a_client_pvt->stream_es);
                     assert(a_client_pvt->stream);
diff --git a/dap-sdk/net/stream/ch/include/dap_stream_ch.h b/dap-sdk/net/stream/ch/include/dap_stream_ch.h
index c72f3c3003..c74c943fbd 100644
--- a/dap-sdk/net/stream/ch/include/dap_stream_ch.h
+++ b/dap-sdk/net/stream/ch/include/dap_stream_ch.h
@@ -25,16 +25,15 @@
 #include <stdint.h>
 #include "uthash.h"
 #include "dap_math_ops.h"
-typedef struct dap_stream dap_stream_t;
+#include "dap_stream.h"
+
+#define TECHICAL_CHANNEL_ID 't'
+
 typedef struct dap_stream_worker dap_stream_worker_t;
-typedef struct dap_stream_pkt dap_stream_pkt_t;
 typedef struct dap_stream_ch_proc dap_stream_ch_proc_t;
-typedef struct dap_stream_ch dap_stream_ch_t;
 typedef struct dap_events_socket dap_events_socket_t;
 
-#define TECHICAL_CHANNEL_ID 't'
-
-typedef void (*dap_stream_ch_callback_t) (dap_stream_ch_t*,void*);
+typedef void (* dap_stream_ch_callback_t)(dap_stream_ch_t *, void *);
 
 typedef uint64_t dap_stream_ch_uuid_t;
 typedef struct dap_stream_ch{
@@ -49,7 +48,7 @@ typedef struct dap_stream_ch{
         uint64_t bytes_read;
     } stat;
 
-    uint8_t buf[500000];
+    uint8_t buf[STREAM_BUF_SIZE_MAX];
 
     dap_stream_ch_proc_t * proc;
     void * internal;
diff --git a/dap-sdk/net/stream/ch/include/dap_stream_ch_pkt.h b/dap-sdk/net/stream/ch/include/dap_stream_ch_pkt.h
index 4c9a324a6a..f2b4698d48 100644
--- a/dap-sdk/net/stream/ch/include/dap_stream_ch_pkt.h
+++ b/dap-sdk/net/stream/ch/include/dap_stream_ch_pkt.h
@@ -26,14 +26,9 @@
 
 #include <stdint.h>
 #include <stddef.h>
-
+#include "dap_stream_ch.h"
 #include "dap_enc_key.h"
 
-typedef uint64_t dap_stream_ch_uuid_t;
-typedef struct dap_stream_ch dap_stream_ch_t;
-typedef struct dap_stream_session dap_stream_session_t;
-typedef struct dap_events_socket dap_events_socket_t;
-typedef struct dap_stream_worker dap_stream_worker_t;
 typedef struct dap_stream_ch_pkt_hdr{
     uint8_t id;   // Channel id
     uint8_t enc_type; // Zero if not encrypted
diff --git a/dap-sdk/net/stream/stream/include/dap_stream.h b/dap-sdk/net/stream/stream/include/dap_stream.h
index 639b9b7d83..758fbd97a3 100644
--- a/dap-sdk/net/stream/stream/include/dap_stream.h
+++ b/dap-sdk/net/stream/stream/include/dap_stream.h
@@ -26,28 +26,18 @@
 #include <pthread.h>
 #include <stdbool.h>
 #include <pthread.h>
-
+#include "dap_http.h"
 #include "dap_events_socket.h"
 #include "dap_config.h"
 #include "dap_stream_session.h"
-#include "dap_stream_ch.h"
 #include "dap_timerfd.h"
 
 #define CHUNK_SIZE_MAX (3 * 1024)
-
-typedef struct dap_client_remote dap_client_remote_t;
-typedef struct dap_udp_server dap_udp_server_t;
-
-
-typedef struct dap_http_client dap_http_client_t;
-typedef struct dap_http dap_http_t;
-typedef struct dap_stream dap_stream_t;
-typedef struct dap_stream_pkt dap_stream_pkt_t;
-typedef struct dap_events_socket dap_events_socket_t;
 #define STREAM_BUF_SIZE_MAX DAP_STREAM_PKT_SIZE_MAX * 4
 #define STREAM_KEEPALIVE_TIMEOUT 3   // How  often send keeplive messages (seconds)
 
-typedef void (*dap_stream_callback)( dap_stream_t *,void*);
+typedef struct dap_stream_ch dap_stream_ch_t;
+typedef struct dap_stream_worker dap_stream_worker_t;
 
 typedef struct dap_stream {
     int id;
@@ -87,6 +77,8 @@ typedef struct dap_stream {
 
 } dap_stream_t;
 
+typedef void (*dap_stream_callback)(dap_stream_t *, void *);
+
 #define DAP_STREAM(a) ((dap_stream_t *) (a)->_inheritor )
 
 int dap_stream_init(dap_config_t * g_config);
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 617dc01786..4ec0585484 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -401,7 +401,7 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar
     dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
 
     int l_flags = 0;
-    if (dap_chain_net_get_add_gdb_group(l_net, l_sync_request->request.node_addr))
+    if (dap_chain_net_get_extra_gdb_group(l_net, l_sync_request->request.node_addr))
         l_flags |= F_DB_LOG_ADD_EXTRA_GROUPS;
     if (!l_sync_request->request.id_start)
         l_flags |= F_DB_LOG_SYNC_FROM_ZERO;
@@ -461,7 +461,7 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a
     dap_chain_net_add_downlink(l_net, l_ch->stream_worker, l_ch->uuid);
     dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
     int l_flags = 0;
-    if (dap_chain_net_get_add_gdb_group(l_net, l_sync_request->request.node_addr))
+    if (dap_chain_net_get_extra_gdb_group(l_net, l_sync_request->request.node_addr))
         l_flags |= F_DB_LOG_ADD_EXTRA_GROUPS;
     if (!l_sync_request->request.id_start)
         l_flags |= F_DB_LOG_SYNC_FROM_ZERO;
@@ -709,7 +709,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
         uint32_t l_last_type = l_store_obj->type;
         bool l_group_changed = false;
         uint32_t l_time_store_lim_hours = dap_config_get_item_uint32_default(g_config, "resources", "dap_global_db_time_store_limit", 72);
-        dap_gdb_time_t l_time_now = dap_gdb_time_now();
+        dap_gdb_time_t l_time_now = dap_gdb_time_now() + dap_gdb_time_from_sec(120);    // time differnece consideration
         uint64_t l_limit_time = l_time_store_lim_hours ? l_time_now - dap_gdb_time_from_sec(l_time_store_lim_hours * 3600) : 0;
         for (size_t i = 0; i < l_data_obj_count; i++) {
             // obj to add
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 280795fc48..341a78e519 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -258,8 +258,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply)
             }else {
                 size_t l_event_size = l_round_item->event_size;
                 dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)DAP_DUP_SIZE(l_round_item->event_n_signs, l_event_size);
-                size_t l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size,
-                                                            l_chain_net, l_poa_pvt->events_sign_cert->enc_key);
+                size_t l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size, l_poa_pvt->events_sign_cert->enc_key);
 
                 if ( l_event_size_new ) {
                     dap_chain_hash_fast_t l_event_new_hash;
@@ -415,8 +414,6 @@ static bool s_poa_round_check(dap_chain_t *a_chain) {
     if (l_objs_size) {
         for (size_t i = 0; i<l_objs_size; i++) {
             dap_chain_cs_dag_event_round_item_t *l_event_round_item = (dap_chain_cs_dag_event_round_item_t *)l_objs[i].value;
-            size_t l_event_size = l_event_round_item->event_size;
-            dap_chain_cs_dag_event_t *l_event = (dap_chain_cs_dag_event_t *)l_event_round_item->event_n_signs;
             if (  (dap_time_now() - l_event_round_item->round_info.ts_update) >   
                     (l_poa_pvt->confirmations_timeout+l_poa_pvt->wait_sync_before_complete+10)  ) {
                 dap_chain_global_db_gr_del(l_objs[i].key, l_gdb_group_round);
@@ -454,7 +451,7 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev
     //char * l_max_signs_hash;
     for (size_t l_index = 0; l_index<l_events_round_size; l_index++) {
         dap_chain_cs_dag_event_round_item_t *l_event_round_item = (dap_chain_cs_dag_event_round_item_t *)l_events_round[l_index].value;
-        if (!l_event_round_item || !l_events_round[l_index].value_len || !l_event_round_item->event_n_signs) {
+        if (!l_event_round_item || !l_events_round[l_index].value_len) {
             dap_chain_global_db_gr_del(l_events_round[l_index].key, l_gdb_group_events);
             continue;
         }
@@ -655,11 +652,11 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
             log_it(L_NOTICE,"Loaded \"%s\" certificate to sign poa event", l_events_sign_cert);
 
     }
-    // Process events from GDB
     dap_chain_net_t *l_cur_net = dap_chain_net_by_name(a_chain->net_name);
     dap_chain_node_role_t l_role = dap_chain_net_get_role(l_cur_net);
     if (l_role.enums == NODE_ROLE_ROOT_MASTER || l_role.enums == NODE_ROLE_ROOT) {
         l_dag->callback_cs_event_round_sync = s_callback_event_round_sync;
+        /* Process events from GDB  - leads to segfault with previous group truncate
         size_t l_round_objs_count;
         dap_global_db_obj_t *l_round_objs = dap_chain_global_db_gr_load(l_dag->gdb_group_events_round_new, &l_round_objs_count);
         if (l_round_objs) {
@@ -669,6 +666,7 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
             }
             dap_chain_global_db_objs_delete(l_round_objs, l_round_objs_count);
         }
+        */
     }
     return 0;
 }
@@ -716,7 +714,6 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
                                                           dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size)
 {
     dap_return_val_if_fail(a_dag && a_dag->chain && DAP_CHAIN_CS_DAG_POA(a_dag), NULL);
-    dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name );
     dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA(a_dag);
     if ( PVT(l_poa)->events_sign_cert == NULL){
         log_it(L_ERROR, "Can't sign event with events_sign_cert in [dag-poa] section");
@@ -733,7 +730,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
             int ret = PVT(l_poa)->callback_pre_sign->callback(a_dag->chain, l_event, *a_event_size, PVT(l_poa)->callback_pre_sign->arg);
             if (ret)
                 return NULL;
-            *a_event_size = dap_chain_cs_dag_event_sign_add(&l_event, *a_event_size, l_net, PVT(l_poa)->events_sign_cert->enc_key);
+            *a_event_size = dap_chain_cs_dag_event_sign_add(&l_event, *a_event_size, PVT(l_poa)->events_sign_cert->enc_key);
             return l_event;
         }
     }
@@ -743,8 +740,6 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
 static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group,
                                         const char *a_key, const void *a_value, const size_t a_value_size)
 {
-    dap_chain_net_t *l_net = dap_chain_net_by_id( a_dag->chain->net_id);
-
     if ( a_value == NULL || a_op_code != DAP_DB$K_OPTYPE_ADD || !a_value || !a_value_size) {
         return 0;
     }
@@ -767,10 +762,10 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
             || dap_chain_cs_dag_event_round_sign_exists(l_round_item,
                                                         PVT(l_poa)->events_sign_cert->enc_key)) {
         // if my sign exists
-        //if (PVT(l_poa)->auto_round_complete && s_round_event_ready_minimum_check(a_dag, l_event, l_event_size,
-        //                                                    (char *)a_key,  &l_round_item->round_info))
+        if (PVT(l_poa)->auto_round_complete && s_round_event_ready_minimum_check(a_dag, l_event, l_event_size,
+                                                            (char *)a_key,  &l_round_item->round_info))
             // cs done (minimum signs & verify passed)
-        //    s_round_event_cs_done(a_dag, l_event, (char *)a_key, &l_round_item->round_info);
+            s_round_event_cs_done(a_dag, l_event, (char *)a_key, &l_round_item->round_info);
         s_round_event_clean_dup(a_dag, a_key);
         DAP_DELETE(l_round_item);
         DAP_DELETE(l_event);
@@ -782,14 +777,13 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
     if ( !PVT(l_poa)->callback_pre_sign || !PVT(l_poa)->callback_pre_sign->callback
             || (ret = PVT(l_poa)->callback_pre_sign->callback(a_dag->chain, 
                                 l_event, l_event_size, PVT(l_poa)->callback_pre_sign->arg)) == 0 ) {
-        l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size,
-                                                l_net, PVT(l_poa)->events_sign_cert->enc_key);
+        l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size, PVT(l_poa)->events_sign_cert->enc_key);
     } else {
         size_t l_round_item_size_new = 0;
         bool l_deleted = false;
         // set sign for reject
         if ( (l_round_item_size_new = dap_chain_cs_dag_event_round_sign_add(&l_round_item, a_value_size,
-                                                l_net, PVT(l_poa)->events_sign_cert->enc_key)) ) {
+                                                                    PVT(l_poa)->events_sign_cert->enc_key)) ) {
             // event reject
             log_it(L_NOTICE,"Can't sign Event %s Sign rejected by pre_sign callback, ret code=%d", a_key, ret);
             l_round_item->round_info.reject_count++;
@@ -820,26 +814,13 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
         dap_chain_hash_fast_t l_event_new_hash;
         dap_chain_cs_dag_event_calc_hash(l_event, l_event_size_new, &l_event_new_hash);
         l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash);
-        if (dap_chain_cs_dag_event_gdb_set(a_dag, l_event_new_hash_hex_str, l_event,
-                                            l_event_size_new, l_round_item, a_group)) {
-            // a_dag->callback_broadcast(a_dag, l_round_item);
-            // dap_chain_global_db_gr_del(a_key, a_group); // Delete old event
-        }
-        bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event, l_event_size_new,
-                                                            l_event_new_hash_hex_str,  &l_round_item->round_info);
-        if (l_event_is_ready && PVT(l_poa)->auto_round_complete) { // cs done (minimum signs & verify passed)
-            s_round_event_cs_done(a_dag, l_event, l_event_new_hash_hex_str, &l_round_item->round_info);
-        }
+        dap_chain_cs_dag_event_gdb_set(a_dag, l_event_new_hash_hex_str, l_event,
+                                            l_event_size_new, l_round_item, a_group);
     }
     else {
         l_event_size_new = l_event_size;
         l_event_new_hash_hex_str = (char *)a_key;
     }
-    // bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event, l_event_size_new,
-    //                                                     l_event_new_hash_hex_str,  &l_round_item->round_info);
-    // if (l_event_is_ready && PVT(l_poa)->auto_round_complete) { // cs done (minimum signs & verify passed)
-    //     s_round_event_cs_done(a_dag, l_event, l_event_new_hash_hex_str, &l_round_item->round_info);
-    // }
     // Delete dup
     s_round_event_clean_dup(a_dag, l_event_new_hash_hex_str);
     if (l_event_new_hash_hex_str != a_key)
diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c
index 331c6a9bea..4f2e9a6664 100644
--- a/modules/global-db/dap_chain_global_db.c
+++ b/modules/global-db/dap_chain_global_db.c
@@ -577,10 +577,9 @@ dap_global_db_obj_t* dap_chain_global_db_load(size_t *a_data_size_out)
 void dap_global_db_change_notify(dap_store_obj_t *a_store_data)
 {
     dap_store_obj_t *l_obj = a_store_data;
-    dap_list_t *it = s_sync_group_items;
-
-    while (it) {
-        for (; it; it = it->next) {
+    dap_list_t *l_items_list = s_sync_group_items;
+    while (l_items_list) {
+        for (dap_list_t *it = l_items_list; it; it = it->next) {
             dap_sync_group_item_t *l_sync_group_item = (dap_sync_group_item_t *)it->data;
             if (dap_fnmatch(l_sync_group_item->group_mask, l_obj->group, 0))
                 continue;
@@ -592,7 +591,7 @@ void dap_global_db_change_notify(dap_store_obj_t *a_store_data)
             }
             return;
         }
-        it = it == s_sync_group_items ? s_sync_group_extra_items : NULL;
+        l_items_list = (l_items_list == s_sync_group_items) ? s_sync_group_extra_items : NULL;
     }
 }
 
diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c
index e489f50ad8..ad233a126b 100644
--- a/modules/global-db/dap_chain_global_db_driver_cdb.c
+++ b/modules/global-db/dap_chain_global_db_driver_cdb.c
@@ -394,6 +394,8 @@ dap_store_obj_t *dap_db_driver_cdb_read_last_store_obj(const char* a_group) {
     CDB *l_cdb = l_cdb_i->cdb;
     CDBSTAT l_cdb_stat;
     cdb_stat(l_cdb, &l_cdb_stat);
+    if (!l_cdb_stat.rnum)
+        return NULL;
     void *l_iter = cdb_iterate_new(l_cdb, 0);
     obj_arg l_arg;
     l_arg.o = DAP_NEW_Z(dap_store_obj_t);
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index cc1a2a0c75..cccefadda6 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -302,7 +302,7 @@ int dap_chain_net_init()
             "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n"
         "net -net <chain net name> get status\n"
             "\tLook at current status\n"
-        "net -net <chain net name> stats tx|tps [-from <From time>] [-to <To time>] [-prev_sec <Seconds>] \n"
+        "net -net <chain net name> stats {tx | tps} [-from <From time>] [-to <To time>] [-prev_sec <Seconds>] \n"
             "\tTransactions statistics. Time format is <Year>-<Month>-<Day>_<Hours>:<Minutes>:<Seconds> or just <Seconds> \n"
         "net -net <chain net name> [-mode {update | all}] sync {all | gdb | chains}\n"
             "\tSyncronyze gdb, chains or everything\n"
@@ -451,6 +451,10 @@ static bool s_net_send_records(dap_proc_thread_t *a_thread, void *a_arg)
         log_it(L_DEBUG, "Notified GDB event does not exist");
         return true;
     }
+    if (!l_obj->group || !l_obj->key) {
+        dap_store_obj_free_one(l_obj);
+        return true;
+    }
     l_obj->type = l_arg->type;
     if (l_obj->type == DAP_DB$K_OPTYPE_DEL) {
         DAP_DELETE(l_obj->group);
@@ -469,8 +473,6 @@ static bool s_net_send_records(dap_proc_thread_t *a_thread, void *a_arg)
                 l_chain = dap_chain_get_chain_from_group_name(l_net->pub.id, l_obj->group);
             dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t) {};
             dap_chain_cell_id_t l_cell_id = l_chain ? l_chain->cells->id : (dap_chain_cell_id_t){};
-            if (!l_obj_cur->group)
-                break;
             dap_store_obj_pkt_t *l_data_out = dap_store_packet_single(l_obj_cur);
             dap_store_obj_free_one(l_obj_cur);
             struct downlink *l_link, *l_tmp;
@@ -3236,12 +3238,12 @@ dap_chain_datum_tx_t * dap_chain_net_get_tx_by_hash(dap_chain_net_t * a_net, dap
 }
 
 /**
- * @brief dap_chain_net_get_add_gdb_group
+ * @brief dap_chain_net_get_extra_gdb_group
  * @param a_net
  * @param a_node_addr
  * @return
  */
-bool dap_chain_net_get_add_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr)
+bool dap_chain_net_get_extra_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr)
 {
     if(!a_net || !PVT(a_net) || !PVT(a_net)->gdb_sync_nodes_addrs)
         return false;
diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index 76ec838f98..4e1250bd85 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -1096,7 +1096,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
             "ledger list balance -net <network name>\n"
             "ledger info -hash <tx_hash> -net <network name> [-unspent]\n"
             "ledger tx -all -net <network name>\n"
-            "ledger tx [-addr <addr> | -w <wallet name> | -tx <tx_hash>] [-chain <chain name>] -net <network name>\n");
+            "ledger tx {-addr <addr> | -w <wallet name> | -tx <tx_hash>} [-chain <chain name>] -net <network name>\n");
 
     // Token info
     dap_chain_node_cli_cmd_item_create("token", com_token, "Token info",
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 9ca432efac..d1e0dc7de4 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -1598,7 +1598,7 @@ int com_ping(int argc, char** argv, char **str_reply)
 
     int n = 4;
     if(argc < 2) {
-        dap_chain_node_cli_set_reply_text(str_reply, "host not specified");
+        dap_chain_node_cli_set_reply_text(str_reply, "Host not specified");
         return -1;
     }
     const char *n_str = NULL;
@@ -1625,24 +1625,24 @@ int com_ping(int argc, char** argv, char **str_reply)
     DAP_DELETE(l_ping_handle);
     if(res >= 0) {
         if(str_reply)
-            dap_chain_node_cli_set_reply_text(str_reply, "ping %s time=%.1lf ms", addr, res * 1. / 1000);
+            dap_chain_node_cli_set_reply_text(str_reply, "Ping %s time=%.1lf ms", addr, res * 1. / 1000);
     }
     else {
         if(str_reply) {
             switch (-res)
             {
             case EDESTADDRREQ:
-                dap_chain_node_cli_set_reply_text(str_reply, "ping %s error: %s", addr, "Destination address required");
+                dap_chain_node_cli_set_reply_text(str_reply, "Ping %s error: %s", addr, "Destination address required");
                 break;
             case EADDRNOTAVAIL:
-                dap_chain_node_cli_set_reply_text(str_reply, "ping %s error: %s", (addr) ? addr : "",
+                dap_chain_node_cli_set_reply_text(str_reply, "Ping %s error: %s", (addr) ? addr : "",
                         (addr) ? "Host not found" : "Host not defined");
                 break;
             case EPFNOSUPPORT:
-                dap_chain_node_cli_set_reply_text(str_reply, "ping %s error: %s", addr, "Unknown protocol family");
+                dap_chain_node_cli_set_reply_text(str_reply, "Ping %s error: %s", addr, "Unknown protocol family");
                 break;
             default:
-                dap_chain_node_cli_set_reply_text(str_reply, "ping %s error(%d)", addr, -res);
+                dap_chain_node_cli_set_reply_text(str_reply, "Ping %s error(%d)", addr, -res);
             }
         }
     }
@@ -1782,11 +1782,13 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
         }
 
         // check wallet existence
-        if(!l_is_force){
-            dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path);
-            if(l_wallet) {
-                dap_chain_node_cli_set_reply_text(str_reply, "Wallet already exists");
-                dap_chain_wallet_close(l_wallet);
+        if (!l_is_force) {
+            char *l_file_name = dap_strdup_printf("%s/%s.dwallet", c_wallets_path, l_wallet_name);
+            FILE *l_exists = fopen(l_file_name, "rb");
+            DAP_DELETE(l_file_name);
+            if (l_exists) {
+                dap_chain_node_cli_set_reply_text(str_reply, "Wallet %s already exists", l_wallet_name);
+                fclose(l_exists);
                 return -1;
             }
         }
@@ -1809,7 +1811,7 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
 
         if (l_sign_type.type == SIG_TYPE_TESLA)
         {
-                dap_chain_node_cli_set_reply_text(str_reply, "Tesla algorithm is not supported, please, use another variant");
+                dap_chain_node_cli_set_reply_text(str_reply, "Tesla algorithm is no longer supported, please, use another variant");
                 return -1;
         }
 
@@ -2005,8 +2007,6 @@ int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index, int argc, ch
         // Select chain
         if(l_chain_str) {
             if((*a_chain = dap_chain_net_get_chain_by_name(*a_net, l_chain_str)) == NULL) { // Can't find such chain
-                dap_chain_node_cli_set_reply_text(a_str_reply,
-                        "%s requires parameter '-chain' to be valid chain name in chain net %s. Current chain %s is not valid",
                 char l_str_to_reply_chain[500] = {0};
                 char *l_str_to_reply = NULL;
                 dap_sprintf(l_str_to_reply_chain, "%s requires parameter '-chain' to be valid chain name in chain net %s. Current chain %s is not valid\n",
@@ -2015,7 +2015,7 @@ int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index, int argc, ch
                 dap_chain_t * l_chain;
                 dap_chain_net_t * l_chain_net = *a_net;
                 l_str_to_reply = dap_strcat2(l_str_to_reply,"\nAvailable chains:\n");
-                DL_FOREACH(l_chain_net->pub.chains, l_chain){
+                DL_FOREACH(l_chain_net->pub.chains, l_chain) {
                         l_str_to_reply = dap_strcat2(l_str_to_reply,"\t");
                         l_str_to_reply = dap_strcat2(l_str_to_reply,l_chain->name);
                         l_str_to_reply = dap_strcat2(l_str_to_reply,"\n");
@@ -2288,11 +2288,12 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a
         else
             dap_string_append_printf(a_str_tmp, "%s.%s: Not found records\n", a_net->pub.name, a_chain->name);
         for(size_t i = 0; i < l_objs_size; i++) {
-            dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value;
+            dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value;
             dap_time_t l_ts_create = (dap_time_t) l_datum->header.ts_create;
             if (!l_datum->header.data_size || (l_datum->header.data_size > l_objs[i].value_len)) {
                 log_it(L_ERROR, "Trash datum in GDB %s.%s, key: %s data_size:%u, value_len:%zu",
                         a_net->pub.name, a_chain->name, l_objs[i].key, l_datum->header.data_size, l_objs[i].value_len);
+                dap_chain_global_db_gr_del(l_objs[i].key, l_gdb_group_mempool);
                 continue;
             }
             char buf[50] = {[0]='\0'};
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 8e300c0fe4..cf7d197865 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -28,7 +28,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include <stdint.h>
 #include <string.h>
 #include "dap_net.h"
-#include "dap_stream.h"
+#include "dap_stream_ch.h"
 #include "dap_strfuncs.h"
 #include "dap_string.h"
 #include "dap_chain_common.h"
@@ -185,7 +185,7 @@ DAP_STATIC_INLINE char * dap_chain_net_get_gdb_group_from_chain(dap_chain_t * l_
 dap_chain_t * dap_chain_net_get_chain_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type);
 char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type);
 dap_chain_net_t **dap_chain_net_list(uint16_t *a_size);
-bool dap_chain_net_get_add_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr);
+bool dap_chain_net_get_extra_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr);
 
 int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum );
 void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type);
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index 70bf83f326..51ca69ef65 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -246,7 +246,7 @@ static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_in
 
     if(l_ch_vpn_info->is_on_this_worker){
         dap_events_socket_t * l_es = NULL;
-        if( (l_es= dap_worker_esocket_find_uuid( l_ch_vpn_info->worker, l_ch_vpn_info->esocket_uuid )) != NULL ){
+        if( (l_es= dap_context_esocket_find_by_uuid(l_ch_vpn_info->worker->context, l_ch_vpn_info->esocket_uuid)) != NULL ){
             if(l_es != l_ch_vpn_info->esocket){
                 log_it(L_WARNING, "Was wrong esocket %p on worker #%u, lost %zd data",l_ch_vpn_info->esocket, l_ch_vpn_info->worker->id,a_data_size );
                 DAP_DELETE(l_pkt_out);
@@ -300,7 +300,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
     switch (l_msg->type) {
         case TUN_SOCKET_MSG_ESOCKET_REASSIGNED:{
             assert(l_msg->esocket_reassigment.worker_id < s_tun_sockets_count);
-            dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->worker->id];
+            dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id];
             assert(l_tun_sock);
             dap_chain_net_srv_ch_vpn_info_t * l_info = NULL;
             HASH_FIND(hh,l_tun_sock->clients,&l_msg->esocket_reassigment.addr , sizeof (l_msg->esocket_reassigment.addr), l_info);
@@ -308,11 +308,11 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
                 l_info->worker = dap_events_worker_get(l_msg->esocket_reassigment.worker_id);
                 l_info->queue_msg = s_tun_sockets_queue_msg[l_msg->esocket_reassigment.worker_id];
                 l_info->is_reassigned_once = true;
-                l_info->is_on_this_worker =(a_esocket_queue->worker->id == l_msg->esocket_reassigment.worker_id);
+                l_info->is_on_this_worker =(a_esocket_queue->context->worker->id == l_msg->esocket_reassigment.worker_id);
                 if(dap_log_level_get() <= L_INFO){
                     char l_addrbuf[INET_ADDRSTRLEN]= { [0]='\0'};
                     inet_ntop(AF_INET,&l_msg->esocket_reassigment.addr, l_addrbuf, sizeof (l_addrbuf));
-                    log_it(L_INFO, "Tun:%u message: addr %s reassign on worker #%u",a_esocket_queue->worker->id,
+                    log_it(L_INFO, "Tun:%u message: addr %s reassign on worker #%u",a_esocket_queue->context->worker->id,
                            l_addrbuf, l_msg->esocket_reassigment.worker_id);
                 }
             }else{
@@ -321,13 +321,13 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
                     inet_ntop(AF_INET,&l_msg->esocket_reassigment.addr, l_addrbuf, sizeof (l_addrbuf));
                     log_it(L_INFO,"Reassigment message for address %s on worker %u comes but no such address was found on tun socket %u",
                            l_addrbuf, l_msg->esocket_reassigment.worker_id,
-                           a_esocket_queue->worker->id);
+                           a_esocket_queue->context->worker->id);
                 }
             }
         } break;
         case TUN_SOCKET_MSG_IP_ASSIGNED:{
             assert(l_msg->ip_assigment.worker_id < s_tun_sockets_count);
-            dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->worker->id];
+            dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id];
             assert(l_tun_sock);
 
             dap_chain_net_srv_ch_vpn_info_t * l_new_info = NULL;
@@ -343,7 +343,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
                 l_new_info->queue_msg = s_tun_sockets_queue_msg[l_msg->ip_assigment.worker_id];
                 l_new_info->usage_id = l_msg->ip_assigment.usage_id;
                 l_new_info->is_reassigned_once = l_msg->is_reassigned_once;
-                l_new_info->is_on_this_worker = (l_msg->ip_assigment.worker_id == a_esocket_queue->worker->id);
+                l_new_info->is_on_this_worker = (l_msg->ip_assigment.worker_id == a_esocket_queue->context->worker->id);
                 l_new_info->esocket = l_msg->esocket;
                 l_new_info->esocket_uuid = l_msg->esocket_uuid;
                 l_new_info->worker = dap_events_worker_get(l_msg->ip_assigment.worker_id);
@@ -351,7 +351,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
                 if(s_debug_more){
                     char l_addrbuf[INET_ADDRSTRLEN]= { [0]='\0'};
                     inet_ntop(AF_INET,&l_msg->ip_assigment.addr, l_addrbuf, sizeof (l_addrbuf));
-                    log_it(L_DEBUG, "Tun:%u message: addr %s assigned for worker #%u on tun #u",a_esocket_queue->worker->id,
+                    log_it(L_DEBUG, "Tun:%u message: addr %s assigned for worker #%u on tun #u",a_esocket_queue->context->worker->id,
                            l_addrbuf, l_msg->ip_assigment.worker_id);
                 }
             }
@@ -359,7 +359,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
         }break;
         case TUN_SOCKET_MSG_IP_UNASSIGNED:{
             assert(l_msg->ip_unassigment.worker_id < s_tun_sockets_count);
-            dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->worker->id];
+            dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id];
             assert(l_tun_sock);
 
             dap_chain_net_srv_ch_vpn_info_t * l_new_info = NULL;
@@ -383,12 +383,11 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void
             if(s_debug_more){
                 char l_addrbuf[INET_ADDRSTRLEN]= { [0]='\0'};
                 inet_ntop(AF_INET,&l_msg->ip_assigment.addr, l_addrbuf, sizeof (l_addrbuf));
-                log_it(L_DEBUG, "Tun:%u message: send %u bytes for ch vpn protocol",a_esocket_queue->worker->id,
+                log_it(L_DEBUG, "Tun:%u message: send %u bytes for ch vpn protocol",a_esocket_queue->context->worker->id,
                        l_msg->ch_vpn_send.pkt->header.op_data.data_size );
             }
-            if(dap_worker_esocket_find_uuid( a_esocket_queue->worker, l_msg->esocket_uuid )== l_msg->esocket  ){
-                    s_tun_client_send_data_unsafe(l_msg->ch_vpn,l_msg->ch_vpn_send.pkt);
-            }
+            if (dap_context_esocket_find_by_uuid(a_esocket_queue->context, l_msg->esocket_uuid) == l_msg->esocket)
+                s_tun_client_send_data_unsafe(l_msg->ch_vpn, l_msg->ch_vpn_send.pkt);
             DAP_DELETE(l_msg->ch_vpn_send.pkt);
         }break;
         default:log_it(L_ERROR,"Wrong tun socket message type %d", l_msg->type);
@@ -1366,9 +1365,9 @@ static ch_vpn_pkt_t *s_tun_fifo_read(dap_chain_net_srv_vpn_tun_socket_t *a_tun)
 static void s_es_tun_delete(dap_events_socket_t * a_es, void * arg)
 {
     (void) arg;
-    if (a_es->worker) {
-        s_tun_sockets[a_es->worker->id] = NULL;
-        dap_events_socket_remove_and_delete_unsafe(s_tun_sockets_queue_msg[a_es->worker->id],false);
+    if (a_es->context->worker) {
+        s_tun_sockets[a_es->context->worker->id] = NULL;
+        dap_events_socket_remove_and_delete_unsafe(s_tun_sockets_queue_msg[a_es->context->worker->id],false);
         log_it(L_NOTICE,"Destroyed TUN event socket");
     }
 }
@@ -1432,11 +1431,11 @@ static void s_es_tun_read(dap_events_socket_t * a_es, void * arg)
         // We found in local table, sending data (if possible)
         if (l_vpn_info){
             if ( !l_vpn_info->is_on_this_worker && !l_vpn_info->is_reassigned_once && s_raw_server->auto_cpu_reassignment ){
-                log_it(L_NOTICE, "Reassigning from worker %u to %u", l_vpn_info->worker->id, a_es->worker->id);
+                log_it(L_NOTICE, "Reassigning from worker %u to %u", l_vpn_info->worker->id, a_es->context->worker->id);
                 l_vpn_info->is_reassigned_once = true;
                 s_tun_send_msg_esocket_reasigned_all_inter(l_vpn_info->ch_vpn, l_vpn_info->esocket,l_vpn_info->esocket_uuid,
-                                                           l_vpn_info->addr_ipv4,a_es->worker->id);
-                dap_events_socket_reassign_between_workers_mt( l_vpn_info->worker,l_vpn_info->esocket,a_es->worker);
+                                                           l_vpn_info->addr_ipv4, a_es->context->worker->id);
+                dap_events_socket_reassign_between_workers_mt( l_vpn_info->worker, l_vpn_info->esocket, a_es->context->worker);
             }
             s_tun_client_send_data(l_vpn_info, a_es->buf_in, l_buf_in_size);
         }else if(s_debug_more){
@@ -1470,11 +1469,11 @@ static void s_es_tun_new(dap_events_socket_t * a_es, void * arg)
     (void) arg;
     dap_chain_net_srv_vpn_tun_socket_t * l_tun_socket = DAP_NEW_Z(dap_chain_net_srv_vpn_tun_socket_t);
     if ( l_tun_socket ){
-        dap_worker_t * l_worker = l_tun_socket->worker = a_es->worker;
+        dap_worker_t * l_worker = l_tun_socket->worker = a_es->context->worker;
         uint32_t l_worker_id = l_tun_socket->worker_id = l_worker->id;
         l_tun_socket->es = a_es;
 
-        s_tun_sockets_queue_msg[l_worker_id] = dap_events_socket_create_type_queue_ptr_unsafe(l_worker, s_tun_recv_msg_callback );
+        s_tun_sockets_queue_msg[l_worker_id] = dap_context_create_esocket_queue(l_worker->context, s_tun_recv_msg_callback );
         s_tun_sockets[l_worker_id] = l_tun_socket;
 
         l_tun_socket->queue_tun_msg_input = DAP_NEW_Z_SIZE(dap_events_socket_t*,sizeof(dap_events_socket_t*)*
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 296a02586c..2ea066146b 100644
--- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c
+++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c
@@ -258,7 +258,7 @@ void m_client_tun_new(dap_events_socket_t * a_es, void * arg)
     (void) arg;
     dap_chain_net_srv_vpn_tun_socket_t * l_tun_socket = DAP_NEW_Z(dap_chain_net_srv_vpn_tun_socket_t);
     if ( l_tun_socket ){
-        l_tun_socket->worker = a_es->worker;
+        l_tun_socket->worker = a_es->context->worker;
         l_tun_socket->worker_id = l_tun_socket->worker->id;
         l_tun_socket->es = a_es;
         //s_tun_sockets_queue_msg[a_es->worker->id] = dap_events_socket_create_type_queue_ptr_unsafe(a_es->worker, s_tun_recv_msg_callback );
@@ -466,7 +466,7 @@ int dap_chain_net_vpn_client_tun_delete(void)
 {
     if(s_tun_events_socket) {
         pthread_mutex_lock(&s_clients_mutex);
-        dap_events_socket_remove_and_delete_mt(s_tun_events_socket->worker, s_tun_events_socket->uuid);
+        dap_events_socket_remove_and_delete_mt(s_tun_events_socket->context->worker, s_tun_events_socket->uuid);
         s_tun_events_socket = NULL;
         pthread_mutex_unlock(&s_clients_mutex);
     }
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index a8a752905e..7b7d17cd76 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -151,7 +151,7 @@ int dap_chain_cs_dag_init(void)
         "dag event sign -net <chain net name> -chain <chain name> -event <event hash>\n"
             "\tAdd sign to event <event hash> in round.new. Hash doesn't include other signs so event hash\n"
             "\tdoesn't changes after sign add to event. \n\n"
-        "dag event dump -net <chain net name> -chain <chain name> -event <event hash> -from {events | events_lasts | round.new  | round.<Round id in hex>} [-H {hex | base58(default)}]\n"
+        "dag event dump -net <chain net name> -chain <chain name> -event <event hash> -from {events | events_lasts | threshold | round.new  | round.<Round id in hex>} [-H {hex | base58(default)}]\n"
             "\tDump event info\n\n"
         "dag event list -net <chain net name> -chain <chain name> -from {events | events_lasts | threshold | round.new | round.<Round id in hex>}\n\n"
             "\tShow event list \n\n"
@@ -281,7 +281,6 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     l_dag->datum_add_hashes_count = dap_config_get_item_uint16_default(a_chain_cfg,"dag","datum_add_hashes_count",1);
     l_dag->use_event_round_info = false;
     l_dag->callback_cs_set_event_round_info = s_dag_chain_cs_set_event_round_info;
-    l_dag->callback_broadcast = s_dag_chain_cs_event_round_broadcast;
     char * l_round_new_str = dap_strdup( dap_config_get_item_str_default(a_chain_cfg,"dag","gdb_group_events_round_new", "new"));
     dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id);
     
@@ -1963,7 +1962,7 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply)
                     if (l_cert && l_cert->enc_key->priv_key_data) {
                         size_t l_event_size = l_round_item->event_size;
                         dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)DAP_DUP_SIZE(l_round_item->event_n_signs, l_event_size);
-                        size_t l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size, l_net, l_cert->enc_key);
+                        size_t l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size, l_cert->enc_key);
                         if ( l_event_size_new ) {
                             dap_chain_hash_fast_t l_event_new_hash;
                             // dap_chain_cs_dag_event_calc_hash(l_event_new, l_event_size_new, &l_event_new_hash);
diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c
index 0941d153cb..740587c01e 100644
--- a/modules/type/dag/dap_chain_cs_dag_event.c
+++ b/modules/type/dag/dap_chain_cs_dag_event.c
@@ -110,48 +110,34 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t
  * @param l_key
  * @return
  */
-size_t dap_chain_cs_dag_event_sign_add( dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size,
-                                                            dap_chain_net_t * a_net, dap_enc_key_t * a_key)
+size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size, dap_enc_key_t * a_key)
 {
     assert(a_event_ptr);
     dap_chain_cs_dag_event_t *l_event = *a_event_ptr;
+    // check for re-sign with same key
+    if (dap_chain_cs_dag_event_sign_exists(l_event, a_event_size, a_key)) {
+        size_t l_pub_key_size = 0;
+        uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size);
+        dap_hash_fast_t l_pkey_hash = {};
+        dap_hash_fast(l_pub_key, l_pub_key_size, &l_pkey_hash);
+        DAP_DEL_Z(l_pub_key);
+        char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE];
+        dap_hash_fast_to_str(&l_pkey_hash, l_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
+        log_it(L_DEBUG, "Sign from this key exists: %s", l_hash_str);
+        return 0;
+    }
     size_t l_hashes_size = l_event->header.hash_count*sizeof(dap_chain_hash_fast_t);
-    dap_chain_datum_t * l_datum = (dap_chain_datum_t*)(l_event->hashes_n_datum_n_signs + l_hashes_size);
+    dap_chain_datum_t *l_datum = (dap_chain_datum_t *)(l_event->hashes_n_datum_n_signs + l_hashes_size);
     size_t l_datum_size =  dap_chain_datum_size(l_datum);
-    size_t l_event_size_excl_sign = sizeof(l_event->header)+l_hashes_size+l_datum_size;
-    size_t l_event_size = a_event_size;
-    dap_sign_t * l_sign = dap_sign_create(a_key,l_event,l_event_size_excl_sign,0);
+    size_t l_event_size_excl_sign = sizeof(l_event->header) + l_hashes_size + l_datum_size;
+    dap_sign_t *l_sign = dap_sign_create(a_key, l_event, l_event_size_excl_sign, 0);
     size_t l_sign_size = dap_sign_get_size(l_sign);
-    dap_chain_addr_t l_addr = {0};
-    dap_chain_hash_fast_t l_pkey_hash;
-    dap_sign_get_pkey_hash(l_sign, &l_pkey_hash);
-    dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, a_net->pub.id);
-
-    size_t l_offset = l_hashes_size+l_datum_size;
-    // checking re-sign from one address and calc signs size
-    while ( l_offset+sizeof(l_event->header) < l_event_size  ) {
-        dap_sign_t * l_item_sign = (dap_sign_t *)(l_event->hashes_n_datum_n_signs +l_offset);
-        size_t l_sign_item_size = dap_sign_get_size(l_item_sign);
-        dap_chain_addr_t l_item_addr = {0};
-        dap_chain_hash_fast_t l_item_pkey_hash;
-        dap_sign_get_pkey_hash(l_item_sign, &l_item_pkey_hash);
-        dap_chain_addr_fill(&l_item_addr, l_item_sign->header.type, &l_item_pkey_hash, a_net->pub.id);
-        // checking re-sign from one address
-        if (memcmp(&l_addr, &l_item_addr, sizeof(l_item_addr)) == 0) {
-            char * l_addr_str = dap_chain_addr_to_str(&l_addr);
-            log_it(L_DEBUG, "Sign from this addr exists: %s", l_addr_str);
-            DAP_DELETE(l_sign);
-            DAP_DELETE(l_addr_str);
-            return 0;
-        }
-        l_offset += l_sign_item_size;
-    }
-
-    *a_event_ptr = l_event = DAP_REALLOC(l_event, l_event_size+l_sign_size);
-    memcpy(l_event->hashes_n_datum_n_signs+l_offset, l_sign, l_sign_size);
+    *a_event_ptr = l_event = DAP_REALLOC(l_event, a_event_size + l_sign_size);
+    size_t l_event_size = a_event_size - sizeof(l_event->header);
+    memcpy(l_event->hashes_n_datum_n_signs + l_event_size, l_sign, l_sign_size);
     l_event->header.signs_count++;
     DAP_DELETE(l_sign);
-    return l_event_size+l_sign_size;
+    return a_event_size + l_sign_size;
 }
 
 static bool s_sign_exists(uint8_t *a_pos, size_t a_len, dap_enc_key_t *a_key)
@@ -165,12 +151,13 @@ static bool s_sign_exists(uint8_t *a_pos, size_t a_len, dap_enc_key_t *a_key)
         size_t l_sign_key_size = 0;
         uint8_t *l_sign_key = dap_sign_get_pkey(l_item_sign, &l_sign_key_size);
         if (l_pub_key_size == l_sign_key_size &&
-                !memcmp(&l_pub_key, &l_sign_key, l_pub_key_size)) {
+                !memcmp(l_pub_key, l_sign_key, l_pub_key_size)) {
             DAP_DELETE(l_pub_key);
             return true;
         }
         l_offset += l_sign_item_size;
     }
+    assert(l_offset == a_pos + a_len);
     DAP_DELETE(l_pub_key);
     return false;
 }
@@ -187,7 +174,7 @@ bool dap_chain_cs_dag_event_sign_exists(dap_chain_cs_dag_event_t *a_event, size_
 
 bool dap_chain_cs_dag_event_round_sign_exists(dap_chain_cs_dag_event_round_item_t *a_round_item, dap_enc_key_t *a_key) {
     uint8_t *l_offset = a_round_item->event_n_signs + (size_t)a_round_item->event_size;
-    size_t l_signs_size = (size_t)a_round_item->data_size - (size_t)a_round_item->event_size - sizeof(dap_chain_cs_dag_event_round_item_t);
+    size_t l_signs_size = (size_t)a_round_item->data_size - (size_t)a_round_item->event_size;
     return s_sign_exists(l_offset, l_signs_size, a_key);
 }
 
@@ -221,42 +208,26 @@ dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event
         return NULL;
 }
 
-size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t **a_round_item_ptr, size_t a_round_item_size,
-                                        dap_chain_net_t * a_net, dap_enc_key_t * a_key) {
+size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t **a_round_item_ptr, size_t a_round_item_size, dap_enc_key_t *a_key)
+{
     dap_chain_cs_dag_event_round_item_t *l_round_item = *a_round_item_ptr;
+    if (dap_chain_cs_dag_event_round_sign_exists(l_round_item, a_key))
+        return 0;
     dap_sign_t * l_sign = dap_sign_create(a_key, &l_round_item->round_info.datum_hash, sizeof(dap_chain_hash_fast_t), 0);
     size_t l_sign_size = dap_sign_get_size(l_sign);
-    dap_chain_addr_t l_addr = {0};
-    dap_chain_hash_fast_t l_pkey_hash;
-    dap_sign_get_pkey_hash(l_sign, &l_pkey_hash);
-    dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, a_net->pub.id);
-
-    size_t l_offset = (size_t)l_round_item->event_size;
-    while ( l_offset < (size_t)l_round_item->data_size ) {
-         dap_sign_t * l_item_sign = (dap_sign_t *)(l_round_item->event_n_signs+l_offset);
-         size_t l_sign_item_size = dap_sign_get_size(l_item_sign);
-         dap_chain_addr_t l_item_addr = {0};
-         dap_chain_hash_fast_t l_item_pkey_hash;
-         dap_sign_get_pkey_hash(l_item_sign, &l_item_pkey_hash);
-         dap_chain_addr_fill(&l_item_addr, l_item_sign->header.type, &l_item_pkey_hash, a_net->pub.id);
-         if (memcmp(&l_addr, &l_item_addr, sizeof(l_item_addr)) == 0) {
-             DAP_DELETE(l_sign);
-             return 0;
-         }
-         l_offset += l_sign_item_size;
-     }
-     *a_round_item_ptr = l_round_item = DAP_REALLOC(l_round_item, a_round_item_size+l_sign_size);
-     memcpy(l_round_item->event_n_signs+l_offset, l_sign, l_sign_size);
-     DAP_DELETE(l_sign);
-     l_round_item->data_size += (uint32_t)l_sign_size;
-     return a_round_item_size+l_sign_size;
+    size_t l_offset = (size_t)l_round_item->data_size;
+    *a_round_item_ptr = l_round_item = DAP_REALLOC(l_round_item, a_round_item_size+l_sign_size);
+    memcpy(l_round_item->event_n_signs+l_offset, l_sign, l_sign_size);
+    DAP_DELETE(l_sign);
+    l_round_item->data_size += (uint32_t)l_sign_size;
+    return a_round_item_size+l_sign_size;
 }
 
+
 static bool s_event_broadcast_send(dap_chain_cs_dag_event_round_broadcast_t *l_arg) {
     dap_chain_net_t *l_net = dap_chain_net_by_id(l_arg->dag->chain->net_id);
-    if (dap_chain_net_get_state(l_net) == NET_STATE_ONLINE) {
+    if (dap_chain_net_get_state(l_net) != NET_STATE_SYNC_GDB)
         dap_chain_net_sync_gdb_broadcast((void *)l_net, l_arg->op_code, l_arg->group, l_arg->key, l_arg->value, l_arg->value_size);
-    }
     else if ( l_arg->attempts < 10 ) {
         l_arg->attempts++;
         return true;
@@ -314,7 +285,9 @@ bool dap_chain_cs_dag_event_gdb_set(dap_chain_cs_dag_t *a_dag, char *a_event_has
             dap_chain_cs_dag_event_round_item_get_size(l_round_item),
             a_group);
 
-    a_dag->callback_broadcast(a_dag, l_round_item, a_event_hash_str);
+    /*size_t l_round_item_size = dap_chain_cs_dag_event_round_item_get_size(a_round_item);
+    dap_chain_cs_dag_event_broadcast(a_dag, DAP_DB$K_OPTYPE_ADD, a_dag->gdb_group_events_round_new,
+            a_key, a_round_item, l_round_item_size);*/
     DAP_DELETE(l_round_item);
     return ret;
 }
diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h
index d96bb74b1f..9431e95de1 100644
--- a/modules/type/dag/include/dap_chain_cs_dag.h
+++ b/modules/type/dag/include/dap_chain_cs_dag.h
@@ -29,8 +29,6 @@
 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 void (*dap_chain_cs_dag_callback_broadcast_t)(dap_chain_cs_dag_t *,
-                                    dap_chain_cs_dag_event_round_item_t *, const char *a_key);
 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 *,
@@ -68,7 +66,6 @@ typedef struct dap_chain_cs_dag
     char *gdb_group_datums_queue;
 
     dap_chain_cs_dag_callback_t callback_delete;
-    dap_chain_cs_dag_callback_broadcast_t callback_broadcast;
     dap_chain_cs_dag_callback_event_create_t callback_cs_event_create;
     dap_chain_cs_dag_callback_event_t callback_cs_verify;
     dap_chain_cs_dag_callback_get_round_info_t callback_cs_get_round_info;
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 35ab3b6839..614aa50658 100644
--- a/modules/type/dag/include/dap_chain_cs_dag_event.h
+++ b/modules/type/dag/include/dap_chain_cs_dag_event.h
@@ -95,10 +95,9 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t
 // dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_sign_add( dap_chain_cs_dag_event_t * a_event, size_t a_event_size,
 //                                                 size_t * a_event_size_new,
 //                                                 dap_chain_net_t * a_net, dap_enc_key_t * a_key);
-size_t dap_chain_cs_dag_event_sign_add( dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size,
-                                                            dap_chain_net_t * a_net, dap_enc_key_t * a_key);
+size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size, dap_enc_key_t * a_key);
 size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t **a_round_item_ptr, size_t a_round_item_size,
-                                        dap_chain_net_t * a_net, dap_enc_key_t * a_key);
+                                             dap_enc_key_t *a_key);
 bool dap_chain_cs_dag_event_sign_exists(dap_chain_cs_dag_event_t *a_event, size_t a_event_size, dap_enc_key_t * a_key);
 bool dap_chain_cs_dag_event_round_sign_exists(dap_chain_cs_dag_event_round_item_t *a_round_item, dap_enc_key_t * a_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);
diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c
index c8395ff5df..f7eee789bb 100644
--- a/modules/wallet/dap_chain_wallet.c
+++ b/modules/wallet/dap_chain_wallet.c
@@ -409,9 +409,7 @@ dap_chain_wallet_t * dap_chain_wallet_open(const char * a_wallet_name, const cha
 {
     if(!a_wallet_name || !a_wallets_path)
         return NULL;
-    size_t l_file_name_size = strlen(a_wallet_name)+strlen(a_wallets_path)+13;
-    char *l_file_name = DAP_NEW_Z_SIZE (char, l_file_name_size);
-    dap_snprintf(l_file_name, l_file_name_size, "%s/%s.dwallet", a_wallets_path, a_wallet_name);
+    char *l_file_name = dap_strdup_printf("%s/%s.dwallet", a_wallets_path, a_wallet_name);
     dap_chain_wallet_t * l_wallet = dap_chain_wallet_open_file(l_file_name);
     DAP_DELETE(l_file_name);
     return l_wallet;
-- 
GitLab