diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index b8e892c4f6c46ef25637fdbb618078723de985cf..90ad7a05a418c839de12a0b91cc6cd76a6d8da3a 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -809,9 +809,6 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast uint256_t l_value_transfer = {}; dap_chain_addr_t l_addr_fee = {}; dap_chain_addr_t* l_addr_from = NULL; - //dap_chain_tx_out_cond_t *l_tx_out_fee = NULL; - //dap_chain_tx_out_t *l_out_fee_net; - //dap_chain_tx_in_t *l_in; dap_list_t *l_list_used_out; const char *l_native_ticker = dap_chain_net_by_id(a_chain->net_id)->pub.native_ticker; bool not_native = dap_strcmp(a_ticker, l_native_ticker); @@ -821,7 +818,15 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t)); l_tx->header.ts_created = time(NULL); - + //in_ems + dap_chain_tx_in_ems_t *l_in_ems = dap_chain_datum_tx_item_in_ems_create(a_emission_chain_id, a_emission_hash, a_ticker); + if (l_in_ems) { + dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*)l_in_ems); + DAP_DELETE(l_in_ems); + } else { + dap_chain_datum_tx_delete(l_tx); + return NULL; + } if (not_native) { l_addr_from = DAP_NEW_Z(dap_chain_addr_t); @@ -869,9 +874,7 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast dap_chain_datum_tx_delete(l_tx); return NULL; } - } - else - {//nativ ticker + } else { //native ticker if (!IS_ZERO_256(a_value_fee)) SUBTRACT_256_256(l_value_need, a_value_fee, &l_value_need); if(l_net_fee_used){ @@ -886,17 +889,6 @@ char *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast return NULL; } } - //in_ems - dap_chain_tx_in_ems_t *l_tx_token = dap_chain_datum_tx_item_in_ems_create(a_emission_chain_id, a_emission_hash, a_ticker); - if(l_tx_token){ - dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_tx_token); - DAP_DEL_Z(l_tx_token); - } - else - { - dap_chain_datum_tx_delete(l_tx); - return NULL; - } if (!IS_ZERO_256(a_value_fee)){ if (!dap_chain_datum_tx_add_fee_item(&l_tx, a_value_fee)){ dap_chain_datum_tx_delete(l_tx); diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 3c32c1f4c5c581dfb40b954bd224bbb240328e98..7174f34d2011c8a50d5b433c00c4797454a7aaa2 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -278,7 +278,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) // Transaction history dap_cli_server_cmd_add("tx_history", com_tx_history, "Transaction history (for address or by hash)", - "tx_history {-addr <addr> | -w <wallet_name> | -tx <tx_hash>} -net <net_name> -chain <chain_name>\n"); + "tx_history {-addr <addr> | -w <wallet_name> | -tx <tx_hash>} [-net <net_name>] [-chain <chain_name>]\n"); // Ledger info dap_cli_server_cmd_add("ledger", com_ledger, "Ledger information", diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index ff6f17506b8d70174b07d7b40f5eddcdc48420c4..a1a8da9573a31406e11065adc058e4429b07245a 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -3839,9 +3839,6 @@ int com_token_emit(int a_argc, char **a_argv, char **a_str_reply) const char * l_chain_emission_str = NULL; dap_chain_t * l_chain_emission = NULL; - const char * l_chain_base_tx_str = NULL; - dap_chain_t * l_chain_base_tx = NULL; - dap_chain_net_t * l_net = NULL; const char * l_hash_out_type = NULL; @@ -3882,7 +3879,6 @@ int com_token_emit(int a_argc, char **a_argv, char **a_str_reply) } const char *l_add_sign = NULL; dap_chain_addr_t *l_addr = NULL; - dap_chain_addr_t *l_addr_from = NULL; dap_cli_server_cmd_find_option_val(a_argv, arg_index, arg_index + 1, "sign", &l_add_sign); if (!l_add_sign) { //Create the emission // Emission value @@ -3916,8 +3912,8 @@ int com_token_emit(int a_argc, char **a_argv, char **a_str_reply) if(l_chain_emission_str) { if((l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_emission_str)) == NULL) { // Can't find such chain dap_cli_server_cmd_set_reply_text(a_str_reply, - "token_emit requires parameter '-chain_base_tx' to be valid chain name in chain net %s or set default datum type in chain configuration file " - "but, if you need create emission has no base transaction, use flag '-no_base_tx'", l_net->pub.name); + "token_emit requires parameter '-chain_emission' to be valid chain name in chain net %s" + " or set default datum type in chain configuration file", l_net->pub.name); return -45; } } @@ -5191,82 +5187,83 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply) dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-chain", &l_chain_str); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-tx", &l_tx_hash_str); - if(!l_addr_base58 && !l_wallet_name && !l_tx_hash_str) { + if (!l_addr_base58 && !l_wallet_name && !l_tx_hash_str) { dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-addr' or '-w' or '-tx'"); return -1; } - // Select chain network - if(!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-net'"); + if (!l_net_str && !l_addr_base58) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-net' or '-addr'"); return -2; - } else { - if((l_net = dap_chain_net_by_name(l_net_str)) == NULL) { // Can't find such network - dap_cli_server_cmd_set_reply_text(a_str_reply, - "tx_history requires parameter '-net' to be valid chain network name"); - return -3; - } } - //Select chain emission - if (l_chain_str) { - l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str); - } - else { - l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_EMISSION); - } - - if(!l_chain) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-chain' to be valid chain name in chain net %s. You can set default datum type in chain configuration file", - l_net_str); - return -8; - } -/* if(!l_chain_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-chain'"); - return -4; - } else { - if((l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str)) == NULL) { // Can't find such chain - dap_cli_server_cmd_set_reply_text(a_str_reply, - "tx_history requires parameter '-chain' to be valid chain name in chain net %s", - l_net_str); - return -5; - } - }*/ - //char *l_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); - //const char *l_chain_group = dap_chain_gdb_get_group(l_chain); dap_chain_hash_fast_t l_tx_hash; - if(l_tx_hash_str) { - if(dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) { - l_tx_hash_str = NULL; - dap_cli_server_cmd_set_reply_text(a_str_reply, "tx hash not recognized"); - return -1; + if (l_tx_hash_str && dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "tx hash not recognized"); + return -3; + } + // Select chain network + if (l_net_str) { + l_net = dap_chain_net_by_name(l_net_str); + if (!l_net) { // Can't find such network + dap_cli_server_cmd_set_reply_text(a_str_reply, + "tx_history requires parameter '-net' to be valid chain network name"); + return -3; } -// char hash_str[99]; -// dap_chain_hash_fast_to_str(&l_tx_hash, hash_str,99); -// int gsdgsd=523; } + // Get chain address dap_chain_addr_t *l_addr = NULL; - // if need addr - if(!l_tx_hash_str) { - if(l_wallet_name) { - const char *c_wallets_path = dap_chain_wallet_get_path(g_config); - dap_chain_wallet_t * l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path); - if(l_wallet) { - dap_chain_addr_t *l_addr_tmp = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet, l_net->pub.id); - l_addr = DAP_NEW_SIZE(dap_chain_addr_t, sizeof(dap_chain_addr_t)); - memcpy(l_addr, l_addr_tmp, sizeof(dap_chain_addr_t)); - dap_chain_wallet_close(l_wallet); - } + if (l_addr_base58) { + if (l_tx_hash_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Incomatible params '-addr' & '-tx'"); + return -4; } - if(!l_addr && l_addr_base58) { - l_addr = dap_chain_addr_from_str(l_addr_base58); + l_addr = dap_chain_addr_from_str(l_addr_base58); + if (!l_addr) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet address not recognized"); + return -5; } - if(!l_addr && !l_tx_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "wallet address not recognized"); - return -1; + if (l_net) { + if (l_net->pub.id.uint64 != l_addr->net_id.uint64) { + dap_cli_server_cmd_set_reply_text(a_str_reply, + "Network ID with '-net' param and network ID with '-addr' param are different"); + DAP_DELETE(l_addr); + return -6; + } + } else + l_net = dap_chain_net_by_id(l_addr->net_id); + } + if (l_wallet_name) { + const char *c_wallets_path = dap_chain_wallet_get_path(g_config); + dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path); + if (l_wallet) { + dap_chain_addr_t *l_addr_tmp = dap_chain_wallet_get_addr(l_wallet, l_net->pub.id); + if (l_addr) { + if (!dap_chain_addr_compare(l_addr, l_addr_tmp)) { + dap_cli_server_cmd_set_reply_text(a_str_reply, + "Address with '-addr' param and address with '-w' param are different"); + DAP_DELETE(l_addr); + DAP_DELETE(l_addr_tmp); + return -7; + } + DAP_DELETE(l_addr_tmp); + } else + l_addr = l_addr_tmp; + dap_chain_wallet_close(l_wallet); } } + // Select chain, if any + if (l_chain_str) + l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str); + else + l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX); + if(!l_chain) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-chain' to be valid chain name in chain net %s." + " You can set default datum type in chain configuration file", + l_net_str); + return -8; + } char *l_str_out = l_tx_hash_str ? dap_db_history_tx(&l_tx_hash, l_chain, l_hash_out_type) : dap_db_history_addr(l_addr, l_chain, l_hash_out_type); diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index b278fab3614b66fc0f90bdd1590d0b4adaf41e5e..3e257fa427150b5c30e5e2cf6b96ff56698c540d 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -211,7 +211,13 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const log_it(L_WARNING, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); return NULL; } - dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger; + dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + if (!l_net) { + log_it(L_WARNING, "Can't find net by specified chain %s", a_chain->name); + return NULL; + } + dap_ledger_t *l_ledger = l_net->pub.ledger; + const char *l_native_ticker = l_net->pub.native_ticker; while (l_atom && l_atom_size) { size_t l_datums_count = 0; @@ -238,23 +244,26 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const dap_chain_hash_fast_t *l_tx_prev_hash; int l_tx_prev_out_idx; dap_chain_datum_tx_t *l_tx_prev = NULL; - if (*(byte_t *)l_list_in_items->data == TX_ITEM_TYPE_IN) { - dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)l_list_in_items->data; + switch (*(byte_t *)it->data) { + case TX_ITEM_TYPE_IN: { + dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)it->data; l_tx_prev_hash = &l_tx_in->header.tx_prev_hash; l_tx_prev_out_idx = l_tx_in->header.tx_out_prev_idx; - } else { // TX_ITEM_TYPE_IN_COND - dap_chain_tx_in_cond_t *l_tx_in_cond = (dap_chain_tx_in_cond_t *)l_list_in_items->data; + } break; + case TX_ITEM_TYPE_IN_COND: { + dap_chain_tx_in_cond_t *l_tx_in_cond = (dap_chain_tx_in_cond_t *)it->data; l_tx_prev_hash = &l_tx_in_cond->header.tx_prev_hash; l_tx_prev_out_idx = l_tx_in_cond->header.tx_out_prev_idx; - } - if (dap_hash_fast_is_blank(l_tx_prev_hash)) { + } break; + case TX_ITEM_TYPE_IN_EMS: { + dap_chain_tx_in_ems_t *l_in_ems = (dap_chain_tx_in_ems_t *)it->data; l_base_tx = true; - dap_chain_tx_in_ems_t *l_token = (dap_chain_tx_in_ems_t *)dap_chain_datum_tx_item_get( - l_tx, NULL, TX_ITEM_TYPE_IN_EMS, NULL); - if (l_token) - l_src_token = l_token->header.ticker; - break; + l_src_token = l_in_ems->header.ticker; + } + default: + continue; } + l_tx_prev = a_chain->callback_tx_find_by_hash(a_chain, l_tx_prev_hash); if (l_tx_prev) { uint8_t *l_prev_out_union = dap_chain_datum_tx_item_get_nth(l_tx_prev, TX_ITEM_TYPE_OUT_ALL, l_tx_prev_out_idx); @@ -270,87 +279,103 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const break; case TX_ITEM_TYPE_OUT_COND: l_src_subtype = ((dap_chain_tx_out_cond_t *)l_prev_out_union)->header.subtype; + if (l_src_subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) + l_src_token = l_native_ticker; default: break; } } if (!l_src_token) l_src_token = dap_chain_ledger_tx_get_token_ticker_by_hash(l_ledger, l_tx_prev_hash); - if (l_src_addr && memcmp(l_src_addr, a_addr, sizeof(dap_chain_addr_t))) + if (l_src_addr && !dap_chain_addr_compare(l_src_addr, a_addr)) break; //it's not our addr } dap_list_free(l_list_in_items); // find OUT items bool l_header_printed = false; + uint256_t l_fee_sum = {}; dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_ALL, NULL); - for (dap_list_t *l_list_out = l_list_out_items; l_list_out; l_list_out = dap_list_next(l_list_out)) { + for (dap_list_t *it = l_list_out_items; it; it = it->next) { dap_chain_addr_t *l_dst_addr = NULL; - uint8_t l_type = *(uint8_t *)l_list_out->data; + uint8_t l_type = *(uint8_t *)it->data; uint256_t l_value; + const char *l_dst_token = NULL; switch (l_type) { case TX_ITEM_TYPE_OUT: - l_dst_addr = &((dap_chain_tx_out_t *)l_list_out->data)->addr; - l_value = ((dap_chain_tx_out_t *)l_list_out->data)->header.value; + l_dst_addr = &((dap_chain_tx_out_t *)it->data)->addr; + l_value = ((dap_chain_tx_out_t *)it->data)->header.value; break; case TX_ITEM_TYPE_OUT_EXT: - l_dst_addr = &((dap_chain_tx_out_ext_t *)l_list_out->data)->addr; - l_value = ((dap_chain_tx_out_ext_t *)l_list_out->data)->header.value; + l_dst_addr = &((dap_chain_tx_out_ext_t *)it->data)->addr; + l_value = ((dap_chain_tx_out_ext_t *)it->data)->header.value; + l_dst_token = ((dap_chain_tx_out_ext_t *)it->data)->token; break; case TX_ITEM_TYPE_OUT_COND: - l_value = ((dap_chain_tx_out_cond_t *)l_list_out->data)->header.value; + l_value = ((dap_chain_tx_out_cond_t *)it->data)->header.value; + if (((dap_chain_tx_out_cond_t *)it->data)->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) { + SUM_256_256(l_fee_sum, ((dap_chain_tx_out_cond_t *)it->data)->header.value, &l_fee_sum); + l_dst_token = l_native_ticker; + } default: break; } - if (l_src_addr && l_dst_addr && !memcmp(l_dst_addr, l_src_addr, sizeof(dap_chain_addr_t))) - continue; // send to self - if (l_src_addr && !memcmp(l_src_addr, a_addr, sizeof(dap_chain_addr_t))) { + if (l_src_addr && l_dst_addr && dap_chain_addr_compare(l_dst_addr, l_src_addr) && + (!l_base_tx || dap_strcmp(l_dst_token, l_src_token))) + continue; // sent to self (coinback) + if (l_src_addr && dap_chain_addr_compare(l_src_addr, a_addr) && + (!l_base_tx || dap_strcmp(l_dst_token, l_src_token))) { if (!l_header_printed) { s_tx_header_print(l_str_out, l_tx_data_ht, l_tx, l_atom_iter, a_hash_out_type, l_ledger, &l_tx_hash); l_header_printed = true; } - //const char *l_token_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_tx_hash); const char *l_dst_addr_str = l_dst_addr ? dap_chain_addr_to_str(l_dst_addr) : dap_chain_tx_out_cond_subtype_to_str( - ((dap_chain_tx_out_cond_t *)l_list_out->data)->header.subtype); + ((dap_chain_tx_out_cond_t *)it->data)->header.subtype); char *l_value_str = dap_chain_balance_print(l_value); char *l_coins_str = dap_chain_balance_to_coins(l_value); dap_string_append_printf(l_str_out, "\tsend %s (%s) %s to %s\n", l_coins_str, l_value_str, - l_src_token ? l_src_token : "UNKNOWN", + l_dst_token ? l_dst_token : + (l_src_token ? l_src_token : "UNKNOWN"), l_dst_addr_str); if (l_dst_addr) DAP_DELETE(l_dst_addr_str); DAP_DELETE(l_value_str); DAP_DELETE(l_coins_str); } - if (l_dst_addr && !memcmp(l_dst_addr, a_addr, sizeof(dap_chain_addr_t))) { + if (l_dst_addr && dap_chain_addr_compare(l_dst_addr, a_addr)) { if (!l_header_printed) { s_tx_header_print(l_str_out, l_tx_data_ht, l_tx, l_atom_iter, a_hash_out_type, l_ledger, &l_tx_hash); l_header_printed = true; } - const char *l_dst_token = (l_type == TX_ITEM_TYPE_OUT_EXT) ? - (const char *)(((dap_chain_tx_out_ext_t *)l_list_out->data)->token) : NULL; - const char *l_src_addr_str = l_base_tx ? "emission" - : (l_src_addr ? dap_chain_addr_to_str(l_src_addr) - : dap_chain_tx_out_cond_subtype_to_str( - l_src_subtype)); + const char *l_src_addr_str = l_base_tx ? "emission" : + (l_src_addr ? dap_chain_addr_to_str(l_src_addr) + : dap_chain_tx_out_cond_subtype_to_str(l_src_subtype)); char *l_value_str = dap_chain_balance_print(l_value); char *l_coins_str = dap_chain_balance_to_coins(l_value); dap_string_append_printf(l_str_out, "\trecv %s (%s) %s from %s\n", l_coins_str, l_value_str, - l_dst_token ? l_dst_token : - (l_src_token ? l_src_token : "UNKNOWN"), + l_src_token ? l_src_token : "UNKNOWN", l_src_addr_str); - if (l_src_addr) + if (l_src_addr && !l_base_tx) DAP_DELETE(l_src_addr_str); DAP_DELETE(l_value_str); DAP_DELETE(l_coins_str); } } dap_list_free(l_list_out_items); + // fee for base TX in native token + if (l_header_printed && l_base_tx && !dap_strcmp(l_native_ticker, l_src_token)) { + char *l_fee_value_str = dap_chain_balance_print(l_fee_sum); + char *l_fee_coins_str = dap_chain_balance_to_coins(l_fee_sum); + dap_string_append_printf(l_str_out, "\t\tpay %s (%s) fee\n", + l_fee_value_str, l_fee_coins_str); + DAP_DELETE(l_fee_value_str); + DAP_DELETE(l_fee_coins_str); + } } DAP_DELETE(l_datums); // go to next atom (event or block) diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c index 53892153dc6eb70c4264b9794123fc59602e54bb..7b1e52bf0ec5deccb645a3717d7be26d331b3399 100644 --- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c @@ -154,18 +154,18 @@ void dap_chain_net_srv_stake_key_delegate(dap_chain_net_t *a_net, dap_chain_addr HASH_FIND(hh, s_srv_stake->itemlist, a_signing_addr, sizeof(dap_chain_addr_t), l_stake); if (!l_stake) l_stake = DAP_NEW_Z(dap_chain_net_srv_stake_item_t); - else + else { l_found = true; + HASH_DELETE(ht, s_srv_stake->tx_itemlist, l_stake); + } l_stake->net = a_net; l_stake->node_addr = *a_node_addr; l_stake->signing_addr = *a_signing_addr; l_stake->value = a_value; l_stake->tx_hash = *a_stake_tx_hash; if (!l_found) - { HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake); - HASH_ADD(ht, s_srv_stake->h_itemlist, tx_hash, sizeof(dap_chain_hash_fast_t), l_stake); - } + HASH_ADD(ht, s_srv_stake->tx_itemlist, tx_hash, sizeof(dap_chain_hash_fast_t), l_stake); } @@ -178,6 +178,7 @@ void dap_chain_net_srv_stake_key_invalidate(dap_chain_addr_t *a_signing_addr) HASH_FIND(hh, s_srv_stake->itemlist, a_signing_addr, sizeof(dap_chain_addr_t), l_stake); if (l_stake) { HASH_DEL(s_srv_stake->itemlist, l_stake); + HASH_DELETE(ht, s_srv_stake->tx_itemlist, l_stake); DAP_DELETE(l_stake); } } @@ -1089,7 +1090,7 @@ static void s_get_tx_filter_callback(dap_chain_net_t* a_net, dap_chain_datum_tx_ if(dap_chain_ledger_tx_hash_is_used_out_item(a_net->pub.ledger,&l_datum_hash,l_out_idx_tmp)==NULL) { dap_chain_net_srv_stake_item_t *l_stake = NULL; - HASH_FIND(ht, s_srv_stake->h_itemlist, &l_datum_hash, sizeof(dap_hash_fast_t), l_stake); + HASH_FIND(ht, s_srv_stake->tx_itemlist, &l_datum_hash, sizeof(dap_hash_fast_t), l_stake); if(!l_stake){ l_args->ret = dap_list_append(l_args->ret,a_tx); } @@ -1307,15 +1308,14 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) DAP_DELETE(l_decree_hash_str); } break; case CMD_LIST: { - const char * sub_com = NULL; l_arg_index++; - if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "keys", &sub_com)){ + if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "keys", NULL)) { const char *l_net_str = NULL, *l_cert_str = NULL; l_arg_index++; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'keylist' requires parameter -net"); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'list keys' requires parameter -net"); return -3; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); @@ -1356,13 +1356,12 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) dap_string_append(l_reply_str, "No keys found"); } *a_str_reply = dap_string_free(l_reply_str, false); - }else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "tx", &sub_com)) - { + } else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "tx", NULL)) { const char *l_net_str = NULL; l_arg_index++; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-net", &l_net_str); if (!l_net_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'approve' requires parameter -net"); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'list tx' requires parameter -net"); return -3; } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); @@ -1416,8 +1415,10 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); dap_string_free(l_str_tmp, true); DAP_DELETE(l_args); + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Subcommand '%s' not recognized", a_argv[l_arg_index]); + return -2; } - } break; case CMD_INVALIDATE: { const char *l_net_str = NULL, 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 df399d9e6b144dc0907ced263b1888815156f27d..20da2e8348cdcf72a7f9537c668cb0ce2a1cc3e5 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 @@ -54,7 +54,8 @@ typedef struct dap_chain_net_srv_stake_cache_item { typedef struct dap_chain_net_srv_stake { uint256_t delegate_allowed_min; - dap_chain_net_srv_stake_item_t *itemlist, *h_itemlist; + dap_chain_net_srv_stake_item_t *itemlist; + dap_chain_net_srv_stake_item_t *tx_itemlist; dap_chain_net_srv_stake_cache_item_t *cache; } dap_chain_net_srv_stake_t;