From 5c63388ecd6031a946c44cba8a52197d5bed2f36 Mon Sep 17 00:00:00 2001 From: "daniil.frolov" <daniil.frolov@demlabs.net> Date: Wed, 28 Feb 2024 07:16:36 +0000 Subject: [PATCH] hotfix-10582_port_to_rc --- modules/net/dap_chain_ledger.c | 131 +++++++++--------- modules/net/dap_chain_net_tx.c | 14 +- modules/net/dap_chain_net_voting.c | 8 +- .../xchange/dap_chain_net_srv_xchange.c | 48 ++++--- 4 files changed, 112 insertions(+), 89 deletions(-) diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 532d632358..3ef15287c1 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -5334,68 +5334,6 @@ uint256_t dap_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, dap_cha return l_ret_value; } -dap_ledger_datum_iter_t *dap_ledger_datum_iter_create(dap_chain_net_t *a_net) -{ - dap_ledger_datum_iter_t *l_ret = DAP_NEW_Z(dap_ledger_datum_iter_t); - if(!l_ret){ - log_it(L_CRITICAL, "Memory allocation error!"); - return NULL; - } - l_ret->net = a_net; - return l_ret; -} - -void dap_ledger_datum_iter_delete(dap_ledger_datum_iter_t *a_iter) -{ - DAP_DELETE(a_iter); -} - -dap_chain_datum_tx_t *dap_ledger_datum_iter_get_first(dap_ledger_datum_iter_t *a_iter) -{ - dap_ledger_private_t *l_ledger_pvt = PVT(a_iter->net->pub.ledger); - pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); - a_iter->cur_ledger_tx_item = l_ledger_pvt->ledger_items; - a_iter->cur = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx; - a_iter->cur_hash = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx_hash_fast; - a_iter->is_unspent = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->cache_data.ts_spent ? false : true; - a_iter->ret_code = 0; - pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); - return a_iter->cur; -} - -dap_chain_datum_tx_t *dap_ledger_datum_iter_get_next(dap_ledger_datum_iter_t *a_iter) -{ - dap_ledger_private_t *l_ledger_pvt = PVT(a_iter->net->pub.ledger); - pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); - a_iter->cur_ledger_tx_item = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->hh.next; - if (a_iter->cur_ledger_tx_item){ - a_iter->cur = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx; - a_iter->cur_hash = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx_hash_fast; - a_iter->ret_code = 0; - a_iter->is_unspent = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->cache_data.ts_spent ? false : true; - } else { - a_iter->cur = NULL; - memset(&a_iter->cur_hash, 0, sizeof(dap_hash_fast_t)); - a_iter->ret_code = 0; - a_iter->is_unspent = false; - } - pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); - return a_iter->cur; -} - -dap_chain_datum_tx_t *dap_ledger_datum_iter_get_last(dap_ledger_datum_iter_t *a_iter) -{ - dap_ledger_private_t *l_ledger_pvt = PVT(a_iter->net->pub.ledger); - pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); - a_iter->cur_ledger_tx_item = l_ledger_pvt->ledger_items->hh.prev; - a_iter->cur = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx; - a_iter->cur_hash = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx_hash_fast; - a_iter->is_unspent = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->cache_data.ts_spent ? false : true; - a_iter->ret_code = 0; - pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); - return a_iter->cur; -} - /** * @brief dap_ledger_get_list_tx_outs_with_val * @param a_ledger @@ -5628,6 +5566,75 @@ dap_list_t *dap_ledger_get_txs(dap_ledger_t *a_ledger, size_t a_count, size_t a_ return l_list; } +dap_ledger_datum_iter_t *dap_ledger_datum_iter_create(dap_chain_net_t *a_net) +{ + dap_ledger_datum_iter_t *l_ret = DAP_NEW_Z(dap_ledger_datum_iter_t); + if(!l_ret){ + log_it(L_CRITICAL, "Memory allocation error!"); + return NULL; + } + l_ret->net = a_net; + return l_ret; +} + +void dap_ledger_datum_iter_delete(dap_ledger_datum_iter_t *a_iter) +{ + DAP_DEL_Z(a_iter); +} + +dap_chain_datum_tx_t *dap_ledger_datum_iter_get_first(dap_ledger_datum_iter_t *a_iter) +{ + if (!a_iter) + return NULL; + dap_ledger_private_t *l_ledger_pvt = PVT(a_iter->net->pub.ledger); + pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); + if (!l_ledger_pvt->ledger_items) { + pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); + return NULL; + } + a_iter->cur_ledger_tx_item = l_ledger_pvt->ledger_items; + a_iter->cur = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx; + a_iter->cur_hash = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx_hash_fast; + a_iter->is_unspent = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->cache_data.ts_spent ? false : true; + a_iter->ret_code = 0; + pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); + return a_iter->cur; +} + +dap_chain_datum_tx_t *dap_ledger_datum_iter_get_next(dap_ledger_datum_iter_t *a_iter) +{ + dap_ledger_private_t *l_ledger_pvt = PVT(a_iter->net->pub.ledger); + pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); + a_iter->cur_ledger_tx_item = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->hh.next; + if (a_iter->cur_ledger_tx_item){ + a_iter->cur = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx; + a_iter->cur_hash = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx_hash_fast; + a_iter->ret_code = 0; + a_iter->is_unspent = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->cache_data.ts_spent ? false : true; + } else { + a_iter->cur = NULL; + memset(&a_iter->cur_hash, 0, sizeof(dap_hash_fast_t)); + a_iter->ret_code = 0; + a_iter->is_unspent = false; + } + pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); + return a_iter->cur; +} + +dap_chain_datum_tx_t *dap_ledger_datum_iter_get_last(dap_ledger_datum_iter_t *a_iter) +{ + dap_ledger_private_t *l_ledger_pvt = PVT(a_iter->net->pub.ledger); + pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); + a_iter->cur_ledger_tx_item = l_ledger_pvt->ledger_items->hh.prev; + a_iter->cur = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx; + a_iter->cur_hash = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->tx_hash_fast; + a_iter->is_unspent = ((dap_ledger_tx_item_t *)(a_iter->cur_ledger_tx_item))->cache_data.ts_spent ? false : true; + a_iter->ret_code = 0; + pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); + return a_iter->cur; +} + + /** * @brief dap_ledger_get_list_tx_cond_outs_with_val * @param a_ledger diff --git a/modules/net/dap_chain_net_tx.c b/modules/net/dap_chain_net_tx.c index 561878d9bf..a478200eb4 100644 --- a/modules/net/dap_chain_net_tx.c +++ b/modules/net/dap_chain_net_tx.c @@ -192,11 +192,13 @@ void dap_chain_net_get_tx_all(dap_chain_net_t * a_net, dap_chain_net_tx_search_t case TX_SEARCH_TYPE_NET: case TX_SEARCH_TYPE_LOCAL:{ dap_ledger_datum_iter_t *l_iter = dap_ledger_datum_iter_create(a_net); - dap_ledger_datum_iter_get_first(l_iter); - while(l_iter->cur){ - if (a_search_type != TX_SEARCH_TYPE_NET_UNSPENT || - (a_search_type == TX_SEARCH_TYPE_NET_UNSPENT && l_iter->is_unspent)){ - a_tx_callback(a_net, l_iter->cur, &l_iter->cur_hash, a_arg); + if ( l_iter && dap_ledger_datum_iter_get_first(l_iter) ) { + while(l_iter->cur) { + if (a_search_type != TX_SEARCH_TYPE_NET_UNSPENT || + (a_search_type == TX_SEARCH_TYPE_NET_UNSPENT && l_iter->is_unspent)){ + a_tx_callback(a_net, l_iter->cur, &l_iter->cur_hash, a_arg); + } + dap_ledger_datum_iter_get_next(l_iter); } dap_ledger_datum_iter_get_next(l_iter); } @@ -289,7 +291,6 @@ static void s_get_tx_cond_chain_callback(dap_chain_net_t* a_net, dap_chain_datum } l_item_idx++; } - DAP_DELETE(l_tx_hash); }else if(a_tx){ dap_hash_fast_t * l_tx_hash = a_tx_hash; if (!l_tx_hash) { @@ -312,7 +313,6 @@ static void s_get_tx_cond_chain_callback(dap_chain_net_t* a_net, dap_chain_datum } } } - DAP_DELETE(l_tx_hash); } } diff --git a/modules/net/dap_chain_net_voting.c b/modules/net/dap_chain_net_voting.c index 00d39e9717..f867c93cac 100644 --- a/modules/net/dap_chain_net_voting.c +++ b/modules/net/dap_chain_net_voting.c @@ -95,10 +95,10 @@ int dap_chain_net_voting_init() pthread_rwlock_init(&s_votings_rwlock, NULL); dap_chain_ledger_voting_verificator_add(s_datum_tx_voting_verification_callback); dap_cli_server_cmd_add("voting", s_cli_voting, "Voting commands.", "" - "voting create -net <net_name> -question <\"Question_string\"> -options <\"Option1\", \"Option2\" ... \"OptionN\"> [-expire <voting_expire_time_in_RCF822>] [-max_votes_count <Votes_count>] [-delegated_key_required] [-vote_changing_allowed] -fee <value_datoshi> -w <fee_wallet_name>\n" - "voting vote -net <net_name> -hash <voting_hash> -option_idx <option_index> [-cert <delegate_cert_name>] -fee <value_datoshi> -w <fee_wallet_name>\n" - "voting list -net <net_name>\n" - "voting dump -net <net_name> -hash <voting_hash>\n"); + "voting create -net <net_name> -question <\"Question_string\"> -options <\"Option0\", \"Option1\" ... \"OptionN\"> [-expire <voting_expire_time_in_RCF822>] [-max_votes_count <Votes_count>] [-delegated_key_required] [-vote_changing_allowed] -fee <value_datoshi> -w <fee_wallet_name>\n" + "voting vote -net <net_name> -hash <voting_hash> -option_idx <option_index> [-cert <delegate_cert_name>] -fee <value_datoshi> -w <fee_wallet_name>\n" + "voting list -net <net_name>\n" + "voting dump -net <net_name> -hash <voting_hash>\n"); return 0; } diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index 4e9f9a823b..ad15a271c4 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -98,7 +98,7 @@ int dap_chain_net_srv_xchange_init() "srv_xchange order create -net <net_name> -token_sell <token_ticker> -token_buy <token_ticker> -w <wallet_name>" " -value <value> -rate <value> -fee <value>\n" "\tCreate a new order and tx with specified amount of datoshi to exchange with specified rate (buy / sell)\n" - "srv_xchange order remove -net <net_name> -order <order_hash> -w <wallet_name>\n -fee <value_datoshi>" + "srv_xchange order remove -net <net_name> -order <order_hash> -w <wallet_name> -fee <value_datoshi>\n" "\tRemove order with specified order hash in specified net name\n" "srv_xchange order history -net <net_name> {-order <order_hash> | -addr <wallet_addr>}" "\tShows transaction history for the selected order\n" @@ -1061,6 +1061,16 @@ static int s_cli_srv_xchange_order(int a_argc, char **a_argv, int a_arg_index, v dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'order create' requires parameter -token_buy"); return -5; } + if (!dap_ledger_token_ticker_check(l_net->pub.ledger, l_token_buy_str)) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Token ticker %s not found", l_token_buy_str); + return -6; + } + + if (!strcmp(l_token_sell_str, l_token_buy_str)){ + dap_cli_server_cmd_set_reply_text(a_str_reply, "token_buy and token_sell must be different!"); + return -7; + } + const char *l_val_sell_str = NULL, *l_val_rate_str = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-value", &l_val_sell_str); if (!l_val_sell_str) { @@ -1257,23 +1267,29 @@ static int s_cli_srv_xchange_order(int a_argc, char **a_argv, int a_arg_index, v dap_hash_fast_t l_order_tx_hash = {}; dap_chain_hash_fast_from_str(l_order_hash_str, &l_order_tx_hash); dap_chain_datum_tx_t * l_tx = dap_chain_net_get_tx_by_hash(l_net, &l_order_tx_hash, TX_SEARCH_TYPE_NET); + if( l_tx){ - int l_rc = s_tx_check_for_open_close(l_net,l_tx); - if(l_rc == 0){ - dap_cli_server_cmd_set_reply_text(a_str_reply, "WRONG TX %s", - dap_chain_hash_fast_to_str_static(&l_order_tx_hash)); - }else{ - dap_string_t * l_str_reply = dap_string_new(""); - dap_string_append_printf(l_str_reply, "Order %s hisrory:\n\n", l_order_hash_str); - dap_list_t *l_tx_list = dap_chain_net_get_tx_cond_chain(l_net, &l_order_tx_hash, c_dap_chain_net_srv_xchange_uid ); - dap_list_t *l_tx_list_temp = l_tx_list; - while(l_tx_list_temp ){ - dap_chain_datum_tx_t * l_tx_cur = (dap_chain_datum_tx_t*) l_tx_list_temp->data; - s_string_append_tx_cond_info(l_str_reply, l_net, l_tx_cur, TX_STATUS_ALL, true, true, false); - l_tx_list_temp = l_tx_list_temp->next; + xchange_tx_type_t l_tx_type = s_xchange_tx_get_type(l_net, l_tx, NULL, NULL, NULL); + char *l_tx_hash = dap_chain_hash_fast_to_str_new(&l_order_tx_hash); + if(l_tx_type != TX_TYPE_ORDER){ + dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum with hash %s is not order. Check hash.", l_tx_hash); + } else { + int l_rc = s_tx_check_for_open_close(l_net,l_tx); + if(l_rc == 0){ + dap_cli_server_cmd_set_reply_text(a_str_reply, "WRONG TX %s", l_tx_hash); + }else{ + dap_string_t * l_str_reply = dap_string_new(""); + dap_string_append_printf(l_str_reply, "Order %s hisrory:\n\n", l_order_hash_str); + dap_list_t *l_tx_list = dap_chain_net_get_tx_cond_chain(l_net, &l_order_tx_hash, c_dap_chain_net_srv_xchange_uid ); + dap_list_t *l_tx_list_temp = l_tx_list; + while(l_tx_list_temp ){ + dap_chain_datum_tx_t * l_tx_cur = (dap_chain_datum_tx_t*) l_tx_list_temp->data; + s_string_append_tx_cond_info(l_str_reply, l_net, l_tx_cur, TX_STATUS_ALL, true, true, false); + l_tx_list_temp = l_tx_list_temp->next; + } + dap_list_free(l_tx_list); + *a_str_reply = dap_string_free(l_str_reply, false); } - dap_list_free(l_tx_list); - *a_str_reply = dap_string_free(l_str_reply, false); } }else{ dap_cli_server_cmd_set_reply_text(a_str_reply, "No history"); -- GitLab