diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index d6091478ba25be59df4949d9d7ffa48079be004e..9d73093321f8b4f7b8fb907a4d211caf5310ade9 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -714,19 +714,12 @@ ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_ato
         dap_cluster_t *l_net_cluster = dap_cluster_find(l_chain->net_id.uint64);
         if (l_net_cluster) {
             size_t l_pkt_size = a_atom_size + sizeof(dap_chain_ch_pkt_t);
-            dap_chain_ch_pkt_t *l_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_pkt_size);
+            dap_chain_ch_pkt_t *l_pkt = dap_chain_ch_pkt_new(l_chain->net_id.uint64, l_chain->id.uint64,
+                                                             a_chain_cell->id.uint64, a_atom, a_atom_size);
             if (l_pkt) {
-                l_pkt->hdr.version = 2;
-                l_pkt->hdr.data_size = a_atom_size;
-                l_pkt->hdr.net_id = l_chain->net_id;
-                l_pkt->hdr.chain_id = l_chain->id;
-                l_pkt->hdr.cell_id = a_chain_cell->id;
-                memcpy(l_pkt->data, a_atom, a_atom_size);
-                dap_gossip_msg_issue(l_net_cluster, DAP_STREAM_CH_CHAIN_ID,
-                                     l_pkt, l_pkt_size, a_new_atom_hash);
+                dap_gossip_msg_issue(l_net_cluster, DAP_STREAM_CH_CHAIN_ID, l_pkt, l_pkt_size, a_new_atom_hash);
                 DAP_DELETE(l_pkt);
-            } else
-                log_it(L_CRITICAL, "Not enough memory");
+            }
         }
     }
     ssize_t l_res = dap_chain_cell_file_append(a_chain_cell, a_atom, a_atom_size);
diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c
index 45868c8b5ba6604d57223d0537cd3324165fd20e..3bc47068d03e0e8e3fe6a266344a62c5cee80edf 100644
--- a/modules/chain/dap_chain_ch.c
+++ b/modules/chain/dap_chain_ch.c
@@ -1069,7 +1069,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         case DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN: {
             dap_chain_ch_pkt_t *l_chain_pkt = (dap_chain_ch_pkt_t *)l_ch_pkt->data;
             if (l_chain_pkt_data_size <= sizeof(dap_chain_ch_pkt_t) ||
-                    l_chain_pkt_data_size != sizeof(dap_chain_ch_pkt_t) + l_chain_pkt->hdr.data_size) {
+                    (l_chain_pkt->hdr.version >= 2 &&
+                        l_chain_pkt_data_size != sizeof(dap_chain_ch_pkt_t) + l_chain_pkt->hdr.data_size)) {
                 log_it(L_WARNING, "Incorrect chain packet size");
                 break;
             }
diff --git a/modules/chain/dap_chain_ch_pkt.c b/modules/chain/dap_chain_ch_pkt.c
index 216b31e3bc634dfdbb2799632fa166ecb5965bb9..a42b35d439b48274ce5bd1b25b80daade9d13c4d 100644
--- a/modules/chain/dap_chain_ch_pkt.c
+++ b/modules/chain/dap_chain_ch_pkt.c
@@ -34,21 +34,30 @@ size_t dap_chain_ch_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint
                                             uint64_t a_chain_id, uint64_t a_cell_id,
                                             const void * a_data, size_t a_data_size)
 {
-    size_t l_chain_pkt_size = sizeof(dap_chain_ch_pkt_hdr_t) + a_data_size;
-    dap_chain_ch_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size);
-    *l_chain_pkt = (dap_chain_ch_pkt_t){
-            .hdr = { .version = DAP_STREAM_CH_CHAIN_PKT_VERSION, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id }
-    };
-
-    if (a_data_size && a_data)
-        memcpy(l_chain_pkt->data, a_data, a_data_size);
-
-    size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_chain_pkt, l_chain_pkt_size);
+    dap_chain_ch_pkt_t *l_chain_pkt = dap_chain_ch_pkt_new(a_net_id, a_chain_id, a_cell_id, a_data, a_data_size);
+    size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_chain_pkt, sizeof(dap_chain_ch_pkt_hdr_t) + a_data_size);
     DAP_DELETE(l_chain_pkt);
     return l_ret;
 }
 
-
+dap_chain_ch_pkt_t *dap_chain_ch_pkt_new(uint64_t a_net_id, uint64_t a_chain_id, uint64_t a_cell_id,
+                                         const void *a_data, size_t a_data_size)
+{
+    size_t l_chain_pkt_size = sizeof(dap_chain_ch_pkt_hdr_t) + a_data_size;
+    dap_chain_ch_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size);
+    if (l_chain_pkt) {
+        *l_chain_pkt = (dap_chain_ch_pkt_t) {
+                .hdr = { .version = DAP_STREAM_CH_CHAIN_PKT_VERSION,
+                         .data_size = a_data_size,
+                         .net_id.uint64 = a_net_id,
+                         .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id }
+        };
+        if (a_data_size && a_data)
+            memcpy(l_chain_pkt->data, a_data, a_data_size);
+    } else
+        log_it(L_CRITICAL, g_error_memory_alloc);
+    return l_chain_pkt;
+}
 /**
  * @brief dap_chain_ch_pkt_write_mt
  * @param a_worker
diff --git a/modules/chain/include/dap_chain_ch_pkt.h b/modules/chain/include/dap_chain_ch_pkt.h
index d0f33de8cebd55eb09732936dedee1362a5814fb..90e128fb3dddddc8bf43e5346a21c7a16f494dad 100644
--- a/modules/chain/include/dap_chain_ch_pkt.h
+++ b/modules/chain/include/dap_chain_ch_pkt.h
@@ -36,7 +36,7 @@
 
 #include "dap_stream_ch.h"
 
-#define DAP_STREAM_CH_CHAIN_PKT_VERSION                        0x01
+#define DAP_STREAM_CH_CHAIN_PKT_VERSION                        0x02
 
 #define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ         0x05
 #define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START       0x25
@@ -118,6 +118,9 @@ static const char* c_dap_chain_ch_pkt_type_str[]={
 
 };
 
+dap_chain_ch_pkt_t *dap_chain_ch_pkt_new(uint64_t a_net_id, uint64_t a_chain_id, uint64_t a_cell_id,
+                                         const void *a_data, size_t a_data_size);
+
 size_t dap_chain_ch_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint64_t a_net_id,
                                             uint64_t a_chain_id, uint64_t a_cell_id,
                                             const void * a_data, size_t a_data_size);