diff --git a/dap-sdk b/dap-sdk
index c9aae9ce01308a85586b770adf02badb6c9c6a39..880cc0469b0370b82552cc58e7ace83f7b711601 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit c9aae9ce01308a85586b770adf02badb6c9c6a39
+Subproject commit 880cc0469b0370b82552cc58e7ace83f7b711601
diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index e71fa132e6e658736f44b1f8d59efe8f7cd8bc9b..bbba6f9e52001623d10cd23e672ca07a7971aff5 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -315,7 +315,7 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d
     if (l_objs_count >= 10) {
         for (size_t i = 0; i < l_objs_count; i++) {
             SUM_256_256(l_value_total, *(uint256_t*)l_objs[i].value, &l_value_total);
-            if (compare256(l_value_total, l_esbocs_pvt->collecting_level) == 1) {
+            if (compare256(l_value_total, l_esbocs_pvt->collecting_level) >= 0) {
                 l_level_reached = true;
                 break;
             }
@@ -336,12 +336,12 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d
                     dap_chain_mempool_tx_reward_create(l_blocks, l_esbocs_pvt->blocks_sign_key,
                                      l_esbocs_pvt->collecting_addr, l_block_list, l_esbocs_pvt->minimum_fee, "hex");
         if (l_tx_hash_str) {
-            dap_global_db_del_sync(a_group, NULL);
             log_it(L_NOTICE, "%s collect transaction successfully created, hash = %s",
                             l_fee_collect ? "Fee" : "Reward", l_tx_hash_str);
             DAP_DELETE(l_tx_hash_str);
         } else
             log_it(L_ERROR, "%s collect transaction creation error", l_fee_collect ? "Fee" : "Reward");
+        dap_global_db_del_sync(a_group, NULL);
     }
     dap_global_db_objs_delete(l_objs, l_objs_count);
 }
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index d9e41a58b645cea085257ade296d03fb159e50e3..3b786b824d87d281a68cbc2c757d33625083a286 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -384,7 +384,7 @@ char *dap_chain_mempool_tx_coll_fee_create(dap_chain_cs_blocks_t *a_blocks, dap_
     uint256_t l_value_tax = {};
     dap_chain_net_srv_stake_item_t *l_key_item = dap_chain_net_srv_stake_check_pkey_hash(&l_sign_pkey_hash);
     if (l_key_item && !IS_ZERO_256(l_key_item->sovereign_tax) &&
-                dap_chain_addr_is_blank(&l_key_item->sovereign_addr)) {
+                !dap_chain_addr_is_blank(&l_key_item->sovereign_addr)) {
         MULT_256_COIN(l_value_out, l_key_item->sovereign_tax, &l_value_tax);
         if (compare256(l_value_tax, l_value_out) < 1)
             SUBTRACT_256_256(l_value_out, l_value_tax, &l_value_out);
@@ -513,7 +513,7 @@ char *dap_chain_mempool_tx_reward_create(dap_chain_cs_blocks_t *a_blocks, dap_en
     uint256_t l_value_tax = {};
     dap_chain_net_srv_stake_item_t *l_key_item = dap_chain_net_srv_stake_check_pkey_hash(&l_sign_pkey_hash);
     if (l_key_item && !IS_ZERO_256(l_key_item->sovereign_tax) &&
-                dap_chain_addr_is_blank(&l_key_item->sovereign_addr)) {
+                !dap_chain_addr_is_blank(&l_key_item->sovereign_addr)) {
         MULT_256_COIN(l_value_out, l_key_item->sovereign_tax, &l_value_tax);
         if (compare256(l_value_tax, l_value_out) < 1)
             SUBTRACT_256_256(l_value_out, l_value_tax, &l_value_out);
diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c
index e9d19af8a5a7c59ff1ee34905c19820d0ba60581..5b73b08c88aa8aa1745941a45f390b74083c3c9c 100644
--- a/modules/net/dap_chain_ledger.c
+++ b/modules/net/dap_chain_ledger.c
@@ -4093,7 +4093,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx
             }
             l_value = l_tx_out->header.value;
             l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out);
-            if (l_tx_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE &&
+            if (l_tax_check && l_tx_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE &&
                     SUBTRACT_256_256(l_taxed_value, l_value, &l_taxed_value)) {
                 log_it(L_WARNING, "Fee is greater than sum of inputs");
                 l_err_num = -89;
diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index ebf145c201fddf4193b96a1903346ff706776cca..51576fa3b5eea15fcf62fad139cc248038da6f7f 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -517,7 +517,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply)
                     dap_string_free(l_string_ret, true);
                     return -21;
                 }
-                if (l_node_addr_str){
+                if (l_node_addr_str) {
                     if (dap_chain_node_addr_str_check(l_node_addr_str)) {
                         dap_chain_node_addr_from_str( &l_node_addr, l_node_addr_str );
                     } else {
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index 72d73bd09f0cbdcc57a49985e5cc0db3f85504d9..aeae11058543e62e5f723679484d249cc6b714a5 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -425,7 +425,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_find_by_hash_str(dap_chain_ne
         if (!l_gdb_order)
             continue;
         // check order size
-        size_t l_expected_size = dap_chain_net_srv_order_get_size(l_order);
+        size_t l_expected_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)l_gdb_order);
         if (l_order_size != l_expected_size) {
             log_it(L_ERROR, "Found wrong size order %zu, expected %zu", l_order_size, l_expected_size);
             DAP_DELETE(l_gdb_order);
@@ -457,6 +457,9 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_
 {
     if (!a_net || !a_output_orders || !a_output_orders_count)
         return -1;
+    size_t l_orders_size = 0, l_output_orders_count = 0;
+    *a_output_orders = NULL;
+
     for (int i = 0; i < 2; i++) {
         char *l_gdb_group_str = i ? dap_chain_net_srv_order_get_gdb_group(a_net)
                                   : dap_chain_net_srv_order_get_common_group(a_net);
@@ -464,9 +467,6 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_
         dap_global_db_obj_t *l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count);
         log_it( L_DEBUG, "Loaded %zu orders", l_orders_count);
         dap_chain_net_srv_order_t *l_order = NULL;
-        *a_output_orders = NULL;
-        size_t l_output_orders_count = 0;
-        size_t l_orders_size = 0;
         for (size_t i = 0; i < l_orders_count; i++) {
             DAP_DEL_Z(l_order);
             l_order = dap_chain_net_srv_order_read(l_orders[i].value, l_orders[i].value_len);
@@ -502,14 +502,14 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_
             size_t l_order_mem_size = dap_chain_net_srv_order_get_size(l_order);
             *a_output_orders = DAP_REALLOC(*a_output_orders, l_orders_size + l_order_mem_size);
             memcpy((byte_t *)*a_output_orders + l_orders_size, l_order, l_order_mem_size);
+            DAP_DEL_Z(l_order);
             l_orders_size += l_order_mem_size;
             l_output_orders_count++;
         }
-        *a_output_orders_count = l_output_orders_count;
-        DAP_DEL_Z(l_order);
         dap_global_db_objs_delete(l_orders, l_orders_count);
         DAP_DELETE(l_gdb_group_str);
     }
+    *a_output_orders_count = l_output_orders_count;
     return 0;
 }
 
diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
index 7c86ae118feccae149f97ff563845427ecbc726e..8d981a4b0ff3fcfcd90b5586b873d9877f761a3d 100644
--- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
+++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
@@ -69,9 +69,10 @@ int dap_chain_net_srv_stake_pos_delegate_init()
     "srv_stake order create [fee] -net <net_name> -value <value> -cert <priv_cert_name> [-H {hex(default) | base58}]\n"
         "\tCreates an order declaring the minimum fee that the validator agrees to for process a transaction.\n"
     "srv_stake order create validator -net <net_name> -value_min <minimum_stake_value> -value_max <maximum_stake_value>"
-                        " -tax <percent> [-H {hex(default) | base58}]\n"
+                        " -tax <percent> -cert <priv_cert_name> [-H {hex(default) | base58}]\n"
         "\tCreates an order declaring wanted tax and minimum/maximum stake value that the validator agrees to work.\n"
-    "srv_stake order create staker -net <net_name> -w <wallet_wtih_m_tokens> -value <stake_value> -tax <percent> [-addr <for_tax_collecting>] [-H {hex(default) | base58}]\n"
+    "srv_stake order create staker -net <net_name> -w <wallet_wtih_m_tokens> -value <stake_value> -tax <percent>"
+                        " [-addr <for_tax_collecting>]  [-cert <priv_cert_name>] [-H {hex(default) | base58}]\n"
         "\tCreates an order allowing the validator to delegate it's key with specified params\n"
     "srv_stake order update -net <net_name> -order <order_hash> [-params]\n"
          "\tUpdates an order with specified hash\n"
@@ -1024,21 +1025,24 @@ char *s_fee_order_create(dap_chain_net_t *a_net, uint256_t *a_fee, dap_enc_key_t
     return l_order_hash_str;
 }
 
-char *s_validator_order_create(dap_chain_net_t *a_net, uint256_t a_value_min, uint256_t a_value_max, uint256_t a_tax, const char *a_hash_out_type)
+struct validator_odrer_ext {
+    uint256_t value_min;
+    uint256_t value_max;
+} DAP_ALIGN_PACKED;
+
+char *s_validator_order_create(dap_chain_net_t *a_net, uint256_t a_value_min, uint256_t a_value_max, uint256_t a_tax,
+                               dap_enc_key_t *a_key, const char *a_hash_out_type)
 {
     dap_chain_hash_fast_t l_tx_hash = {};
-    dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_BUY;
+    dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_SELL;
     const char *l_native_ticker = a_net->pub.native_ticker;
     dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 =  SERV_UNIT_PCS};
     dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS };
-    struct odrer_ext {
-        uint256_t value_min;
-        uint256_t value_max;
-    } DAP_ALIGN_PACKED l_order_ext = { a_value_min, a_value_max };
+    struct validator_odrer_ext l_order_ext = { a_value_min, a_value_max };
     dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_compose(a_net, l_dir, l_uid, g_node_addr,
                                                             l_tx_hash, &a_tax, l_unit, l_native_ticker, 0,
                                                             (const uint8_t *)&l_order_ext, sizeof(l_order_ext),
-                                                            1, NULL, 0, NULL);
+                                                            1, NULL, 0, a_key);
     if (!l_order)
         return NULL;
     char *l_order_hash_str = dap_chain_net_srv_order_save(a_net, l_order, true);
@@ -1052,9 +1056,9 @@ char *s_validator_order_create(dap_chain_net_t *a_net, uint256_t a_value_min, ui
 }
 
 char *s_staker_order_create(dap_chain_net_t *a_net, uint256_t a_value, uint256_t a_tax, dap_hash_fast_t *a_tx_hash,
-                            dap_chain_addr_t *a_addr, const char *a_hash_out_type)
+                            dap_chain_addr_t *a_addr, dap_enc_key_t *a_key, const char *a_hash_out_type)
 {
-    dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_SELL;
+    dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_BUY;
     const char *l_native_ticker = a_net->pub.native_ticker;
     dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 =  SERV_UNIT_PCS};
     dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS };
@@ -1065,7 +1069,7 @@ char *s_staker_order_create(dap_chain_net_t *a_net, uint256_t a_value, uint256_t
     dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_compose(a_net, l_dir, l_uid, g_node_addr,
                                                             *a_tx_hash, &a_tax, l_unit, l_native_ticker, 0,
                                                              (const uint8_t *)&l_order_ext, sizeof(l_order_ext),
-                                                             1, NULL, 0, NULL);
+                                                             1, NULL, 0, a_key);
     if (!l_order)
         return NULL;
     char *l_order_hash_str = dap_chain_net_srv_order_save(a_net, l_order, true);
@@ -1183,8 +1187,19 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
             dap_cli_server_cmd_set_reply_text(a_str_reply, "Tax must be lower or eqal than 100%% and higher or eqal than 1.0e-16%%");
             return -10;
         }
+        const char *l_cert_str = NULL;
+        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", &l_cert_str);
+        if (!l_cert_str) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Validator order creation requires parameter -cert");
+            return -7;
+        }
+        dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str);
+        if (!l_cert) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't load cert %s", l_cert_str);
+            return -8;
+        }
         // Create the order & put it in GDB
-        char *l_order_hash_str = s_validator_order_create(l_net, l_value_min, l_value_max, l_tax, a_hash_out_type);
+        char *l_order_hash_str = s_validator_order_create(l_net, l_value_min, l_value_max, l_tax, l_cert->enc_key, a_hash_out_type);
         if (l_order_hash_str) {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str);
             DAP_DELETE(l_order_hash_str);
@@ -1268,7 +1283,18 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
         // Create the order & put it in GDB
         dap_hash_fast_t l_tx_hash = {};
         dap_chain_hash_fast_from_hex_str(l_tx_hash_str, &l_tx_hash);
-        char *l_order_hash_str = s_staker_order_create(l_net, l_value, l_tax, &l_tx_hash, &l_addr, a_hash_out_type);
+        char *l_cert_str = NULL, *l_default_cert_str = NULL;
+        dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", (const char **)&l_cert_str);
+        if (!l_cert_str)
+            l_cert_str = l_default_cert_str = dap_strdup_printf("node-addr-%s", l_net->pub.name);
+        dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str);
+        if (!l_cert) {
+            dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't load cert %s", l_cert_str);
+            DAP_DEL_Z(l_default_cert_str);
+            return -8;
+        }
+        DAP_DEL_Z(l_default_cert_str);
+        char *l_order_hash_str = s_staker_order_create(l_net, l_value, l_tax, &l_tx_hash, &l_addr, l_cert->enc_key, a_hash_out_type);
         if (l_order_hash_str) {
             dap_cli_server_cmd_set_reply_text(a_str_reply, "%sSuccessfully created order %s", l_sign_str, l_order_hash_str);
             DAP_DELETE(l_order_hash_str);
@@ -1353,32 +1379,36 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha
             dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str);
             return -4;
         }
-        char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(l_net);
-        size_t l_orders_count = 0;
-        dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count);
         dap_string_t *l_reply_str = dap_string_new("");
-        for (size_t i = 0; i < l_orders_count; i++) {
-            dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_orders[i].value;
-            if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID)
-                continue;
-            // TODO add filters to list (token, address, etc.)
-            char *l_price_coins = dap_chain_balance_to_coins(l_order->price);
-            char *l_price_datoshi = dap_chain_balance_print(l_order->price);
-            char *l_node_addr = dap_strdup_printf(NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_order->node_addr));
-            char l_created[80] = {'\0'};
-            dap_time_t l_ts_created = l_order->ts_created;
-            dap_ctime_r(&l_ts_created, l_created);
-            dap_string_append_printf(l_reply_str, "Order: %s\n"
-                                                  "\tCreated: %s"
-                                                  "\tPrice: %s (%s) %s\n"
-                                                  "\tNode addr: %s\n",
-                                                  l_orders[i].key, l_created, l_price_coins, l_price_datoshi, l_order->price_ticker, l_node_addr);
-            DAP_DELETE(l_price_coins);
-            DAP_DELETE(l_price_datoshi);
-            DAP_DELETE(l_node_addr);
+        for (int i = 0; i < 2; i++) {
+            char *l_gdb_group_str = i ? dap_chain_net_srv_order_get_gdb_group(l_net) :
+                                        dap_chain_net_srv_order_get_common_group(l_net);
+            size_t l_orders_count = 0;
+            dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count);
+            for (size_t i = 0; i < l_orders_count; i++) {
+                dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_orders[i].value;
+                if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID &&
+                        l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS)
+                    continue;
+                // TODO add filters to list (token, address, etc.)
+                char *l_price_coins = dap_chain_balance_to_coins(l_order->price);
+                char *l_price_datoshi = dap_chain_balance_print(l_order->price);
+                char *l_node_addr = dap_strdup_printf(NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_order->node_addr));
+                char l_created[80] = {'\0'};
+                dap_time_t l_ts_created = l_order->ts_created;
+                dap_ctime_r(&l_ts_created, l_created);
+                dap_string_append_printf(l_reply_str, "Order: %s\n"
+                                                      "\tCreated: %s"
+                                                      "\tPrice: %s (%s) %s\n"
+                                                      "\tNode addr: %s\n",
+                                                      l_orders[i].key, l_created, l_price_coins, l_price_datoshi, l_order->price_ticker, l_node_addr);
+                DAP_DELETE(l_price_coins);
+                DAP_DELETE(l_price_datoshi);
+                DAP_DELETE(l_node_addr);
+            }
+            dap_global_db_objs_delete(l_orders, l_orders_count);
+            DAP_DELETE( l_gdb_group_str);
         }
-        dap_global_db_objs_delete(l_orders, l_orders_count);
-        DAP_DELETE( l_gdb_group_str);
         if (!l_reply_str->len) {
             dap_string_append(l_reply_str, "No orders found");
         }
@@ -1418,14 +1448,16 @@ static void s_srv_stake_print(dap_chain_net_srv_stake_item_t *a_stake, uint256_t
         snprintf(l_active_str, 32, "\tActive: %s\n", a_stake->is_active ? "true" : "false");
     char *l_sov_addr_str = dap_chain_addr_is_blank(&a_stake->sovereign_addr) ?
                 dap_strdup("N/A") : dap_chain_addr_to_str(&a_stake->sovereign_addr);
-    char *l_sov_tax_str = dap_chain_balance_to_coins(a_stake->sovereign_tax);
+    uint256_t l_sov_tax_percent = uint256_0;
+    MULT_256_256(a_stake->sovereign_tax, GET_256_FROM_64(100), &l_sov_tax_percent);
+    char *l_sov_tax_str = dap_chain_balance_to_coins(l_sov_tax_percent);
     dap_string_append_printf(a_string, "Pkey hash: %s\n"
                                         "\tStake value: %s\n"
                                         "\tRelated weight: %s%%\n"
                                         "\tTx hash: %s\n"
                                         "\tNode addr: "NODE_ADDR_FP_STR"\n"
                                         "\tSovereign addr: %s\n"
-                                        "\tSovereign tax: %s\n"
+                                        "\tSovereign tax: %s%%\n"
                                         "%s\n",
                              l_pkey_hash_str, l_balance, l_rel_weight_str,
                              l_tx_hash_str, NODE_ADDR_FP_ARGS_S(a_stake->node_addr),
@@ -1603,9 +1635,9 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply)
 
     const char * l_hash_out_type = NULL;
     dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, dap_min(a_argc, l_arg_index + 1), "-H", &l_hash_out_type);
-    if(!l_hash_out_type)
-        l_hash_out_type = "base58";
-    if(dap_strcmp(l_hash_out_type," hex") && dap_strcmp(l_hash_out_type, "base58")) {
+    if (!l_hash_out_type)
+        l_hash_out_type = "hex";
+    else if (dap_strcmp(l_hash_out_type," hex") && dap_strcmp(l_hash_out_type, "base58")) {
         dap_cli_server_cmd_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>");
         return -1;
     }
@@ -1762,6 +1794,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply)
                 return -13;
             }
             dap_chain_node_addr_t l_node_addr;
+            uint256_t l_value_min, l_value_max;
             if (l_cert_str) {
                 dap_cert_t *l_signing_cert = dap_cert_find_by_name(l_cert_str);
                 if (!l_signing_cert) {
@@ -1801,22 +1834,29 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply)
                     dap_chain_wallet_close(l_wallet);
                     return -25;
                 }
-                dap_pkey_t *l_pkey = (dap_pkey_t *)l_order->ext_n_sign;
-                if (l_order->ext_size < sizeof(dap_pkey_t) || l_order->ext_size != dap_pkey_get_size(l_pkey)) {
+                if (l_order->ext_size != sizeof(struct validator_odrer_ext)) {
                     dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order has invalid size");
                     dap_chain_wallet_close(l_wallet);
                     DAP_DELETE(l_order);
                     return -26;
                 }
+                struct validator_odrer_ext *l_ext = (struct validator_odrer_ext *)l_order->ext_n_sign;
+                l_value_min = l_ext->value_min;
+                l_value_max = l_ext->value_max;
+                dap_sign_t *l_sign = (dap_sign_t *)(l_order->ext_n_sign + l_order->ext_size);
+                if (l_sign->header.type.type == SIG_TYPE_NULL) {
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order is unsigned");
+                    dap_chain_wallet_close(l_wallet);
+                    DAP_DELETE(l_order);
+                    return -27;
+                }
                 if (dap_strcmp(l_order->price_ticker, l_net->pub.native_ticker)) {
                     dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order is invalid");
                     dap_chain_wallet_close(l_wallet);
                     DAP_DELETE(l_order);
-                    return -27;
+                    return -28;
                 }
-                dap_hash_t l_pkey_hash;
-                dap_pkey_get_hash(l_pkey, &l_pkey_hash);
-                dap_chain_addr_fill(&l_signing_addr, dap_pkey_type_to_sign_type(l_pkey->header.type), &l_pkey_hash, l_net->pub.id);
+                dap_chain_addr_fill_from_sign(&l_signing_addr, l_sign, l_net->pub.id);
                 l_node_addr = l_order->node_addr;
                 l_sovereign_tax = l_order->price;
                 DAP_DELETE(l_order);
@@ -1824,7 +1864,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply)
                         compare256(l_sovereign_tax, GET_256_FROM_64(100)) == -1) {
                     dap_cli_server_cmd_set_reply_text(a_str_reply, "Tax must be lower or eqal than 100%% and higher or eqal than 1.0e-16%%");
                     dap_chain_wallet_close(l_wallet);
-                    return -28;
+                    return -29;
                 }
                 DIV_256(l_sovereign_tax, GET_256_FROM_64(100), &l_sovereign_tax);
             }
@@ -1857,7 +1897,30 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply)
                 dap_chain_wallet_close(l_wallet);
                 return -11;
             }
-
+            if (l_order_hash_str && compare256(l_value, l_value_min) == -1) {
+                char *l_coin_str = dap_chain_balance_to_coins(l_value);
+                char *l_value_min_str = dap_chain_balance_print(l_value_min);
+                char *l_coin_min_str = dap_chain_balance_to_coins(l_value_min);
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Number in '-value' param %s(%s) is lower than order minimum allowed value %s(%s)",
+                                                  l_coin_str, l_value_str, l_coin_min_str, l_value_min_str);
+                DAP_DELETE(l_coin_str);
+                DAP_DELETE(l_value_min_str);
+                DAP_DELETE(l_coin_min_str);
+                dap_chain_wallet_close(l_wallet);
+                return -13;
+            }
+            if (l_order_hash_str && compare256(l_value, l_value_max) == 1) {
+                char *l_coin_str = dap_chain_balance_to_coins(l_value);
+                char *l_value_max_str = dap_chain_balance_print(l_value_max);
+                char *l_coin_max_str = dap_chain_balance_to_coins(l_value_max);
+                dap_cli_server_cmd_set_reply_text(a_str_reply, "Number in '-value' param %s(%s) is higher than order minimum allowed value %s(%s)",
+                                                  l_coin_str, l_value_str, l_coin_max_str, l_value_max_str);
+                DAP_DELETE(l_coin_str);
+                DAP_DELETE(l_value_max_str);
+                DAP_DELETE(l_coin_max_str);
+                dap_chain_wallet_close(l_wallet);
+                return -14;
+            }
             dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-fee", &l_fee_str);
             if (!l_fee_str) {
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'delegate' requires parameter -fee");