From b0ea11a176313992fef9bcbb5ac6ca8dfafe2518 Mon Sep 17 00:00:00 2001 From: "alexey.stratulat" <alexey.stratulat@demlabs.net> Date: Mon, 8 Jul 2024 13:03:01 +0000 Subject: [PATCH] Bugfix 12175 --- modules/net/dap_chain_ledger.c | 168 ++++++++++++++---------- modules/net/dap_chain_node_cli_cmd_tx.c | 56 ++++++-- modules/net/include/dap_chain_ledger.h | 1 + 3 files changed, 144 insertions(+), 81 deletions(-) diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index feb006a659..b276d6100e 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -2230,6 +2230,81 @@ dap_list_t * dap_ledger_token_auth_pkeys_hashes(dap_ledger_t *a_ledger, const ch return l_ret; } +json_object *s_token_item_to_json(dap_ledger_token_item_t *a_token_item) { + json_object *json_obj_datum = json_object_new_object(); + const char *l_type_str; + switch (a_token_item->type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: { + switch (a_token_item->subtype) { + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: + l_type_str = "SIMPLE"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: + l_type_str = "PRIVATE"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: + l_type_str = "CF20"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC: + l_type_str = "PUBLIC"; break; + default: l_type_str = "UNKNOWN"; break; + } + }break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: { + switch (a_token_item->subtype) { + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: + l_type_str = "SIMPLE"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: + l_type_str = "PRIVATE_UPDATE"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: + l_type_str = "CF20_UPDATE"; break; + default: l_type_str = "UNKNOWN"; break; + } + } break; + default: + l_type_str = "UNKNOWN"; break; + } + if ((a_token_item->subtype != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE) + || (a_token_item->type != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC)) { + char *l_balance_cur = dap_chain_balance_print(a_token_item->current_supply); + char *l_balance_total = dap_chain_balance_print(a_token_item->total_supply); + json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(a_token_item->ticker)); + json_object_object_add(json_obj_datum, "type", json_object_new_string(l_type_str)); + json_object_object_add(json_obj_datum, "flags", json_object_new_string(s_flag_str_from_code(a_token_item->datum_token->header_native_decl.flags))); + json_object_object_add(json_obj_datum, "description", a_token_item->description_token_size != 0 ? + json_object_new_string(a_token_item->description_token) : + json_object_new_string("The token description is not set")); + json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur)); + json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total)); + json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18")); + json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(a_token_item->auth_signs_valid)); + json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(a_token_item->auth_signs_total)); + json_object_object_add(json_obj_datum, "TSD and Signs", json_object_new_string("")); + dap_datum_token_dump_tsd_to_json(json_obj_datum, a_token_item->datum_token, a_token_item->datum_token_size, "hex"); + size_t l_certs_field_size = a_token_item->datum_token_size - sizeof(*a_token_item->datum_token) - a_token_item->datum_token->header_native_decl.tsd_total_size; + dap_chain_datum_token_certs_dump_to_json(json_obj_datum, a_token_item->datum_token->data_n_tsd + a_token_item->datum_token->header_native_decl.tsd_total_size, + l_certs_field_size, "hex"); + json_object_object_add(json_obj_datum, "and TSD and Signs", json_object_new_string("")); + json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(a_token_item->token_emissions))); + DAP_DEL_Z(l_balance_cur); + DAP_DEL_Z(l_balance_total); + } else { + char *l_balance_cur = dap_chain_balance_print(a_token_item->current_supply); + char *l_balance_total = dap_chain_balance_print(a_token_item->total_supply); + json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(a_token_item->ticker)); + json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur)); + json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total)); + json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18")); + json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(a_token_item->auth_signs_valid)); + json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(a_token_item->auth_signs_total)); + json_object_object_add(json_obj_datum, "Signs", json_object_new_string("")); + size_t l_certs_field_size = a_token_item->datum_token_size - sizeof(*a_token_item->datum_token); + dap_chain_datum_token_certs_dump_to_json(json_obj_datum, a_token_item->datum_token->data_n_tsd, + l_certs_field_size, "hex"); + json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(a_token_item->token_emissions))); + DAP_DEL_Z(l_balance_cur); + DAP_DEL_Z(l_balance_total); + } + return json_obj_datum; +} + /** * @brief Compose string list of all tokens with information * @param a_ledger @@ -2264,85 +2339,32 @@ json_object *dap_ledger_token_info(dap_ledger_t *a_ledger, size_t a_limit, size_ i_tmp++; continue; } + json_obj_datum = s_token_item_to_json(l_token_item); + json_object_array_add(json_arr_out, json_obj_datum); i_tmp++; - json_obj_datum = json_object_new_object(); - const char *l_type_str; - switch (l_token_item->type) { - case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: { - switch (l_token_item->subtype) { - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: - l_type_str = "SIMPLE"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: - l_type_str = "PRIVATE"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: - l_type_str = "CF20"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC: - l_type_str = "PUBLIC"; break; - default: l_type_str = "UNKNOWN"; break; - } - }break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: { - switch (l_token_item->subtype) { - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: - l_type_str = "SIMPLE"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: - l_type_str = "PRIVATE_UPDATE"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: - l_type_str = "CF20_UPDATE"; break; - default: l_type_str = "UNKNOWN"; break; - } - } break; - default: - l_type_str = "UNKNOWN"; break; - } - if ((l_token_item->subtype != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE) - || (l_token_item->type != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC)) { - char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply); - char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply); - json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(l_token_item->ticker)); - json_object_object_add(json_obj_datum, "type", json_object_new_string(l_type_str)); - json_object_object_add(json_obj_datum, "flags", json_object_new_string(s_flag_str_from_code(l_token_item->datum_token->header_native_decl.flags))); - json_object_object_add(json_obj_datum, "description", l_token_item->description_token_size != 0 ? - json_object_new_string(l_token_item->description_token) : - json_object_new_string("The token description is not set")); - json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur)); - json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total)); - json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18")); - json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(l_token_item->auth_signs_valid)); - json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(l_token_item->auth_signs_total)); - json_object_object_add(json_obj_datum, "TSD and Signs", json_object_new_string("")); - dap_datum_token_dump_tsd_to_json(json_obj_datum, l_token_item->datum_token, l_token_item->datum_token_size, "hex"); - size_t l_certs_field_size = l_token_item->datum_token_size - sizeof(*l_token_item->datum_token) - l_token_item->datum_token->header_native_decl.tsd_total_size; - dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token_item->datum_token->data_n_tsd + l_token_item->datum_token->header_native_decl.tsd_total_size, - l_certs_field_size, "hex"); - json_object_object_add(json_obj_datum, "and TSD and Signs", json_object_new_string("")); - json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(l_token_item->token_emissions))); - json_object_array_add(json_arr_out, json_obj_datum); - DAP_DEL_Z(l_balance_cur); - DAP_DEL_Z(l_balance_total); - } else { - char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply); - char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply); - json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(l_token_item->ticker)); - json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur)); - json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total)); - json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18")); - json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(l_token_item->auth_signs_valid)); - json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(l_token_item->auth_signs_total)); - json_object_object_add(json_obj_datum, "Signs", json_object_new_string("")); - size_t l_certs_field_size = l_token_item->datum_token_size - sizeof(*l_token_item->datum_token); - dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token_item->datum_token->data_n_tsd, - l_certs_field_size, "hex"); - json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(l_token_item->token_emissions))); - json_object_array_add(json_arr_out, json_obj_datum); - DAP_DEL_Z(l_balance_cur); - DAP_DEL_Z(l_balance_total); - } + } pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); return json_arr_out; } +/** + * @breif Forms a JSON object with a token description for the specified ticker. + * @param a_ledger + * @param a_token_ticker + * @return + */ +json_object *dap_ledger_token_info_by_name(dap_ledger_t *a_ledger, const char *a_token_ticker) { + json_object *l_jobj = NULL; + dap_ledger_token_item_t *l_token_item = NULL; + HASH_FIND_STR(PVT(a_ledger)->tokens, a_token_ticker, l_token_item); + if (l_token_item) { + return s_token_item_to_json(l_token_item); + } else { + return json_object_new_null(); + } +} + /** * @brief Get all token declatations * @param a_ledger diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 4f1c02a87a..55d3b82805 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -802,6 +802,15 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, return json_arr_out; } +json_object *s_get_ticker(json_object *a_jobj_tickers, const char *a_token_ticker) { + json_object_object_foreach(a_jobj_tickers, key, value){ + if (dap_strcmp(a_token_ticker, key) == 0) { + return value; + } + } + return NULL; +} + /** * @brief show all tokens in chain * @@ -813,37 +822,68 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, */ static json_object* dap_db_chain_history_token_list(dap_chain_t * a_chain, const char *a_token_name, const char *a_hash_out_type, size_t *a_token_num) { + json_object *l_jobj_tickers = json_object_new_object(); if (!a_chain->callback_datum_iter_create) { log_it(L_WARNING, "Not defined datum iterators for chain \"%s\"", a_chain->name); return NULL; } size_t l_token_num = 0; - json_object* json_arr_history_token_out = json_object_new_array(); dap_chain_datum_iter_t *l_datum_iter = a_chain->callback_datum_iter_create(a_chain); for (dap_chain_datum_t *l_datum = a_chain->callback_datum_iter_get_first(l_datum_iter); l_datum; l_datum = a_chain->callback_datum_iter_get_next(l_datum_iter)) { if (l_datum->header.type_id != DAP_CHAIN_DATUM_TOKEN_DECL) continue; + size_t l_token_size = l_datum->header.data_size; + dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(l_datum->data, &l_token_size); if (a_token_name) { - size_t l_token_size = l_datum->header.data_size; - dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(l_datum->data, &l_token_size); - int l_cmp = dap_strcmp(l_token->ticker, a_token_name); - DAP_DELETE(l_token); - if (l_cmp) + if (dap_strcmp(a_token_name, l_token->ticker) != 0) { + DAP_DELETE(l_token); continue; + } + } + json_object *l_jobj_ticker = s_get_ticker(l_jobj_tickers, l_token->ticker); + json_object *l_jobj_decls = NULL; + json_object *l_jobj_updates = NULL; + if (!l_jobj_ticker) { + l_jobj_ticker = json_object_new_object(); + dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger; + json_object *l_current_state = dap_ledger_token_info_by_name(l_ledger, l_token->ticker); + json_object_object_add(l_jobj_ticker, "current state", l_current_state); + l_jobj_decls = json_object_new_array(); + l_jobj_updates = json_object_new_array(); + json_object_object_add(l_jobj_ticker, "declarations", l_jobj_decls); + json_object_object_add(l_jobj_ticker, "updates", l_jobj_updates); + json_object_object_add(l_jobj_tickers, l_token->ticker, l_jobj_ticker); + } else { + l_jobj_decls = json_object_object_get(l_jobj_ticker, "declarations"); + l_jobj_updates = json_object_object_get(l_jobj_ticker, "updates"); } int l_ret_code = l_datum_iter->ret_code; json_object* json_history_token = json_object_new_object(); json_object_object_add(json_history_token, "status", json_object_new_string(l_ret_code ? "DECLINED" : "ACCEPTED")); json_object_object_add(json_history_token, "Ledger return code", json_object_new_int(l_ret_code)); dap_chain_datum_dump_json(json_history_token, l_datum, a_hash_out_type, a_chain->net_id); - json_object_array_add(json_arr_history_token_out, json_history_token); + switch (l_token->type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_DECL: + case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: + json_object_array_add(l_jobj_decls, json_history_token); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_UPDATE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: + json_object_array_add(l_jobj_updates, json_history_token); + break; + } + DAP_DELETE(l_token); l_token_num++; } a_chain->callback_datum_iter_delete(l_datum_iter); if (a_token_num) *a_token_num = l_token_num; - return json_arr_history_token_out; + return l_jobj_tickers; } /** diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index e6d04d4ad2..c630c87bbf 100644 --- a/modules/net/include/dap_chain_ledger.h +++ b/modules/net/include/dap_chain_ledger.h @@ -264,6 +264,7 @@ int dap_ledger_token_load(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_toke int dap_ledger_token_decl_add_check(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size); char *dap_ledger_token_decl_add_err_code_to_str(int a_code); json_object *dap_ledger_token_info(dap_ledger_t *a_ledger, size_t a_limit, size_t a_offset); +json_object *dap_ledger_token_info_by_name(dap_ledger_t *a_ledger, const char *a_token_ticker); // Get all token-declarations dap_list_t* dap_ledger_token_decl_all(dap_ledger_t *a_ledger); -- GitLab