diff --git a/cmake/OS_Detection.cmake b/cmake/OS_Detection.cmake
index 161a5b8fa690764c43d26f5e2f027b1c8119834c..df005742c04124f02e6a8ecb47b3b9218d828b79 100644
--- a/cmake/OS_Detection.cmake
+++ b/cmake/OS_Detection.cmake
@@ -79,19 +79,19 @@ if(UNIX)
     
     if (LINUX)
         if(DAP_DEBUG)
-	  set(_CCOPT "-DDAP_DEBUG -Wall -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -pg -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing")
+          set(_CCOPT "-DDAP_DEBUG -Wall  -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -pg -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing")
           set(_LOPT "-pg")
 	  SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
         else()
-	    set(_CCOPT "-Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all -std=gnu11")
+            set(_CCOPT "-Wno-deprecated-declarations  -Wno-unused-command-line-argument -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all -std=gnu11")
         endif()
     elseif (DARWIN)
         if(DAP_DEBUG)
-          set(_CCOPT "-L/usr/local/lib -I/usr/local/include -DDAP_DEBUG -Wall -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing  -std=c11")
+          set(_CCOPT "-L/usr/local/lib -I/usr/local/include -DDAP_DEBUG -Wall  -Wno-address-of-packed-member -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing  -std=c11")
           set(_LOPT "-L/usr/local/lib ")
           SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
         else()
-          set(_CCOPT "-L /usr/local/lib -I/usr/local/include -Wno-deprecated-declarations -Wno-unused-command-line-argument -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -std=c11")
+          set(_CCOPT "-L /usr/local/lib -I/usr/local/include -Wno-address-of-packed-member -Wno-deprecated-declarations -Wno-unused-command-line-argument -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -std=c11")
           set(_LOPT "-L /usr/local/lib")
           SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L/usr/local/lib")
         endif()
diff --git a/dap-sdk/core/include/dap_math_ops.h b/dap-sdk/core/include/dap_math_ops.h
index 606a7e684a961314162471efe4145f4b9358d156..1423f6f39dd291f4424761724c8859ab8b6f3e3a 100755
--- a/dap-sdk/core/include/dap_math_ops.h
+++ b/dap-sdk/core/include/dap_math_ops.h
@@ -8,66 +8,108 @@
 typedef __int128 int128_t;
 typedef __uint128 uint128_t;
 #else
-typedef struct uint128 {
-    uint64_t hi;
-    uint64_t lo;
-} uint128_t;
+typedef union uint128 {
+    struct {
+        uint64_t hi;
+        uint64_t lo;
+    } DAP_ALIGN_PACKED;
+    uint64_t u64[2];
+    uint32_t u32[4];
+} DAP_ALIGN_PACKED uint128_t;
 #endif
 
 typedef struct unsign256 {
     uint128_t hi;
     uint128_t lo;
-} unsign256_t;
-
-const  uint128_t two_power_64={ .hi = 1, .lo = 0};
-
-const uint64_t lo_32=0xffffffff;
-const uint64_t hi_32=0xffffffff00000000;
-const uint64_t ones_64=0xffffffffffffffff;
-
-
-static inline int SUM_64_64(uint64_t a_64_bit,uint64_t b_64_bit,uint64_t* c_64_bit ) {
-
-int overflow_flag;
-*c_64_bit=a_64_bit+b_64_bit;
-overflow_flag=(*c_64_bit<a_64_bit);
-return overflow_flag;}
+} DAP_ALIGN_PACKED uint256_t;
+
+static const  uint128_t two_power_64={ .hi = 1, .lo = 0};
+
+static const uint64_t lo_32=0xffffffff;
+static const uint64_t hi_32=0xffffffff00000000;
+static const uint64_t ones_64=0xffffffffffffffff;
+
+/**
+ * @brief SUM_64_64
+ * @param a_arg1
+ * @param a_arg2
+ * @param a_result
+ * @return
+ */
+static inline int SUM_64_64(uint64_t a_arg1,uint64_t a_arg2,uint64_t* a_result )
+{
+    int overflow_flag;
+    *a_result=a_arg1+a_arg2;
+    overflow_flag=(*a_result<a_arg1);
+    return overflow_flag;
+}
 
-//!!!!This function returns void because THERE CANNOT BE OVERFLOW IN A (64,64)->128 SUM!!!!
-static inline void SUM_64_128(uint64_t a_64_bit,uint64_t b_64_bit,uint128_t* c_128_bit ) {
-int overflow_flag;
-c_128_bit->lo=a_64_bit+b_64_bit;
-c_128_bit->hi=(c_128_bit->lo<a_64_bit);}
+/**
+ * @brief SUM_64_128
+ * @details !!! This function returns void because THERE CANNOT BE OVERFLOW IN A (64,64)->128 SUM!!!!
+ * @param a_arg1
+ * @param a_arg2
+ * @param a_result
+ */
+static inline void SUM_64_128(uint64_t a_arg1,uint64_t a_arg2,uint128_t* a_result )
+{
+    int overflow_flag;
+    a_result->lo=a_arg1+a_arg2;
+    a_result->hi=(a_result->lo<a_arg1);
+}
 
-//Mixed precision: add a uint64_t into a unsign128_t
-static inline int ADD_64_INTO_128(uint64_t a_64_bit,uint128_t* c_128_bit ) {
+/**
+ * @brief ADD_64_INTO_128
+ * @details Mixed precision: add a uint64_t into a unsign128_t
+ * @param a_arg
+ * @param a_proc_value
+ * @return
+ */
+static inline int ADD_64_INTO_128(uint64_t a_arg,uint128_t* a_proc_value )
+{
     int overflow_flag;
     uint64_t overflow_64;
     uint64_t temp;
-    temp=c_128_bit->lo;
-    overflow_flag=SUM_64_64(a_64_bit,temp,&c_128_bit->lo);
+    temp=a_proc_value->lo;
+    overflow_flag=SUM_64_64(a_arg,temp,&a_proc_value->lo);
     overflow_64=overflow_flag;
-    temp=c_128_bit->hi;
-    overflow_flag=SUM_64_64(overflow_64,temp,&c_128_bit->hi);
-    return overflow_flag;}
+    temp=a_proc_value->hi;
+    overflow_flag=SUM_64_64(overflow_64,temp,&a_proc_value->hi);
+    return overflow_flag;
+}
 
-static inline int  SUM_128_128(uint128_t a_128_bit,uint128_t b_128_bit,uint128_t* c_128_bit){
+/**
+ * @brief SUM_128_128
+ * @param a_arg1
+ * @param a_arg2
+ * @param a_result
+ * @return
+ */
+static inline int  SUM_128_128(uint128_t a_arg1,uint128_t a_arg2,uint128_t* a_result)
+{
     int overflow_flag;
-    overflow_flag=SUM_64_64(a_128_bit.lo,b_128_bit.lo,&c_128_bit->lo);
+    overflow_flag=SUM_64_64(a_arg1.lo,a_arg2.lo,&a_result->lo);
     uint64_t carry_in_64=overflow_flag;
     uint64_t intermediate_value=0;
     overflow_flag=0;
-    overflow_flag=SUM_64_64(a_128_bit.hi,b_128_bit.hi,&intermediate_value);
+    overflow_flag=SUM_64_64(a_arg1.hi,a_arg2.hi,&intermediate_value);
     carry_in_64=overflow_flag;
     overflow_flag=0;
-    overflow_flag=SUM_64_64(carry_in_64,intermediate_value,&c_128_bit->hi);
+    overflow_flag=SUM_64_64(carry_in_64,intermediate_value,&a_result->hi);
     return overflow_flag;
 }
 
-
-static inline int  SUM_256_256(unsign256_t a_256_bit,unsign256_t b_256_bit,unsign256_t* c_256_bit){
+/**
+ * @brief SUM_256_256
+ * @param a_arg1
+ * @param a_arg2
+ * @param a_result
+ * @return
+ */
+static inline int  SUM_256_256(uint256_t a_arg1,uint256_t a_arg2,uint256_t* a_result)
+{
     int overflow_flag;
-    overflow_flag=SUM_128_128(a_256_bit.lo,b_256_bit.lo,&c_256_bit->lo);
+    overflow_flag=SUM_128_128(a_arg1.lo,a_arg2.lo,&a_result->lo);
     uint128_t carry_in_128;
     carry_in_128.hi=0;
     carry_in_128.lo=overflow_flag;
@@ -75,32 +117,86 @@ static inline int  SUM_256_256(unsign256_t a_256_bit,unsign256_t b_256_bit,unsig
     intermediate_value.hi=0;
     intermediate_value.lo=0;
     overflow_flag=0;
-    overflow_flag=SUM_128_128(carry_in_128,a_256_bit.hi,&intermediate_value);
+    overflow_flag=SUM_128_128(carry_in_128,a_arg1.hi,&intermediate_value);
     
     //we store overflow_flag in case there is already overflow
     int overflow_flag_bis=0; 
     
-    overflow_flag_bis=SUM_128_128(intermediate_value,b_256_bit.hi,&c_256_bit->hi);
+    overflow_flag_bis=SUM_128_128(intermediate_value,a_arg2.hi,&a_result->hi);
     overflow_flag=overflow_flag||overflow_flag_bis;
-    return overflow_flag;}
+    return overflow_flag;
+}
 
+/**
+ * @brief dap_uint128_add
+ * @param a_arg1
+ * @param a_arg2
+ * @return
+ */
+static inline uint128_t dap_uint128_add (uint128_t a_arg1, uint128_t a_arg2)
+{
+    uint128_t l_ret;
+    memset(&l_ret,0,sizeof(l_ret));
+
+    SUM_128_128(a_arg1, a_arg2, & l_ret);
+    return l_ret;
+}
 
-static inline bool dap_unsign128_t_check_equal(uint128_t a_128_bit, uint128_t b_128_bit)
+/**
+ * @brief dap_uint128_substract
+ * @param a
+ * @param b
+ * @return
+ */
+static inline uint128_t dap_uint128_substract(uint128_t a, uint128_t b)
 {
 #ifdef DAP_GLOBAL_IS_INT128
-    return a_128_bit == b_128_bit;
+    if (a < b) {
+        _log_it("dap_math_ops",L_WARNING, "Substract result overflow");
+        return 0;
+    }
+    return a - b;
 #else
-    return a_128_bit.lo==b_128_bit.lo && a_128_bit.hi==b_128_bit.hi;
+    uint128_t l_ret = {};
+    if (a.u64[0] < b.u64[0] || (a.u64[0] == b.u64[0] && a.u64[1] < b.u64[1])) {
+        _log_it("dap_math_ops",L_WARNING, "Substract result overflow");
+        return l_ret;
+    }
+    l_ret.u64[0] = a.u64[0] - b.u64[0];
+    l_ret.u64[1] = a.u64[1] - b.u64[1];
+    if (a.u64[1] < b.u64[1])
+        l_ret.u64[0]--;
+    return l_ret;
 #endif
+
 }
 
 
-static inline bool dap_unsign256_t_check_equal(unsign256_t a_256_bit, unsign256_t b_256_bit)
+/**
+ * @brief dap_uint128_check_equal
+ * @param a_arg1
+ * @param a_arg2
+ * @return
+ */
+static inline bool dap_uint128_check_equal(uint128_t a_arg1, uint128_t a_arg2)
 {
-    return a_256_bit.lo.lo==b_256_bit.lo.lo &&
-           a_256_bit.lo.hi==b_256_bit.lo.hi &&
-           a_256_bit.hi.lo==b_256_bit.hi.lo &&
-           a_256_bit.hi.hi==b_256_bit.hi.hi;
+#ifdef DAP_GLOBAL_IS_INT128
+    return a_128_bit == b_128_bit;
+#else
+    return a_arg1.lo==a_arg2.lo && a_arg1.hi==a_arg2.hi;
+#endif
 }
 
-
+/**
+ * @brief dap_unsign256_t_check_equal
+ * @param a_arg1
+ * @param a_arg2
+ * @return
+ */
+static inline bool dap_unsign256_t_check_equal(uint256_t a_arg1, uint256_t a_arg2)
+{
+    return a_arg1.lo.lo==a_arg2.lo.lo &&
+           a_arg1.lo.hi==a_arg2.lo.hi &&
+           a_arg1.hi.lo==a_arg2.hi.lo &&
+           a_arg1.hi.hi==a_arg2.hi.hi;
+}
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index f5f6cad96fe314737b8a18574e8b5150665fadfa..4d501aeb19aa7f1266048d60ba2c9a05700e3449 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -2569,8 +2569,11 @@ uint128_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c
         if(l_out_item_count >= MAX_OUT_ITEMS) {
             if(s_debug_more)
                 log_it(L_ERROR, "Too many 'out' items=%d in transaction (max=%d)", l_out_item_count, MAX_OUT_ITEMS);
-            if (l_out_item_count >= MAX_OUT_ITEMS)
-                return 0;
+            if (l_out_item_count >= MAX_OUT_ITEMS){
+                uint128_t l_ret;
+                memset(&l_ret,0,sizeof(l_ret));
+                return l_ret;
+            }
         }
         int l_out_idx_tmp = 0;
         for (dap_list_t *l_list_tmp = l_list_out_items; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_out_idx_tmp++) {
diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h
index 19333779c7551ff7fbb3bc61de8fa31d9ca24aa1..807079680d020d03bfe04f03c0a750c25e7ef697 100644
--- a/modules/common/include/dap_chain_common.h
+++ b/modules/common/include/dap_chain_common.h
@@ -246,7 +246,7 @@ DAP_STATIC_INLINE uint128_t dap_chain_uint128_from(uint64_t a_from)
 #ifdef DAP_GLOBAL_IS_INT128
     return (uint128_t)a_from;
 #else
-    uint128_t l_ret = { .0, a_from};
+    uint128_t l_ret = {{ .0, a_from}};
     return l_ret;
 #endif
 }
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index 3885d764a163a0adedc5d79cbe6e1608c427e218..c528c8dd5b18b326294653931ade2469b3a08af7 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -1023,14 +1023,16 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke
                     break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: {
                     char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address);
+                    char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply);
                     dap_string_append_printf(l_str_out,
-                            " total_supply: %.0llf(%llu), flags: 0x%x\n, premine_supply: %llu, premine_address '%s'\n",
-                            l_token->header_public.total_supply / DATOSHI_LD,
+                            " total_supply: %s (%llu), flags: 0x%x\n, premine_supply: %llu, premine_address '%s'\n",
+                            l_balance,
                             l_token->header_public.total_supply,
                             l_token->header_public.flags,
                             l_token->header_public.premine_supply,
                             l_addr ? l_addr : "-");
                     DAP_DELETE(l_addr);
+                    DAP_DELETE(l_balance);
                 }
                     break;
                 default:
@@ -1147,14 +1149,16 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                     break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: {
                     char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address);
+                    char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply);
                     dap_string_append_printf(l_str_out,
-                            " total_supply: %.0llf(%llu), flags: 0x%x\n, premine_supply: %llu, premine_address '%s'\n",
-                            l_token->header_public.total_supply / DATOSHI_LD,
+                            " total_supply: %s (%llu), flags: 0x%x\n, premine_supply: %llu, premine_address '%s'\n",
+                            l_balance,
                             l_token->header_public.total_supply,
                             l_token->header_public.flags,
                             l_token->header_public.premine_supply,
                             l_addr ? l_addr : "-");
                     DAP_DELETE(l_addr);
+                    DAP_DELETE(l_balance);
                 }
                     break;
                 default: