diff --git a/dap-sdk b/dap-sdk index 2fa175608533db70a74d61ab1ed57edd85a01607..be89b46ae7ac20620b50714d7ba852341f79fa51 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 2fa175608533db70a74d61ab1ed57edd85a01607 +Subproject commit be89b46ae7ac20620b50714d7ba852341f79fa51 diff --git a/modules/common/CMakeLists.txt b/modules/common/CMakeLists.txt index 785170c91815e8a9ec72df3d1f8ac5c68e588a7b..81f118c84042790a85911e5475526d86b90aa41b 100644 --- a/modules/common/CMakeLists.txt +++ b/modules/common/CMakeLists.txt @@ -6,5 +6,5 @@ file(GLOB DAP_CHAIN_COMMON_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_COMMON_SRCS} ${DAP_CHAIN_COMMON_HEADERS}) -target_link_libraries(${PROJECT_NAME} dap_core dap_crypto ) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto json-c) target_include_directories(${PROJECT_NAME} PUBLIC include/ ) diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c index a2a8f77dd28ba8f538d6cbc569703c82dccbe08d..3a39a7b1c32363719f1a8c69cc8667dc601ea4fe 100644 --- a/modules/common/dap_chain_common.c +++ b/modules/common/dap_chain_common.c @@ -50,6 +50,23 @@ const dap_chain_cell_id_t c_dap_chain_cell_id_null = {0}; char *dap_cvt_uint256_to_str (uint256_t a_uint256); uint256_t dap_cvt_str_to_uint256 (const char *a_256bit_num); +json_object* dap_chain_receipt_info_to_json(dap_chain_receipt_info_t *a_info){ + json_object *l_obj = json_object_new_object(); + json_object *l_obj_srv_uid = json_object_new_uint64(a_info->srv_uid.uint64); + json_object_object_add(l_obj, "srvUID", l_obj_srv_uid); +#if DAP_CHAIN_NET_SRV_UID_SIZE == 8 + json_object *l_obj_addition = json_object_new_uint64(a_info->addition); + json_object_object_add(l_obj, "addition", l_obj_addition); +#endif + json_object *l_obj_units_type = json_object_new_string(dap_chain_srv_unit_enum_to_str(a_info->units_type.enm)); + json_object_object_add(l_obj, "unitsType", l_obj_units_type); + char *l_datoshi_value = dap_chain_balance_print(a_info->value_datoshi); + json_object *l_obj_datoshi = json_object_new_string(l_datoshi_value); + DAP_DELETE(l_datoshi_value); + json_object_object_add(l_obj, "value", l_obj_datoshi); + return l_obj; +} + /** * @brief dap_chain_hash_to_str * @param a_hash @@ -75,6 +92,18 @@ 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_addr_to_json + * @param a_addr + * @return + */ +json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr){ + char *l_addr_str = dap_chain_addr_to_str(a_addr); + json_object *l_obj = json_object_new_string(l_addr_str); + DAP_DELETE(l_addr_str); + return l_obj; +} + /** * @brief dap_chain_addr_to_str * @param a_addr diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index c3704bc994364dda56e6a184b0608164cb6fc35d..7e82c6d7142858ae539460f0874052dcfd0eeb21 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -322,7 +322,6 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi); char *l_coins_str = dap_chain_balance_to_coins( ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.value_datoshi); - serv_unit_enum_t l_unit = ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units_type.enm; dap_string_append_printf(a_str_out, "\t Receipt:\n" "\t\t size: %"DAP_UINT64_FORMAT_U"\n" "\t\t ext size: %"DAP_UINT64_FORMAT_U"\n" @@ -335,7 +334,7 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, ((dap_chain_datum_tx_receipt_t*)item)->exts_size, ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units, ((dap_chain_datum_tx_receipt_t*)item)->receipt_info.srv_uid.uint64, - serv_unit_enum_to_str(&l_unit), + dap_chain_srv_unit_enum_to_str(((dap_chain_datum_tx_receipt_t*)item)->receipt_info.units_type.enm), l_coins_str, l_value_str); if (((dap_chain_datum_tx_receipt_t*)item)->exts_size == sizeof(dap_sign_t) + sizeof(dap_sign_t)){ @@ -750,7 +749,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c char l_decree_hash_str[40] = ""; dap_hash_fast_t l_decree_hash ={0}; dap_chain_datum_anchor_get_hash_from_data(l_anchor, &l_decree_hash); - dap_chain_hash_fast_to_str(&l_decree_hash, &l_decree_hash_str, 40); + dap_chain_hash_fast_to_str(&l_decree_hash, l_decree_hash_str, 40); dap_string_append_printf(a_str_out, "decree hash: %s\n", l_decree_hash_str); @@ -759,3 +758,32 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c } DAP_DELETE(l_hash_str); } + +json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum){ + json_object *l_object = json_object_new_object(); + dap_hash_fast_t l_hash_data = {0}; + dap_hash_fast(a_datum->data, a_datum->header.data_size, &l_hash_data); + char *l_hash_data_str = dap_hash_fast_to_str_new(&l_hash_data); + json_object *l_obj_data_hash = json_object_new_string(l_hash_data_str); + DAP_DELETE(l_hash_data_str); + json_object *l_obj_version = json_object_new_int(a_datum->header.version_id); + json_object *l_obj_size = json_object_new_int(a_datum->header.data_size); + json_object *l_obj_ts_created = json_object_new_uint64(a_datum->header.ts_create); + json_object *l_obj_type = json_object_new_string(dap_chain_datum_type_id_to_str(a_datum->header.type_id)); + json_object *l_obj_data; + switch (a_datum->header.type_id) { + case DAP_CHAIN_DATUM_TX: + l_obj_data = dap_chain_datum_tx_to_json((dap_chain_datum_tx_t*)a_datum->data); + break; + default: + l_obj_data = json_object_new_null(); + break; + } + json_object_object_add(l_object, "version", l_obj_version); + json_object_object_add(l_object, "hash", l_obj_data_hash); + json_object_object_add(l_object, "data_size", l_obj_size); + json_object_object_add(l_object, "ts_created", l_obj_ts_created); + json_object_object_add(l_object, "type", l_obj_type); + json_object_object_add(l_object, "data", l_obj_data); + return l_object; +} diff --git a/modules/common/dap_chain_datum_anchor.c b/modules/common/dap_chain_datum_anchor.c index a1ef9e131c67f42c962b9cec73e96688fe05e673..3be303ad469f5a57fba1cc57142b9fdc7f27bc13 100644 --- a/modules/common/dap_chain_datum_anchor.c +++ b/modules/common/dap_chain_datum_anchor.c @@ -25,13 +25,11 @@ #include "dap_tsd.h" #include "dap_sign.h" #include "dap_common.h" +#include "dap_enc_base58.h" #include "dap_chain_datum_anchor.h" - #define LOG_TAG "dap_chain_datum_anchor" - - int dap_chain_datum_anchor_get_hash_from_data(dap_chain_datum_anchor_t* a_anchor, dap_hash_fast_t * l_out_hash) { if(!a_anchor){ diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index 82d01e2becb1f3d12096024e8f6cf51838ae1097..dbf6de247a3dbd7cf70b399f7de01069b55272ab 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -273,3 +273,106 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *tx) return ret; } +json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx){ + json_object *l_obj = json_object_new_object(); + json_object *l_obj_ts_created = json_object_new_uint64(a_tx->header.ts_created); + json_object *l_obj_items = json_object_new_array(); + uint32_t l_tx_items_count = 0; + uint32_t l_tx_items_size = a_tx->header.tx_items_size; + while(l_tx_items_count < l_tx_items_size) { + uint8_t *item = a_tx->tx_items + l_tx_items_count; + size_t l_tx_item_size = dap_chain_datum_item_tx_get_size(item); + if (l_tx_item_size == 0) { + json_object_put(l_obj_items); + l_obj_items = json_object_new_null(); + break; + } + dap_chain_tx_item_type_t l_item_type = dap_chain_datum_tx_item_get_type(item); + json_object *l_obj_item_type = NULL; + json_object *l_obj_item_data = NULL; + dap_hash_fast_t a_tx_hash = {0}; + char *l_hash_str = NULL; + switch (l_item_type) { + case TX_ITEM_TYPE_IN: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN"); + l_obj_item_data = dap_chain_datum_tx_item_in_to_json((dap_chain_tx_in_t*)item); + break; + case TX_ITEM_TYPE_OUT: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT"); + l_obj_item_data = dap_chain_datum_tx_item_out_to_json((dap_chain_tx_out_t*)item); + break; + case TX_ITEM_TYPE_IN_EMS: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_EMS"); + l_obj_item_data = dap_chain_datum_tx_item_in_ems_to_json((dap_chain_tx_in_ems_t*)item); + break; + case TX_ITEM_TYPE_SIG: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_SIG"); + l_obj_item_data = dap_chain_datum_tx_item_sig_to_json((dap_chain_tx_sig_t*)item); + break; + case TX_ITEM_TYPE_RECEIPT: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_RECEIPT"); + l_obj_item_data = dap_chain_datum_tx_receipt_to_json((dap_chain_datum_tx_receipt_t*)item); + break; + case TX_ITEM_TYPE_IN_COND: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_COND"); + l_obj_item_data = dap_chain_datum_tx_item_in_cond_to_json((dap_chain_tx_in_cond_t*)item); + break; + case TX_ITEM_TYPE_OUT_COND: + switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) { + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: + l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY"); + l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_pay_to_json((dap_chain_tx_out_cond_t*)item); + break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK: + l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK"); + l_obj_item_data = dap_chain_net_srv_stake_lock_cond_out_to_json((dap_chain_tx_out_cond_t*)item); + break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE: + l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE"); + l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_stake_to_json((dap_chain_tx_out_cond_t*)item); + break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: + l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE"); + l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_xchange_to_json((dap_chain_tx_out_cond_t*)item); + break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE: + l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE"); + l_obj_item_data = dap_chain_datum_tx_item_out_cond_fee_to_json((dap_chain_tx_out_cond_t*)item); + break; +// default: + } + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_COND"); + break; + case TX_ITEM_TYPE_OUT_EXT: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_EXT"); + l_obj_item_data = dap_chain_datum_tx_item_out_ext_to_json((dap_chain_tx_out_ext_t*)item); + break; + case TX_ITEM_TYPE_TSD: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_TSD"); + l_obj_item_data = dap_chain_datum_tx_item_tsd_to_json((dap_chain_tx_tsd_t*)item); + break; + default: + dap_hash_fast(a_tx, dap_chain_datum_tx_get_size(a_tx), &a_tx_hash); + l_hash_str = dap_chain_hash_fast_to_str_new(&a_tx_hash); + log_it(L_NOTICE, "Transaction %s has an item whose type cannot be handled by the dap_chain_datum_tx_to_json function.", l_hash_str); + DAP_DELETE(l_hash_str); + break; + } + if (!l_obj_item_type){ + json_object_array_add(l_obj_items, json_object_new_null()); + } else { + if (!l_obj_item_data) + l_obj_item_data = json_object_new_null(); + json_object *l_obj_item = json_object_new_object(); + json_object_object_add(l_obj_item, "type", l_obj_item_type); + json_object_object_add(l_obj_item, "data", l_obj_item_data); + json_object_array_add(l_obj_items, l_obj_item); + } + + l_tx_items_count += l_tx_item_size; + } + json_object_object_add(l_obj, "tsCrated", l_obj_ts_created); + json_object_object_add(l_obj, "items", l_obj_items); + return l_obj; +} + diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c index 0bd20cb46c78ef6470500a1e232a36328c210dfc..df32f5e239d9e1bdd000600e64676e3f9d6bb285 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -226,7 +226,7 @@ size_t dap_chain_datum_item_tx_get_size(const void *a_item) } /** - * Create item dap_chain_tx_token_t + * Create item dap_chain_tx_in_ems_t * * return item, NULL Error */ @@ -242,6 +242,20 @@ dap_chain_tx_in_ems_t *dap_chain_datum_tx_item_token_create(dap_chain_id_t a_id, return l_item; } +json_object *dap_chain_datum_tx_item_in_ems_to_json(const dap_chain_tx_in_ems_t *a_in_ems) +{ + json_object *l_object = json_object_new_object(); + json_object *l_obj_ticker = json_object_new_string(a_in_ems->header.ticker); + json_object *l_obj_chain_id = json_object_new_uint64(a_in_ems->header.token_emission_chain_id.uint64); + char *l_ehf = dap_chain_hash_fast_to_str_new(&a_in_ems->header.token_emission_hash); + json_object *l_obj_ehf = json_object_new_string(l_ehf); + DAP_DELETE(l_ehf); + json_object_object_add(l_object, "ticker", l_obj_ticker); + json_object_object_add(l_object, "chainId", l_obj_chain_id); + json_object_object_add(l_object, "emissionHash", l_obj_ehf); + return l_object; +} + /** * Create item dap_chain_tx_out_old_t * @@ -276,6 +290,28 @@ dap_chain_tx_tsd_t *dap_chain_datum_tx_item_tsd_create(void *a_data, int a_type, return l_item; } +json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in){ + json_object *l_obj_in = json_object_new_object(); + json_object *l_obj_prev_idx = json_object_new_uint64(a_in->header.tx_out_prev_idx); + char *l_hash = dap_chain_hash_fast_to_str_new(&a_in->header.tx_prev_hash); + json_object *l_obj_hash = json_object_new_string(l_hash); + DAP_DELETE(l_hash); + json_object_object_add(l_obj_in, "prev_idx", l_obj_prev_idx); + json_object_object_add(l_obj_in, "prev_hash", l_obj_hash); + return l_obj_in; +} + +json_object* dap_chain_datum_tx_item_tsd_to_json(dap_chain_tx_tsd_t *a_tsd){ + json_object *l_object = json_object_new_object(); + json_object *l_obj_tsd_type = json_object_new_int(a_tsd->header.type); + json_object *l_obj_tsd_size = json_object_new_uint64(a_tsd->header.size); + json_object *l_obj_data = json_object_new_string_len((char *)a_tsd->tsd, a_tsd->header.size); + json_object_object_add(l_object, "type", l_obj_tsd_type); + json_object_object_add(l_object, "size", l_obj_tsd_size); + json_object_object_add(l_object, "data", l_obj_data); + return l_object; +} + /** * @brief dap_chain_datum_tx_item_in_cond_create * @param a_pkey_serialized @@ -296,6 +332,24 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa return l_item; } +json_object* dap_chain_datum_tx_item_in_cond_to_json(dap_chain_tx_in_cond_t *a_in_cond){ + json_object *l_obj = json_object_new_object(); + json_object *l_obj_receipt_idx = json_object_new_uint64(a_in_cond->header.receipt_idx); + json_object *l_obj_out_prev_idx = json_object_new_uint64(a_in_cond->header.tx_out_prev_idx); + json_object *l_obj_prev_hash = NULL; + if (dap_hash_fast_is_blank(&a_in_cond->header.tx_prev_hash)){ + l_obj_prev_hash = json_object_new_null(); + } else { + char *l_prev_hash = dap_hash_fast_to_str_new(&a_in_cond->header.tx_prev_hash); + l_obj_prev_hash = json_object_new_string(dap_strdup(l_prev_hash)); + DAP_DELETE(l_prev_hash); + } + json_object_object_add(l_obj, "receiptIdx", l_obj_receipt_idx); + json_object_object_add(l_obj, "outPrevIdx", l_obj_out_prev_idx); + json_object_object_add(l_obj, "txPrevHash", l_obj_prev_hash); + return l_obj; +} + /** * Create item dap_chain_tx_out_old_t * @@ -312,6 +366,15 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a return l_item; } +json_object* dap_chain_datum_tx_item_out_to_json(const dap_chain_tx_out_t *a_out) { + json_object *l_object = json_object_new_object(); + json_object *l_value = json_object_new_string(dap_chain_balance_print(a_out->header.value)); + json_object *l_addr = dap_chain_addr_to_json(&a_out->addr); + json_object_object_add(l_object, "value", l_value); + json_object_object_add(l_object, "addr", l_addr); + return l_object; +} + dap_chain_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) @@ -326,6 +389,19 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a return l_item; } +json_object* dap_chain_datum_tx_item_out_ext_to_json(const dap_chain_tx_out_ext_t *a_out_ext) { + json_object *l_obj = json_object_new_object(); + char *l_value = dap_chain_balance_print(a_out_ext->header.value); + json_object *l_obj_value = json_object_new_string(l_value); + DAP_DELETE(l_value); + json_object *l_obj_addr = dap_chain_addr_to_json(&a_out_ext->addr); + json_object *l_obj_token = json_object_new_string(a_out_ext->token); + json_object_object_add(l_obj, "value", l_obj_value); + json_object_object_add(l_obj, "addr", l_obj_addr); + json_object_object_add(l_obj, "token", l_obj_token); + return l_obj; +} + dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a_value) { if (IS_ZERO_256(a_value)) @@ -337,6 +413,18 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a return l_item; } +json_object *dap_chain_datum_tx_item_out_cond_fee_to_json(dap_chain_tx_out_cond_t *a_fee){ + if (a_fee->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) { + json_object *l_obj = json_object_new_object(); + char *l_balance = dap_chain_balance_print(a_fee->header.value); + json_object *l_obj_balance = json_object_new_string(l_balance); + DAP_DELETE(l_balance); + json_object_object_add(l_obj, "balance", l_obj_balance); + return l_obj; + } + return NULL; +} + /** * Create item dap_chain_tx_out_cond_t * @@ -369,6 +457,33 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_pke return l_item; } +json_object *dap_chain_datum_tx_item_out_cond_srv_pay_to_json(dap_chain_tx_out_cond_t *a_srv_pay) { + if (a_srv_pay->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY) { + json_object *l_obj = json_object_new_object(); + char *l_balance = dap_chain_balance_print(a_srv_pay->header.value); + json_object *l_obj_value = json_object_new_string(l_balance); + DAP_DELETE(l_balance); + json_object_object_add(l_obj, "value", l_obj_value); + json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_pay->header.srv_uid.uint64); + json_object_object_add(l_obj, "srvUid", l_obj_srv_uid); + json_object *l_obj_units_type = json_object_new_string(dap_chain_srv_unit_enum_to_str(a_srv_pay->subtype.srv_pay.unit.enm)); + json_object_object_add(l_obj, "srvUnit", l_obj_units_type); + char *l_price_max_datoshi = dap_chain_balance_print(a_srv_pay->subtype.srv_pay.unit_price_max_datoshi); + json_object *l_obj_price_max_datoshi = json_object_new_string(l_price_max_datoshi); + DAP_DELETE(l_price_max_datoshi); + json_object_object_add(l_obj, "price", l_obj_price_max_datoshi); + char *l_pkeyHash = dap_hash_fast_to_str_new(&a_srv_pay->subtype.srv_pay.pkey_hash); + json_object *l_obj_pkey_hash = json_object_new_string(l_pkeyHash); + DAP_DELETE(l_pkeyHash); + json_object_object_add(l_obj, "pKeyHash", l_obj_pkey_hash); + //TODO: Parsing a_srv_pay->tsd +// json_object *l_obj_tsd = json_object_new_string_len(a_srv_pay->tsd, a_srv_pay->tsd_size); +// json_object_object_add(l_obj, "TSD", l_obj_tsd); + return l_obj; + } + return NULL; +} + 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_sell_net_id, uint256_t a_value_sell, dap_chain_net_id_t a_buy_net_id, const char *a_token, uint256_t a_value_buy, @@ -396,6 +511,33 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap return l_item; } +json_object* dap_chain_datum_tx_item_out_cond_srv_xchange_to_json(dap_chain_tx_out_cond_t* a_srv_xchange){ + if (a_srv_xchange->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE){ + json_object *l_object = json_object_new_object(); + char *l_value = dap_chain_balance_print(a_srv_xchange->header.value); + json_object *l_obj_value = json_object_new_string(l_value); + DAP_DELETE(l_value); + json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_xchange->header.srv_uid.uint64); + json_object *l_obj_buy_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.buy_net_id); + json_object *l_obj_sell_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.sell_net_id); + json_object *l_obj_buy_token = json_object_new_string(a_srv_xchange->subtype.srv_xchange.buy_token); + char *l_value_buy = dap_chain_balance_print(a_srv_xchange->subtype.srv_xchange.buy_value); + json_object *l_obj_value_buy = json_object_new_string(l_value_buy); + DAP_DELETE(l_value_buy); + json_object *l_obj_seller_addr = dap_chain_addr_to_json(&a_srv_xchange->subtype.srv_xchange.seller_addr); + json_object_object_add(l_object, "value", l_obj_value); + json_object_object_add(l_object, "valueBuy", l_obj_value_buy); + json_object_object_add(l_object, "srvUID", l_obj_srv_uid); + json_object_object_add(l_object, "buyNetId", l_obj_buy_net_id); + json_object_object_add(l_object, "sellNetId", l_obj_sell_net_id); + json_object_object_add(l_object, "buyToken", l_obj_buy_token); + json_object_object_add(l_object, "sellerAddr", l_obj_seller_addr); + //TODO: Parse TSD + return l_object; + } + return NULL; +} + 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, uint256_t a_value, uint256_t a_fee_value, dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr, dap_chain_addr_t *a_signing_addr, dap_chain_node_addr_t *a_signer_node_addr) @@ -415,6 +557,97 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c return l_item; } +json_object *dap_chain_datum_tx_item_out_cond_srv_stake_to_json(dap_chain_tx_out_cond_t* a_srv_stake) { + if (a_srv_stake->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE) { + json_object *l_object = json_object_new_object(); + char *l_value = dap_chain_balance_print(a_srv_stake->header.value); + json_object *l_obj_value = json_object_new_string(l_value); + DAP_DELETE(l_value); + json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_stake->header.srv_uid.uint64); + char *l_value_fee = dap_chain_balance_print(a_srv_stake->subtype.srv_stake.fee_value); + json_object *l_obj_value_fee = json_object_new_string(l_value_fee); + DAP_DELETE(l_value_fee); + json_object *l_obj_fee_addr = dap_chain_addr_to_json(&a_srv_stake->subtype.srv_stake.fee_addr); + json_object *l_obj_hldr_addr = dap_chain_addr_to_json(&a_srv_stake->subtype.srv_stake.hldr_addr); + json_object *l_obj_signing_addr = dap_chain_addr_to_json(&a_srv_stake->subtype.srv_stake.signing_addr); + char *l_signer_node_addr = dap_strdup_printf( + NODE_ADDR_FP_STR, + NODE_ADDR_FP_ARGS_S(a_srv_stake->subtype.srv_stake.signer_node_addr)); + json_object *l_obj_signer_node_addr = json_object_new_string(l_signer_node_addr); + DAP_DELETE(l_signer_node_addr); + json_object_object_add(l_object, "value", l_obj_value); + json_object_object_add(l_object, "srvUID", l_obj_srv_uid); + json_object_object_add(l_object, "valueFee", l_obj_value_fee); + json_object_object_add(l_object, "feeAddr", l_obj_fee_addr); + json_object_object_add(l_object, "hldrAddr", l_obj_hldr_addr); + json_object_object_add(l_object, "signindAddr", l_obj_signing_addr); + json_object_object_add(l_object, "signerNodeAddr", l_obj_signer_node_addr); + return l_object; + } + return NULL; +} + +/** + * @brief dap_chain_net_srv_stake_lock_create_cond_out + * @param a_key + * @param a_srv_uid + * @param a_value + * @param a_time_staking + * @param token + * @return + */ +dap_chain_tx_out_cond_t *dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, + uint256_t a_value, uint64_t a_time_staking, + uint256_t a_reinvest_percent, bool create_base_tx) +{ + if (IS_ZERO_256(a_value)) + return NULL; + dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_out_cond_t); + 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_LOCK; + l_item->header.srv_uid = a_srv_uid; + l_item->subtype.srv_stake_lock.reinvest_percent = a_reinvest_percent; + if (a_time_staking) { +// l_item->header.ts_expires = dap_time_now() + a_time_staking; + l_item->subtype.srv_stake_lock.time_unlock = dap_time_now() + a_time_staking; + l_item->subtype.srv_stake_lock.flags |= DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME; + } + if (create_base_tx) + l_item->subtype.srv_stake_lock.flags |= DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_CREATE_BASE_TX; + if (a_key) + dap_hash_fast(a_key->pkey, a_key->header.size, &l_item->subtype.srv_stake_lock.pkey_delegated); + + return l_item; +} + +json_object *dap_chain_net_srv_stake_lock_cond_out_to_json(dap_chain_tx_out_cond_t *a_stake_lock) +{ + if (a_stake_lock->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK) { + json_object *l_object = json_object_new_object(); + char *l_value = dap_chain_balance_print(a_stake_lock->header.value); + json_object *l_obj_value = json_object_new_string(l_value); + DAP_DELETE(l_value); + json_object *l_obj_srv_uid = json_object_new_uint64(a_stake_lock->header.srv_uid.uint64); + char *l_reinvest_precent = dap_chain_balance_print(a_stake_lock->subtype.srv_stake_lock.reinvest_percent); + json_object *l_obj_reinvest_percent = json_object_new_string(l_reinvest_precent); + DAP_DELETE(l_reinvest_precent); + json_object *l_obj_time_unlock = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.time_unlock); + json_object *l_obj_flags = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.flags); + char *l_pkey_delegate_hash = dap_hash_fast_to_str_new(&a_stake_lock->subtype.srv_stake_lock.pkey_delegated); + json_object *l_obj_pkey_delegate_hash = json_object_new_string(l_pkey_delegate_hash); + DAP_DELETE(l_pkey_delegate_hash); + json_object_object_add(l_object, "value", l_obj_value); + json_object_object_add(l_object, "srvUID", l_obj_srv_uid); + json_object_object_add(l_object, "reinvestPercent", l_obj_reinvest_percent); + json_object_object_add(l_object, "timeUnlock", l_obj_time_unlock); + json_object_object_add(l_object, "flags", l_obj_flags); + json_object_object_add(l_object, "pkeyDelegateHash", l_obj_pkey_delegate_hash); + return l_object; + } + return NULL; +} + /** * Create item dap_chain_tx_sig_t * @@ -438,6 +671,15 @@ dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, co return l_tx_sig; } +json_object* dap_chain_datum_tx_item_sig_to_json(const dap_chain_tx_sig_t *a_sig){ + json_object *l_object = json_object_new_object(); + json_object *l_sign_size = json_object_new_uint64(a_sig->header.sig_size); + json_object *l_sign = dap_sign_to_json((dap_sign_t*)a_sig->sig); + json_object_object_add(l_object, "signSize", l_sign_size); + json_object_object_add(l_object, "sign", l_sign); + return l_object; +} + /** * Get sign from sign item * diff --git a/modules/common/dap_chain_datum_tx_receipt.c b/modules/common/dap_chain_datum_tx_receipt.c index dd3148ed05cb907af7734cad06ce591580606113..8c8010827779c93a3ecacfb5624a987895ec8dea 100644 --- a/modules/common/dap_chain_datum_tx_receipt.c +++ b/modules/common/dap_chain_datum_tx_receipt.c @@ -155,3 +155,24 @@ uint16_t dap_chain_datum_tx_receipt_signs_count(dap_chain_datum_tx_receipt_t * a log_it(L_ERROR, "Receipt 0x%zu (size=%zu) is corrupted", (size_t)a_receipt, a_receipt_size); return l_ret; } + +json_object *dap_chain_datum_tx_receipt_to_json(dap_chain_datum_tx_receipt_t *a_receipt) { + json_object *l_obj = json_object_new_object(); + json_object *l_obj_info = dap_chain_receipt_info_to_json(&a_receipt->receipt_info); + json_object *l_obj_size = json_object_new_uint64(a_receipt->size); + //Provider + dap_sign_t *l_first_sign = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 1); + //Client + dap_sign_t *l_second_sign = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 2); + json_object *l_obj_signs = json_object_new_object(); + json_object *l_obj_provider_sign = dap_sign_to_json(l_first_sign); + json_object *l_obj_client_sign = dap_sign_to_json(l_second_sign); + json_object_object_add(l_obj_signs, "provider", l_obj_provider_sign); + json_object_object_add(l_obj_signs, "client", l_obj_client_sign); + json_object *l_exts_data = json_object_new_string_len((char *)a_receipt->exts_n_signs, a_receipt->exts_size); + json_object_object_add(l_obj, "info", l_obj_info); + json_object_object_add(l_obj, "size", l_obj_size); + json_object_object_add(l_obj, "sings", l_obj_signs); + json_object_object_add(l_obj, "extsData", l_exts_data); + return l_obj; +} diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h index 49d7febfbc31cb0265fa528e14b25b3404785ae5..b85660693b5cdd16804cd194ac8dda09ec1b2f8a 100644 --- a/modules/common/include/dap_chain_common.h +++ b/modules/common/include/dap_chain_common.h @@ -32,6 +32,7 @@ #include "dap_pkey.h" #include "dap_sign.h" #include "dap_hash.h" +#include <json-c/json.h> #define DAP_CHAIN_ADDR_VERSION_CURRENT 1 @@ -162,7 +163,7 @@ typedef union { extern const dap_chain_net_srv_uid_t c_dap_chain_net_srv_uid_null; extern const dap_chain_cell_id_t c_dap_chain_cell_id_null; -enum serv_unit_enum { +enum dap_chain_srv_unit_enum { SERV_UNIT_UNDEFINED = 0 , SERV_UNIT_MB = 0x00000001, // megabytes SERV_UNIT_SEC = 0x00000002, // seconds @@ -171,10 +172,11 @@ enum serv_unit_enum { SERV_UNIT_B = 0x00000011, // bytes SERV_UNIT_PCS = 0x00000022 // pieces }; -typedef uint32_t serv_unit_enum_t; +typedef uint32_t dap_chain_srv_unit_enum_t; -DAP_STATIC_INLINE const char *serv_unit_enum_to_str(serv_unit_enum_t *unit_enum){ - switch (*unit_enum) { +DAP_STATIC_INLINE const char *dap_chain_srv_unit_enum_to_str(dap_chain_srv_unit_enum_t a_unit_enum) +{ + switch (a_unit_enum) { case SERV_UNIT_UNDEFINED: return "SERV_UNIT_UNDEFINED"; case SERV_UNIT_MB: return "SERV_UNIT_MB"; case SERV_UNIT_SEC: return "SERV_UNIT_SEC"; @@ -189,7 +191,7 @@ DAP_STATIC_INLINE const char *serv_unit_enum_to_str(serv_unit_enum_t *unit_enum) typedef union { uint8_t raw[4]; uint32_t uint32; - serv_unit_enum_t enm; + dap_chain_srv_unit_enum_t enm; } DAP_ALIGN_PACKED dap_chain_net_srv_price_unit_uid_t; enum dap_chain_tx_item_type { @@ -237,12 +239,19 @@ typedef struct dap_chain_receipt_info { extern "C" { #endif +json_object* dap_chain_receipt_info_to_json(dap_chain_receipt_info_t *a_info); + size_t dap_chain_hash_slow_to_str(dap_chain_hash_slow_t * a_hash, char * a_str, size_t a_str_max); char* dap_chain_addr_to_str(const dap_chain_addr_t *a_addr); +json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr); dap_chain_addr_t* dap_chain_addr_from_str(const char *str); bool dap_chain_addr_is_blank(const dap_chain_addr_t *a_addr); +DAP_STATIC_INLINE json_object *dap_chain_net_id_to_json(dap_chain_net_id_t a_net_id) { + return json_object_new_uint64(a_net_id.uint64); +} + dap_chain_net_srv_uid_t dap_chain_net_srv_uid_from_str(const char* a_str); void dap_chain_addr_fill(dap_chain_addr_t *a_addr, dap_sign_type_t a_type, dap_chain_hash_fast_t *a_pkey_hash, dap_chain_net_id_t a_net_id); diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h index 8bd2c7419f214a05f82e7a9811aa12abd6b5e033..85a05c7560a4c2dfacc64abc911dedf86ec30e6e 100644 --- a/modules/common/include/dap_chain_datum.h +++ b/modules/common/include/dap_chain_datum.h @@ -29,6 +29,7 @@ #include "dap_chain_common.h" #include "dap_chain_datum_tx.h" #include "dap_chain_datum_token.h" +#include <json-c/json.h> #define DAP_CHAIN_DATUM_VERSION 0x00 @@ -176,3 +177,4 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, dap_string_t *a_str_out, const char *a_hash_out_type, dap_hash_fast_t *a_tx_hash); +json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum); diff --git a/modules/common/include/dap_chain_datum_tx.h b/modules/common/include/dap_chain_datum_tx.h index d4f53f1efcf6324d533891b827a4e3a2a0d8f742..b0b50c0b2227adb543565ec9c3aa17492dc0326d 100644 --- a/modules/common/include/dap_chain_datum_tx.h +++ b/modules/common/include/dap_chain_datum_tx.h @@ -27,6 +27,7 @@ #include "dap_enc_key.h" #include "dap_chain_common.h" #include "dap_time.h" +#include <json-c/json.h> typedef enum dap_chain_tx_cond_type { COND_SERVICE_PROVIDE = 0x20, // @@ -139,3 +140,5 @@ int dap_chain_datum_tx_add_sign_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t * return 1 Ok, 0 Invalid sign, -1 Not found sing or other Error */ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *a_tx); + +json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx); diff --git a/modules/common/include/dap_chain_datum_tx_in_ems.h b/modules/common/include/dap_chain_datum_tx_in_ems.h index c0f46fbeecf0e6011e5ec50ab534996ce84b2f34..f3aa0cfc0cbea2feeec70fe6d52368db142524ef 100644 --- a/modules/common/include/dap_chain_datum_tx_in_ems.h +++ b/modules/common/include/dap_chain_datum_tx_in_ems.h @@ -38,7 +38,7 @@ typedef struct dap_chain_tx_in_ems { char ticker[DAP_CHAIN_TICKER_SIZE_MAX]; uint8_t padding; // Padding dap_chain_id_t token_emission_chain_id; - dap_chain_hash_fast_t token_emission_hash; + dap_hash_fast_t token_emission_hash; } header; /// Only header's hash is used for verification } DAP_ALIGN_PACKED dap_chain_tx_in_ems_t; diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h index 050909ccd2bda840e6d62292163d7238f756186c..0a728612d4ebe6f48eeaaecacf03978d09c9455d 100644 --- a/modules/common/include/dap_chain_datum_tx_items.h +++ b/modules/common/include/dap_chain_datum_tx_items.h @@ -104,12 +104,14 @@ dap_chain_tx_out_cond_subtype_t dap_chain_tx_out_cond_subtype_from_str(const cha size_t dap_chain_datum_item_tx_get_size(const void *a_item); /** - * Create item dap_chain_tx_token_t + * Create item dap_chain_tx_in_ems_t * * return item, NULL Error */ dap_chain_tx_in_ems_t *dap_chain_datum_tx_item_token_create(dap_chain_id_t a_id, dap_chain_hash_fast_t *a_datum_token_hash, const char *a_ticker); +json_object *dap_chain_datum_tx_item_in_ems_to_json(const dap_chain_tx_in_ems_t *a_in_ems); + /** * Create item dap_chain_tx_out_old_t * @@ -117,11 +119,18 @@ dap_chain_tx_in_ems_t *dap_chain_datum_tx_item_token_create(dap_chain_id_t a_id, */ dap_chain_tx_in_t* dap_chain_datum_tx_item_in_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx); +json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in); + dap_chain_tx_tsd_t *dap_chain_datum_tx_item_tsd_create(void *a_data, int a_type, size_t a_size); +json_object* dap_chain_datum_tx_item_tsd_to_json(dap_chain_tx_tsd_t *a_tsd); + dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx, uint32_t a_receipt_idx); + +json_object* dap_chain_datum_tx_item_in_cond_to_json(dap_chain_tx_in_cond_t *a_in_cond); + /** * Create item dap_chain_tx_out_old_t * @@ -129,6 +138,8 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa */ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value); +json_object* dap_chain_datum_tx_item_out_to_json(const dap_chain_tx_out_t *a_out); + /** * Create item dap_chain_tx_out_ext_t * @@ -136,6 +147,8 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a */ dap_chain_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); +json_object* dap_chain_datum_tx_item_out_ext_to_json(const dap_chain_tx_out_ext_t *a_out_ext); + /** * Create item dap_chain_tx_out_cond_t with fee subtype * @@ -143,6 +156,8 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a */ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a_value); +json_object *dap_chain_datum_tx_item_out_cond_fee_to_json(dap_chain_tx_out_cond_t *a_fee); + /** * Create item dap_chain_tx_out_cond_t with fee stake subtype * @@ -159,6 +174,9 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_pke 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); + +json_object *dap_chain_datum_tx_item_out_cond_srv_pay_to_json(dap_chain_tx_out_cond_t *a_srv_pay); + /** * Create item dap_chain_tx_out_cond_t for eXchange service * @@ -168,6 +186,9 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap uint256_t a_value_sell, dap_chain_net_id_t a_buy_net_id, const char *a_token, uint256_t a_value_buy, const dap_chain_addr_t *a_seller_addr, const void *a_params, uint32_t a_params_size); + +json_object* dap_chain_datum_tx_item_out_cond_srv_xchange_to_json(dap_chain_tx_out_cond_t* a_srv_xchange); + /** * Create item dap_chain_tx_out_cond_t for stake service * @@ -176,6 +197,17 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap 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, uint256_t a_value, uint256_t a_fee_value, dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr, dap_chain_addr_t *a_signing_addr, dap_chain_node_addr_t *a_signer_node_addr); + +json_object *dap_chain_datum_tx_item_out_cond_srv_stake_to_json(dap_chain_tx_out_cond_t* a_srv_stake); + +// Create cond out +dap_chain_tx_out_cond_t *dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, + uint256_t a_value, uint64_t a_time_staking, + uint256_t a_reinvest_percent, bool create_base_tx); + +json_object *dap_chain_net_srv_stake_lock_cond_out_to_json(dap_chain_tx_out_cond_t *a_stake_lock); + + /** * Create item dap_chain_tx_sig_t * @@ -183,6 +215,8 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c */ 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); +json_object* dap_chain_datum_tx_item_sig_to_json(const dap_chain_tx_sig_t *a_sig); + /** * Get sign from sign item * diff --git a/modules/common/include/dap_chain_datum_tx_out_cond.h b/modules/common/include/dap_chain_datum_tx_out_cond.h index 2e41d3497b6cb32aa59bb839a7c4bdda3fa101e6..f46a079278fe8bb5b9e84c832eecef8ccff0edc0 100644 --- a/modules/common/include/dap_chain_datum_tx_out_cond.h +++ b/modules/common/include/dap_chain_datum_tx_out_cond.h @@ -53,6 +53,18 @@ DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_ return "UNDEFINED"; } +// Allow to spend stake by network +// Need for service staking to enable network governance to fee the service provider +#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_ENABLE_NET_FEE 0x00000001 +// Delegate token to prove thats stake is provided +#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_DELEGATE_TOKEN 0x00000002 +// Delegate public key's hash +#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_DELEGATE_PKEY 0x00000004 +// Lock by time +#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME 0x00000008 +// Create base tx for delegated token +#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_CREATE_BASE_TX 0x00000010 + /** * @struct dap_chain_tx_out * @brief Transaction item out_cond diff --git a/modules/common/include/dap_chain_datum_tx_receipt.h b/modules/common/include/dap_chain_datum_tx_receipt.h index f534726ab692883f63990258dba512c817106d67..df8cc3bad94edf9936d6c6b218f3453b5d81411e 100644 --- a/modules/common/include/dap_chain_datum_tx_receipt.h +++ b/modules/common/include/dap_chain_datum_tx_receipt.h @@ -49,6 +49,7 @@ dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create(dap_chain_net_s uint64_t units, uint256_t value_datoshi, const void * a_ext, size_t a_ext_size); dap_chain_datum_tx_receipt_t *dap_chain_datum_tx_receipt_sign_add(dap_chain_datum_tx_receipt_t *a_receipt, dap_enc_key_t *a_key); +json_object *dap_chain_datum_tx_receipt_to_json(dap_chain_datum_tx_receipt_t *a_receipt); dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size , uint16_t sign_position); uint32_t dap_chain_datum_tx_receipt_utype_get(dap_chain_datum_tx_receipt_t * l_receipt); uint64_t dap_chain_datum_tx_receipt_srv_uid_get(dap_chain_datum_tx_receipt_t * l_receipt); diff --git a/modules/mempool/CMakeLists.txt b/modules/mempool/CMakeLists.txt index 42a266f33071d3f7125f2369c13c5a05803073ab..c187a6b5398d8f280cd9e7853100629b95a65c78 100644 --- a/modules/mempool/CMakeLists.txt +++ b/modules/mempool/CMakeLists.txt @@ -6,6 +6,6 @@ file(GLOB DAP_CHAIN_MEMPOOL_HDR include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_MEMPOOL_SRC} ${DAP_CHAIN_MEMPOOL_HDR}) -target_link_libraries(${PROJECT_NAME} dap_http_server dap_client dap_chain_net dap_global_db dap_core) +target_link_libraries(${PROJECT_NAME} dap_http_server dap_client dap_chain_net dap_global_db dap_core dap_json_rpc) target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 16ed3ec3935a2ad55c21293f421973a63cdf979a..0924bf90961938b4afbcb4f1ff674b6bcc288f4d 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -64,6 +64,7 @@ #include "dap_chain_datum_tx.h" #include "dap_chain_datum_tx_items.h" #include "dap_chain_net_srv.h" +#include "dap_chain_mempool_rpc.h" #define LOG_TAG "dap_chain_mempool" @@ -74,6 +75,7 @@ static void s_tx_create_massive_gdb_save_callback(dap_global_db_context_t *a_glo int dap_datum_mempool_init(void) { + dap_chain_mempool_rpc_init(); return 0; } diff --git a/modules/mempool/dap_chain_mempool_rpc.c b/modules/mempool/dap_chain_mempool_rpc.c new file mode 100644 index 0000000000000000000000000000000000000000..28b7ad35ea4680d582c40ce512eceb47a1f4a0ac --- /dev/null +++ b/modules/mempool/dap_chain_mempool_rpc.c @@ -0,0 +1,102 @@ +#include "dap_chain_mempool_rpc.h" +#include "dap_chain_mempool.h" + +#define LOG_TAG "dap_chain_mempool_rpc" + +int dap_chain_mempool_rpc_init(void) { + dap_json_rpc_registration_request_handler("mempool_list", dap_chain_mempool_rpc_handler_list); + dap_json_rpc_registration_request_handler("memtest", dap_chain_mempool_rpc_handler_test); + return 0; +} + +void dap_chain_mempool_rpc_handler_test(dap_json_rpc_params_t *a_params, + dap_json_rpc_response_t *a_response, const char *a_method) { + UNUSED(a_method); + char *l_tn = NULL; +// char *l_chain_str = NULL; + for (uint32_t i = 0; i < a_params->lenght; i++) { + dap_json_rpc_param_t *l_prm = a_params->params[i]; + if (i == 0) + l_tn = l_prm->value_param; + } + if (dap_strcmp(l_tn, "NULL") == 0) { + a_response->type_result = TYPE_RESPONSE_NULL; + } else if (dap_strcmp(l_tn, "STRING") == 0) { + a_response->type_result = TYPE_RESPONSE_STRING; + a_response->result_string = dap_strdup("This test string"); + } else if (dap_strcmp(l_tn, "INTEGER") == 0) { + a_response->type_result = TYPE_RESPONSE_INTEGER; + a_response->result_int = 4555745; + } else if (dap_strcmp(l_tn, "BOOLEAN") == 0) { + a_response->type_result = TYPE_RESPONSE_BOOLEAN; + a_response->result_boolean = true; + } else if (dap_strcmp(l_tn, "DOUBLE") == 0) { + a_response->type_result = TYPE_RESPONSE_DOUBLE; + a_response->result_double = 75.545; + } else if (dap_strcmp(l_tn, "JSON") == 0) { + a_response->type_result = TYPE_RESPONSE_JSON; + json_object *l_obj = json_object_new_object(); + json_object *l_int = json_object_new_uint64(45577445); + json_object *l_boolean = json_object_new_boolean((json_bool)1); + json_object *l_double = json_object_new_double(457.74514); + json_object *l_arr = json_object_new_array(); + for (int i = 1000; i < 1997; i++) { + json_object *l_cur = json_object_new_int(i); + json_object_array_add(l_arr, l_cur); + } + json_object_object_add(l_obj, "int", l_int); + json_object_object_add(l_obj, "boolean", l_boolean); + json_object_object_add(l_obj, "double", l_double); + json_object_object_add(l_obj, "array", l_arr); + a_response->result_json_object = json_object_get(l_obj); + json_object_put(l_obj); + } else { + //set ERR code + } +} + +void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params, + dap_json_rpc_response_t *a_response, const char *a_method) { + char *l_net_str = NULL; + char *l_chain_str = NULL; + for (uint32_t i = 0; i < a_params->lenght; i++) { + dap_json_rpc_param_t *l_prm = a_params->params[i]; + if (i == 0) + l_net_str = l_prm->value_param; + if (i == 1) + l_chain_str = l_prm->value_param; + } + dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str); + a_response->type_result = TYPE_RESPONSE_STRING; + char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); + if(!l_gdb_group_mempool){ + a_response->result_string = "{\"datums\":[]}"; + return; + } + size_t l_objs_size = 0; + dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_gdb_group_mempool, &l_objs_size); + json_object *l_object = json_object_new_object(); + json_object *l_object_array = json_object_new_array(); + + for(size_t i = 0; i < l_objs_size; i++) { + dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value; + //dap_time_t l_ts_create = (dap_time_t) l_datum->header.ts_create; + if (!l_datum->header.data_size || (l_datum->header.data_size > l_objs[i].value_len)) { + log_it(L_ERROR, "Trash datum in GDB %s.%s, key: %s data_size:%u, value_len:%zu", + l_net->pub.name, l_chain->name, l_objs[i].key, l_datum->header.data_size, l_objs[i].value_len); + dap_global_db_del(l_objs[i].key, l_gdb_group_mempool, NULL, NULL); + continue; + } + + json_object *l_obj_datum = dap_chain_datum_to_json(l_datum); + json_object_array_add(l_object_array, l_obj_datum); + } + json_object_object_add(l_object, "datums", l_object_array); + a_response->type_result = TYPE_RESPONSE_JSON; + a_response->result_json_object = l_object; + + DAP_DELETE(l_gdb_group_mempool); +} + +#undef LOG_TAG diff --git a/modules/mempool/include/dap_chain_mempool_rpc.h b/modules/mempool/include/dap_chain_mempool_rpc.h new file mode 100644 index 0000000000000000000000000000000000000000..60388908103c0d002071f8d2c90126914214c82c --- /dev/null +++ b/modules/mempool/include/dap_chain_mempool_rpc.h @@ -0,0 +1,8 @@ +#pragma once +#include "dap_json_rpc.h" + +int dap_chain_mempool_rpc_init(void); +void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params, + dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_mempool_rpc_handler_test(dap_json_rpc_params_t *a_params, + dap_json_rpc_response_t *a_response, const char *a_method); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 80e1bda575225dc034cb7e6a82e0d40dee33ff6d..71ebb09d26a212ba5b4169f0190020f4fca0c338 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -737,11 +737,11 @@ int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) cmd_name = CMD_FLUSH; else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "record", NULL)) cmd_name = CMD_RECORD; - else if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "write", NULL)) + else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "write", NULL)) cmd_name = CMD_WRITE; - else if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "read", NULL)) + else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "read", NULL)) cmd_name = CMD_READ; - else if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "delete", NULL)) + else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "delete", NULL)) cmd_name = CMD_DELETE; switch (cmd_name) { case CMD_NAME_CELL: @@ -931,93 +931,91 @@ int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) } case CMD_WRITE: { - char *l_group_str = NULL; - char *l_key_str = NULL; - char *l_value_str = NULL; + const char *l_group_str = NULL; + const char *l_key_str = NULL; + const char *l_value_str = NULL; - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-value", &l_value_str); if(!l_group_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); return -120; } if(!l_key_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); return -121; } if(!l_value_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'value' to be valid", a_argv[0]); + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'value' to be valid", a_argv[0]); return -122; } - if(dap_chain_global_db_gr_set(l_key_str, l_value_str, strlen(l_value_str), l_group_str)) - { - dap_chain_node_cli_set_reply_text(a_str_reply, "Data has been successfully written to the database"); + if (dap_global_db_set(l_group_str, l_key_str, l_value_str, strlen(l_value_str), false, NULL, NULL)) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Data has been successfully written to the database"); return 0; - }else{ - dap_chain_node_cli_set_reply_text(a_str_reply, "Data writing is failed"); + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Data writing is failed"); return -124; } } case CMD_READ: { - char *l_group_str = NULL; - char *l_key_str = NULL; + const char *l_group_str = NULL; + const char *l_key_str = NULL; - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); if(!l_group_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); return -120; } if(!l_key_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); return -122; } size_t l_out_len = 0; - uint8_t *l_value_out = dap_chain_global_db_gr_get(l_key_str, &l_out_len, l_group_str); + uint8_t *l_value_out = dap_global_db_get_sync(l_group_str, l_key_str, &l_out_len, NULL, NULL); if (!l_value_out || !l_out_len) { - dap_chain_node_cli_set_reply_text(a_str_reply, "Record with key %s in group %s not found", l_key_str, l_group_str); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s not found", l_key_str, l_group_str); return -121; } - dap_chain_node_cli_set_reply_text(a_str_reply, "Group %s, key %s, data:\n %s", l_group_str, l_key_str, (char*)l_value_out); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Group %s, key %s, data:\n %s", l_group_str, l_key_str, (char*)l_value_out); return 0; } case CMD_DELETE: { - char *l_group_str = NULL; - char *l_key_str = NULL; + const char *l_group_str = NULL; + const char *l_key_str = NULL; - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-group", &l_group_str); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-key", &l_key_str); if(!l_group_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'group' to be valid", a_argv[0]); return -120; } if(!l_key_str) { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); + dap_cli_server_cmd_set_reply_text(a_str_reply, "%s requires parameter 'key' to be valid", a_argv[0]); return -121; } - if (dap_chain_global_db_gr_del(l_key_str, l_group_str)) - { - dap_chain_node_cli_set_reply_text(a_str_reply, "Record with key %s in group %s was deleted successfuly", l_key_str, l_group_str); + if (dap_global_db_del(l_group_str, l_key_str, NULL, NULL)) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s was deleted successfuly", l_key_str, l_group_str); return 0; - }else{ - dap_chain_node_cli_set_reply_text(a_str_reply, "Record with key %s in group %s deleting failed", l_group_str, l_key_str); + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Record with key %s in group %s deleting failed", l_group_str, l_key_str); return -122; } } diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index ed303f4c59590ad3ad9b3e6ce3156d6489f04e11..586451e479aa88793b51cc3418de9ee313b35d5a 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -1537,7 +1537,7 @@ int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply) dap_pkey_t *l_pkey = dap_cert_to_pkey(l_new_certs[i]); if(!l_pkey) { - log_it(L_WARNING,"New cert [%d] have no public key."); + log_it(L_WARNING,"New cert [%zu] have no public key.", i); l_failed_certs++; continue; } diff --git a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c index f02801c0c13a5782a5252ec002f48230374d6e51..013eb3293ef6b2ef9f714e9f95f4539b32966137 100644 --- a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c +++ b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c @@ -1359,40 +1359,6 @@ dap_chain_datum_t *dap_chain_net_srv_stake_lock_datum_create(dap_chain_net_t *a_ return l_datum; } -/** - * @brief dap_chain_net_srv_stake_lock_create_cond_out - * @param a_key - * @param a_srv_uid - * @param a_value - * @param a_time_staking - * @param token - * @return - */ -dap_chain_tx_out_cond_t *dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, - uint256_t a_value, uint64_t a_time_staking, - uint256_t a_reinvest_percent, bool create_base_tx) -{ - if (IS_ZERO_256(a_value)) - return NULL; - dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_out_cond_t); - 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_LOCK; - l_item->header.srv_uid = a_srv_uid; - l_item->subtype.srv_stake_lock.reinvest_percent = a_reinvest_percent; - if (a_time_staking) { -// l_item->header.ts_expires = dap_time_now() + a_time_staking; - l_item->subtype.srv_stake_lock.time_unlock = dap_time_now() + a_time_staking; - l_item->subtype.srv_stake_lock.flags |= DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME; - } - if (create_base_tx) - l_item->subtype.srv_stake_lock.flags |= DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_CREATE_BASE_TX; - if (a_key) - dap_hash_fast(a_key->pkey, a_key->header.size, &l_item->subtype.srv_stake_lock.pkey_delegated); - - return l_item; -} - dap_chain_datum_t *dap_chain_burning_tx_create(dap_chain_t *a_chain, dap_enc_key_t *a_key_from, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], diff --git a/modules/service/stake_lock/include/dap_chain_net_srv_stake_lock.h b/modules/service/stake_lock/include/dap_chain_net_srv_stake_lock.h index b6a086266f2d608db69b913264354a7ea59a4574..ea615ba5cb4602a966ce43357b5fd4ae5514da31 100644 --- a/modules/service/stake_lock/include/dap_chain_net_srv_stake_lock.h +++ b/modules/service/stake_lock/include/dap_chain_net_srv_stake_lock.h @@ -30,18 +30,6 @@ #define DAP_CHAIN_NET_SRV_STAKE_LOCK_ID 0x12 -// Allow to spend stake by network -// Need for service staking to enable network governance to fee the service provider -#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_ENABLE_NET_FEE 0x00000001 -// Delegate token to prove thats stake is provided -#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_DELEGATE_TOKEN 0x00000002 -// Delegate public key's hash -#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_DELEGATE_PKEY 0x00000004 -// Lock by time -#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME 0x00000008 -// Create base tx for delegated token -#define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_CREATE_BASE_TX 0x00000010 - /** * @brief The cond_params struct thats placed in tx_cond->params[] section */ @@ -50,10 +38,6 @@ int dap_chain_net_srv_stake_lock_init(void); void dap_chain_net_srv_stake_lock_deinit(void); -// Create cond out -dap_chain_tx_out_cond_t *dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, - uint256_t a_value, uint64_t a_time_staking, - uint256_t a_reinvest_percent, bool create_base_tx); // Create stake lock datum dap_chain_datum_t *dap_chain_net_srv_stake_lock_datum_create(dap_chain_net_t *a_net, dap_enc_key_t *a_key_from, dap_pkey_t *a_key_cond, diff --git a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h index 8d623501075b56cb9683f4b0ccb6ae7ed7106cdb..8d4067a88e4352f6da98096c486794c8f2a1dbed 100644 --- a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h @@ -44,7 +44,17 @@ typedef struct dap_chain_net_srv_stake_item { dap_chain_node_addr_t node_addr; UT_hash_handle hh; } dap_chain_net_srv_stake_item_t; - +/* +typedef struct dap_chain_net_srv_stake_item { + bool is_active; + dap_chain_net_t *net; + uint256_t value; + dap_chain_addr_t signing_addr; + dap_chain_hash_fast_t tx_hash; + dap_chain_node_addr_t node_addr; + UT_hash_handle hh; +} dap_chain_net_srv_stake_item_t; +*/ typedef struct dap_srv_stake_order_ext { dap_chain_addr_t addr_hldr; dap_chain_addr_t signing_addr;