diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index 63beb35923e2cd226799a56790172c84ffc8248a..581c26b64c10618639aece02164585574be2ae29 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -3516,9 +3516,19 @@ static json_object* s_dap_chain_net_srv_stake_reward_all(json_object* a_json_arr size_t l_arr_end = 0; s_set_offset_limit_json(json_obj_reward, &l_arr_start, &l_arr_end, a_limit, a_offset, a_chain->callback_count_tx(a_chain)); + if (a_node_info){ + json_object* json_obj_addr = json_object_new_object(); + char *l_addr_valid = dap_strdup_printf(NODE_ADDR_FP_STR,NODE_ADDR_FP_ARGS_S(a_node_info->address)); + json_object_object_add(json_obj_addr, "validator addr", json_object_new_string(l_addr_valid)); + DAP_DELETE(l_addr_valid); + json_object_array_add(json_obj_reward, json_obj_addr); + } + size_t i_tmp = 0; uint256_t l_value_total = uint256_0; + uint256_t l_value_total_calc = uint256_0; dap_chain_net_srv_stake_t *l_srv_stake = s_srv_stake_by_net_id(a_chain->net_id); + dap_chain_net_srv_stake_item_t *l_stake_valid = NULL; // load transactions dap_chain_datum_iter_t *l_datum_iter = a_chain->callback_datum_iter_create(a_chain); @@ -3535,13 +3545,20 @@ static json_object* s_dap_chain_net_srv_stake_reward_all(json_object* a_json_arr l_datum = iter_direc(l_datum_iter)) { dap_hash_fast_t l_ttx_hash = {0}; - dap_chain_hash_fast_t l_datum_hash; + dap_chain_hash_fast_t l_datum_hash; + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data; + dap_hash_fast(l_tx, l_datum->header.data_size, &l_ttx_hash); + const char *l_tx_token_ticker = NULL; if (a_limit && i_tmp >= l_arr_end) break; if (l_datum->header.type_id != DAP_CHAIN_DATUM_TX) // go to next datum continue; - + l_tx_token_ticker = l_datum_iter ? l_datum_iter->token_ticker + : dap_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &l_ttx_hash); + //dap_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_datum_hash); + if (!l_tx_token_ticker)//DECLINED transaction + continue; if (a_time_form && l_datum->header.ts_create < a_time_form) continue; if (a_time_to && l_datum->header.ts_create >= a_time_to) @@ -3549,7 +3566,7 @@ static json_object* s_dap_chain_net_srv_stake_reward_all(json_object* a_json_arr if (i_tmp >= l_arr_end) break; - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data; + dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN_REWARD, NULL); if (!l_list_in_items) // a bad tx continue; @@ -3557,106 +3574,97 @@ static json_object* s_dap_chain_net_srv_stake_reward_all(json_object* a_json_arr i_tmp++; continue; } - // all in items should be from the same address - dap_hash_fast(l_tx, l_datum->header.data_size, &l_ttx_hash); - dap_hash_fast(l_datum, dap_chain_datum_size(l_datum), &l_datum_hash); + // all in items should be from the same address + if (a_node_info) { + dap_hash_fast_t pkey_hash_tx = {}; + int l_item_cnt = 0; + dap_list_t *l_signs_list = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_SIG, &l_item_cnt); + bool l_flag_continue = true; + + if (!l_signs_list) { + log_it(L_WARNING, "Can't get signs from tx %s", dap_chain_hash_fast_to_str_static(&l_ttx_hash)); + continue; + } + while(l_signs_list) { + dap_chain_tx_sig_t *l_vote_sig = (dap_chain_tx_sig_t *)(l_signs_list->data); + dap_sign_get_pkey_hash((dap_sign_t*)l_vote_sig->sig, &pkey_hash_tx); + + char l_pkey_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&pkey_hash_tx, l_pkey_hash_str, sizeof(l_pkey_hash_str)); + l_stake_valid = NULL; + HASH_FIND(hh, l_srv_stake->itemlist, &pkey_hash_tx, sizeof(dap_hash_fast_t), l_stake_valid); + if (l_stake_valid && (a_node_info->address.uint64 == l_stake_valid->node_addr.uint64)) { + l_flag_continue = false; + break; + } + l_signs_list = l_signs_list->next; + } + if (l_flag_continue) continue; + dap_list_free(l_signs_list); + } + json_object* json_obj_hash = json_object_new_object(); json_object_object_add(json_obj_hash, "tx_hash", json_object_new_string(dap_chain_hash_fast_to_str_static(&l_ttx_hash))); - json_object_array_add(json_obj_reward, json_obj_hash); + json_object_array_add(json_obj_reward, json_obj_hash); - /* - const char * l_tx_token_ticker = l_datum_iter ? l_datum_iter->token_ticker - : dap_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_datum_hash);*/ json_object* json_arr_sign_out = NULL; json_object* json_block_hash = NULL; uint256_t l_value_reward = uint256_0, l_value_out = uint256_0; - + l_value_total_calc = uint256_0; dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); - dap_list_t *l_list_out_cond_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_COND, NULL); for(dap_list_t *it = l_list_out_items; it; it = it->next) { dap_chain_tx_out_t *l_tx_out = (dap_chain_tx_out_t *)it->data; SUM_256_256(l_value_out, l_tx_out->header.value, &l_value_out); - } - for(dap_list_t *it = l_list_out_cond_items; it; it = it->next) { - dap_chain_tx_out_cond_t *l_tx_out_cound = (dap_chain_tx_out_cond_t *)it->data; - SUM_256_256(l_value_out, l_tx_out_cound->header.value, &l_value_out); - } + } dap_list_free(l_list_out_items); - dap_list_free(l_list_out_cond_items); - - for(dap_list_t *it = l_list_in_items; it; it = it->next) - { - dap_chain_tx_in_reward_t *l_in_reward = (dap_chain_tx_in_reward_t *) it->data; - dap_chain_block_cache_t *l_block_cache = dap_chain_block_cache_get_by_hash(DAP_CHAIN_CS_BLOCKS(a_chain), &l_in_reward->block_hash); - char *l_block_hash = NULL; - json_arr_sign_out = json_object_new_array(); - l_block_hash = dap_chain_hash_fast_to_str_new(&l_in_reward->block_hash); - json_block_hash = json_object_new_object(); - json_object_object_add(json_block_hash, "block hash", json_object_new_string(l_block_hash)); - DAP_DELETE(l_block_hash); - - - for (uint32_t i=0; i < l_block_cache->sign_count ; i++) { - if (!json_arr_sign_out) { - json_arr_sign_out = json_object_new_array(); - l_block_hash = dap_chain_hash_fast_to_str_new(&l_in_reward->block_hash); - json_block_hash = json_object_new_object(); - json_object_object_add(json_block_hash, "block hash", json_object_new_string(l_block_hash)); - DAP_DELETE(l_block_hash); - } - - dap_sign_t * l_sign = dap_chain_block_sign_get(l_block_cache->block, l_block_cache->block_size, i); + if (!a_brief) { + for(dap_list_t *it = l_list_in_items; it; it = it->next) + { + dap_chain_tx_in_reward_t *l_in_reward = (dap_chain_tx_in_reward_t *) it->data; + dap_chain_block_cache_t *l_block_cache = dap_chain_block_cache_get_by_hash(DAP_CHAIN_CS_BLOCKS(a_chain), &l_in_reward->block_hash); + json_arr_sign_out = json_object_new_array(); + json_block_hash = json_object_new_object(); + json_object_object_add(json_block_hash, "block hash", json_object_new_string(dap_chain_hash_fast_to_str_static(&l_in_reward->block_hash))); + dap_sign_t *l_sign = dap_chain_block_sign_get(l_block_cache->block, l_block_cache->block_size, 0); size_t l_sign_size = dap_sign_get_size(l_sign); dap_chain_hash_fast_t l_pkey_hash; dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); char l_pkey_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_to_str(&l_pkey_hash, l_pkey_hash_str, sizeof(l_pkey_hash_str)); - dap_chain_net_srv_stake_item_t *l_stake = NULL; - HASH_FIND(hh, l_srv_stake->itemlist, &l_pkey_hash, sizeof(dap_hash_fast_t), l_stake); - if (a_node_info) { - if (!l_stake || a_node_info->address.uint64 != l_stake->node_addr.uint64) { - if (json_object_array_length(json_arr_sign_out) == 0) { - json_object_put(json_arr_sign_out); - json_object_put(json_block_hash); - json_arr_sign_out = NULL; - json_block_hash = NULL; - } - continue; - } - } json_object* json_obj_sign = json_object_new_object(); - if (l_stake && !a_brief) { - char *l_addr = dap_strdup_printf(""NODE_ADDR_FP_STR"",NODE_ADDR_FP_ARGS_S(l_stake->node_addr)); - json_object_object_add(json_obj_sign, "validator addr", json_object_new_string(l_addr)); - DAP_DELETE(l_addr); - } + json_object_object_add(json_obj_sign, "pkey_hash",json_object_new_string(l_pkey_hash_str)); + dap_pkey_t * l_block_sign_pkey = dap_pkey_get_from_sign(l_sign); l_value_reward = a_chain->callback_calc_reward(a_chain, &l_block_cache->block_hash, - l_block_sign_pkey); + l_block_sign_pkey); DAP_DELETE(l_block_sign_pkey); - if (!a_brief) { - json_object_object_add(json_obj_sign, "pkey_hash",json_object_new_string(l_pkey_hash_str)); - const char *l_coins_str, + const char *l_coins_str, *l_value_str = dap_uint256_to_char(l_value_reward, &l_coins_str); - json_object_object_add(json_obj_sign, "reward value", json_object_new_string(l_value_str)); - json_object_object_add(json_obj_sign, "reward coins", json_object_new_string(l_coins_str)); - } + json_object_object_add(json_obj_sign, "reward value", json_object_new_string(l_value_str)); + json_object_object_add(json_obj_sign, "reward coins", json_object_new_string(l_coins_str)); + if (json_object_object_length(json_obj_sign)) - json_object_array_add(json_arr_sign_out, json_obj_sign); - } - SUM_256_256(l_value_total, l_value_reward, &l_value_total); - l_value_reward = uint256_0; - if (json_arr_sign_out && json_object_array_length(json_arr_sign_out) > 0) { - json_object_object_add(json_block_hash, "REWARDS", json_arr_sign_out); + json_object_array_add(json_arr_sign_out, json_obj_sign); + SUM_256_256(l_value_total_calc, l_value_reward, &l_value_total_calc); + l_value_reward = uint256_0; json_object_array_add(json_obj_reward, json_block_hash); - } + json_object_array_add(json_obj_reward, json_arr_sign_out); + } + const char *l_coins_t_out_str, *l_value_t_str; + json_object* json_value_t_out = json_object_new_object(); + l_value_t_str = dap_uint256_to_char(l_value_total_calc, &l_coins_t_out_str); + json_object_object_add(json_value_t_out, "Rewards value (calculated)", json_object_new_string(l_value_t_str)); + json_object_object_add(json_value_t_out, "Rewards coins (calculated)", json_object_new_string(l_coins_t_out_str)); + json_object_array_add(json_obj_reward, json_value_t_out); } + const char *l_coins_out_str, *l_value_str; json_object* json_value_out = json_object_new_object(); + SUM_256_256(l_value_total, l_value_out, &l_value_total); l_value_str = dap_uint256_to_char(l_value_out, &l_coins_out_str); - json_object_object_add(json_value_out, "Rewards value (calculated)", json_object_new_string(l_value_str)); - json_object_object_add(json_value_out, "Rewards coins (calculated)", json_object_new_string(l_coins_out_str)); + json_object_object_add(json_value_out, "Rewards value (tx_out)", json_object_new_string(l_value_str)); + json_object_object_add(json_value_out, "Rewards coins (tx_out)", json_object_new_string(l_coins_out_str)); json_object_array_add(json_obj_reward, json_value_out); i_tmp++; dap_list_free(l_list_in_items);