diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index f14c5f712cf9ed0570c2b291e72a4fce5dac48c0..fa714eac7c3bc259cc570ba2b96747148dc22ce2 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -317,7 +317,10 @@ static uint16_t s_chain_type_convert(dap_chain_type_t a_type)
         return DAP_CHAIN_DATUM_CA;
 	case CHAIN_TYPE_SIGNER:
 		return DAP_CHAIN_DATUM_SIGNER;
-
+    case CHAIN_TYPE_DECREE:
+        return DAP_CHAIN_DATUM_DECREE;
+    case CHAIN_TYPE_ANCHOR:
+        return DAP_CHAIN_DATUM_ANCHOR;
     default:
         return DAP_CHAIN_DATUM_CUSTOM;
     }
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 500103bdb1767e77c203a2eb7e8081841675f6de..bf55dd1b97afa257ae2b159615006c22627fd557 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -1736,7 +1736,7 @@ static void s_threshold_emissions_proc(dap_ledger_t * a_ledger)
             int l_res = s_token_emission_add_unsafe(a_ledger, (byte_t *)l_emission_item->datum_token_emission,
                                                             l_emission_item->datum_token_emission_size,
                                                             &l_emission_item->datum_token_emission_hash, true);
-            if (l_res != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN) {
+            if (l_res != DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE) {
                 HASH_DEL(PVT(a_ledger)->threshold_emissions, l_emission_item);
                 if (l_res)
                     DAP_DELETE(l_emission_item->datum_token_emission);
@@ -2127,17 +2127,17 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_
     int l_ret = 0;
     dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger);
 
-    const char * c_token_ticker = ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.ticker;
+    const char *l_token_ticker = ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.ticker;
     dap_chain_ledger_token_item_t * l_token_item = NULL;
     pthread_rwlock_rdlock(&l_ledger_pvt->tokens_rwlock);
-    HASH_FIND_STR(l_ledger_pvt->tokens, c_token_ticker, l_token_item);
+    HASH_FIND_STR(l_ledger_pvt->tokens, l_token_ticker, l_token_item);
     pthread_rwlock_unlock(&l_ledger_pvt->tokens_rwlock);
 
     dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL;
 
     if (!l_token_item) {
-        log_it(L_WARNING, "Ledger_token_emission_add_check. Token ticker %s was not found", c_token_ticker);
-        return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; // old return -5
+        log_it(L_WARNING, "Ledger_token_emission_add_check. Token ticker %s was not found", l_token_ticker);
+        return -5;
     }
 
     // check if such emission is already present in table
@@ -2157,12 +2157,12 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_
             if ( l_token_emission_item->datum_token_emission->hdr.version == 2 ) {
                 char *l_balance = dap_chain_balance_print(l_token_emission_item->datum_token_emission->hdr.value_256);
                 log_it(L_ERROR, "Can't add token emission datum of %s %s ( %s ): already present in cache",
-                        l_balance, c_token_ticker, l_hash_str);
+                        l_balance, l_token_ticker, l_hash_str);
                 DAP_DELETE(l_balance);
             }
             else
                 log_it(L_ERROR, "Can't add token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s ): already present in cache",
-                    l_token_emission_item->datum_token_emission->hdr.value, c_token_ticker, l_hash_str);
+                    l_token_emission_item->datum_token_emission->hdr.value, l_token_ticker, l_hash_str);
         }
         l_ret = -1;
     }else if ( (! l_token_item) && ( l_threshold_emissions_count >= s_threshold_emissions_max)) {
@@ -2255,7 +2255,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_
             }else{
                 if(s_debug_more)
                     log_it(L_WARNING,"Can't find token declaration %s:%s thats pointed in token emission datum", a_ledger->net_name, l_emission->hdr.ticker);
-                l_ret = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN;
+                l_ret = -5;
             }
         }break;
         default:{}
@@ -2368,7 +2368,7 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e
     dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL;
     int l_ret = dap_chain_ledger_token_emission_add_check(a_ledger, a_token_emission, a_token_emission_size);
     if (l_ret) {
-        if (l_ret == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN) {
+        if (l_ret == DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE) { // TODO remove emissions threshold
             if (HASH_COUNT(l_ledger_pvt->threshold_emissions) < s_threshold_emissions_max) {
                 l_token_emission_item = DAP_NEW_Z(dap_chain_ledger_token_emission_item_t);
                 l_token_emission_item->datum_token_emission = DAP_DUP_SIZE(a_token_emission, a_token_emission_size);
@@ -2395,7 +2395,7 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e
     HASH_FIND_STR(l_ledger_pvt->tokens, c_token_ticker, l_token_item);
     pthread_rwlock_unlock(&l_ledger_pvt->tokens_rwlock);
     if (!l_token_item && a_from_threshold)
-        return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN;
+        return -5;
 
     // check if such emission is already present in table
     if(a_safe_call) pthread_rwlock_rdlock( l_token_item ? &l_token_item->token_emissions_rwlock
@@ -2475,7 +2475,7 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e
             HASH_ADD(hh, l_ledger_pvt->threshold_emissions, datum_token_emission_hash,
                      sizeof(*a_emission_hash), l_token_emission_item);
             if(a_safe_call) pthread_rwlock_unlock(&l_ledger_pvt->threshold_emissions_rwlock);
-            l_ret = DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN;
+            l_ret = -5;
             if(s_debug_more) {
                 char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_emission_item->datum_token_emission->hdr.address));
                 log_it(L_NOTICE, "Added token emission datum to emissions threshold: type=%s value=%.1Lf token=%s to_addr=%s ",
@@ -2589,7 +2589,7 @@ int dap_chain_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token
                 l_token_emission_item);
         pthread_rwlock_unlock(&PVT(a_ledger)->threshold_emissions_rwlock);
         if (l_token_emission_item) {
-            return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN;
+            return -5;
         }
     }
     return dap_chain_ledger_token_emission_add(a_ledger, a_token_emission, a_token_emission_size, &l_token_emission_hash, false);
diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h
index 72e6e5cb85b7cb3873b08e70438c30fb49384cec..2b33563a07f87f5bf350c6f50abea57c95bc3faa 100644
--- a/modules/chain/include/dap_chain_ledger.h
+++ b/modules/chain/include/dap_chain_ledger.h
@@ -60,12 +60,12 @@ typedef struct dap_chain_net dap_chain_net_t;
 
 #define DAP_CHAIN_LEDGER_CACHE_ENABLED           0x0200
 
-// Error code for no previous transaction (candidate to threshold)
-#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS  -111
-// Error code for no emission for a transaction (candidate to threshold)
-#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION  -112
-// Error code for no token for an emission (candidate to threshold)
-#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN     -113
+// Error code for no previous transaction (for stay in mempool)
+#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS  -1111
+// Error code for no emission for a transaction (for stay in mempoold)
+#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION  -1112
+// Error code for no decree for anchor (for stay in mempool)
+#define DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE       -1113
 
 #define DAP_CHAIN_LEDGER_TOKENS_STR              "tokens"
 #define DAP_CHAIN_LEDGER_EMISSIONS_STR           "emissions"
diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c
index 7403c053105e49b06793626f7cec67344ffa2f88..888527d614a1cf45bd29914f9fa2054432188613 100644
--- a/modules/common/dap_chain_datum.c
+++ b/modules/common/dap_chain_datum.c
@@ -712,7 +712,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c
         } break;
         case DAP_CHAIN_DATUM_DECREE:{
             dap_chain_datum_decree_t *l_decree = (dap_chain_datum_decree_t *)a_datum->data;
-            size_t l_decree_size = sizeof(dap_chain_datum_decree_t) + l_decree->header.data_size + l_decree->header.signs_size;
+            size_t l_decree_size = dap_chain_datum_decree_get_size(l_decree);
             dap_string_append_printf(a_str_out,"=== Datum decree ===\n");
             dap_string_append_printf(a_str_out, "hash: %s\n", l_hash_str);
             dap_string_append_printf(a_str_out, "size: %zd\n", l_decree_size);
diff --git a/modules/common/include/dap_chain_datum_anchor.h b/modules/common/include/dap_chain_datum_anchor.h
index e9a9a19317c034530d3c57bbff3b66378ad517ba..044b8165f68ac20636796a08fb6da920556c9d23 100644
--- a/modules/common/include/dap_chain_datum_anchor.h
+++ b/modules/common/include/dap_chain_datum_anchor.h
@@ -43,6 +43,10 @@ typedef struct dap_chain_datum_anchor{
 // ANCHOR TSD types
 #define DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH                0x0001
 
+DAP_STATIC_INLINE size_t dap_chain_datum_anchor_get_size(dap_chain_datum_anchor_t *a_datum_anchor)
+{
+    return sizeof(*a_datum_anchor) + a_datum_anchor->header.data_size + a_datum_anchor->header.signs_size;
+}
 
 int dap_chain_datum_anchor_get_hash_from_data(dap_chain_datum_anchor_t* a_anchor, dap_hash_fast_t * l_out_hash);
 void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_signs,
diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index 388e5537a23b5887fa3fe3bf28df4e345adc023e..8e7bc7eada69a4d3713b51f3f6be48fcf124ca15 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -235,7 +235,7 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf
             return 0;
         } else if (l_sign_cert->enc_key->priv_key_data) {
             l_esbocs_pvt->blocks_sign_key = l_sign_cert->enc_key;
-            log_it(L_INFO, "Loaded \"%s\" certificate to sign TON blocks", l_sign_cert_str);
+            log_it(L_INFO, "Loaded \"%s\" certificate to sign ESBOCS blocks", l_sign_cert_str);
         } else {
             log_it(L_ERROR, "Certificate \"%s\" has no private key", l_sign_cert_str);
             return 0;
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 383a6dc4f0ad419a31b103ae60338ddf8aa1181f..e0af3e6001a7f37e5698287b70f02c4802613da4 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -3161,9 +3161,9 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t
         case DAP_CHAIN_DATUM_TOKEN_EMISSION:
             return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger, a_datum->data, a_datum->header.data_size );
         case DAP_CHAIN_DATUM_DECREE:
-            return dap_chain_net_decree_verify((dap_chain_datum_decree_t*)a_datum->data, a_net, NULL, NULL);
+            return dap_chain_net_decree_verify((dap_chain_datum_decree_t*)a_datum->data, a_net, a_datum->header.data_size, NULL);
         case DAP_CHAIN_DATUM_ANCHOR:
-            return dap_chain_net_anchor_verify((dap_chain_datum_anchor_t*)a_datum->data, a_net, NULL, NULL);
+            return dap_chain_net_anchor_verify((dap_chain_datum_anchor_t*)a_datum->data, a_datum->header.data_size);
     default: return 0;
     }
 }
diff --git a/modules/net/dap_chain_net_anchor.c b/modules/net/dap_chain_net_anchor.c
index b6743269d74562429b9856aab8ace8b41477fcba..83002e1ba255429feba157ce8920cdd9097dadd7 100644
--- a/modules/net/dap_chain_net_anchor.c
+++ b/modules/net/dap_chain_net_anchor.c
@@ -38,8 +38,16 @@ static bool s_verify_pubkeys(dap_sign_t *a_sign, dap_sign_t **a_decree_signs, si
 static inline dap_sign_t *s_concate_all_signs_in_array(dap_sign_t *a_in_signs, size_t a_signs_size, size_t *a_sings_count, size_t *a_signs_arr_size);
 
 // Public functions
-int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, dap_chain_net_t *a_net, uint32_t *a_signs_count, uint32_t *a_signs_verify)
+int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, size_t a_data_size)
 {
+    if (a_data_size < sizeof(dap_chain_datum_anchor_t)) {
+        log_it(L_WARNING, "Anchor size is too small");
+        return -120;
+    }
+    if (dap_chain_datum_anchor_get_size(a_anchor) != a_data_size) {
+        log_it(L_WARNING, "Anchor size is invalid");
+        return -121;
+    }
     int ret_val = 0;
     dap_chain_datum_anchor_t *l_anchor = a_anchor;
     size_t l_signs_size = l_anchor->header.signs_size;
@@ -90,7 +98,7 @@ int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, dap_chain_n
         DAP_DELETE(l_signs_arr);
         DAP_DELETE(l_unique_signs);
         log_it(L_WARNING,"Can't get decree by hash");
-        return -107;
+        return DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE;
     }
 
     if (l_is_applied)
@@ -148,9 +156,6 @@ int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, dap_chain_n
     DAP_DELETE(l_signs_arr);
     DAP_DELETE(l_unique_signs);
 
-    if (a_signs_verify)
-        *a_signs_verify = l_signs_verify_counter;
-
     return 0;
 }
 
@@ -172,7 +177,7 @@ int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *
         return -108;
     }
 
-    if ((ret_val = dap_chain_net_anchor_verify(a_anchor, l_net, NULL, NULL)) != 0)
+    if ((ret_val = dap_chain_net_anchor_verify(a_anchor, dap_chain_datum_anchor_get_size(a_anchor))) != 0)
     {
         log_it(L_WARNING,"Decree is not pass verification!");
         return ret_val;
diff --git a/modules/net/dap_chain_net_decree.c b/modules/net/dap_chain_net_decree.c
index f357b28ee72b658b71d7ee771d8ba4a4e63df4d2..fd270ab2726630499259b048ee5b5242469c686d 100644
--- a/modules/net/dap_chain_net_decree.c
+++ b/modules/net/dap_chain_net_decree.c
@@ -113,7 +113,6 @@ int dap_chain_net_decree_deinit(dap_chain_net_t *a_net)
 int s_decree_verify_tsd(dap_chain_datum_decree_t * a_decree, dap_chain_net_t *a_net)
 {
     int ret_val = 0;
-    dap_chain_net_t *l_net = NULL;
 
     if (!a_decree)
     {
@@ -137,8 +136,30 @@ int s_decree_verify_tsd(dap_chain_datum_decree_t * a_decree, dap_chain_net_t *a_
     return ret_val;
 }
 
-int dap_chain_net_decree_verify(dap_chain_datum_decree_t * a_decree, dap_chain_net_t *a_net, uint32_t *a_signs_count, uint32_t *a_signs_verify)
+int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, size_t a_data_size, dap_hash_fast_t *a_decree_hash)
 {
+    if (a_data_size < sizeof(dap_chain_datum_decree_t)) {
+        log_it(L_WARNING, "Decree size is too small");
+        return -120;
+    }
+    if (dap_chain_datum_decree_get_size(a_decree) != a_data_size) {
+        log_it(L_WARNING, "Decree size is invalid");
+        return -121;
+    }
+    if (a_decree->header.common_decree_params.net_id.uint64 != a_net->pub.id.uint64) {
+        log_it(L_WARNING, "Decree net id is invalid");
+        return -122;
+    }
+
+    dap_hash_fast_t l_decree_hash;
+    dap_hash_fast(a_decree, a_data_size, &l_decree_hash);
+    if (a_decree_hash)
+        *a_decree_hash = l_decree_hash;
+    struct decree_hh *l_decree_hh = NULL;
+    HASH_FIND(hh, s_decree_hh, &l_decree_hash, sizeof(dap_hash_fast_t), l_decree_hh);
+    if (l_decree_hh)
+        return DAP_DECREE_IS_PRESENT;
+
     dap_chain_datum_decree_t *l_decree = a_decree;
     // Get pkeys sign from decree datum
 
@@ -189,9 +210,6 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t * a_decree, dap_chain_n
         l_signs_count++;
     }
 
-    if (a_signs_count)
-        *a_signs_count = l_signs_count;
-
     // Find unique pkeys in pkeys set from previous step and check that number of signs > min
     size_t l_num_of_unique_signs = 0;
     dap_sign_t **l_unique_signs = dap_sign_get_unique_signs(l_signs_arr, l_signs_arr_size, &l_num_of_unique_signs);
@@ -235,9 +253,6 @@ int dap_chain_net_decree_verify(dap_chain_datum_decree_t * a_decree, dap_chain_n
     DAP_DELETE(l_signs_arr);
     DAP_DELETE(l_unique_signs);
 
-    if (a_signs_verify)
-        *a_signs_verify = l_signs_verify_counter;
-
     l_min_signs = a_net->pub.decree->min_num_of_owners;
     l_num_of_valid_signs256 = GET_256_FROM_64((uint64_t)l_signs_verify_counter);
     if (compare256(l_num_of_valid_signs256, l_min_signs) < 0)
@@ -275,10 +290,11 @@ int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t
         return -108;
     }
 
-    if ((ret_val = dap_chain_net_decree_verify(a_decree, l_net, NULL, NULL)) != 0)
-        return ret_val;
-
+    dap_hash_fast_t l_hash = {0};
+    size_t l_data_size = dap_chain_datum_decree_get_size(a_decree);
 
+    if ((ret_val = dap_chain_net_decree_verify(a_decree, l_net, l_data_size, &l_hash)) != DAP_DECREE_IS_PRESENT)
+        return ret_val;
 
     // Process decree
     switch(a_decree->header.type){
@@ -294,13 +310,8 @@ int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t
         ret_val = -100;
     }
 
-    if (!ret_val)
-    {
-        dap_hash_fast_t l_hash = {0};
-        size_t l_data_size = sizeof(dap_chain_datum_decree_t) + a_decree->header.data_size + a_decree->header.signs_size;
-        dap_hash_fast(a_decree, l_data_size, &l_hash);
+    if (!ret_val) {
         struct decree_hh *l_decree_hh = NULL;
-
         HASH_FIND(hh, s_decree_hh, &l_hash, sizeof(dap_hash_fast_t), l_decree_hh);
         if (l_decree_hh)
             l_decree_hh->is_applied = true;
@@ -311,8 +322,6 @@ int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t
 
 int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain)
 {
-    dap_hash_fast_t l_hash = {0};
-    struct decree_hh *l_decree_hh = NULL;
     int ret_val = 0;
     if (!a_chain || !a_chain)
     {
@@ -328,33 +337,25 @@ int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t *
         return -108;
     }
 
-    if ((ret_val = dap_chain_net_decree_verify(a_decree, l_net, NULL, NULL)) != 0){
+    dap_hash_fast_t l_hash = {};
+    size_t l_data_size = dap_chain_datum_decree_get_size(a_decree);
+
+    if ((ret_val = dap_chain_net_decree_verify(a_decree, l_net, l_data_size, &l_hash)) != 0) {
         log_it(L_ERROR,"Decree verification failed!");
         return ret_val;
     }
-
-    dap_chain_datum_decree_t * l_decree = NULL;
-    size_t l_data_size = sizeof(dap_chain_datum_decree_t) + a_decree->header.data_size + a_decree->header.signs_size;
-    l_decree = DAP_NEW_Z_SIZE(dap_chain_datum_decree_t, l_data_size);
-    memcpy(l_decree, a_decree, l_data_size);
-    dap_hash_fast(l_decree, l_data_size, &l_hash);
-
-    l_decree_hh =  DAP_NEW_Z_SIZE(struct decree_hh, sizeof(struct decree_hh) + l_decree->header.data_size + l_decree->header.signs_size);
-    l_decree_hh->decree = l_decree;
+    struct decree_hh *l_decree_hh = DAP_NEW_Z(struct decree_hh);
+    l_decree_hh->decree = DAP_DUP_SIZE(a_decree, l_data_size);;
     l_decree_hh->key = l_hash;
     l_decree_hh->is_applied = false;
 
     if (a_decree->header.common_decree_params.chain_id.uint64 == a_chain->id.uint64)
     {
         ret_val = dap_chain_net_decree_apply(a_decree, a_chain);
-        if (ret_val){
+        if (ret_val)
             log_it(L_ERROR,"Decree applying failed!");
-
-        } else
-        {
+        else
             l_decree_hh->is_applied = true;
-        }
-
     }
 
     HASH_ADD(hh, s_decree_hh, key, sizeof(dap_hash_fast_t), l_decree_hh);
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index abe671fea1598959f81027b5bbb04fcd4a1e90ca..1d14b367067945fb9014f85b33d4cd2fd4ede98f 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -215,7 +215,7 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d
     if (l_verify_datum != 0 &&
             l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS &&
             l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION &&
-            l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN)
+            l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE)
         return true;
     if (!l_verify_datum
 #ifdef DAP_TPS_TEST
diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index b8e3c60d0b32c90bded8b2353b124cb07704c376..18e74e08ee52b6ee42c070797228cdf38323d468 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -320,12 +320,12 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
     dap_cli_server_cmd_add ("decree", cmd_decree, "Work with decree",
             "decree create common -net <net_name> [-chain <chain_name>] [-decree_chain <chain_name>] -certs <certs list> -<Subtype param name> <Subtype param Value>\n"
             "decree create service -net <net_name> [-chain <chain_name>] [-decree_chain <chain_name>] -srv_id <service_id> -certs <certs list> -<Subtype param name> <Subtype param Value>\n"
-            "decree sign -net <net_name> [-chain <chain_name>] -datum <datum_hash> -certs <certs list>\n"
-            "decree anchor -net <net_name> -chain <chain_name> -datum <datum_hash>\n"
+            "decree sign -net <net_name> [-chain <chain_name>] -datum <datum_hash> -certs <certs_list>\n"
+            "decree anchor -net <net_name> -chain <chain_name> -datum <datum_hash> -certs <certs_list>\n"
             "==Subtype Params==\n"
             "\t -fee <value>: sets fee for tx in net\n"
             "\t -to_addr <wallet_addr>: sets wallet addr for network fee\n"
-            "\t -new_certs <certs list>: sets new owners set for net\n"
+            "\t -new_certs <certs_list>: sets new owners set for net\n"
             "\t -signs_verify <value>: sets minimum number of owners needed to sign decree\n"
             "\t -ton_signs_verify <value>: sets minimum number of TON signers");
 
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index 441f45a176543465dbf79fcec658de885a24f79b..f5a76a287a21ddd1e0e6a1535ed58c5f1b617241 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -43,6 +43,7 @@
 #include "dap_chain_node_cli.h"
 #include "dap_chain_node_cli_cmd_tx.h"
 #include "dap_chain_net_tx.h"
+#include "dap_chain_mempool.h"
 
 #define LOG_TAG "chain_node_cli_cmd_tx"
 
@@ -1658,37 +1659,11 @@ int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply)
                                                              sizeof(*l_datum_decree) + l_datum_decree->header.data_size +
                                                              l_datum_decree->header.signs_size);
         DAP_DELETE(l_datum_decree);
-        size_t l_datum_size = dap_chain_datum_size(l_datum);
-
-        // Calc datum's hash
-        dap_chain_hash_fast_t l_key_hash;
-        dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_key_hash);
-        char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
-        char * l_key_str_out = dap_strcmp(l_hash_out_type, "hex") ?
-                    dap_enc_base58_encode_hash_to_str(&l_key_hash) : l_key_str;
-
-        // Add datum to mempool with datum_token hash as a key
-        char * l_gdb_group_mempool;
-        if (l_chain)
-            l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain);
-        else
-            l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_DECREE);
-        if (!l_gdb_group_mempool) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "No suitable chain for placing decree datum found");
-            DAP_DELETE(l_datum);
-            DAP_DELETE(l_key_str);
-            DAP_DELETE(l_key_str_out);
-            DAP_DELETE(l_datum);
-            return -10;
-        }
-        bool l_placed = dap_global_db_set_sync(l_gdb_group_mempool, l_key_str, l_datum, l_datum_size, true) == 0;
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s is%s placed in datum pool",
-                                          l_key_str_out, l_placed ? "" : " not");
-
-        //additional checking for incorrect key format
-        DAP_DELETE(l_key_str);
+        char *l_key_str_out = dap_chain_mempool_datum_add(l_datum, l_chain, l_hash_out_type);
         DAP_DELETE(l_datum);
-
+        dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s is%s placed in datum pool",
+                                          l_key_str_out ? l_key_str_out : "",
+                                          l_key_str_out ? "" : " not");
         break;
     }
     case CMD_SIGN:{
@@ -1922,37 +1897,11 @@ int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply)
                                                              sizeof(*l_datum_anchor) + l_datum_anchor->header.data_size +
                                                              l_datum_anchor->header.signs_size);
         DAP_DELETE(l_datum_anchor);
-        size_t l_datum_size = dap_chain_datum_size(l_datum);
-
-        // Calc datum's hash
-        dap_chain_hash_fast_t l_key_hash;
-        dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_key_hash);
-        char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
-        char * l_key_str_out = dap_strcmp(l_hash_out_type, "hex") ?
-                    dap_enc_base58_encode_hash_to_str(&l_key_hash) : l_key_str;
-
-        // Add datum to mempool with datum_token hash as a key
-        char * l_gdb_group_mempool;
-        if (l_chain)
-            l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain);
-        else
-            l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_DECREE);
-        if (!l_gdb_group_mempool) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "No suitable chain for placing decree datum found");
-            DAP_DELETE(l_datum);
-            DAP_DELETE(l_key_str);
-            DAP_DELETE(l_key_str_out);
-            DAP_DELETE(l_datum);
-            return -10;
-        }
-        bool l_placed = dap_global_db_set_sync(l_gdb_group_mempool, l_key_str, l_datum, l_datum_size, true) == 0;
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s is%s placed in datum pool",
-                                          l_key_str_out, l_placed ? "" : " not");
-
-        //additional checking for incorrect key format
-        DAP_DELETE(l_key_str);
+        char *l_key_str_out = dap_chain_mempool_datum_add(l_datum, l_chain, l_hash_out_type);
         DAP_DELETE(l_datum);
-
+        dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s is%s placed in datum pool",
+                                          l_key_str_out ? l_key_str_out : "",
+                                          l_key_str_out ? "" : " not");
         break;
     }
     default:
diff --git a/modules/net/include/dap_chain_net_anchor.h b/modules/net/include/dap_chain_net_anchor.h
index 59a27d0df7d255648972e9ce611ef7c06787954d..a9405409f192c3dafce1baa6123988ff2b9b93c1 100644
--- a/modules/net/include/dap_chain_net_anchor.h
+++ b/modules/net/include/dap_chain_net_anchor.h
@@ -24,5 +24,5 @@
 #include "dap_chain_datum_anchor.h"
 #include "dap_chain_net.h"
 
-int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, dap_chain_net_t *a_net, uint32_t *a_signs_count, uint32_t *a_signs_verify);
+int dap_chain_net_anchor_verify(dap_chain_datum_anchor_t * a_anchor, size_t a_data_size);
 int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain);
diff --git a/modules/net/include/dap_chain_net_decree.h b/modules/net/include/dap_chain_net_decree.h
index 0533d796b328073c63fa67638202015a94bc2dd9..b9a2d4a72ea6b9c1963356172dfd86daf5c4b56b 100644
--- a/modules/net/include/dap_chain_net_decree.h
+++ b/modules/net/include/dap_chain_net_decree.h
@@ -32,14 +32,13 @@ typedef struct decree_params {
     dap_chain_addr_t *fee_addr;
 }   dap_chain_net_decree_t;
 
-// Default values
-
+#define DAP_DECREE_IS_PRESENT -1110
 
 int dap_chain_net_decree_init(dap_chain_net_t *a_net);
 int dap_chain_net_decree_deinit(dap_chain_net_t *a_net);
 
 int dap_chain_net_decree_apply(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain);
-int dap_chain_net_decree_verify(dap_chain_datum_decree_t * a_decree, dap_chain_net_t *a_net, uint32_t *a_signs_count, uint32_t *a_signs_verify);
+int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, size_t a_data_size, dap_hash_fast_t *a_decree_hash);
 int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain);
 
 dap_chain_datum_decree_t *dap_chain_net_decree_get_by_hash(dap_hash_fast_t a_hash, bool *is_applied);
diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c
index b12dd3e6f51530e568eab0ba633b02882607ad42..e8b73dc9d4bbce593a6c596daa7a6dbc79106ff8 100644
--- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c
+++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c
@@ -461,11 +461,11 @@ static dap_chain_datum_decree_t *s_stake_decree_approve(dap_chain_net_t *a_net,
     l_decree->header.ts_created = dap_time_now();
     l_decree->header.type = DAP_CHAIN_DATUM_DECREE_TYPE_COMMON;
     l_decree->header.common_decree_params.net_id = a_net->pub.id;
-    dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE);
+    dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR);
     if (!l_chain)
-        l_chain =  dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE);
+        l_chain =  dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR);
     if (!l_chain) {
-        log_it(L_ERROR, "No chain supported decree datum type");
+        log_it(L_ERROR, "No chain supported anchor datum type");
         return NULL;
     }
     l_decree->header.common_decree_params.chain_id = l_chain->id;
@@ -513,8 +513,11 @@ static char *s_stake_decree_put(dap_chain_datum_decree_t *a_decree, dap_chain_ne
     // Put the transaction to mempool or directly to chains
     size_t l_decree_size = dap_chain_datum_decree_get_size(a_decree);
     dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_DECREE, a_decree, l_decree_size);
-    dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE);
+    dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE);
+    if (!l_chain)
+        l_chain =  dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE);
     if (!l_chain) {
+        log_it(L_ERROR, "No chain supported decree datum type");
         return NULL;
     }
     // Processing will be made according to autoprocess policy
@@ -651,7 +654,14 @@ static dap_chain_datum_decree_t *s_stake_decree_invalidate(dap_chain_net_t *a_ne
     l_decree->header.ts_created = dap_time_now();
     l_decree->header.type = DAP_CHAIN_DATUM_DECREE_TYPE_COMMON;
     l_decree->header.common_decree_params.net_id = a_net->pub.id;
-    l_decree->header.common_decree_params.chain_id = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE)->id;
+    dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR);
+    if (!l_chain)
+        l_chain =  dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR);
+    if (!l_chain) {
+        log_it(L_ERROR, "No chain supported anchor datum type");
+        return NULL;
+    }
+    l_decree->header.common_decree_params.chain_id = l_chain->id;
     l_decree->header.common_decree_params.cell_id = *dap_chain_net_get_cur_cell(a_net);
     l_decree->header.sub_type = DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_INVALIDATE;
     l_decree->header.data_size = l_total_tsd_size;
@@ -709,7 +719,14 @@ static dap_chain_datum_decree_t *s_stake_decree_set_min_stake(dap_chain_net_t *a
     l_decree->header.ts_created = dap_time_now();
     l_decree->header.type = DAP_CHAIN_DATUM_DECREE_TYPE_COMMON;
     l_decree->header.common_decree_params.net_id = a_net->pub.id;
-    l_decree->header.common_decree_params.chain_id = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE)->id;
+    dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR);
+    if (!l_chain)
+        l_chain =  dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR);
+    if (!l_chain) {
+        log_it(L_ERROR, "No chain supported anchor datum type");
+        return NULL;
+    }
+    l_decree->header.common_decree_params.chain_id = l_chain->id;
     l_decree->header.common_decree_params.cell_id = *dap_chain_net_get_cur_cell(a_net);
     l_decree->header.sub_type = DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_MIN_VALUE;
     l_decree->header.data_size = l_total_tsd_size;
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index dd8f5c7152ec246f287e130a46b3cfac0a645e46..8344824edcad7bb58ecab4930fe2b250aeb911ef 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -557,7 +557,6 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
             break;
         case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS:
         case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION:
-        case DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN:
             if(s_debug_more)
                 log_it(L_DEBUG, "... ledger tresholded");
             break;
@@ -699,6 +698,7 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_d
                 if (s_chain_callback_atom_add(a_chain, l_event, l_event_size) == ATOM_ACCEPT) {
                     if (dap_chain_atom_save(a_chain, (uint8_t *)l_event, l_event_size, a_chain->cells->id) < 0)
                         log_it(L_ERROR, "Can't add new event to the file");
+                    return true;
                 } else {
                     log_it(L_ERROR, "Can't add new event");
                     return false;