From e6e10187dd0baf5e7e93dfb40af0a39c89ad127e Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Fri, 17 Dec 2021 20:27:36 +0300
Subject: [PATCH] [*] Intermediate refactoring results

---
 dap-sdk/core/include/dap_common.h             |   2 +-
 modules/chain/dap_chain_ledger.c              |  16 +-
 modules/chain/include/dap_chain_ledger.h      |   2 +-
 modules/common/include/dap_chain_common.h     |   7 +
 .../include/dap_chain_datum_tx_out_cond.h     |   8 +-
 modules/mempool/dap_chain_mempool.c           |  18 +-
 modules/mempool/include/dap_chain_mempool.h   |   2 +-
 modules/net/dap_chain_node_cli_cmd.c          |  95 +++------
 modules/net/dap_chain_node_cli_cmd_tx.c       | 187 +++++++-----------
 9 files changed, 135 insertions(+), 202 deletions(-)

diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h
index 641096894d..0236aaeb3a 100755
--- a/dap-sdk/core/include/dap_common.h
+++ b/dap-sdk/core/include/dap_common.h
@@ -143,7 +143,7 @@ typedef uint8_t byte_t;
   #define DAP_DUP_SIZE(a, s)    memcpy(malloc(s), a, s)
 #endif
 
-#define DAP_DEL_Z(a)          if(a) { DAP_DELETE(a); a=NULL;}
+#define DAP_DEL_Z(a)            if (a) { DAP_DELETE(a); (a) = NULL; }
 
 DAP_STATIC_INLINE void *_dap_aligned_alloc( uintptr_t alignment, uintptr_t size )
 {
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 0069bb0ba9..8212d22647 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -935,7 +935,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger)
                                              "\tAuth signs (valid/total) %zu/%zu\n"
                                              "\tTotal emissions %u\n",
                                              &l_token_item->ticker, l_type_str, l_token_item->flags,
-                                             dap_chain_u256tostr(l_token_item->current_supply), dap_chain_u256tostr(l_token_item->total_supply),
+                                             dap_chain_balance_print(l_token_item->current_supply), dap_chain_balance_print(l_token_item->total_supply),
                                              l_token_item->auth_signs_valid, l_token_item->auth_signs_total,
                                              HASH_COUNT(l_token_item->token_emissions));
         l_ret_list = dap_list_append(l_ret_list, l_item_str);
@@ -1205,7 +1205,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_
         if(s_debug_more) {
             if ( l_token_emission_item->datum_token_emission->hdr.version == 1 ) //&& l_token_emission_item->datum_token_emission->hdr.type_256 )
                 log_it(L_ERROR, "Can't add token emission datum of %s %s ( %s ): already present in cache",
-                    dap_chain_u256tostr(l_token_emission_item->datum_token_emission->hdr.value_256), c_token_ticker, l_hash_str);
+                    dap_chain_balance_print(l_token_emission_item->datum_token_emission->hdr.value_256), c_token_ticker, l_hash_str);
             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);
@@ -1258,7 +1258,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_
                     if(s_debug_more)
                             if ( l_emission->hdr.version == 1 ) // && l_emission->hdr.type_256 ) // 256
                                log_it(L_WARNING, "Emission of %s datoshi of %s:%s is wrong: only %u valid aproves when %u need",
-                                   dap_chain_u256tostr(l_emission->hdr.value_256), a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid );
+                                   dap_chain_balance_print(l_emission->hdr.value_256), a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid );
                             else
                                 log_it(L_WARNING, "Emission of %"DAP_UINT64_FORMAT_U" datoshi of %s:%s is wrong: only %u valid aproves when %u need",
                                    l_emission->hdr.value, a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid );
@@ -1363,7 +1363,7 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_
             if(s_debug_more) {
                 if ( ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.version == 1 ) // && ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.type_256 ) // 256
                     log_it(L_ERROR, "Duplicate token emission datum of %s %s ( %s )",
-                            dap_chain_u256tostr(((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value_256), c_token_ticker, l_hash_str);
+                            dap_chain_balance_print(((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value_256), c_token_ticker, l_hash_str);
                 else
                     log_it(L_ERROR, "Duplicate token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s )",
                             ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value, c_token_ticker, l_hash_str);
@@ -2898,7 +2898,7 @@ uint256_t dap_chain_ledger_calc_balance(dap_ledger_t *a_ledger, const dap_chain_
     if (l_balance_item) {
         if(s_debug_more)
             log_it (L_INFO,"Found address in cache with balance %s",
-                            dap_chain_u256tostr(l_balance_item->balance));
+                            dap_chain_balance_print(l_balance_item->balance));
         l_ret = l_balance_item->balance;
     } else {
         if (s_debug_more)
@@ -3262,12 +3262,12 @@ uint64_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, da
  * @return
  */
 dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, const char *a_token_ticker, const dap_chain_addr_t *a_addr_from,
-                                                       uint64_t a_value_need, uint64_t *a_value_transfer)
+                                                       uint256_t a_value_need, uint256_t *a_value_transfer)
 {
     dap_list_t *l_list_used_out = NULL; // list of transaction with 'out' items
     dap_chain_hash_fast_t l_tx_cur_hash = { 0 };
-    uint64_t l_value_transfer = 0;
-    while(l_value_transfer < a_value_need)
+    uint256_t l_value_transfer = {};
+    while(compare256(l_value_transfer, a_value_need) == -1)
     {
         // Get the transaction in the cache by the addr in out item
         dap_chain_datum_tx_t *l_tx = dap_chain_ledger_tx_find_by_addr(a_ledger, a_token_ticker, a_addr_from,
diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h
index 543a4d7f5d..2133380eb7 100644
--- a/modules/chain/include/dap_chain_ledger.h
+++ b/modules/chain/include/dap_chain_ledger.h
@@ -217,7 +217,7 @@ uint64_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, da
 // Get the list of 'out' items from previous transactions with summary value >= than a_value_need
 // Put this summary value to a_value_transfer
 dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, const char *a_token_ticker, const dap_chain_addr_t *a_addr_from,
-                                                       uint64_t a_value_need, uint64_t *a_value_transfer);
+                                                       uint256_t a_value_need, uint256_t *a_value_transfer);
 int dap_chain_ledger_verificator_rwlock_init(void);
 // Add new verificator callback with associated subtype. Returns 1 if callback replaced, overwise returns 0
 int dap_chain_ledger_verificator_add(dap_chain_tx_out_cond_subtype_t a_subtype, dap_chain_ledger_verificator_callback_t a_callback);
diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h
index 15697bb114..58e0e3250f 100644
--- a/modules/common/include/dap_chain_common.h
+++ b/modules/common/include/dap_chain_common.h
@@ -271,6 +271,13 @@ DAP_STATIC_INLINE uint256_t dap_chain_uint256_from(uint64_t a_from)
     return l_ret_256;
 }
 
+DAP_STATIC_INLINE uint256_t dap_chain_uint256_from_uint128(uint128_t a_from)
+{
+    uint256_t l_ret_256 = uint256_0;
+    ADD_128_INTO_256(a_from, &l_ret_256);
+    return l_ret_256;
+}
+
 uint64_t dap_chain_uint128_to(uint128_t a_from);
 // 256
 uint64_t dap_chain_uint256_to(uint256_t a_from);
diff --git a/modules/common/include/dap_chain_datum_tx_out_cond.h b/modules/common/include/dap_chain_datum_tx_out_cond.h
index f8202e9440..de61d36934 100644
--- a/modules/common/include/dap_chain_datum_tx_out_cond.h
+++ b/modules/common/include/dap_chain_datum_tx_out_cond.h
@@ -33,7 +33,7 @@ enum dap_chain_tx_out_cond_subtype {
     DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY = 0x01,
     DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE = 0x02,
     DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE = 0x13,
-    DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_UPDATE = 0xFA       // Virtual type for stake update verificator TODO change it to new type of callback for ledger tx add
+    DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_UPDATE = 0xFA       // Virtual type for stake update verificator //TODO change it to new type of callback for ledger tx add
 };
 typedef byte_t dap_chain_tx_out_cond_subtype_t;
 
@@ -51,7 +51,7 @@ DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_
  * @struct dap_chain_tx_out
  * @brief Transaction item out_cond
  */
-typedef struct dap_chain_tx_out_cond {
+typedef struct dap_chain_tx_out_cond {      // Absolete
     struct {
         /// Transaction item type
         dap_chain_tx_item_type_t item_type;
@@ -107,9 +107,9 @@ typedef struct dap_chain_tx_out_cond {
 typedef struct dap_chain_256_tx_out_cond {
     struct {
         /// Transaction item type
-        dap_chain_tx_item_type_t item_type :8;
+        dap_chain_tx_item_type_t item_type;
         /// Condition subtype
-        dap_chain_tx_out_cond_subtype_t subtype : 8;
+        dap_chain_tx_out_cond_subtype_t subtype;
         /// Number of Datoshis ( DAP/10^9 ) to be reserver for service
         uint256_t value;
         /// When time expires this output could be used only by transaction owner
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index e72a1242c0..5137d4f72a 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -107,7 +107,7 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_
         const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to,
         const dap_chain_addr_t* a_addr_fee,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value, uint64_t a_value_fee)
+        uint256_t a_value, uint256_t a_value_fee)
 {
     // check valid param
     if(!a_chain | !a_key_from || ! a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size ||
@@ -116,8 +116,9 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_
         return NULL;
 
     // find the transactions from which to take away coins
-    uint64_t l_value_transfer = 0; // how many coins to transfer
-    uint64_t l_value_need = a_value + a_value_fee;
+    uint256_t l_value_transfer = 0; // how many coins to transfer
+    uint256_t l_value_need;
+    SUM_256_256(a_value, a_value_fee, &l_value_need);
     dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(a_chain->ledger, a_token_ticker,
                                                                              a_addr_from, l_value_need, &l_value_transfer);
     if (!l_list_used_out) {
@@ -134,18 +135,19 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_
     }
     // add 'out' items
     {
-        uint64_t l_value_pack = 0; // how much datoshi add to 'out' items
+        uint256_t l_value_pack = {}; // how much datoshi add to 'out' items
         if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_to, a_value) == 1) {
-            l_value_pack += a_value;
+            SUM_256_256(l_value_pack, a_value, &l_value_pack);
             // transaction fee
             if(a_addr_fee) {
                 if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_fee, a_value_fee) == 1)
-                    l_value_pack += a_value_fee;
+                    SUM_256_256(l_value_pack, a_value_fee, &l_value_pack);
             }
         }
         // coin back
-        uint64_t l_value_back = l_value_transfer - l_value_pack;
-        if(l_value_back) {
+        uint256_t l_value_back;
+        SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back);
+        if(!IS_ZERO_256(l_value_back)) {
             if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_from, l_value_back) != 1) {
                 dap_chain_datum_tx_delete(l_tx);
                 return NULL;
diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h
index 0e8b0be25b..b4b81ae28b 100644
--- a/modules/mempool/include/dap_chain_mempool.h
+++ b/modules/mempool/include/dap_chain_mempool.h
@@ -48,7 +48,7 @@ dap_hash_fast_t*  dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key
         const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to,
         const dap_chain_addr_t* a_addr_fee,
         const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value, uint64_t a_value_fee);
+        uint256_t a_value, uint256_t a_value_fee);
 
 // Make transfer transaction & insert to cache
 dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net,
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 3fbc547a98..5902c2be53 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -3113,7 +3113,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     }
     int l_ret = 0;
     bool l_placed = dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool);
-    dap_chain_node_cli_set_reply_text(a_str_reply, "datum 256_t %s with token %s is%s placed in datum pool",
+    dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s with 256bit token %s is%s placed in datum pool",
                                       dap_strcmp(l_hash_out_type, "hex") ? l_key_str_base58 : l_key_str,
                                       l_ticker, l_placed ? "" : " not");
     if (!l_placed) {
@@ -3143,7 +3143,6 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     const char * l_addr_str = NULL;
 
     const char * l_emission_hash_str = NULL;
-    char * l_emission_hash_str_new = NULL;
     dap_chain_hash_fast_t l_emission_hash={0};
     dap_chain_datum_token_emission_t * l_emission = NULL;
     char * l_emission_hash_str_base58 = NULL;
@@ -3279,7 +3278,7 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     }
     // Create emission datum
     // then create datum in memory
-    if(!l_emission){
+    if (!l_emission) {
         char * l_gdb_group_mempool_emission;
         if(l_chain_emission) {
             l_gdb_group_mempool_emission = dap_chain_net_get_gdb_group_mempool(l_chain_emission);
@@ -3313,50 +3312,35 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
         }
 
         // Produce datum
-        dap_chain_datum_t * l_datum_emission = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_EMISSION,
+        dap_chain_datum_t *l_datum_emission = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_EMISSION,
                 l_emission,
                 l_emission_size);
         size_t l_datum_emission_size = sizeof(l_datum_emission->header) + l_datum_emission->header.data_size;
 
-        // Calc emission's hash
-        dap_hash_fast(l_emission, l_emission_size, &l_emission_hash);
-        l_emission_hash_str = l_emission_hash_str_new = dap_chain_hash_fast_to_str_new(&l_emission_hash);
+        // Calc datum emission's hash
+        dap_hash_fast(l_datum_emission, l_datum_emission_size, &l_emission_hash);
+        l_emission_hash_str = dap_chain_hash_fast_to_str_new(&l_emission_hash);
         l_emission_hash_str_base58 = dap_enc_base58_encode_hash_to_str(&l_emission_hash);
 
         // Delete token emission
         DAP_DEL_Z(l_emission);
 
-        // Add to mempool emission token
-        bool l_placed = dap_chain_global_db_gr_set(dap_strdup(l_emission_hash_str_new),
+        // Add token emission datum to mempool
+        bool l_placed = dap_chain_global_db_gr_set(dap_strdup(l_emission_hash_str),
                                                    (uint8_t *)l_datum_emission,
                                                    l_datum_emission_size,
                                                    l_gdb_group_mempool_emission);
-        str_reply_tmp = dap_strdup_printf("Datum 256_t emission %s is%s placed in datum pool",
-                    (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""),
-                    l_emission_hash_str_new);
-            else
-                str_reply_tmp = dap_strdup_printf("Datum%s emission %s is placed in datum pool",
-                            (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""),
-                            l_emission_hash_str_base58);
-        }
-        else {
-            if(!dap_strcmp(l_hash_out_type,"hex"))
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Datum%s emission %s is not placed in datum pool",
-                            (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""),
-                            l_emission_hash_str_new);
-            else
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Datum%s emission %s is not placed in datum pool", 
-                            (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""),
-                            l_emission_hash_str_base58);
-            DAP_DEL_Z(l_emission_hash_str_new);
-            l_emission_hash_str = NULL;
-            DAP_DEL_Z(l_emission_hash_str_base58);
+        str_reply_tmp = dap_strdup_printf("Datum %s with 256bit emission is%s placed in datum pool",
+                                          dap_strcmp(l_hash_out_type, "hex") ? l_emission_hash_str_base58 : l_emission_hash_str,
+                                          l_placed ? "" : " not");
+        DAP_DELETE((char *)l_emission_hash_str);
+        DAP_DEL_Z(l_emission_hash_str_base58);
+        if (!l_placed) {
             DAP_DEL_Z(l_datum_emission);
             return -1;
         }
         l_datum_emission = NULL;
-        l_emission = NULL;
-    }
+    } // TODO possible update emission if it found, or remove -emission parameter
 
     // create first transaction (with tx_token)
     dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t));
@@ -3391,18 +3375,12 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     DAP_DEL_Z(l_in);
     DAP_DEL_Z(l_out);
 
-    DAP_DEL_Z(l_emission_hash_str_new);
-    l_emission_hash_str = NULL;
-    DAP_DEL_Z(l_emission_hash_str_base58);
-
     size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx);
 
     // Pack transaction into the datum
     dap_chain_datum_t * l_datum_tx = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size);
     size_t l_datum_tx_size = dap_chain_datum_size(l_datum_tx);
 
-    // use l_tx hash for compatible with utho hash
-    //dap_hash_fast(l_tx, l_tx_size, &l_key_hash); //dap_hash_fast(l_datum_tx, l_datum_tx_size, &l_key_hash);
     // calc datum hash
     dap_chain_hash_fast_t l_datum_tx_hash;
     dap_hash_fast(l_datum_tx, l_datum_tx_size,  &l_datum_tx_hash);
@@ -3411,38 +3389,21 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     DAP_DEL_Z(l_tx);
 
     // Add to mempool tx token
-    if(dap_chain_global_db_gr_set(dap_strdup(l_tx_hash_str), l_datum_tx, l_datum_tx_size
-            , l_gdb_group_mempool_base_tx)) {
-        if(!dap_strcmp(l_hash_out_type,"hex"))
-            dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is placed in datum pool ",
-                            str_reply_tmp,
-                            (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""),
-                            l_tx_hash_str);
-        else
-            dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is placed in datum pool ",
-                            str_reply_tmp,
-                            (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""),
-                            l_tx_hash_str_base58);
-        DAP_DEL_Z(l_tx_hash_str);
-        DAP_DEL_Z(l_tx_hash_str_base58);
-    } else {
-        if(!dap_strcmp(l_hash_out_type,"hex"))
-            dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is not placed in datum pool ",
-                            str_reply_tmp,
-                            (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""),
-                            l_emission_hash_str);
-        else
-            dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is not placed in datum pool ",
-                            str_reply_tmp,
-                            (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""),
-                            l_tx_hash_str_base58);
-        DAP_DEL_Z(l_tx_hash_str);
-        DAP_DEL_Z(l_tx_hash_str_base58);
-
-        return -2;
-    }
+    bool l_placed = dap_chain_global_db_gr_set(dap_strdup(l_tx_hash_str), l_datum_tx,
+                                               l_datum_tx_size, l_gdb_group_mempool_base_tx);
+    dap_chain_node_cli_set_reply_text(a_str_reply, "%s\nDatum %s with 256bit TX is%s placed in datum pool ",
+                                      str_reply_tmp,
+                                      dap_strcmp(l_hash_out_type, "hex") ? l_tx_hash_str_base58 : l_tx_hash_str,
+                                      l_placed ? "" : " not");
+    DAP_DEL_Z(l_tx_hash_str);
+    DAP_DEL_Z(l_tx_hash_str_base58);
     DAP_DELETE(str_reply_tmp);
     DAP_DELETE(l_addr);
+    if (!l_placed) {
+        DAP_DELETE(l_datum_tx);
+        return -2;
+    }
+
     return 0;
 }
 
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index fdc7d4e0bd..8d465e0384 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -149,9 +149,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
             dap_string_append_printf(a_str_out, "\t OUT:\n"
                                                 "\t\t Value: %s (%"DAP_UINT64_FORMAT_U")\n"
                                                 "\t\t Address: %s\n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from(
-                                                                       ((dap_chain_tx_out_t*)item)->header.value)
-                                                                   ),
+                                        dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                                                      ((dap_chain_tx_out_t*)item)->header.value)),
                                         ((dap_chain_tx_out_t*)item)->header.value,
                                         dap_chain_addr_to_str(&((dap_chain_tx_out_t*)item)->addr));
             break;
@@ -159,10 +158,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
             dap_string_append_printf(a_str_out, "\t OUT 256_t:\n"
                                                 "\t\t Value: %s (%s)\n"
                                                 "\t\t Address: %s\n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(
-                                                                       ((dap_chain_256_tx_out_t*)item)->header.value)
-                                                                   ),
-                                        dap_chain_u256tostr(((dap_chain_256_tx_out_t*)item)->header.value),
+                                        dap_chain_balance_to_coins(((dap_chain_256_tx_out_t*)item)->header.value),
+                                        dap_chain_balance_print(((dap_chain_256_tx_out_t*)item)->header.value),
                                         dap_chain_addr_to_str(&((dap_chain_256_tx_out_t*)item)->addr));
             break;
         }
@@ -172,7 +169,7 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                 "\t\t ticker: %s \n"
                                                 "\t\t token_emission_hash: %s\n"
                                                 "\t\t token_emission_chain_id: 0x%016"DAP_UINT64_FORMAT_x"\n", ((dap_chain_tx_token_t*)item)->header.ticker, l_hash_str_tmp,
-                                        ((dap_chain_tx_token_t*)item)->header.token_emission_chain_id.uint64);
+                                                ((dap_chain_tx_token_t*)item)->header.token_emission_chain_id.uint64);
             DAP_DELETE(l_hash_str_tmp);
             break;
         case TX_ITEM_TYPE_TOKEN_EXT:
@@ -214,11 +211,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                      serv_unit_enum_to_str(
                                          &((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units_type.enm
                                          ),
-                                     dap_chain_balance_to_coins(
-                                         dap_chain_uint128_from(
-                                             ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi
-                                         )
-                                     ),
+                                     dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                         ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi)),
                                      ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi);
             if (((dap_chain_datum_tx_receipt_t*)item)->exts_size == sizeof(dap_sign_t) + sizeof(dap_sign_t)){
                 dap_sign_t *l_provider = DAP_NEW_Z(dap_sign_t);
@@ -278,9 +272,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                 "\t\t\t subtype: %s\n"
                                                 "\t\t SubType:\n",
                                      dap_ctime_r((time_t *)&((dap_chain_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf),
-                                     dap_chain_balance_to_coins(
-                                         dap_chain_uint128_from(((dap_chain_tx_out_cond_t*)item)->header.value)
-                                     ),
+                                     dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                         ((dap_chain_tx_out_cond_t*)item)->header.value)),
                                      ((dap_chain_tx_out_cond_t*)item)->header.value,
                                      dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_t*)item)->header.subtype));
             switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) {
@@ -293,9 +286,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                          ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32,
                                          ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.srv_uid.uint64,
                                          l_hash_str_tmp,
-                                         dap_chain_balance_to_coins(dap_chain_uint128_from(
-                                                ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)
-                                                                    ),
+                                         dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                             ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)),
                                          ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi);
                 DAP_FREE(l_hash_str_tmp);
                 break;
@@ -317,11 +309,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                          ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.srv_uid.uint64,
                                          ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.net_id.uint64,
                                          ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.token,
-                                         dap_chain_balance_to_coins(
-                                             dap_chain_uint128_from(
-                                                 ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value
-                                                 )
-                                             ),
+                                         dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                             ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value)),
                                          ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value);
                 break;
                 default: break;
@@ -335,10 +324,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                 "\t\t\t subtype: %s\n"
                                                 "\t\t SubType:\n",
                                      dap_ctime_r((time_t*)((dap_chain_256_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf),
-                                     dap_chain_balance_to_coins(
-                                         dap_chain_uint128_from_uint256(((dap_chain_256_tx_out_cond_t*)item)->header.value)
-                                     ),
-                                     dap_chain_u256tostr(((dap_chain_256_tx_out_cond_t*)item)->header.value),
+                                     dap_chain_balance_to_coins(((dap_chain_256_tx_out_cond_t*)item)->header.value),
+                                     dap_chain_balance_print(((dap_chain_256_tx_out_cond_t*)item)->header.value),
                                      dap_chain_tx_out_cond_subtype_to_str(((dap_chain_256_tx_out_cond_t*)item)->header.subtype)
             );
             switch (((dap_chain_256_tx_out_cond_t*)item)->header.subtype) {
@@ -351,10 +338,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                          ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32,
                                          ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.srv_uid.uint64,
                                          l_hash_str_tmp,
-                                         dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(
-                                                ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)
-                                                                    ),
-                                         dap_chain_u256tostr(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)
+                                         dap_chain_balance_to_coins(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi),
+                                         dap_chain_balance_print(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)
                 );
                 DAP_FREE(l_hash_str_tmp);
                 break;
@@ -377,12 +362,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                          ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.srv_uid.uint64,
                                          ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.net_id.uint64,
                                          ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.token,
-                                         dap_chain_balance_to_coins(
-                                             dap_chain_uint128_from_uint256(
-                                                 ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value
-                                                 )
-                                             ),
-                                         dap_chain_u256tostr(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value)
+                                         dap_chain_balance_to_coins(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value),
+                                         dap_chain_balance_print(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value)
                 );
                 break;
             }
@@ -394,9 +375,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                 "\t\t Value: %s (%"DAP_UINT64_FORMAT_U")\n",
                                      dap_chain_addr_to_str(&((dap_chain_tx_out_ext_t*)item)->addr),
                                      ((dap_chain_tx_out_ext_t*)item)->token,
-                                     dap_chain_balance_to_coins(dap_chain_uint128_from(
-                                                                    ((dap_chain_tx_out_ext_t*)item)->header.value)
-                                                                ),
+                                     dap_chain_balance_to_coins(dap_chain_uint256_from(
+                                         ((dap_chain_tx_out_ext_t*)item)->header.value)),
                                      ((dap_chain_tx_out_ext_t*)item)->header.value
                                 );
             break;
@@ -407,10 +387,8 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                 "\t\t Value: %s (%s)\n",
                                      dap_chain_addr_to_str(&((dap_chain_256_tx_out_ext_t*)item)->addr),
                                      ((dap_chain_256_tx_out_ext_t*)item)->token,
-                                     dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(
-                                                                    ((dap_chain_256_tx_out_ext_t*)item)->header.value)
-                                                                ),
-                                     dap_chain_u256tostr(((dap_chain_256_tx_out_ext_t*)item)->header.value)
+                                     dap_chain_balance_to_coins(((dap_chain_256_tx_out_ext_t*)item)->header.value),
+                                     dap_chain_balance_print(((dap_chain_256_tx_out_ext_t*)item)->header.value)
                                 );
             break;
         default:
@@ -459,16 +437,13 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
 
         while(l_atom && l_atom_size) {
             dap_chain_datum_t *l_datum = (dap_chain_datum_t*) l_atom;
-            if(!l_datum && (l_datum->header.type_id != DAP_CHAIN_DATUM_TX && l_datum->header.type_id != DAP_CHAIN_DATUM_256_TX ) ) {
+            if (!l_datum || (l_datum->header.type_id != DAP_CHAIN_DATUM_TX)) {
                 // go to next transaction
                 l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size);
                 continue;
             }
 
-            bool l_type_256 = false;
 
-            if ( l_datum->header.type_id == DAP_CHAIN_DATUM_256_TX )
-                l_type_256 = true;
 
             dap_tx_data_t *l_tx_data = NULL;
 
@@ -480,12 +455,12 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
             l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL);
 
             // find OUT items
-
-            dap_list_t *l_list_out_items;
-            if ( l_type_256 ) // 256
+            bool l_type_256 = false;
+            dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
+            if (!l_list_out_items) {
                 l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_OUT, NULL);
-            else
-                l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
+                l_type_256 = true;
+            }
 
             dap_list_t *l_list_tmp = l_list_out_items;
 
@@ -593,8 +568,8 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
 
                 if(l_tx_out || l_tx_out_256) {
                     if ( l_type_256 ) // 256
-                        dap_string_append_printf(l_str_out, " OUT 256_t item %s %s to %s\n",
-                            dap_chain_u256tostr(l_tx_out_256->header.value),
+                        dap_string_append_printf(l_str_out, " OUT 256bit item %s %s to %s\n",
+                            dap_chain_balance_print(l_tx_out_256->header.value),
                             dap_strlen(l_token_str) > 0 ? l_token_str : "?",
                             l_dst_to_str ? l_dst_to_str : "?"
                         );
@@ -653,8 +628,8 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
                         dap_chain_256_tx_out_t *l_tx_prev_out =
                                 l_list_out_prev_item ? (dap_chain_256_tx_out_t*)l_list_out_prev_item->data : NULL;
                         // print value from prev out item
-                        dap_string_append_printf(l_str_out, "  prev OUT 256_t item value=%s",
-                                l_tx_prev_out ? dap_chain_u256tostr(l_tx_prev_out->header.value) : "0");
+                        dap_string_append_printf(l_str_out, "  prev OUT 256bitt item value=%s",
+                                l_tx_prev_out ? dap_chain_balance_print(l_tx_prev_out->header.value) : "0");
                     } else {
                         dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev,
                                 TX_ITEM_TYPE_OUT, NULL);
@@ -723,7 +698,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons
 
     dap_tx_data_t *l_tx_data_hash = NULL;
     // load transactions
-    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
+    dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_chain->cells->id);
     size_t l_atom_size=0;
     dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size);
     if (!l_atom) {
@@ -894,7 +869,8 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke
                 // get time of create datum
                 if (dap_time_to_str_rfc822(l_time_str, 70, l_datum->header.ts_create) < 1)
                     l_time_str[0] = '\0';
-                dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
+                size_t l_token_size = l_datum->header.data_size;
+                dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(l_datum->data, &l_token_size);
                 if (!a_token_name || !dap_strcmp(l_token->ticker, a_token_name)) {
                     dap_chain_hash_fast_t l_datum_hash = {};
                     dap_hash_fast(l_datum, dap_chain_datum_size(l_datum), &l_datum_hash);
@@ -905,13 +881,13 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke
                         l_out_hash_str = dap_enc_base58_encode_hash_to_str(&l_datum_hash);
                     dap_string_append(l_str_out, l_out_hash_str);
                     dap_string_append(l_str_out, "\n");
-                    dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str);
+                    dap_string_append_printf(l_str_out, "Token %s, created: %s\n", l_token->ticker, l_time_str);
                     switch (l_token->type) {
                         // Simple private token decl
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256
                            dap_string_append_printf(l_str_out, "  total_supply: %s(%s), signs: valid/total %02d/%02d \n",
-                                    dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)),
-                                    dap_chain_u256tostr(l_token->header_private.total_supply_256),
+                                    dap_chain_balance_to_coins(l_token->header_private.total_supply_256),
+                                    dap_chain_balance_print(l_token->header_private.total_supply_256),
                                     l_token->header_private.signs_valid, l_token->header_private.signs_total);
                             break;
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
@@ -928,38 +904,40 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke
                             break;
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
-                            dap_string_append_printf(l_str_out, "  tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n",
-                                    l_token->header_private_update.tsd_total_size,
-                                    l_token->header_private_update.padding);
+                            dap_string_append_printf(l_str_out, "  tsd_total_size: %"DAP_UINT64_FORMAT_U"\n",
+                                    l_token->header_private_update.tsd_total_size);
                             break;
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256
                             char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address);
-                            char * l_balance = dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256));
+                            char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply_256);
                             dap_string_append_printf(l_str_out,
                                     " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                    dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)),
-                                    dap_chain_u256tostr(l_token->header_public.total_supply_256),
+                                    dap_chain_balance_to_coins(l_token->header_public.total_supply_256),
+                                    dap_chain_balance_print(l_token->header_public.total_supply_256),
                                     l_token->header_public.flags,
-                                    dap_chain_u256tostr(l_token->header_public.premine_supply_256),
+                                    dap_chain_balance_print(l_token->header_public.premine_supply_256),
                                     l_addr ? l_addr : "-");
                             DAP_DELETE(l_addr);
                             DAP_DELETE(l_balance);
                         }break;
                         case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_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);
+                            char * l_balance = dap_chain_balance_to_coins(dap_chain_uint256_from_uint128(
+                                                                              l_token->header_public.total_supply));
                             dap_string_append_printf(l_str_out,
-                                    " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                    dap_chain_datoshi_to_coins(l_token->header_public.total_supply),
-                                    dap_chain_balance_print(l_token->header_public.total_supply),
+                                    " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
+                                    l_balance,
+                                    dap_chain_balance_print(dap_chain_uint256_from_uint128(
+                                                                l_token->header_public.total_supply)),
                                     l_token->header_public.flags,
-                                    dap_chain_balance_print(l_token->header_public.premine_supply),
+                                    dap_chain_balance_print(dap_chain_uint256_from_uint128(
+                                                                l_token->header_public.premine_supply)),
                                     l_addr ? l_addr : "-");
                             DAP_DELETE(l_addr);
                             DAP_DELETE(l_balance);
                         }break;
                         default:
-                            dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type);
+                            dap_string_append_printf(l_str_out, "Unknown token type: 0x%x\n", l_token->type);
                             break;
                     }
                     dap_string_append_printf(l_str_out, "\n");
@@ -1062,9 +1040,9 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                         switch (l_token->type) {
                         // Simple private token decl
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256
-                                dap_string_append_printf(l_str_out, "  256_t total_supply: %s(%s), signs: valid/total %02d/%02d \n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)),
-                                        dap_chain_u256tostr(l_token->header_private.total_supply_256),
+                                dap_string_append_printf(l_str_out, "  256bit total_supply: %s(%s), signs: valid/total %02d/%02d \n",
+                                        dap_chain_balance_to_coins(l_token->header_private.total_supply_256),
+                                        dap_chain_balance_print(l_token->header_private.total_supply_256),
                                         l_token->header_private.signs_valid, l_token->header_private.signs_total);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE:
@@ -1074,7 +1052,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                                         l_token->header_private.signs_valid, l_token->header_private.signs_total);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256
-                                dap_string_append_printf(l_str_out, "256_t  tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n",
+                                dap_string_append_printf(l_str_out, "256bit  tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n",
                                         l_token->header_private_decl.tsd_total_size,
                                         l_token->header_private_decl.flags);
                                 break;
@@ -1084,37 +1062,36 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                                         l_token->header_private_decl.flags);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256
-                                dap_string_append_printf(l_str_out, "256_t  tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n",
-                                        l_token->header_private_update.tsd_total_size,
-                                        l_token->header_private_update.padding);
+                                dap_string_append_printf(l_str_out, "256bit  tsd_total_size: %"DAP_UINT64_FORMAT_U"\n",
+                                        l_token->header_private_update.tsd_total_size);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
-                                dap_string_append_printf(l_str_out, "  tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n",
-                                        l_token->header_private_update.tsd_total_size,
-                                        l_token->header_private_update.padding);
+                                dap_string_append_printf(l_str_out, "  tsd_total_size: %"DAP_UINT64_FORMAT_U"\n",
+                                        l_token->header_private_update.tsd_total_size);
                                 break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256
                                 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: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)),
-                                        dap_chain_u256tostr(l_token->header_public.total_supply_256),
+                                        dap_chain_balance_to_coins(l_token->header_public.total_supply_256),
+                                        dap_chain_balance_print(l_token->header_public.total_supply_256),
                                         l_token->header_public.flags,
-                                        dap_chain_u256tostr(l_token->header_public.premine_supply_256),
+                                        dap_chain_balance_print(l_token->header_public.premine_supply_256),
                                         l_addr ? l_addr : "-");
                                 DAP_DELETE(l_addr);
-                                DAP_DELETE(l_balance);
                             } break;
                             case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_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);
+                                char * l_balance = dap_chain_balance_to_coins(dap_chain_uint256_from_uint128(
+                                                                                  l_token->header_public.total_supply));
                                 dap_string_append_printf(l_str_out,
                                         " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n",
-                                        dap_chain_balance_to_coins(l_token->header_public.total_supply),
-                                        dap_chain_balance_print(l_token->header_public.total_supply),
+                                        l_balance,
+                                        dap_chain_balance_print(dap_chain_uint256_from_uint128(
+                                                                    l_token->header_public.total_supply)),
                                         l_token->header_public.flags,
-                                        dap_chain_balance_print(l_token->header_public.premine_supply),
+                                        dap_chain_balance_print(dap_chain_uint256_from_uint128(
+                                                                    l_token->header_public.premine_supply)),
                                         l_addr ? l_addr : "-");
                                 DAP_DELETE(l_addr);
                                 DAP_DELETE(l_balance);
@@ -1131,7 +1108,6 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                     break;
 
                 // emission
-                case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256
                 case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
                     // datum out of page
                     if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) {
@@ -1148,8 +1124,8 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                         }
                         if ( l_token_em->hdr.version == 1 ) { // && l_token_em->hdr.type_256 ) { // 256
                             dap_string_append_printf(l_str_out, "emission 256: %s(%s) %s, type: %s, version: %d\n",
-                                dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->hdr.value_256)),
-                                dap_chain_u256tostr(l_token_em->hdr.value_256),
+                                dap_chain_balance_to_coins(l_token_em->hdr.value_256),
+                                dap_chain_balance_print(l_token_em->hdr.value_256),
                                 l_token_em->hdr.ticker,
                                 c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type],
                                 l_token_em->hdr.version);
@@ -1211,20 +1187,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                     dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data;
                     //calc tx hash
                     s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num);
-                }
-                    break;
-
-                    // transaction
-                case DAP_CHAIN_DATUM_256_TX:{ // 256
-                    // datum out of page
-                    if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) {
-                        l_tx_num++;
-                        break;
-                    }
-                    dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data;
-                    s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num);
-                }
-                    break;
+                } break;
 
                 default:
                     dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id);
-- 
GitLab