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

---
 dap-sdk/core/include/dap_math_ops.h           |  25 +---
 modules/chain/dap_chain_ledger.c              |   8 +-
 modules/chain/include/dap_chain.h             |   7 +-
 modules/chain/include/dap_chain_ledger.h      |  10 +-
 modules/channel/chain/dap_stream_ch_chain.c   |   5 +-
 modules/common/dap_chain_common.c             | 100 ++++---------
 modules/common/dap_chain_datum_token.c        |   3 +-
 modules/common/dap_chain_datum_tx.c           |  44 +-----
 modules/common/dap_chain_datum_tx_items.c     | 111 ++-------------
 modules/common/include/dap_chain_common.h     |  29 +---
 modules/common/include/dap_chain_datum.h      |   2 -
 .../common/include/dap_chain_datum_token.h    |   3 +-
 modules/common/include/dap_chain_datum_tx.h   |   6 +-
 .../common/include/dap_chain_datum_tx_items.h |  51 +++----
 modules/consensus/none/dap_chain_cs_none.c    |  29 ++--
 modules/net/dap_chain_net.c                   |  42 +++---
 modules/net/dap_chain_node_cli_cmd.c          | 132 ++++++------------
 modules/net/dap_chain_node_cli_cmd_tx.c       |  48 +------
 modules/net/include/dap_chain_net.h           |   2 +-
 modules/type/blocks/dap_chain_cs_blocks.c     |   2 +-
 modules/type/dag/dap_chain_cs_dag.c           |  53 +++----
 21 files changed, 196 insertions(+), 516 deletions(-)

diff --git a/dap-sdk/core/include/dap_math_ops.h b/dap-sdk/core/include/dap_math_ops.h
index 745fde28fd..64882893b1 100755
--- a/dap-sdk/core/include/dap_math_ops.h
+++ b/dap-sdk/core/include/dap_math_ops.h
@@ -51,40 +51,21 @@ typedef int128_t _dap_int128_t;
 typedef struct uint256_t {
     uint128_t hi;
     uint128_t lo;
-
-    } uint256_t;
+} uint256_t;
 
 typedef struct uint512_t {
     uint256_t hi;
     uint256_t lo;
-
-    } uint512_t;
+} uint512_t;
 
 #endif //defined(__GNUC__) || defined (__clang__)
 
 ////////////////////////////////////////////////////////////////////////////////////////////////
 
 #ifndef DAP_GLOBAL_IS_INT128
-
-// uint128_t dap_uint128_substract(uint128_t a, uint128_t b);
-// uint128_t dap_uint128_add(uint128_t a, uint128_t b);
-// bool dap_uint128_check_equal(uint128_t a, uint128_t b);
-const  uint128_t two_power_64={ .hi = 1, .lo = 0};
-const  uint128_t lo_64={ .hi = 0, .lo = 0xffffffffffffffff};
-const  uint128_t hi_64={ .hi = 0xffffffffffffffff, .lo = 0};
-// const  uint128_t zero_128={.hi=0,.lo=0};
-// #define zero_128 ((uint128_t){.hi=0,.lo=0})
-
 #define uint128_0 ((uint128_t){.hi=0,.lo=0})
 #define uint128_1 ((uint128_t){.hi=0,.lo=1})
-
-// const uint64_t lo_32=0xffffffff;
-// const uint64_t hi_32=0xffffffff00000000;
-// const uint64_t ones_64=0xffffffffffffffff;
-
 #else // DAP_GLOBAL_IS_INT128
-
-// #define zero_128 ((uint128_t)0)
 #define uint128_0 0ULL
 #define uint128_1 1ULL
 
@@ -92,7 +73,7 @@ const  uint128_t hi_64={ .hi = 0xffffffffffffffff, .lo = 0};
 
 // const uint256_t zero_256={.hi=zero_128,.lo=zero_128};
 // #define zero_256 ((uint256_t){.hi=zero_128,.lo=zero_128})
-#define uint256_0 {.hi=uint128_0,.lo=uint128_0}
+#define uint256_0 ((uint256_t){.hi=uint128_0,.lo=uint128_0})
 #define uint256_1 ((uint256_t){.hi=uint128_0,.lo=uint128_1})
 #define uint512_0 ((uint512_t){.hi=uint256_0,.lo=uint256_0})
 #define lo_32 ((uint64_t)0xffffffff)
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index e069b15142..0069bb0ba9 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -295,7 +295,7 @@ void dap_chain_ledger_load_end(dap_ledger_t *a_ledger)
  * @param a_token
  * @return
  */
-int dap_chain_ledger_token_decl_add_check(dap_ledger_t * a_ledger,  dap_chain_datum_token_t *a_token)
+int dap_chain_ledger_token_decl_add_check(dap_ledger_t *a_ledger, byte_t *a_token)
 {
     if ( !a_ledger){
         if(s_debug_more)
@@ -305,7 +305,7 @@ int dap_chain_ledger_token_decl_add_check(dap_ledger_t * a_ledger,  dap_chain_da
 
     dap_chain_ledger_token_item_t * l_token_item;
     pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock);
-    HASH_FIND_STR(PVT(a_ledger)->tokens,a_token->ticker,l_token_item);
+    HASH_FIND_STR(PVT(a_ledger)->tokens, a_token->ticker, l_token_item);
     pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock);
     if ( l_token_item != NULL ){
         log_it(L_WARNING,"Duplicate token declaration for ticker '%s' ", a_token->ticker);
@@ -341,7 +341,7 @@ int dap_chain_ledger_token_ticker_check(dap_ledger_t * a_ledger, const char *a_t
  * @param a_token_size
  * @return
  */
-int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,  dap_chain_datum_token_t *a_token, size_t a_token_size)
+int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_size)
 {
     if ( !a_ledger){
         if(s_debug_more)
@@ -897,7 +897,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite
     return 0;
 }
 
-int dap_chain_ledger_token_load(dap_ledger_t *a_ledger,  dap_chain_datum_token_t *a_token, size_t a_token_size)
+int dap_chain_ledger_token_load(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_size)
 {
     if (PVT(a_ledger)->last_ticker.found) {
         return dap_chain_ledger_token_add(a_ledger, a_token, a_token_size);
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 40899a1088..b527a10157 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -47,11 +47,13 @@ typedef struct dap_chain_atom_iter{
     dap_chain_t * chain;
     dap_chain_atom_ptr_t cur;
     dap_chain_hash_fast_t *cur_hash;
+    dap_chain_cell_id_t cell_id;
     size_t cur_size;
     void * cur_item;
     void * _inheritor;
 } dap_chain_atom_iter_t;
 
+
 typedef enum dap_chain_atom_verify_res{
     ATOM_ACCEPT=0,
     ATOM_PASS=1,
@@ -70,7 +72,7 @@ typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_form_treshold_t)(dap_chai
 typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_verify_t)(dap_chain_t *, dap_chain_atom_ptr_t , size_t);
 typedef size_t (*dap_chain_callback_atom_get_hdr_size_t)(void);
 
-typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t * );
+typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t *, dap_chain_cell_id_t);
 typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_from_t)(dap_chain_t * ,dap_chain_atom_ptr_t, size_t);
 typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_first_t)(dap_chain_atom_iter_t * , size_t*);
 typedef dap_chain_datum_t** (*dap_chain_callback_atom_get_datum_t)(dap_chain_atom_ptr_t, size_t, size_t * );
@@ -95,9 +97,6 @@ typedef enum dap_chain_type
     CHAIN_TYPE_TX,
     CHAIN_TYPE_CA,
     CHAIN_TYPE_LAST
-    // CHAIN_TYPE_256_TOKEN, // 256
-    // CHAIN_TYPE_256_EMISSION, // 256
-    // CHAIN_TYPE_256_TX, // 256
 } dap_chain_type_t;
 
 typedef struct dap_chain{
diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h
index d1d22d3efc..543a4d7f5d 100644
--- a/modules/chain/include/dap_chain_ledger.h
+++ b/modules/chain/include/dap_chain_ledger.h
@@ -122,9 +122,9 @@ int dap_chain_ledger_token_ticker_check(dap_ledger_t * a_ledger, const char *a_t
  *
  */
 
-int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token, size_t a_token_size);
-int dap_chain_ledger_token_load(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token, size_t a_token_size);
-int dap_chain_ledger_token_decl_add_check(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token);
+int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_size);
+int dap_chain_ledger_token_load(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_size);
+int dap_chain_ledger_token_decl_add_check(dap_ledger_t *a_ledger, byte_t *a_token);
 dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger);
 /**
  * Add token emission datum
@@ -184,10 +184,10 @@ bool dap_chain_ledger_tx_hash_is_used_out_item(dap_ledger_t *a_ledger, dap_chain
  * Calculate balance of addr
  *
  */
-uint128_t dap_chain_ledger_calc_balance(dap_ledger_t *a_ledger, const dap_chain_addr_t *a_addr,
+uint256_t dap_chain_ledger_calc_balance(dap_ledger_t *a_ledger, const dap_chain_addr_t *a_addr,
         const char *a_token_ticker);
 
-uint128_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_chain_addr_t *a_addr,
+uint256_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_chain_addr_t *a_addr,
             const char *a_token_ticker);
 
 /**
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 85bcc06fe1..45185ab838 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -288,7 +288,7 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a
     dap_chain_t * l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id);
     assert(l_chain);
     //pthread_rwlock_rdlock(&l_chain->atoms_rwlock);
-    l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain);
+    l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_sync_request->request_hdr.cell_id);
     size_t l_first_size = 0;
     dap_chain_atom_ptr_t l_iter = l_chain->callback_atom_iter_get_first(l_sync_request->chain.request_atom_iter, &l_first_size);
     if (l_iter && l_first_size) {
@@ -308,6 +308,7 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a
     return true;
 }
 
+
 /**
  * @brief s_sync_out_gdb_first_gdb_worker_callback
  * @param a_worker
@@ -1035,7 +1036,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                 if(s_debug_more)
                     log_it(L_INFO, "Out: UPDATE_CHAINS_START pkt: net %s chain %s cell 0x%016"DAP_UINT64_FORMAT_X, l_chain->name,
                                         l_chain->net_name, l_chain_pkt->hdr.cell_id.uint64);
-                l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain);
+                l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_chain_pkt->hdr.cell_id);
                 l_chain->callback_atom_iter_get_first(l_ch_chain->request_atom_iter, NULL);
                 memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_hdr_t));
                 dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START,
diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c
index d10e19b974..19513bcc0b 100644
--- a/modules/common/dap_chain_common.c
+++ b/modules/common/dap_chain_common.c
@@ -58,43 +58,6 @@ size_t dap_chain_hash_slow_to_str( dap_chain_hash_slow_t *a_hash, char *a_str, s
     return strlen(a_str);
 }
 
-/**
- * @brief dap_chain_hash_fast_to_str
- * @param a_hash
- * @param a_str
- * @param a_str_max
- * @return
- */
-#if 0
-size_t dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash, char *a_str, size_t a_str_max )
-{
-    const size_t c_hash_str_size = sizeof(*a_hash) * 2 + 1 /*trailing zero*/+ 2 /* heading 0x */;
-
-    if ( a_str_max < c_hash_str_size ) {
-      log_it( L_ERROR, "String for hash too small, need %u but have only %u", c_hash_str_size, a_str_max );
-    }
-
-//    size_t i;
-    // faster conversion to string
-
-    dap_snprintf( a_str, 3, "0x" );
-
-    size_t l_ret = dap_bin2hex(a_str + 2, a_hash->raw, sizeof(a_hash->raw));
-
-    //for(i = 0; i < sizeof(a_hash->raw); ++i)
-    //    dap_snprintf(a_str + i * 2 + 2, 3, "%02x", (a_hash->raw[i]));
-
-    a_str[c_hash_str_size - 1] = '\0';
-
-    if(!l_ret)
-        return 0;
-
-    return c_hash_str_size - 1; //strlen(a_str);
-}
-#endif
-
-
-
 /**
  * @brief dap_chain_addr_to_str
  * @param a_addr
@@ -146,38 +109,10 @@ dap_chain_net_id_t dap_chain_net_id_from_str(const char * a_net_str)
     log_it(L_DEBUG, "net id: %s", a_net_str);
 
     a_net_str += 2;
-    /*size_t l_net_str_len = strlen( a_net_str);
-    if (l_net_str_len >2){
-        a_net_str+=2;
-        l_net_str_len-=2;
-        if (l_net_str_len == sizeof (l_ret)/2 ){
-            size_t l_pos =0;
-            char l_byte[3];
-            while(l_net_str_len){
-                // Copy two characters for bytes
-                memcpy(l_byte,a_net_str,2);
-                l_byte[2]='\0';
-                // Read byte chars
-                if ( sscanf(l_byte,"%02hhx",&l_ret.raw[l_pos] ) != 1)
-                    if( sscanf(l_byte,"%02hhX",&l_ret.raw[l_pos] ) ==1 )
-                        break;
-
-                // Update pos
-                l_pos++;
-                // Reduce in two steps to not to break if input will have bad input
-                l_net_str_len-=1;
-                if(l_net_str_len)
-                    l_net_str_len-=1;
-            }
-        }else
-            log_it(L_WARNING,"Wrong input string \"%s\" not recognized as network id", a_net_str);
-    } */
-
-    if (!(l_ret.uint64 = strtol(a_net_str, NULL, 0))) {
+    if (!(l_ret.uint64 = strtoll(a_net_str, NULL, 0))) {
         log_it(L_ERROR, "Wrong input string \"%s\" not recognized as network id", a_net_str);
         return l_ret;
     }
-    //dap_stpcpy(&l_ret.raw, a_net_str);
     return l_ret;
 }
 
@@ -297,7 +232,7 @@ uint64_t dap_chain_uint128_to(uint128_t a_from)
 #endif
 }
 
-char *dap_chain_balance_print(uint128_t a_balance)
+char *dap_chain_balance_print128(uint128_t a_balance)
 {
     char *l_buf = DAP_NEW_Z_SIZE(char, DATOSHI_POW + 3);
     int l_pos = 0;
@@ -334,9 +269,15 @@ char *dap_chain_balance_print(uint128_t a_balance)
     return l_buf;
 }
 
-char *dap_chain_balance_to_coins(uint128_t a_balance)
+char *dap_chain_balance_print(uint256_t a_balance)
+{
+    return dap_chain_balance_print128(a_balance.lo);
+}
+
+
+char *dap_chain_balance_to_coins128(uint128_t a_balance)
 {
-    char *l_buf = dap_chain_balance_print(a_balance);
+    char *l_buf = dap_chain_balance_print128(a_balance);
     int l_strlen = strlen(l_buf);
     int l_pos;
     if (l_strlen > DATOSHI_DEGREE) {
@@ -354,6 +295,11 @@ char *dap_chain_balance_to_coins(uint128_t a_balance)
     return l_buf;
 }
 
+char *dap_chain_balance_to_coins(uint256_t a_balance)
+{
+    return dap_chain_balance_to_coins128(a_balance.lo);
+}
+
 const union { uint64_t u64[2]; uint32_t u32[4]; } c_pow10[DATOSHI_POW + 1] = {
     { .u64 = {0,                         1ULL} },                          // 0
     { .u64 = {0,                         10ULL} },                         // 1
@@ -396,7 +342,7 @@ const union { uint64_t u64[2]; uint32_t u32[4]; } c_pow10[DATOSHI_POW + 1] = {
     { .u64 = {5421010862427522170ULL,    687399551400673280ULL} }          // 38
 };
 
-uint128_t dap_chain_balance_scan(char *a_balance)
+uint128_t dap_chain_balance_scan128(char *a_balance)
 {
     int l_strlen = strlen(a_balance);
 #ifdef DAP_GLOBAL_IS_INT128
@@ -457,7 +403,13 @@ uint128_t dap_chain_balance_scan(char *a_balance)
     return l_ret;
 }
 
-uint128_t dap_chain_coins_to_balance(char *a_coins)
+uint256_t dap_chain_balance_scan(char *a_balance)
+{
+    return GET_256_FROM_128(dap_chain_balance_scan128(a_balance));
+}
+
+
+uint128_t dap_chain_coins_to_balance128(char *a_coins)
 {
 #ifdef DAP_GLOBAL_IS_INT128
     uint128_t l_ret = 0, l_nul = 0;
@@ -497,8 +449,12 @@ uint128_t dap_chain_coins_to_balance(char *a_coins)
         l_buf[l_pos + i] = '0';
     }
     l_buf[l_pos + i] = '\0';
-    l_ret = dap_chain_balance_scan(l_buf);
+    l_ret = dap_chain_balance_scan128(l_buf);
     DAP_DELETE(l_buf);
     return l_ret;
 }
 
+uint256_t dap_chain_coins_to_balance(char *a_coins)
+{
+    return GET_256_FROM_128(dap_chain_coins_to_balance128(a_coins));
+}
diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c
index dd1da5ab30..446d3adcce 100644
--- a/modules/common/dap_chain_datum_token.c
+++ b/modules/common/dap_chain_datum_token.c
@@ -117,7 +117,8 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(byte_t *a_token_serial, size
         memcpy(l_token_old, a_token_serial, (*a_token_size));
         size_t l_token_size = (*a_token_size) - sizeof(*l_token_old) + sizeof(dap_chain_datum_token_t);
         dap_chain_datum_token_t * l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size);
-        strncpy(l_token->ticker, l_token_old->ticker, sizeof(l_token_old->ticker) );
+        memcpy(l_token->ticker, l_token_old->ticker, sizeof(l_token_old->ticker));
+        l_token->ticker[sizeof(l_token_old->ticker) - 1] = '\0';
         size_t l_token_tsd_size = (*a_token_size) - sizeof(*l_token_old);
         memcpy(l_token->data_n_tsd, l_token_old->data_n_tsd, l_token_tsd_size);
 
diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c
index c7ff6f97ee..e9a0001fb1 100644
--- a/modules/common/dap_chain_datum_tx.c
+++ b/modules/common/dap_chain_datum_tx.c
@@ -147,20 +147,9 @@ int dap_chain_datum_tx_add_in_cond_item(dap_chain_datum_tx_t **a_tx, dap_chain_h
  *
  * return 1 Ok, -1 Error
  */
-int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint64_t a_value)
+int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value)
 {
-    dap_chain_tx_out_t *l_tx_out = dap_chain_datum_tx_item_out_create(a_addr, a_value);
-    if(l_tx_out) {
-        dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out);
-        DAP_DELETE(l_tx_out);
-        return 1;
-    }
-    return -1;
-}
-
-int dap_chain_datum_256_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value)
-{
-    dap_chain_256_tx_out_t *l_tx_out = dap_chain_datum_tx_item_256_out_create(a_addr, a_value);
+    dap_chain_256_tx_out_t *l_tx_out = dap_chain_datum_tx_item_out_create(a_addr, a_value);
     if(l_tx_out) {
         dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out);
         DAP_DELETE(l_tx_out);
@@ -174,9 +163,9 @@ int dap_chain_datum_256_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_c
  *
  * return 1 Ok, -1 Error
  */
-int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint64_t a_value, const char *a_token)
+int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
 {
-    dap_chain_tx_out_ext_t *l_tx_out = dap_chain_datum_tx_item_out_ext_create(a_addr, a_value, a_token);
+    dap_chain_256_tx_out_ext_t *l_tx_out = dap_chain_datum_tx_item_out_ext_create(a_addr, a_value, a_token);
     if(l_tx_out) {
         dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out);
         DAP_DELETE(l_tx_out);
@@ -185,38 +174,15 @@ int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_c
     return -1;
 }
 
-int dap_chain_datum_256_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
-{
-    dap_chain_256_tx_out_ext_t *l_tx_out = dap_chain_datum_tx_item_256_out_ext_create(a_addr, a_value, a_token);
-    if(l_tx_out) {
-        dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out);
-        DAP_DELETE(l_tx_out);
-        return 1;
-    }
-    return -1;
-}
 /**
  * Create 'out_cond' item and insert to transaction
  *
  * return 1 Ok, -1 Error
  */
 int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size)
-{
-    dap_chain_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_pay(
-                a_key, a_srv_uid,a_value, a_value_max_per_unit, a_unit, a_cond, a_cond_size );
-    if(l_tx_out) {
-        dap_chain_datum_tx_add_item(a_tx, (const uint8_t *) l_tx_out);
-        DAP_DELETE(l_tx_out);
-        return 1;
-    }
-    return -1;
-}
-
-int dap_chain_datum_256_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
         uint256_t a_value, uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size)
 {
-    dap_chain_256_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_256_out_cond_create_srv_pay(
+    dap_chain_256_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_pay(
                 a_key, a_srv_uid,a_value, a_value_max_per_unit, a_unit, a_cond, a_cond_size );
     if(l_tx_out) {
         dap_chain_datum_tx_add_item(a_tx, (const uint8_t *) l_tx_out);
diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c
index e723ece1e7..a67bd64bea 100644
--- a/modules/common/dap_chain_datum_tx_items.c
+++ b/modules/common/dap_chain_datum_tx_items.c
@@ -143,7 +143,7 @@ size_t dap_chain_datum_item_tx_get_size(const uint8_t *a_item)
     case TX_ITEM_TYPE_256_OUT: // 256
         size = dap_chain_256_tx_out_get_size((const dap_chain_256_tx_out_t*) a_item);
         break;
-    case TX_ITEM_TYPE_OUT_EXT:
+    case TX_ITEM_TYPE_OUT_EXT: // Exchange transaction outputs
         size = dap_chain_tx_out_ext_get_size((const dap_chain_tx_out_ext_t*) a_item);
         break;
     case TX_ITEM_TYPE_256_OUT_EXT: // 256
@@ -232,18 +232,7 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint64_t a_value)
-{
-    if(!a_addr)
-        return NULL;
-    dap_chain_tx_out_t *l_item = DAP_NEW_Z(dap_chain_tx_out_t);
-    l_item->header.type = TX_ITEM_TYPE_OUT;
-    l_item->header.value = a_value;
-    memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t));
-    return l_item;
-}
-
-dap_chain_256_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value)
+dap_chain_256_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value)
 {
     if(!a_addr)
         return NULL;
@@ -254,20 +243,7 @@ dap_chain_256_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_a
     return l_item;
 }
 
-dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint64_t a_value, const char *a_token)
-{
-    if (!a_addr || !a_token)
-        return NULL;
-    dap_chain_tx_out_ext_t *l_item = DAP_NEW_Z(dap_chain_tx_out_ext_t);
-    l_item->header.type = TX_ITEM_TYPE_OUT_EXT;
-    l_item->header.value = a_value;
-    memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t));
-    strcpy(l_item->token, a_token);
-    return l_item;
-}
-
-//256
-dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_256_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
+dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
 {
     if (!a_addr || !a_token)
         return NULL;
@@ -284,36 +260,10 @@ dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_256_out_ext_create(const dap
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint64_t a_value,uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
-                                                                 const void *a_params, size_t a_params_size)
-{
-    if(!a_key || !a_params)
-        return NULL;
-    size_t l_pub_key_size = 0;
-    uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size);
-
-
-    dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size);
-    if(l_item == NULL)
-        return NULL;
-
-    l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
-    l_item->header.value = a_value;
-    l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY; // By default creatre cond for service pay. Rework with smth more flexible
-    l_item->subtype.srv_pay.srv_uid = a_srv_uid;
-    l_item->subtype.srv_pay.unit = a_unit;
-    l_item->subtype.srv_pay.unit_price_max_datoshi = a_value_max_per_unit;
-    dap_hash_fast( l_pub_key, l_pub_key_size, & l_item->subtype.srv_pay.pkey_hash);
-    l_item->params_size = (uint32_t)a_params_size;
-    memcpy(l_item->params, a_params, a_params_size);
-    return l_item;
-}
-
-// 256
-dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint256_t a_value,uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
-                                                                 const void *a_params, size_t a_params_size)
+dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
+                                                                             uint256_t a_value, uint256_t a_value_max_per_unit,
+                                                                             dap_chain_net_srv_price_unit_uid_t a_unit,
+                                                                             const void *a_params, size_t a_params_size)
 {
     if(!a_key || !a_params)
         return NULL;
@@ -337,30 +287,7 @@ dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_pay
     return l_item;
 }
 
-
-dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_net_id,
-                                                                             const char *a_token, uint64_t a_value,
-                                                                             const void *a_params, uint32_t a_params_size)
-{
-    if (!a_token) {
-        return NULL;
-    }
-    dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size);
-    l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
-    l_item->header.value = a_value;
-    l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE;
-    l_item->subtype.srv_xchange.srv_uid = a_srv_uid;
-    l_item->subtype.srv_xchange.net_id = a_net_id;
-    strcpy(l_item->subtype.srv_xchange.token, a_token);
-    l_item->params_size = a_params_size;
-    if (a_params_size) {
-        memcpy(l_item->params, a_params, a_params_size);
-    }
-    return l_item;
-}
-
-// 256
-dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_256_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_net_id,
+dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_net_id,
                                                                              const char *a_token, uint256_t a_value,
                                                                              const void *a_params, uint32_t a_params_size)
 {
@@ -381,27 +308,7 @@ dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_256_out_cond_create_srv_xch
     return l_item;
 }
 
-dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value, long double a_fee_value,
-                                                                           dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
-                                                                           const void *a_params, uint32_t a_params_size)
-{
-    dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size);
-    l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
-    l_item->header.value = a_value;
-    l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE;
-    l_item->subtype.srv_stake.srv_uid = a_srv_uid;
-    l_item->subtype.srv_stake.fee_value = a_fee_value;
-    memcpy(&l_item->subtype.srv_stake.fee_addr, a_fee_addr, sizeof(dap_chain_addr_t));
-    memcpy(&l_item->subtype.srv_stake.hldr_addr, a_hldr_addr, sizeof(dap_chain_addr_t));
-    l_item->params_size = a_params_size;
-    if (a_params_size) {
-        memcpy(l_item->params, a_params, a_params_size);
-    }
-    return l_item;
-}
-
-// 256
-dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_256_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value,
+dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value,
                                                                            dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
                                                                            const void *a_params, uint32_t a_params_size)
 {
diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h
index 35804fe06b..15697bb114 100644
--- a/modules/common/include/dap_chain_common.h
+++ b/modules/common/include/dap_chain_common.h
@@ -202,16 +202,12 @@ typedef enum dap_chain_tx_item_type {
     TX_ITEM_TYPE_TOKEN = 0x40,
     TX_ITEM_TYPE_TOKEN_EXT = 0x41,
 
-    TX_ITEM_TYPE_256_TOKEN = 0x42,
-    TX_ITEM_TYPE_256_TOKEN_EXT = 0x43,
-
     TX_ITEM_TYPE_IN_COND = 0x50, /// @brief  Transaction: conditon inputs
 
     TX_ITEM_TYPE_OUT_COND = 0x60, /// @brief  Transaction: conditon outputs
     TX_ITEM_TYPE_256_OUT_COND = 0x61, // 256
 
     TX_ITEM_TYPE_RECEIPT = 0x70,
-    TX_ITEM_TYPE_256_RECEIPT = 0x71,
 
     TX_ITEM_TYPE_OUT_ALL = 0xfe,
     TX_ITEM_TYPE_ANY = 0xff
@@ -228,14 +224,6 @@ typedef struct dap_chain_receipt{
     };
 } dap_chain_receipt_info_t;
 
-// 256
-// typedef struct dap_chain_256_receipt{
-//     dap_chain_net_srv_uid_t srv_uid; // Service UID
-//     dap_chain_net_srv_price_unit_uid_t units_type;
-//     uint64_t units; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
-//     uint256_t value_datoshi; // Receipt value
-// } dap_chain_256_receipt_info_t;
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -265,12 +253,6 @@ DAP_STATIC_INLINE uint64_t dap_chain_coins_to_datoshi(long double a_count)
 
 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}};
-//     return l_ret;
-// #endif
     uint128_t l_ret = uint128_0;
     ADD_64_INTO_128(a_from, &l_ret );
     return l_ret;
@@ -293,13 +275,10 @@ uint64_t dap_chain_uint128_to(uint128_t a_from);
 // 256
 uint64_t dap_chain_uint256_to(uint256_t a_from);
 
-char *dap_chain_u256tostr(uint256_t v);
-
-
-char *dap_chain_balance_print(uint128_t a_balance);
-char *dap_chain_balance_to_coins(uint128_t a_balance);
-uint128_t dap_chain_balance_scan(char *a_balance);
-uint128_t dap_chain_coins_to_balance(char *a_coins);
+char *dap_chain_balance_print(uint256_t a_balance);
+char *dap_chain_balance_to_coins(uint256_t a_balance);
+uint256_t dap_chain_balance_scan(char *a_balance);
+uint256_t dap_chain_coins_to_balance(char *a_coins);
 
 /**
  * @brief dap_chain_hash_to_str
diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h
index f0ec919564..88f8dc13dd 100644
--- a/modules/common/include/dap_chain_datum.h
+++ b/modules/common/include/dap_chain_datum.h
@@ -37,7 +37,6 @@
 
 /// Transaction header section
 #define DAP_CHAIN_DATUM_TX                  0x0100
-#define DAP_CHAIN_DATUM_256_TX              0x0101 // 256
 
 /// Transaction request section
 #define DAP_CHAIN_DATUM_TX_REQUEST          0x0300
@@ -61,7 +60,6 @@
 #define DAP_CHAIN_DATUM_TOKEN_DECL           0xf000
 #define DAP_CHAIN_DATUM_256_TOKEN_DECL       0xf001 // 256
 #define DAP_CHAIN_DATUM_TOKEN_EMISSION       0xf100
-#define DAP_CHAIN_DATUM_256_TOKEN_EMISSION   0xf101 // 256
 #define DAP_CHAIN_DATUM_TOKEN_DISMISSAL      0xf200
 
 #define DAP_CHAIN_DATUM_CUSTOM               0xffff
diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h
index 41a778c3cd..efdb862da7 100644
--- a/modules/common/include/dap_chain_datum_token.h
+++ b/modules/common/include/dap_chain_datum_token.h
@@ -264,10 +264,9 @@ typedef struct dap_chain_datum_token_emission{
         dap_chain_addr_t address; // Emission holder's address
         union {
             uint64_t value;
-            uint256_t value256;
+            uint256_t value_256;
         };
         uint8_t nonce[DAP_CHAIN_DATUM_NONCE_SIZE];
-        // bool type_256; // emission 256
     } DAP_ALIGN_PACKED hdr;
     union {
         struct {
diff --git a/modules/common/include/dap_chain_datum_tx.h b/modules/common/include/dap_chain_datum_tx.h
index 54885c4863..e36f33ac1c 100644
--- a/modules/common/include/dap_chain_datum_tx.h
+++ b/modules/common/include/dap_chain_datum_tx.h
@@ -104,7 +104,7 @@ int dap_chain_datum_tx_add_in_cond_item(dap_chain_datum_tx_t **a_tx, dap_chain_h
  *
  * return 1 Ok, -1 Error
  */
-int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint64_t a_value);
+int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value);
 
 /**
  * Create 'out'_ext item and insert to transaction
@@ -112,7 +112,7 @@ int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain
  * return 1 Ok, -1 Error
  */
 int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr,
-                                        uint64_t a_value, const char *a_token);
+                                        uint256_t a_value, const char *a_token);
 
 /**
  * Create 'out_cond' item and insert to transaction
@@ -120,7 +120,7 @@ int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_c
  * return 1 Ok, -1 Error
  */
 int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size);
+        uint256_t a_value, uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size);
 
 /**
 * Sign a transaction (Create sign item and insert to transaction)
diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h
index a06fb55939..e2d7da7987 100644
--- a/modules/common/include/dap_chain_datum_tx_items.h
+++ b/modules/common/include/dap_chain_datum_tx_items.h
@@ -53,21 +53,21 @@ DAP_STATIC_INLINE const char * dap_chain_datum_tx_item_type_to_str(dap_chain_tx_
     switch(a_item_type){
         case TX_ITEM_TYPE_IN: return "TX_ITEM_TYPE_IN";
         case TX_ITEM_TYPE_OUT: return "TX_ITEM_TYPE_OUT";
+        case TX_ITEM_TYPE_256_OUT: return "TX_ITEM_TYPE_256_OUT"; // 256
         case TX_ITEM_TYPE_OUT_EXT: return "TX_ITEM_TYPE_OUT_EXT";
+        case TX_ITEM_TYPE_256_OUT_EXT: return "TX_ITEM_TYPE_256_OUT_EXT"; // 256
         case TX_ITEM_TYPE_PKEY: return "TX_ITEM_TYPE_PKEY";
         case TX_ITEM_TYPE_SIG: return "TX_ITEM_TYPE_SIG";
         case TX_ITEM_TYPE_TOKEN: return "TX_ITEM_TYPE_TOKEN";
-        case TX_ITEM_TYPE_256_TOKEN: return "TX_ITEM_TYPE_256_TOKEN"; // 256
         case TX_ITEM_TYPE_TOKEN_EXT: return "TX_ITEM_TYPE_TOKEN_EXT";
-        case TX_ITEM_TYPE_256_TOKEN_EXT: return "TX_ITEM_TYPE_256_TOKEN_EXT"; // 256
         case TX_ITEM_TYPE_IN_COND: return "TX_ITEM_TYPE_IN_COND";
         case TX_ITEM_TYPE_OUT_COND: return "TX_ITEM_TYPE_OUT_COND";
+        case TX_ITEM_TYPE_256_OUT_COND: return "TX_ITEM_TYPE_256_OUT_COND"; // 256
         case TX_ITEM_TYPE_RECEIPT: return "TX_ITEM_TYPE_RECEIPT";
         case TX_ITEM_TYPE_OUT_ALL: return "TX_ITEM_TYPE_OUT_ALL";
         case TX_ITEM_TYPE_ANY: return "TX_ITEM_TYPE_ANY";
         default: return "UNDEFINED";
     }
-
 }
 
 /**
@@ -99,70 +99,53 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint64_t a_value);
-
-// 256
-dap_chain_256_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value);
+dap_chain_256_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value);
 
 /**
  * Create item dap_chain_tx_out_ext_t
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint64_t a_value, const char *a_token);
-
-// 256
-dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_256_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token);
+dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token);
 
 /**
  * Create item dap_chain_tx_out_cond_t
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
-                                                                 const void *a_cond, size_t a_cond_size);
-// 256
-dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
-        uint256_t a_value, uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
-                                                                 const void *a_cond, size_t a_cond_size);
+dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
+                                                                             uint256_t a_value, uint256_t a_value_max_per_unit,
+                                                                             dap_chain_net_srv_price_unit_uid_t a_unit,
+                                                                             const void *a_params, size_t a_params_size);
 /**
  * Create item dap_chain_tx_out_cond_t for eXchange service
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid,
-                                                                             dap_chain_net_id_t a_net_id, const char *a_token, uint64_t a_value,
-                                                                             const void *a_params, uint32_t a_params_size);
-//256
-dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid,
-                                                                             dap_chain_net_id_t a_net_id, const char *a_token, uint256_t a_value,
-                                                                             const void *a_params, uint32_t a_params_size);
+dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid,
+                                                                                 dap_chain_net_id_t a_net_id, const char *a_token, uint256_t a_value,
+                                                                                 const void *a_params, uint32_t a_params_size);
 /**
  * Create item dap_chain_tx_out_cond_t for stake service
  *
  * return item, NULL Error
  */
-dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value, long double a_fee_value,
-                                                                        dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
-                                                                        const void *a_params, uint32_t a_params_size);
-// 256
-dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_256_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value,
-                                                                        dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
-                                                                        const void *a_params, uint32_t a_params_size);
+dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value,
+                                                                               dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr,
+                                                                               const void *a_params, uint32_t a_params_size);
 /**
  * Create item dap_chain_tx_sig_t
  *
  * return item, NULL Error
  */
-dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size);
+dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size);
 
 /**
  * Get sign from sign item
  *
  * return sign, NULL Error
  */
-dap_sign_t* dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig);
+dap_sign_t *dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig);
 
 /**
  * Get item from transaction
diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c
index a1c2a0614b..b797bb2623 100644
--- a/modules/consensus/none/dap_chain_cs_none.c
+++ b/modules/consensus/none/dap_chain_cs_none.c
@@ -70,7 +70,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
 static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); //    Verify new event in gdb
 static size_t s_chain_callback_atom_get_static_hdr_size(void); //    Get gdb event header size
 
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain);
+static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id);
 static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain,
         dap_chain_atom_ptr_t a, size_t a_atom_size);
 
@@ -346,8 +346,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
     switch (l_datum->header.type_id) {
         case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256
         case DAP_CHAIN_DATUM_TOKEN_DECL:{
-            dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
-            if (dap_chain_ledger_token_load(a_chain->ledger,l_token, l_datum->header.data_size))
+            if (dap_chain_ledger_token_load(a_chain->ledger, l_datum->data, l_datum->header.data_size))
                 return ATOM_REJECT;
         }break;
         case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
@@ -417,21 +416,21 @@ static size_t s_chain_callback_atom_get_static_hdr_size()
  * @param a_chain dap_chain_t a_chain
  * @return dap_chain_atom_iter_t* 
  */
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain)
+static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id)
 {
     dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
     l_iter->chain = a_chain;
-    l_iter->cur_hash = DAP_NEW(dap_chain_hash_fast_t);
+    l_iter->cell_id = a_cell_id;
     return l_iter;
 }
 
 /**
  * @brief create atom object (dap_chain_atom_iter_t)
- * 
+ *
  * @param a_chain chain object
  * @param a_atom pointer to atom
  * @param a_atom_size size of atom
- * @return dap_chain_atom_iter_t* 
+ * @return dap_chain_atom_iter_t*
  */
 static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain,
         dap_chain_atom_ptr_t a_atom, size_t a_atom_size)
@@ -461,11 +460,11 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite
 
 /**
  * @brief get dap_chain_atom_ptr_t object form database by hash
- * @details Searchs by datum data hash, not for datum's hash itself 
- * @param a_atom_iter dap_chain_atom_iter_t atom object 
+ * @details Searchs by datum data hash, not for datum's hash itself
+ * @param a_atom_iter dap_chain_atom_iter_t atom object
  * @param a_atom_hash dap_chain_hash_fast_t atom hash
  * @param a_atom_size size of atom object
- * @return dap_chain_atom_ptr_t 
+ * @return dap_chain_atom_ptr_t
  */
 static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter,
         dap_chain_hash_fast_t * a_atom_hash, size_t *a_atom_size)
@@ -482,10 +481,10 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at
 
 /**
  * @brief Get the first dag event from database
- * 
- * @param a_atom_iter ap_chain_atom_iter_t object 
+ *
+ * @param a_atom_iter ap_chain_atom_iter_t object
  * @param a_atom_size a_atom_size atom size
- * @return dap_chain_atom_ptr_t 
+ * @return dap_chain_atom_ptr_t
  */
 static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size)
 {
@@ -517,10 +516,10 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
 
 /**
  * @brief Get the next dag event from database
- * 
+ *
  * @param a_atom_iter dap_chain_atom_iter_t
  * @param a_atom_size size_t a_atom_size
- * @return dap_chain_atom_ptr_t 
+ * @return dap_chain_atom_ptr_t
  */
 static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t *a_atom_iter, size_t *a_atom_size)
 {
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 99e2c0075b..b5907395a3 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -2597,20 +2597,13 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t
         return -11;
 
     switch ( a_datum->header.type_id) {
-        case DAP_CHAIN_DATUM_256_TX: // 256
         case DAP_CHAIN_DATUM_TX:
-            return dap_chain_ledger_tx_add_check( a_net->pub.ledger,
-                    (dap_chain_datum_tx_t*) a_datum->data );
-
+            return dap_chain_ledger_tx_add_check( a_net->pub.ledger, (dap_chain_datum_tx_t*)a_datum->data );
         case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256
         case DAP_CHAIN_DATUM_TOKEN_DECL:
-            return dap_chain_ledger_token_decl_add_check( a_net->pub.ledger,
-                    (dap_chain_datum_token_t*) a_datum->data );
-
-        case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256
-        case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
+            return dap_chain_ledger_token_decl_add_check( a_net->pub.ledger, a_datum->data );
+        case DAP_CHAIN_DATUM_TOKEN_EMISSION:
             return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger, a_datum->data, a_datum->header.data_size );
-        }
         default: return 0;
     }
 }
@@ -2624,7 +2617,7 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t
  * @param a_str_out
  * @param a_datum
  */
-void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum, const char *a_hash_out_type)
+void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type)
 {
     if( a_datum == NULL){
         dap_string_append_printf(a_str_out,"==Datum is NULL\n");
@@ -2633,8 +2626,8 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
     switch (a_datum->header.type_id){
         case DAP_CHAIN_DATUM_256_TOKEN_DECL:
         case DAP_CHAIN_DATUM_TOKEN_DECL:{
-            dap_chain_datum_token_t * l_token = (dap_chain_datum_token_t*) a_datum->data;
             size_t l_token_size = a_datum->header.data_size;
+            dap_chain_datum_token_t * l_token = dap_chain_datum_token_read(a_datum->data, &l_token_size);
             if(l_token_size < sizeof(dap_chain_datum_token_t)){
                 dap_string_append_printf(a_str_out,"==Datum has incorrect size. Only %zu, while at least %zu is expected\n",
                                          l_token_size, sizeof(dap_chain_datum_token_t));
@@ -2653,7 +2646,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                         dap_string_append_printf(a_str_out, "total_supply: %"DAP_UINT64_FORMAT_U"\n", l_token->header_private.total_supply );
                     else
                         dap_string_append_printf(a_str_out, "total_supply: %s\n", 
-                                        dap_chain_u256tostr(l_token->header_private.total_supply_256));
+                                                dap_chain_balance_print(l_token->header_private.total_supply_256));
                 }break;
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
                 case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{
@@ -2683,13 +2676,13 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256: // 256
                                     dap_string_append_printf(a_str_out,"total_supply: %s\n",
-                                                        dap_chain_u256tostr(
+                                                        dap_chain_balance_print(
                                                                 dap_tsd_get_scalar(l_tsd, uint256_t)));
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: // 128
                                     dap_string_append_printf(a_str_out,"total_supply: %s\n",
-                                                        dap_chain_balance_print(
-                                                            dap_tsd_get_scalar(l_tsd, uint128_t)));
+                                                        dap_chain_balance_print(GET_256_FROM_128(
+                                                            dap_tsd_get_scalar(l_tsd, uint128_t))));
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID :
                                     dap_string_append_printf(a_str_out,"total_signs_valid: %u\n",
@@ -2795,13 +2788,13 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                             switch( l_tsd->type){
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256: // 256
                                     dap_string_append_printf(a_str_out,"total_supply: %s\n",
-                                                            dap_chain_u256tostr(
+                                                            dap_chain_balance_print(
                                                                     dap_tsd_get_scalar(l_tsd, uint256_t)));
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: // 128
                                         dap_string_append_printf(a_str_out,"total_supply: %s\n",
-                                                            dap_chain_balance_print(
-                                                                dap_tsd_get_scalar(l_tsd, uint128_t)));
+                                                            dap_chain_balance_print(GET_256_FROM_128(
+                                                                                        dap_tsd_get_scalar(l_tsd, uint128_t))));
                                 break;
                                 case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID :
                                     dap_string_append_printf(a_str_out,"total_signs_valid: %u\n",
@@ -2841,7 +2834,6 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                     size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_decl.tsd_total_size;
                     dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd, l_certs_field_size);
                 }break;
-                case DAP_CHAIN_DATUM_256_TX:
                 case DAP_CHAIN_DATUM_TX:{
                     dap_chain_datum_tx_t * l_tx =(dap_chain_datum_tx_t *) a_datum->data;
                     char buf[50];
@@ -2869,7 +2861,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                 } break;
                                 case TX_ITEM_TYPE_256_OUT: { // 256
                                     dap_string_append_printf(a_str_out,"\tvalue: %s\n", 
-                                                dap_chain_u256tostr(((dap_chain_256_tx_out_t *)l_cur->data)->header.value)
+                                                dap_chain_balance_print(((dap_chain_256_tx_out_t *)l_cur->data)->header.value)
                                             );
                                     char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_256_tx_out_t *)l_cur->data)->addr );
                                     dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
@@ -2884,9 +2876,8 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                     DAP_DELETE(l_addr_str);
                                 } break;
                                 case TX_ITEM_TYPE_256_OUT_EXT: { // 256
-                                    // dap_chain_256_tx_out_ext_t * l_out_ext = l_cur->data;
                                     dap_string_append_printf(a_str_out,"\tvalue: %s\n",
-                                                dap_chain_u256tostr(((dap_chain_256_tx_out_ext_t *)l_cur->data)->header.value)
+                                                dap_chain_balance_print(((dap_chain_256_tx_out_ext_t *)l_cur->data)->header.value)
                                             );
                                     char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_256_tx_out_ext_t *)l_cur->data)->addr );
                                     dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
@@ -2894,7 +2885,6 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                     DAP_DELETE(l_addr_str);
                                 } break;
                                 case TX_ITEM_TYPE_OUT_EXT:{
-                                    // dap_chain_tx_out_ext_t * l_out_ext = l_cur->data;
                                     dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n",
                                                 ((dap_chain_tx_out_ext_t *)l_cur->data)->header.value
                                             );
@@ -2945,7 +2935,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                 } break;
                                 case TX_ITEM_TYPE_256_OUT_COND: { // 256
                                     dap_chain_256_tx_out_cond_t * l_out = l_cur->data;
-                                    dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_u256tostr(l_out->header.value) );
+                                    dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_balance_print(l_out->header.value) );
                                     switch ( l_out->header.subtype){
                                         case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{
                                             dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY\n");
@@ -2960,7 +2950,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
                                                 default: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNKNOWN\n"); break;
                                             }
                                             dap_string_append_printf(a_str_out,"\tunit_price_max: %s\n",
-                                                    dap_chain_u256tostr(l_out->subtype.srv_pay.unit_price_max_datoshi)
+                                                    dap_chain_balance_print(l_out->subtype.srv_pay.unit_price_max_datoshi)
                                                 );
                                             char l_pkey_hash_str[70]={[0]='\0'};
                                             dap_chain_hash_fast_to_str(&l_out->subtype.srv_pay.pkey_hash, l_pkey_hash_str, sizeof (l_pkey_hash_str)-1);
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 9f0152b51e..3fbc547a98 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -1801,7 +1801,7 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply)
 
             for(size_t i = 0; i < l_addr_tokens_size; i++) {
                 if(l_addr_tokens[i]) {
-                    uint128_t l_balance = dap_chain_ledger_calc_balance(l_ledger, l_addr, l_addr_tokens[i]);
+                    uint256_t l_balance = dap_chain_ledger_calc_balance(l_ledger, l_addr, l_addr_tokens[i]);
                     char *l_balance_coins = dap_chain_balance_to_coins(l_balance);
                     char *l_balance_datoshi = dap_chain_balance_print(l_balance);
                     dap_string_append_printf(l_string_ret, "\t%s (%s) %s\n", l_balance_coins,
@@ -2457,7 +2457,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
     int l_arg_index = 1;
 
     const char * l_type_str = NULL;
-    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; // 256
+    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE;
 
     const char * l_ticker = NULL;
 
@@ -2491,9 +2491,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
     // Token type
     l_arg_index=dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-type", &l_type_str);
 
-    if (!l_type_str || !strcmp(l_type_str, "private")) {
-        l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; // 256
-    } else {
+    if (l_type_str && strcmp(l_type_str, "private")) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "token_update can't accept type \"%s\"", l_type_str);
         return -22;
     }
@@ -2502,7 +2500,6 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
     size_t l_datum_data_offset = 0;
 
     switch(l_type){
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE:
         case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{ // 256
             dap_list_t *l_tsd_list = dap_list_alloc();
             size_t l_tsd_total_size = 0;
@@ -2556,15 +2553,9 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
                     }
                 } else if ( strcmp( a_argv[l_arg_index],"-total_supply" )==0){ // Total supply
                     dap_tsd_t * l_tsd;
-                    if ( dap_chain_datum_token_is_old(l_type) ) { // 128
-                        uint128_t l_param_value = dap_chain_balance_scan(l_arg_param); 
-                        l_tsd = dap_tsd_create_scalar(
-                                                DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value);
-                    } else {  // 256
-                        uint256_t l_param_value = GET_256_FROM_128(dap_chain_balance_scan(l_arg_param)); 
-                        l_tsd = dap_tsd_create_scalar(
-                                                DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value);
-                    }
+                    uint256_t l_param_value = dap_chain_balance_scan(l_arg_param);
+                    l_tsd = dap_tsd_create_scalar(
+                                            DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value);
                     dap_list_append( l_tsd_list, l_tsd);
                     l_tsd_total_size+= dap_tsd_size( l_tsd);
                 }else if ( strcmp( a_argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid
@@ -2785,7 +2776,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     const char * l_ticker = NULL;
 
     const char * l_total_supply_str = NULL;
-    uint256_t l_total_supply = uint256_0; // 256
+    uint256_t l_total_supply = {}; // 256
 
     const char * l_signs_emission_str = NULL;
     uint16_t l_signs_emission = 0;
@@ -2801,12 +2792,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     dap_chain_t * l_chain = NULL;
     dap_chain_net_t * l_net = NULL;
 
-    // 256
-    bool l_type_256 = true; //dap_chain_node_cli_check_option(a_argv, l_arg_index, a_argc, "-256") == -1 ? false : true;
-
-    uint16_t l_type = l_type_256 
-                                ? DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE // 256
-                                : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE;
+    uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE;
 
     const char * l_hash_out_type = NULL;
     dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-H", &l_hash_out_type);
@@ -2839,14 +2825,11 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
     if (l_type_str) {
         if (strcmp( l_type_str, "private") == 0){
-            l_type = l_type_256 ? DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL // 256
-                                : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL;
+            l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL; // 256
         }else if (strcmp( l_type_str, "private_simple") == 0){
-            l_type = l_type_256 ? DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE // 256
-                                : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE;
+            l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; // 256
         }else if (strcmp( l_type_str, "public_simple") == 0){
-            l_type = l_type_256 ? DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC // 256
-                                : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC;
+            l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC; // 256
         }
     }
 
@@ -2854,8 +2837,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     size_t l_datum_data_offset = 0;
 
     switch(l_type){
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: {
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: { // 256
             dap_list_t *l_tsd_list = dap_list_alloc();
             size_t l_tsd_total_size = 0;
             uint16_t l_flags = 0;
@@ -2876,15 +2858,9 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
                      }
                 } else if ( strcmp( a_argv[l_arg_index],"-total_supply" )==0){ // Total supply
                     dap_tsd_t * l_tsd;
-                    if ( l_type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL ) { // 256
-                        uint256_t l_param_value = GET_256_FROM_128(dap_chain_balance_scan(l_arg_param));
-                        l_tsd = dap_tsd_create_scalar(
-                                        DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value);
-                    } else { // 128
-                        uint128_t l_param_value = dap_chain_balance_scan(l_arg_param);
-                        l_tsd = dap_tsd_create_scalar(
-                                        DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value);
-                    }
+                    uint256_t l_param_value = dap_chain_balance_scan(l_arg_param);
+                    l_tsd = dap_tsd_create_scalar(
+                                    DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value);
                     dap_list_append( l_tsd_list, l_tsd);
                     l_tsd_total_size+= dap_tsd_size( l_tsd);
                 }else if ( strcmp( a_argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid
@@ -2978,14 +2954,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
                 switch (l_tsd->type){
                     case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256: { // 256
                         char *l_balance;
-                        l_balance = dap_chain_u256tostr(dap_tsd_get_scalar(l_tsd, uint256_t));
-                        log_it(L_DEBUG,"== TOTAL_SUPPLY: %s", l_balance);
-                        DAP_DELETE(l_balance);
-                    }
-                    break;
-                    case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: { // 128
-                        char *l_balance;
-                        l_balance = dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint128_t));
+                        l_balance = dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint256_t));
                         log_it(L_DEBUG,"== TOTAL_SUPPLY: %s", l_balance);
                         DAP_DELETE(l_balance);
                     }
@@ -3024,8 +2993,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
 
         }break;
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256
-        case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: {
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: { // 256
             // Total supply value
             dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-total_supply", &l_total_supply_str);
 
@@ -3039,14 +3007,11 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
             // Signs minimum number thats need to authorize the emission
             dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-signs_emission", &l_signs_emission_str);
 
-
             if(!l_total_supply_str) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter '-total_supply'");
                 return -3;
             } else {
-                // char * l_tmp = NULL;
-                l_total_supply = GET_256_FROM_128(dap_chain_balance_scan(l_total_supply_str));
-                //if((l_total_supply = strtoull(l_total_supply_str, &l_tmp, 10)) == 0) {
+                l_total_supply = dap_chain_balance_scan((char *)l_total_supply_str);
                 if ( IS_ZERO_256(l_total_supply) ) {
                     dap_chain_node_cli_set_reply_text(a_str_reply,
                             "token_create requires parameter '-total_supply' to be unsigned integer value that fits in 8 bytes");
@@ -3054,8 +3019,6 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
                 }
             }
 
-
-
             // Signs emission
             if(!l_signs_emission_str) {
                 dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter '-signs_emission'");
@@ -3102,14 +3065,9 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
             // Create new datum token
             l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t));
-            l_datum_token->type = l_type_256 
-                                            ? DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE // 256
-                                            : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE;
+            l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; // 256
             dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker);
-            if ( l_type_256 )
-                l_datum_token->header_private.total_supply_256 = l_total_supply;
-            else
-                l_datum_token->header_private.total_supply = dap_chain_uint256_to(l_total_supply);
+            l_datum_token->header_private.total_supply_256 = l_total_supply;
             l_datum_token->header_private.signs_total = l_signs_total;
             l_datum_token->header_private.signs_valid = l_signs_emission;
 
@@ -3133,13 +3091,9 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
             return -8;
     }
 
-    dap_chain_datum_t * l_datum = l_type_256 
-                                            ? dap_chain_datum_create( // 256
-                                                        DAP_CHAIN_DATUM_256_TOKEN_DECL,
-                                                        l_datum_token, sizeof(*l_datum_token) + l_datum_data_offset)
-                                            : dap_chain_datum_create(
-                                                        DAP_CHAIN_DATUM_TOKEN_DECL,
-                                                        l_datum_token, sizeof(*l_datum_token) + l_datum_data_offset);
+    dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_256_TOKEN_DECL,
+                                                         l_datum_token,
+                                                         sizeof(*l_datum_token) + l_datum_data_offset);
     size_t l_datum_size = dap_chain_datum_size(l_datum);
 
     // Calc datum's hash
@@ -3150,7 +3104,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
     // Add datum to mempool with datum_token hash as a key
     char * l_gdb_group_mempool;
-    if(l_chain) {
+    if (l_chain) {
         l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
     }
     else {
@@ -3158,15 +3112,11 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
 
     }
     int l_ret = 0;
-    char * l_datum_type = l_type_256 ? "256_t" : "";
-    if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
-        if(!dap_strcmp(l_hash_out_type,"hex"))
-            dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s %s with token %s is placed in datum pool ", l_datum_type, l_key_str, l_ticker);
-        else
-            dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s %s with token %s is placed in datum pool ", l_datum_type, l_key_str_base58, l_ticker);
-    }
-    else {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s %s is not placed in datum pool ", l_datum_type, l_key_str_base58);
+    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_strcmp(l_hash_out_type, "hex") ? l_key_str_base58 : l_key_str,
+                                      l_ticker, l_placed ? "" : " not");
+    if (!l_placed) {
         DAP_DELETE(l_datum);
         l_ret = -2;
     }
@@ -3186,7 +3136,7 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     int arg_index = 1;
     const char *str_tmp = NULL;
     char *str_reply_tmp = NULL;
-    uint64_t l_emission_value = 0;
+    uint256_t l_emission_value = {};
 
     const char * l_ticker = NULL;
 
@@ -3241,14 +3191,15 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
 
     // Emission value
     if(dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-emission_value", &str_tmp)) {
-        l_emission_value = strtoull(str_tmp, NULL, 10);
+        l_emission_value = dap_chain_balance_scan((char *)str_tmp);
     }
 
-    if(!l_emission_value) {
+    if (EQUAL_256(l_emission_value, uint256_0) ) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter '-emission_value'");
         return -1;
     }
 
+
     if(!l_addr_str) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter '-addr'");
         return -2;
@@ -3340,7 +3291,7 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
                 sizeof(l_emission->data.type_auth.signs_count);
 
         l_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_emission_size);
-        l_emission->hdr.version = 1;
+        l_emission->hdr.version = 2;
         l_emission->hdr.value_256 = l_emission_value;
         strncpy(l_emission->hdr.ticker, l_ticker, sizeof(l_emission->hdr.ticker) - 1);
         l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH;
@@ -3376,12 +3327,13 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
         DAP_DEL_Z(l_emission);
 
         // Add to mempool emission token
-        if(dap_chain_global_db_gr_set(dap_strdup(l_emission_hash_str_new), (uint8_t *) l_datum_emission, l_datum_emission_size
-                , l_gdb_group_mempool_emission)) {
-            if(!dap_strcmp(l_hash_out_type,"hex"))
-                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_new);
+        bool l_placed = dap_chain_global_db_gr_set(dap_strdup(l_emission_hash_str_new),
+                                                   (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" : ""),
@@ -3413,7 +3365,7 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply)
     // create items
     dap_chain_tx_token_t *l_tx_token = dap_chain_datum_tx_item_token_create(&l_emission_hash, l_ticker);
     dap_chain_tx_in_t *l_in = dap_chain_datum_tx_item_in_create(&l_tx_prev_hash, 0);
-    dap_chain_tx_out_t *l_out = dap_chain_datum_tx_item_out_create(l_addr, l_emission_value);
+    dap_chain_256_tx_out_t *l_out = dap_chain_datum_tx_item_out_create(l_addr, l_emission_value);
 
     // pack items to transaction
     dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_tx_token);
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index 4c854b9756..fdc7d4e0bd 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -34,6 +34,7 @@
 #include "dap_list.h"
 #include "dap_hash.h"
 
+#include "dap_chain_cell.h"
 #include "dap_chain_datum.h"
 #include "dap_chain_datum_token.h"
 #include "dap_chain_datum_tx_items.h"
@@ -165,7 +166,6 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                         dap_chain_addr_to_str(&((dap_chain_256_tx_out_t*)item)->addr));
             break;
         }
-        case TX_ITEM_TYPE_256_TOKEN:
         case TX_ITEM_TYPE_TOKEN:
             l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_token_t*)item)->header.token_emission_hash);
             dap_string_append_printf(a_str_out, "\t TOKEN:\n"
@@ -424,25 +424,6 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
     dap_string_append_printf(a_str_out, "\n");
 }
 
-/*static char* dap_db_new_history_timestamp()
-{
-    static pthread_mutex_t s_mutex = PTHREAD_MUTEX_INITIALIZER;
-    // get unique key
-    pthread_mutex_lock(&s_mutex);
-    static time_t s_last_time = 0;
-    static uint64_t s_suffix = 0;
-    time_t l_cur_time = time(NULL);
-    if(s_last_time == l_cur_time)
-        s_suffix++;
-    else {
-        s_suffix = 0;
-        s_last_time = l_cur_time;
-    }
-    char *l_str = dap_strdup_printf("%lld_%lld", (uint64_t) l_cur_time, s_suffix);
-    pthread_mutex_unlock(&s_mutex);
-    return l_str;
-}*/
-
 // for dap_db_history_tx & dap_db_history_addr()
 static dap_chain_datum_t* get_prev_tx(dap_tx_data_t *a_tx_data)
 {
@@ -495,16 +476,10 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain,
             dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
 
             // find Token items - present in emit transaction
-            // dap_list_t *l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL);
-
             dap_list_t *l_list_tx_token;
-            if ( l_type_256 ) // 256
-                l_list_tx_token =  dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_256_TOKEN, NULL);
-            else
-                l_list_tx_token = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_TOKEN, NULL);
+            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 = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL);
 
             dap_list_t *l_list_out_items;
             if ( l_type_256 ) // 256
@@ -1202,21 +1177,12 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
                                 break;
                             // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ATOM_OWNER: // 256
                             case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER:
-                                if ( l_token_em->hdr.version == 1 ) { // && l_token_em->hdr.type_256 ) { // 256
-                                    dap_string_append_printf(l_str_out, " value_start: %s(%s), codename: %s\n",
-                                        dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->data.type_atom_owner.value_start_256)),
-                                        dap_chain_u256tostr(l_token_em->data.type_atom_owner.value_start_256),
-                                        l_token_em->data.type_atom_owner.value_change_algo_codename
-                                    );
-                                } else {
-                                    dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n",
-                                        dap_chain_datoshi_to_coins(l_token_em->data.type_atom_owner.value_start),
-                                        l_token_em->data.type_atom_owner.value_start,
-                                        l_token_em->data.type_atom_owner.value_change_algo_codename
-                                    );
-                                }
+                                dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n",
+                                    dap_chain_datoshi_to_coins(l_token_em->data.type_atom_owner.value_start),
+                                    l_token_em->data.type_atom_owner.value_start,
+                                    l_token_em->data.type_atom_owner.value_change_algo_codename
+                                );
                             break;
-                            // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_SMART_CONTRACT:
                             case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: {
                                 char *l_addr = dap_chain_addr_to_str(&l_token_em->data.type_presale.addr);
                                 // get time of create datum
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 58ea4b07db..d686c6d0f6 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -176,7 +176,7 @@ dap_chain_net_t **dap_chain_net_list(uint16_t *a_size);
 bool dap_chain_net_get_add_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr);
 
 int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum );
-void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_datum, const char *a_hash_out_type);
+void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type);
 void dap_chain_net_set_srv_callback_notify(dap_global_db_obj_callback_notify_t a_callback);
 void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const char *a_group,
                                       const char *a_key, const void *a_value, const size_t a_value_len);
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index a46defbea4..b5cb68d088 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -521,7 +521,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply)
                         ctime_r(&l_datum_ts_create, buf);
                         dap_string_append_printf(l_str_tmp,"\t\t\t\tts_create=%s\n", buf);
                         dap_string_append_printf(l_str_tmp,"\t\t\t\tdata_size=%u\n", l_datum->header.data_size);
-                        dap_chain_net_dump_datum(l_str_tmp, l_datum, "hex" );
+                        dap_chain_net_dump_datum(l_str_tmp, l_datum, "hex");
                     }
                     // Signatures
                     dap_string_append_printf(l_str_tmp,"\t\tsignatures:\tcount: %zu\n",l_block_cache->sign_count );
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 4aeec1806a..7bf68b5cd9 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -89,7 +89,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_add_from_treshold(dap_chain_t
 static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t , size_t);                   //    Verify new event in dag
 static size_t s_chain_callback_atom_get_static_hdr_size(void);                               //    Get dag event header size
 
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain );
+static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id);
 static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t *  ,
                                                                      dap_chain_atom_ptr_t , size_t);
 
@@ -305,14 +305,7 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger
         }
         break;
         case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
-<<<<<<< HEAD
-            // dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data;
-            // l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ?
-            //                                     true : false;
-            return dap_chain_ledger_token_emission_load(a_ledger, (dap_chain_datum_token_emission_t*) l_datum->data, l_datum->header.data_size);
-=======
             return dap_chain_ledger_token_emission_load(a_ledger, l_datum->data, l_datum->header.data_size);
->>>>>>> bugfix-5311
         }
         break;
         case DAP_CHAIN_DATUM_TX: {
@@ -994,10 +987,11 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t
  * @param a_chain
  * @return
  */
-static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain )
+static dap_chain_atom_iter_t *s_chain_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id)
 {
     dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
     l_atom_iter->chain = a_chain;
+    l_atom_iter->cell_id = a_cell_id;
     pthread_rwlock_rdlock(&a_chain->atoms_rwlock);
 #ifdef WIN32
     log_it(L_DEBUG, "! Create caller id %lu", GetThreadId(GetCurrentThread()));
@@ -1005,6 +999,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_
     return l_atom_iter;
 }
 
+
 /**
  * @brief s_chain_callback_atom_get_datum Get the datum from event
  * @param a_atom_iter
@@ -1042,7 +1037,14 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
     assert(l_dag);
     dap_chain_cs_dag_pvt_t *l_dag_pvt = PVT(l_dag);
     assert(l_dag_pvt);
-    a_atom_iter->cur_item = l_dag_pvt->events;
+    a_atom_iter->cur_item = NULL;
+    dap_chain_cs_dag_event_item_t *l_item_tmp, *l_item_cur;
+    HASH_ITER(hh, l_dag_pvt->events, l_item_cur, l_item_tmp) {
+        if (l_item_cur->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) {
+            a_atom_iter->cur_item = l_item_cur;
+            break;
+        }
+    }
     if ( a_atom_iter->cur_item ){
         a_atom_iter->cur = ((dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item)->event;
         a_atom_iter->cur_size = ((dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item)->event_size;
@@ -1058,6 +1060,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
     return a_atom_iter->cur;
 }
 
+
 /**
  * @brief s_chain_callback_atom_iter_get_lasts
  * @param a_atom_iter
@@ -1190,23 +1193,23 @@ static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chai
  */
 static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter,size_t * a_atom_size )
 {
-    if (a_atom_iter->cur ){
-        //dap_chain_cs_dag_pvt_t* l_dag_pvt = PVT(DAP_CHAIN_CS_DAG(a_atom_iter->chain));
-        dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item;
-        a_atom_iter->cur_item = l_event_item->hh.next;
-        l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item;
-        // if l_event_item=NULL then items are over
-        a_atom_iter->cur = l_event_item ? l_event_item->event : NULL;
-        a_atom_iter->cur_size = a_atom_iter->cur ? l_event_item->event_size : 0;
-        a_atom_iter->cur_hash = l_event_item ? &l_event_item->hash : NULL;
-        if(a_atom_size)
-            *a_atom_size = a_atom_iter->cur_size;
-        return a_atom_iter->cur;
-    }else
-        return NULL;
-
+    dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item;
+    while (l_event_item) {
+        l_event_item = (dap_chain_cs_dag_event_item_t *)l_event_item->hh.next;
+        if (l_event_item && l_event_item->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64)
+            break;
+    }
+    // if l_event_item=NULL then items are over
+    a_atom_iter->cur_item = l_event_item;
+    a_atom_iter->cur = l_event_item ? l_event_item->event : NULL;
+    a_atom_iter->cur_size = a_atom_iter->cur ? l_event_item->event_size : 0;
+    a_atom_iter->cur_hash = l_event_item ? &l_event_item->hash : NULL;
+    if(a_atom_size)
+        *a_atom_size = a_atom_iter->cur_size;
+    return a_atom_iter->cur;
 }
 
+
 /**
  * @brief s_chain_callback_atom_iter_delete Delete dag event iterator
  * @param a_atom_iter
-- 
GitLab