From 4c3bab20dba27b2a4a0f7569cd2ebeac4545d204 Mon Sep 17 00:00:00 2001
From: Aleksey Feoktistov <aleksey@synestproject.com>
Date: Tue, 23 Nov 2021 23:15:20 +0500
Subject: [PATCH] add 256bit items to cli_cmd

---
 modules/chain/dap_chain.c                     |  16 +++
 modules/chain/dap_chain_ledger.c              |  28 ++--
 modules/chain/include/dap_chain.h             |   2 +
 modules/common/dap_chain_common.c             |  16 +++
 modules/common/include/dap_chain_common.h     |  28 +++-
 modules/common/include/dap_chain_datum.h      |   8 ++
 .../common/include/dap_chain_datum_tx_items.h |   2 +-
 modules/net/dap_chain_net.c                   |  51 ++++++++
 modules/net/dap_chain_node_cli_cmd_tx.c       | 120 ++++++++++++++++++
 9 files changed, 255 insertions(+), 16 deletions(-)

diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index b577c8ad0c..c73c4dcc92 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -251,9 +251,15 @@ static dap_chain_type_t s_chain_type_from_str(const char *a_type_str)
     if(!dap_strcmp(a_type_str, "emission")) {
         return CHAIN_TYPE_EMISSION;
     }
+    if(!dap_strcmp(a_type_str, "emission_256")) {
+        return CHAIN_TYPE_256_EMISSION;
+    }
     if(!dap_strcmp(a_type_str, "transaction")) {
         return CHAIN_TYPE_TX;
     }
+    if(!dap_strcmp(a_type_str, "transaction_256")) {
+        return CHAIN_TYPE_256_TX;
+    }
     if(!dap_strcmp(a_type_str, "ca")) {
         return CHAIN_TYPE_CA;
     }
@@ -274,9 +280,15 @@ static uint16_t s_datum_type_from_str(const char *a_type_str)
     if(!dap_strcmp(a_type_str, "emission")) {
         return DAP_CHAIN_DATUM_TOKEN_EMISSION;
     }
+    if(!dap_strcmp(a_type_str, "emission_256")) {
+        return DAP_CHAIN_DATUM_256_TOKEN_EMISSION;
+    }
     if(!dap_strcmp(a_type_str, "transaction")) {
         return DAP_CHAIN_DATUM_TX;
     }
+    if(!dap_strcmp(a_type_str, "transaction_256")) {
+        return DAP_CHAIN_DATUM_256_TX;
+    }
     return DAP_CHAIN_DATUM_CUSTOM;
 }
 
@@ -293,8 +305,12 @@ static uint16_t s_chain_type_convert(dap_chain_type_t a_type)
         return DAP_CHAIN_DATUM_TOKEN_DECL;
     case CHAIN_TYPE_EMISSION:
         return DAP_CHAIN_DATUM_TOKEN_EMISSION;
+    case CHAIN_TYPE_256_EMISSION:
+        return DAP_CHAIN_DATUM_256_TOKEN_EMISSION;
     case CHAIN_TYPE_TX:
         return DAP_CHAIN_DATUM_TX;
+    case CHAIN_TYPE_256_TX:
+        return DAP_CHAIN_DATUM_256_TX;
     default:
         return DAP_CHAIN_DATUM_CUSTOM;
     }
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 3c6546b95c..2e5879c897 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -132,8 +132,11 @@ typedef struct dap_chain_ledger_tx_bound {
     } in;
     union {
         dap_chain_tx_out_t *tx_prev_out;
+        dap_chain_256_tx_out_t *tx_prev_out_256; // 256
         dap_chain_tx_out_ext_t *tx_prev_out_ext;
+        dap_chain_256_tx_out_ext_t *tx_prev_out_ext_256; // 256
         dap_chain_tx_out_cond_t *tx_prev_out_cond;
+        dap_chain_256_tx_out_cond_t *tx_prev_out_cond_256; // 256
     } out;
     dap_chain_ledger_tx_item_t *item_out;
 } dap_chain_ledger_tx_bound_t;
@@ -143,6 +146,7 @@ typedef struct dap_ledger_wallet_balance {
     char *key;
     char token_ticker[DAP_CHAIN_TICKER_SIZE_MAX];
     uint128_t balance;
+    //uint256_t balance;
     UT_hash_handle hh;
 } dap_ledger_wallet_balance_t;
 
@@ -2607,11 +2611,13 @@ bool dap_chain_ledger_tx_hash_is_used_out_item(dap_ledger_t *a_ledger, dap_chain
 uint128_t dap_chain_ledger_calc_balance(dap_ledger_t *a_ledger, const dap_chain_addr_t *a_addr,
                                         const char *a_token_ticker)
 {
-#ifdef DAP_GLOBAL_IS_INT128
-    uint128_t l_ret = 0;
-#else
-    uint128_t l_ret = {};
-#endif
+// #ifdef DAP_GLOBAL_IS_INT128
+//     uint128_t l_ret = 0;
+// #else
+//     uint128_t l_ret = {};
+// #endif
+    uint128_t l_ret = zero_128;
+
     dap_ledger_wallet_balance_t *l_balance_item = NULL;// ,* l_balance_item_tmp = NULL;
     char *l_addr = dap_chain_addr_to_str(a_addr);
     char *l_wallet_balance_key = dap_strjoin(" ", l_addr, a_token_ticker, (char*)NULL);
@@ -2635,11 +2641,13 @@ uint128_t dap_chain_ledger_calc_balance(dap_ledger_t *a_ledger, const dap_chain_
 uint128_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_chain_addr_t *a_addr,
                                              const char *a_token_ticker)
 {
-#ifdef DAP_GLOBAL_IS_INT128
-    uint128_t balance = 0;
-#else
-    uint128_t balance = {0};
-#endif
+// #ifdef DAP_GLOBAL_IS_INT128
+//     uint128_t balance = 0;
+// #else
+//     uint128_t balance = {0};
+// #endif
+    uint128_t balance = zero_128;
+
     if(!a_addr || !dap_chain_addr_check_sum(a_addr))
         return balance;
     /* proto
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index 5d6de24f66..30fd91383f 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -92,7 +92,9 @@ typedef  enum dap_chain_type
     CHAIN_TYPE_FIRST,
     CHAIN_TYPE_TOKEN,
     CHAIN_TYPE_EMISSION,
+    CHAIN_TYPE_256_EMISSION, // 256
     CHAIN_TYPE_TX,
+    CHAIN_TYPE_256_TX, // 256
     CHAIN_TYPE_CA,
     CHAIN_TYPE_LAST
 } dap_chain_type_t;
diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c
index 91498d753a..370cd38b86 100644
--- a/modules/common/dap_chain_common.c
+++ b/modules/common/dap_chain_common.c
@@ -282,6 +282,15 @@ int dap_chain_addr_check_sum(const dap_chain_addr_t *a_addr)
     return -1;
 }
 
+// 256
+uint128_t dap_chain_uint128_from_uint256(uint256_t a_from)
+{
+    if ( !( EQUAL_128(a_from.hi, zero_128) ) ) {
+        log_it(L_ERROR, "Can't convert to uint128_t. It's too big.");
+    }
+    return a_from.lo;
+}
+
 uint64_t dap_chain_uint128_to(uint128_t a_from)
 {
 #ifdef DAP_GLOBAL_IS_INT128
@@ -297,6 +306,13 @@ uint64_t dap_chain_uint128_to(uint128_t a_from)
 #endif
 }
 
+// 256
+uint64_t dap_chain_uint256_to(uint256_t a_from)
+{
+    return dap_chain_uint128_to(a_from.lo);
+}
+
+
 char *dap_chain_balance_print(uint128_t a_balance)
 {
     char *l_buf = DAP_NEW_Z_SIZE(char, DATOSHI_POW + 3);
diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h
index c9e597c23a..38300c9415 100644
--- a/modules/common/include/dap_chain_common.h
+++ b/modules/common/include/dap_chain_common.h
@@ -258,15 +258,33 @@ 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}};
+// #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 = zero_128;
+    ADD_64_INTO_128(a_from, &l_ret );
     return l_ret;
-#endif
+}
+
+// 256
+uint128_t dap_chain_uint128_from_uint256(uint256_t a_from);
+
+// 256
+DAP_STATIC_INLINE uint256_t dap_chain_uint256_from(uint64_t a_from)
+{
+    uint128_t l_temp_128 = zero_128;
+    uint256_t l_ret_256 = zero_256;
+    ADD_64_INTO_128(a_from, &l_temp_128);
+    ADD_128_INTO_256(l_temp_128, &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);
 
 char *dap_chain_balance_print(uint128_t a_balance);
 char *dap_chain_balance_to_coins(uint128_t a_balance);
diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h
index e01ac5de87..8723dda037 100644
--- a/modules/common/include/dap_chain_datum.h
+++ b/modules/common/include/dap_chain_datum.h
@@ -38,6 +38,9 @@
 /// Transaction header section
 #define DAP_CHAIN_DATUM_TX                  0x0100
 
+// 256
+#define DAP_CHAIN_DATUM_256_TX              0x0101
+
 /// Transaction request section
 #define DAP_CHAIN_DATUM_TX_REQUEST          0x0300
 
@@ -59,6 +62,7 @@
 /// Simple token decl
 #define DAP_CHAIN_DATUM_TOKEN_DECL           0xf000
 #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
@@ -67,6 +71,8 @@
     switch (t) {                            \
         case DAP_CHAIN_DATUM_TX:            \
             s = "DATUM_TX"; break;          \
+        case DAP_CHAIN_DATUM_256_TX:            \
+            s = "DATUM_256_TX"; break;          \
         case DAP_CHAIN_DATUM_TX_REQUEST:    \
             s = "DATUM_WASM_CODE"; break;   \
         case DAP_CHAIN_DATUM_WASM_CODE:     \
@@ -85,6 +91,8 @@
             s = "DATUM_TOKEN_DECL"; break;  \
         case DAP_CHAIN_DATUM_TOKEN_EMISSION:\
             s = "DATUM_TOKEN_EMISSION"; break;\
+        case DAP_CHAIN_DATUM_256_TOKEN_EMISSION:\
+            s = "DATUM_256_TOKEN_EMISSION"; break;\
         default:                            \
             s = "DATUM_UNKNOWN"; break;     \
 }
diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h
index 3e919f854a..c68c373fdb 100644
--- a/modules/common/include/dap_chain_datum_tx_items.h
+++ b/modules/common/include/dap_chain_datum_tx_items.h
@@ -53,8 +53,8 @@ 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_OUT_EXT: return "TX_ITEM_TYPE_OUT_EXT";
         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";
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 2658130cbc..4df78a5dc3 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -2544,10 +2544,16 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t
     switch ( a_datum->header.type_id) {
         case DAP_CHAIN_DATUM_TX: return dap_chain_ledger_tx_add_check( a_net->pub.ledger,
                                                                    (dap_chain_datum_tx_t*) a_datum->data );
+        // 256
+        case DAP_CHAIN_DATUM_256_TX: return dap_chain_ledger_tx_add_check( a_net->pub.ledger,
+                                                                   (dap_chain_datum_tx_t*) a_datum->data );
         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_TOKEN_EMISSION : return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger,
                                                                    (dap_chain_datum_token_emission_t*) a_datum->data, a_datum->header.data_size );
+        // 256
+        case DAP_CHAIN_DATUM_256_TOKEN_EMISSION : return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger,
+                                                                   (dap_chain_datum_256_token_emission_t*) a_datum->data, a_datum->header.data_size );
         default: return 0;
     }
 }
@@ -2790,6 +2796,13 @@ 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,"\taddr : %s\n", l_addr_str );
                                     DAP_DELETE(l_addr_str);
                                 } break;
+                                case TX_ITEM_TYPE_256_OUT:{ // 256
+                                    dap_chain_256_tx_out_t * l_out = l_cur->data;
+                                    dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", dap_chain_uint256_to(l_out->header.value) );
+                                    char * l_addr_str = dap_chain_addr_to_str(&l_out->addr);
+                                    dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
+                                    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", l_out_ext->header.value );
@@ -2798,6 +2811,14 @@ 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,"\ttoken : %s\n", l_out_ext->token );
                                     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: %"DAP_UINT64_FORMAT_U"\n", dap_chain_uint256_to(l_out_ext->header.value) );
+                                    char * l_addr_str = dap_chain_addr_to_str(&l_out_ext->addr);
+                                    dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
+                                    dap_string_append_printf(a_str_out,"\ttoken : %s\n", l_out_ext->token );
+                                    DAP_DELETE(l_addr_str);
+                                } break;
                                 case TX_ITEM_TYPE_SIG:{
                                     dap_chain_tx_sig_t * l_item_sign = l_cur->data;
                                     dap_sign_t *l_sign = (dap_sign_t *)l_item_sign->sig;
@@ -2868,6 +2889,36 @@ 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,"\tparams_size : %u\n", l_out->params_size );
                                 } 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: %"DAP_UINT64_FORMAT_U"\n", dap_chain_uint256_to(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");
+                                            dap_string_append_printf(a_str_out,"\tsrv_uid: 0x%016"DAP_UINT64_FORMAT_x"\n", l_out->subtype.srv_pay.srv_uid.uint64 );
+                                            switch (l_out->subtype.srv_pay.unit.enm) {
+                                                case SERV_UNIT_UNDEFINED: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNDEFINED\n"); break;
+                                                case SERV_UNIT_MB: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_MB\n"); break;
+                                                case SERV_UNIT_SEC: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_SEC\n"); break;
+                                                case SERV_UNIT_DAY: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_DAY\n"); break;
+                                                case SERV_UNIT_KB: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_KB\n"); break;
+                                                case SERV_UNIT_B : dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_B\n"); break;
+                                                default: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNKNOWN\n"); break;
+                                            }
+                                            dap_string_append_printf(a_str_out,"\tunit_price_max: %"DAP_UINT64_FORMAT_U"\n", dap_chain_uint256_to(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);
+                                            dap_string_append_printf(a_str_out,"\tpkey_hash: %s\n", l_pkey_hash_str );
+                                        }break;
+                                        case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:{
+                                            dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE\n");
+                                        }break;
+                                        case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE:{
+                                            dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE\n");
+                                        }break;
+                                    }
+                                    dap_string_append_printf(a_str_out,"\tparams_size : %u\n", l_out->params_size );
+                                } break;
                                 case TX_ITEM_TYPE_RECEIPT:{} break;
                                 default:{}
                             }
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index 8d4e8ed037..f23209fd78 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -156,6 +156,16 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                         ((dap_chain_tx_out_t*)item)->header.value,
                                         dap_chain_addr_to_str(&((dap_chain_tx_out_t*)item)->addr));
             break;
+        case TX_ITEM_TYPE_256_OUT: // 256
+            dap_string_append_printf(a_str_out, "\t OUT 256_t:\n"
+                                                "\t\t Value: %s (%"DAP_UINT64_FORMAT_U")\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_256_tx_out_t*)item)->header.value,
+                                        dap_chain_addr_to_str(&((dap_chain_256_tx_out_t*)item)->addr));
+            break;
         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"
@@ -230,6 +240,48 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                 dap_sign_get_information(l_provider, a_str_out);
             }
             break;
+        case TX_ITEM_TYPE_256_RECEIPT: // 256
+            dap_string_append_printf(a_str_out, "\t Receipt 256_t:\n"
+                                                "\t\t size: %u\n"
+                                                "\t\t ext size:%u\n"
+                                                "\t\t Info:"
+                                                "\t\t\t   units: 0x%016"DAP_UINT64_FORMAT_x"\n"
+                                                "\t\t\t   uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
+                                                "\t\t\t   units type: %s \n"
+                                                "\t\t\t   value: %s (%"DAP_UINT64_FORMAT_U")\n",
+                                     ((dap_chain_datum_256_tx_receipt_t*)item)->size,
+                                     ((dap_chain_datum_256_tx_receipt_t*)item)->exts_size,
+                                     ((dap_chain_datum_256_tx_receipt_t*)item)->receipt_info.units,
+                                     ((dap_chain_datum_256_tx_receipt_t*)item)->receipt_info.srv_uid.uint64,
+                                     serv_unit_enum_to_str(
+                                         &((dap_chain_datum_256_tx_receipt_t*)item)->receipt_info.units_type.enm
+                                         ),
+                                     dap_chain_balance_to_coins(
+                                         dap_chain_uint128_from_uint256(
+                                             ((dap_chain_datum_256_tx_receipt_t*)item)->receipt_info.value_datoshi
+                                         )
+                                     ),
+                                     ((dap_chain_datum_256_tx_receipt_t*)item)->receipt_info.value_datoshi);
+            if (((dap_chain_datum_256_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);
+                memcpy(l_provider, ((dap_chain_datum_256_tx_receipt_t*)item)->exts_n_signs, sizeof(dap_sign_t));
+                dap_sign_t *l_client = DAP_NEW_Z(dap_sign_t);
+                memcpy(l_client,
+                       ((dap_chain_datum_256_tx_receipt_t*)item)->exts_n_signs + sizeof(dap_sign_t),
+                       sizeof(dap_sign_t));
+                dap_string_append_printf(a_str_out, "Exts:\n"
+                                                    "   Provider:\n");
+                dap_sign_get_information(l_provider, a_str_out);
+                dap_string_append_printf(a_str_out, "   Client:\n");
+                dap_sign_get_information(l_client, a_str_out);
+            } else if (((dap_chain_datum_256_tx_receipt_t*)item)->exts_size == sizeof(dap_sign_t)) {
+                dap_sign_t *l_provider = DAP_NEW_Z(dap_sign_t);
+                memcpy(l_provider, ((dap_chain_datum_256_tx_receipt_t*)item)->exts_n_signs, sizeof(dap_sign_t));
+                dap_string_append_printf(a_str_out, "Exts:\n"
+                                                    "   Provider:\n");
+                dap_sign_get_information(l_provider, a_str_out);
+            }
+            break;
         case TX_ITEM_TYPE_PKEY:
             l_pkey_tmp = (dap_pkey_t*)((dap_chain_tx_pkey_t*)item)->pkey;
             dap_hash_fast(l_pkey_tmp->pkey, l_pkey_tmp->header.size, &l_pkey_hash_tmp);
@@ -316,6 +368,62 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                 break;
             }
             break;
+        case TX_ITEM_TYPE_256_OUT_COND: // 256
+            dap_string_append_printf(a_str_out, "\t OUT uint256_t COND:\n"
+                                                "\t Header:\n"
+                                                "\t\t\t ts_expires: %s\t"
+                                                "\t\t\t value: %s (%"DAP_UINT64_FORMAT_U")\n"
+                                                "\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_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) {
+            case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:
+                l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash);
+                dap_string_append_printf(a_str_out, "\t\t\t unit: 0x%08x\n"
+                                                    "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
+                                                    "\t\t\t pkey: %s\n"
+                                                    "\t\t\t max price: %s (%"DAP_UINT64_FORMAT_U") \n",
+                                         ((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_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi);
+                DAP_FREE(l_hash_str_tmp);
+                break;
+            case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE:
+                dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
+                                                    "\t\t\t addr: %s\n"
+                                                    "\t\t\t value: %Lf",
+                                         ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64,
+                                         dap_chain_addr_to_str(
+                                             &((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr
+                                             ),
+                                         ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_stake.fee_value);
+                break;
+            case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:
+                dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n"
+                                                    "\t\t\t net id: 0x%016"DAP_UINT64_FORMAT_x"\n"
+                                                    "\t\t\t token: %s\n"
+                                                    "\t\t\t value: %s (%"DAP_UINT64_FORMAT_U")\n",
+                                         ((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_256_tx_out_cond_t*)item)->subtype.srv_xchange.value);
+                break;
+            }
+            break;
         case TX_ITEM_TYPE_OUT_EXT:
             dap_string_append_printf(a_str_out, "\t OUT EXT:\n"
                                                 "\t\t Addr: %s\n"
@@ -328,6 +436,18 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
                                                                 ),
                                      ((dap_chain_tx_out_ext_t*)item)->header.value);
             break;
+        case TX_ITEM_TYPE_256_OUT_EXT: // 256
+            dap_string_append_printf(a_str_out, "\t OUT 256_t EXT:\n"
+                                                "\t\t Addr: %s\n"
+                                                "\t\t Token: %s\n"
+                                                "\t\t Value: %s (%"DAP_UINT64_FORMAT_U")\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_256_tx_out_ext_t*)item)->header.value);
+            break;
         default:
             dap_string_append_printf(a_str_out, " This transaction have unknown item type \n");
             break;
-- 
GitLab