diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c
index da5891bf377eb70149dbca855fd49261f1523fb3..8ea7e5f2905dc4a33b3e9bfeaf444198c162b5bd 100644
--- a/modules/common/dap_chain_datum_tx.c
+++ b/modules/common/dap_chain_datum_tx.c
@@ -60,7 +60,9 @@ void dap_chain_datum_tx_delete(dap_chain_datum_tx_t *a_tx)
  */
 size_t dap_chain_datum_tx_get_size(dap_chain_datum_tx_t *a_tx)
 {
-    return a_tx ? sizeof(dap_chain_datum_tx_t) + a_tx->header.tx_items_size : 0;
+    dap_return_val_if_fail(a_tx, 0);
+    return (sizeof(dap_chain_datum_tx_t) + a_tx->header.tx_items_size) > a_tx->header.tx_items_size
+            ? sizeof(dap_chain_datum_tx_t) + a_tx->header.tx_items_size : 0;
 }
 
 /**
diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c
index 636809ede52e39b9fc4690301bd262d6f707e07a..0d9e031e58fc3afa4a115b638e16e1456872711b 100644
--- a/modules/net/dap_chain_ledger.c
+++ b/modules/net/dap_chain_ledger.c
@@ -3884,6 +3884,7 @@ static int s_tx_cache_check(dap_ledger_t *a_ledger,
                     l_err_num = DAP_LEDGER_TX_CHECK_NO_VERIFICATOR_SET;
                     break;
                 }
+
                 int l_verificator_error = l_verificator->callback(a_ledger, l_tx_prev_out_cond, a_tx, l_owner);
                 if (l_verificator_error != DAP_LEDGER_CHECK_OK) { // TODO add string representation for verificator return codes
                     debug_if(s_debug_more, L_WARNING, "Verificator check error %d for conditional output %s",
diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c
index 789d3ef48e721864dede29ef4f116f7878755aa7..399f8172bcb5a488e95bea94500e39b133d18d6f 100644
--- a/modules/service/xchange/dap_chain_net_srv_xchange.c
+++ b/modules/service/xchange/dap_chain_net_srv_xchange.c
@@ -34,7 +34,6 @@
 #include "dap_time.h"
 #include "dap_chain_net_srv.h"
 #include "dap_chain_ledger.h"
-#include "dap_chain_net_srv_order.h"
 #include "dap_common.h"
 #include "dap_hash.h"
 #include "dap_math_ops.h"
@@ -75,7 +74,7 @@ static bool s_string_append_tx_cond_info( dap_string_t * a_reply_str, dap_chain_
 dap_chain_net_srv_xchange_price_t *s_xchange_price_from_order(dap_chain_net_t *a_net, dap_chain_datum_tx_t *a_order, uint256_t *a_fee, bool a_ret_is_invalid);
 
 static dap_chain_net_srv_xchange_t *s_srv_xchange;
-static bool s_debug_more = true;
+static bool s_debug_more = false;
 
 
 static bool s_tag_check_xchange(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_datum_tx_item_groups_t *a_items_grp, dap_chain_tx_tag_action_type_t *a_action)
@@ -279,12 +278,18 @@ static int s_xchange_verificator_callback(dap_ledger_t *a_ledger, dap_chain_tx_o
             dap_chain_addr_t l_out_addr = l_tx_in_output->addr;
             // Out is with token to buy
             if (!strcmp(l_out_token, l_buy_ticker) &&
-                    !memcmp(&l_out_addr, l_seller_addr, sizeof(l_out_addr)))
-                SUM_256_256(l_buy_val, l_out_value, &l_buy_val);
+                    !memcmp(&l_out_addr, l_seller_addr, sizeof(l_out_addr)) &&
+                    SUM_256_256(l_buy_val, l_out_value, &l_buy_val)) {
+                log_it(L_WARNING, "Integer overflow for buyer value of exchange tx");
+                return -5;
+            }
             // Out is with token to fee
             if (l_service_fee_used && !strcmp(l_out_token, l_service_ticker) &&
-                    !memcmp(&l_out_addr, &l_service_fee_addr, sizeof(l_out_addr)))
-                SUM_256_256(l_fee_val, l_out_value, &l_fee_val);
+                    !memcmp(&l_out_addr, &l_service_fee_addr, sizeof(l_out_addr)) &&
+                    SUM_256_256(l_fee_val, l_out_value, &l_fee_val)) {
+                log_it(L_WARNING, "Integer overflow for fee value of exchange tx");
+                return -5;
+            }
         } break;
         case TX_ITEM_TYPE_OUT_COND: {
             dap_chain_tx_out_cond_t *l_tx_in_output = (dap_chain_tx_out_cond_t*)l_tx_item;
@@ -313,11 +318,28 @@ static int s_xchange_verificator_callback(dap_ledger_t *a_ledger, dap_chain_tx_o
      * a_cond->subtype.srv_xchange.buy_value * (a_cond->header.value - new_cond->header.value)
      */
 
+
     uint256_t l_sell_val, l_buyer_val_expected;
-    if (compare256(l_sell_again_val, a_tx_out_cond->header.value) >= 0)
+    if (SUBTRACT_256_256(a_tx_out_cond->header.value, l_sell_again_val, &l_sell_val)) {
+        log_it(L_WARNING, "Integer overflow for resell value of exchange tx");
         return -5;
-    SUBTRACT_256_256(a_tx_out_cond->header.value, l_sell_again_val, &l_sell_val);
+    }
     MULT_256_COIN(l_sell_val, a_tx_out_cond->subtype.srv_xchange.rate, &l_buyer_val_expected);
+    if (s_debug_more) {
+        const char *l_value_str;
+        dap_uint256_to_char(a_tx_out_cond->header.value, &l_value_str);
+        log_it(L_NOTICE, "Total sell %s %s from %s", l_value_str, l_sell_ticker, dap_hash_fast_to_str_static(&l_tx_in_cond->header.tx_prev_hash));
+        dap_uint256_to_char(a_tx_out_cond->subtype.srv_xchange.rate, &l_value_str);
+        log_it(L_NOTICE, "Rate is %s", l_value_str);
+        dap_uint256_to_char(l_sell_again_val, &l_value_str);
+        log_it(L_NOTICE, "Resell %s %s", l_value_str, l_sell_ticker);
+        dap_uint256_to_char(l_buyer_val_expected, &l_value_str);
+        log_it(L_NOTICE, "Expect to buy %s %s", l_value_str, l_buy_ticker);
+        dap_uint256_to_char(l_buy_val, &l_value_str);
+        log_it(L_NOTICE, "Buy %s %s", l_value_str, l_buy_ticker);
+        dap_uint256_to_char(l_fee_val, &l_value_str);
+        log_it(L_NOTICE, "Service fee is %s %s", l_value_str, l_service_ticker);
+    }
     if (compare256(l_buyer_val_expected, l_buy_val) > 0)
         return -6;