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