diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c index 103637acd36038468f3f6a14dc9487a86d06fa42..aa4139aa4ce2b4a7e2d264759098a4fd6e881eea 100644 --- a/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c @@ -230,11 +230,11 @@ json_object *dap_chain_datum_token_to_json(dap_chain_datum_token_t * a_token, si } size_t l_offset = 0; size_t l_certs_field_size = a_token_size - sizeof(*a_token); - while (l_offset < l_certs_field_size) { + while ((l_offset + l_tsd_total_size) < l_certs_field_size) { dap_sign_t *l_sign = (dap_sign_t *) ((byte_t*)a_token->data_n_tsd + l_tsd_total_size + l_offset); l_offset += dap_sign_get_size(l_sign); json_object *l_obj_sign = dap_sign_to_json(l_sign); - if (!l_obj_sign) { + if (!l_obj_sign || !dap_sign_get_size(l_sign)) { json_object_put(l_obj_signs); json_object_put(l_jobj_token); dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON, "Failed to convert signature to JSON."); diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index ef2d6db661751058efcdf601023385531392f682..c0d081d6bffa6b9c42ebd034112591fabf34f8f9 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -252,8 +252,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config) ); dap_cli_server_cmd_add ("token_emit", com_token_emit, "Token emission", - "token_emit { sign | -token <mempool_token_ticker> -emission_value <value>" - "-addr <addr> [-chain_emission <chain_name>] -net <net_name> -certs <cert list>\n"); + "token_emit { sign -emission <hash> | -token <mempool_token_ticker> -emission_value <value>\n" + "\t-addr <addr> } [-chain_emission <chain_name>] -net <net_name> -certs <cert_list>\n"); dap_cli_server_cmd_add("mempool", com_mempool, "Command for working with mempool", "mempool list -net <net_name> [-chain <chain_name>] [-addr <addr>] [-brief] [-limit] [-offset]\n" diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 2fe0e6a52714f740480cacb4d8f6a17edc4a2c6a..85db305dd0e41e8054156dc24b0227813922b3a8 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2428,7 +2428,6 @@ static dap_chain_datum_token_t * s_sign_cert_in_cycle(dap_cert_t ** l_certs, dap { dap_sign_t * l_sign = dap_cert_sign(l_certs[i], l_datum_token, sizeof(*l_datum_token) + l_tsd_size, 0); - if (l_sign) { size_t l_sign_size = dap_sign_get_size(l_sign); l_datum_token = DAP_REALLOC(l_datum_token, sizeof(*l_datum_token) + (*l_datum_signs_offset) + l_sign_size); @@ -2534,9 +2533,11 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) l_tsd_size = l_datum_token->header_native_decl.tsd_total_size; // Check for signatures, are they all in set and are good enought? size_t l_signs_size = 0, i = 1; - for (i = 1; i <= l_datum_token->signs_total; i++){ + uint16_t l_tmp_signs_total = l_datum_token->signs_total; + l_datum_token->signs_total = 0; + for (i = 1; i <= l_tmp_signs_total; i++){ dap_sign_t *l_sign = (dap_sign_t *)(l_datum_token->data_n_tsd + l_tsd_size + l_signs_size); - if(dap_sign_verify(l_sign, l_datum_token, sizeof(*l_datum_token) - sizeof(uint16_t))) { + if( dap_sign_verify(l_sign, l_datum_token, sizeof(*l_datum_token)) != 1) { log_it(L_WARNING, "Wrong signature %zu for datum_token with key %s in mempool!", i, l_datum_hash_out_str); dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s with datum token has wrong signature %zu, break process and exit", @@ -2549,7 +2550,7 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) } l_signs_size += dap_sign_get_size(l_sign); } - + l_datum_token->signs_total = l_tmp_signs_total; log_it(L_DEBUG, "Datum %s with token declaration: %hu signatures are verified well (sign_size = %zu)", l_datum_hash_out_str, l_datum_token->signs_total, l_signs_size); @@ -4889,24 +4890,24 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) } } - // Check, if network ID is same as ID in destination wallet address. If not - operation is cancelled. - if (!dap_chain_addr_is_blank(l_addr) && l_addr->net_id.uint64 != l_net->pub.id.uint64) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "destination wallet network ID=0x%"DAP_UINT64_FORMAT_x - " and network ID=0x%"DAP_UINT64_FORMAT_x" is not equal." - " Please, change network name or wallet address", - l_addr->net_id.uint64, l_net->pub.id.uint64); - DAP_DEL_Z(l_addr); - DAP_DEL_Z(l_emission); - return -3; - } - - if(!l_ticker) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "token_emit requires parameter '-token'"); - DAP_DEL_Z(l_addr); - return -3; - } - if (!l_add_sign) { + // Check, if network ID is same as ID in destination wallet address. If not - operation is cancelled. + if (!dap_chain_addr_is_blank(l_addr) && l_addr->net_id.uint64 != l_net->pub.id.uint64) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "destination wallet network ID=0x%"DAP_UINT64_FORMAT_x + " and network ID=0x%"DAP_UINT64_FORMAT_x" is not equal." + " Please, change network name or wallet address", + l_addr->net_id.uint64, l_net->pub.id.uint64); + DAP_DEL_Z(l_addr); + DAP_DEL_Z(l_emission); + return -3; + } + + if(!l_ticker) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "token_emit requires parameter '-token'"); + DAP_DEL_Z(l_addr); + return -3; + } + if (!l_chain_emission) { if ( (l_chain_emission = dap_chain_net_get_default_chain_by_chain_type(l_net,CHAIN_TYPE_EMISSION)) == NULL ) { DAP_DEL_Z(l_addr); 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 1067c0bcf72ae91ca0d285a6b4f718898db19a61..6287d6a0582666f8df5782ea0fe42162a54813ee 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 @@ -1901,36 +1901,6 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index dap_hash_fast_t l_tx_hash = {}; if (l_tx_hash_str) { dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash); - dap_chain_datum_tx_t *l_tx = dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash); - if (!l_tx) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s is not found", l_tx_hash_str); - return -21; - } - int l_out_num = 0; - if (!dap_chain_datum_tx_out_cond_get(l_tx, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, &l_out_num)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s is invalid", l_tx_hash_str); - return -22; - } - dap_hash_fast_t l_spender_hash = {}; - if (dap_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, &l_tx_hash, l_out_num, &l_spender_hash)) { - l_tx_hash = l_spender_hash; - if (!dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Previous transaction %s is not found", l_tx_hash_str); - return -21; - } - } - dap_chain_net_srv_stake_item_t *l_stake; - HASH_FIND(ht, s_srv_stake->tx_itemlist, &l_tx_hash, sizeof(dap_hash_t), l_stake); - if (l_stake) { - char *l_delegated_hash_str = dap_hash_fast_is_blank(&l_spender_hash) ? dap_strdup(l_tx_hash_str) - : dap_hash_fast_to_str_new(&l_spender_hash); - char l_pkey_hash_str[DAP_HASH_FAST_STR_SIZE]; - dap_hash_fast_to_str(&l_stake->signing_addr.data.hash_fast, l_pkey_hash_str, DAP_HASH_FAST_STR_SIZE); - dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s has active delegated key %s, need to revoke it first", - l_delegated_hash_str, l_pkey_hash_str); - DAP_DELETE(l_delegated_hash_str); - return -30; - } } else { dap_chain_addr_t l_signing_addr; if (l_cert_str) { @@ -1960,6 +1930,40 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index } l_tx_hash = l_stake->tx_hash; } + + char *l_tx_hash_str_tmp = l_tx_hash_str ? l_tx_hash_str : dap_hash_fast_to_str_static(&l_tx_hash); + dap_chain_datum_tx_t *l_tx = dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash); + if (!l_tx) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s not found", l_tx_hash_str_tmp); + return -21; + } + + int l_out_num = 0; + if (!dap_chain_datum_tx_out_cond_get(l_tx, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, &l_out_num)) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s is invalid", l_tx_hash_str_tmp); + return -22; + } + dap_hash_fast_t l_spender_hash = {}; + if (dap_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, &l_tx_hash, l_out_num, &l_spender_hash)) { + l_tx_hash = l_spender_hash; + l_tx_hash_str_tmp = dap_hash_fast_to_str_static(&l_spender_hash); + if (!dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_tx_hash)) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Previous transaction %s is not found", l_tx_hash_str_tmp); + return -21; + } + } + if (l_tx_hash_str || l_cert_str) { + dap_chain_net_srv_stake_item_t *l_stake; + HASH_FIND(ht, s_srv_stake->tx_itemlist, &l_tx_hash, sizeof(dap_hash_t), l_stake); + if (l_stake) { + char l_pkey_hash_str[DAP_HASH_FAST_STR_SIZE]; + dap_hash_fast_to_str(&l_stake->signing_addr.data.hash_fast, l_pkey_hash_str, DAP_HASH_FAST_STR_SIZE); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s has active delegated key %s, need to revoke it first", + l_tx_hash_str_tmp, l_pkey_hash_str); + return -30; + } + } + if (l_wallet_str) { const char* l_sign_str = ""; dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_str, dap_chain_wallet_get_path(g_config));