From 70995def62f9a195a22a0d15d808df0596805e6b Mon Sep 17 00:00:00 2001 From: cellframe <roman.khlopkov@demlabs.net> Date: Fri, 4 Nov 2022 21:07:40 +0300 Subject: [PATCH] [*] Build fix --- dap-sdk/core/src/dap_file_utils.c | 4 +- dap-sdk/crypto/src/dap_enc_dilithium.c | 4 +- dap-sdk/crypto/src/dap_enc_tesla.c | 16 +- .../dap_chain_global_db_driver_mdbx.c | 8 +- .../stake_lock/dap_chain_net_srv_stake_lock.c | 1424 +++++++++-------- modules/type/dag/dap_chain_cs_dag.c | 17 +- 6 files changed, 738 insertions(+), 735 deletions(-) diff --git a/dap-sdk/core/src/dap_file_utils.c b/dap-sdk/core/src/dap_file_utils.c index cf643a1c72..273c76e084 100755 --- a/dap-sdk/core/src/dap_file_utils.c +++ b/dap-sdk/core/src/dap_file_utils.c @@ -158,7 +158,7 @@ bool dap_dir_test(const char * a_dir_path) /** * @brief dap_mkdir_with_parents Create a new directory with intermediate sub-directories - * + * * @param a_dir_path new directory pathname * @return int 0, if the directory was created or already exist, else -1 */ @@ -643,7 +643,7 @@ static bool dap_get_contents_regfile(const char *filename, struct stat *stat_buf bytes_read = 0; while(bytes_read < size) { - size_t rc; + ssize_t rc; rc = read(fd, buf + bytes_read, size - bytes_read); diff --git a/dap-sdk/crypto/src/dap_enc_dilithium.c b/dap-sdk/crypto/src/dap_enc_dilithium.c index 18e998439a..5a604cac6b 100755 --- a/dap-sdk/crypto/src/dap_enc_dilithium.c +++ b/dap-sdk/crypto/src/dap_enc_dilithium.c @@ -54,7 +54,7 @@ void dap_enc_sig_dilithium_key_new_generate(struct dap_enc_key * key, const void key->pub_key_data = malloc(key->pub_key_data_size); retcode = dilithium_crypto_sign_keypair((dilithium_public_key_t *) key->pub_key_data, - (dilithium_private_key_t *) key->priv_key_data, _dilithium_type, seed, seed_size); + (dilithium_private_key_t *) key->priv_key_data, (dilithium_kind_t)_dilithium_type, seed, seed_size); if(retcode != 0) { dilithium_private_and_public_keys_delete((dilithium_private_key_t *) key->pub_key_data, (dilithium_public_key_t *) key->pub_key_data); @@ -454,7 +454,7 @@ dilithium_public_key_t* dap_enc_dilithium_read_public_key(const uint8_t *a_buf, } else { memcpy(&kind, a_buf + sizeof(uint64_t), sizeof(uint32_t)); } - dilithium_param_t p; + dilithium_param_t p; if(!dilithium_params_init(&p, kind)){ log_it(L_ERROR,"::read_public_key() Can't find params for signature kind %d", kind); return NULL; diff --git a/dap-sdk/crypto/src/dap_enc_tesla.c b/dap-sdk/crypto/src/dap_enc_tesla.c index 54e40d2e09..9eb9fbdc7e 100755 --- a/dap-sdk/crypto/src/dap_enc_tesla.c +++ b/dap-sdk/crypto/src/dap_enc_tesla.c @@ -32,13 +32,13 @@ void dap_enc_sig_tesla_key_new(struct dap_enc_key *key) { // alice_msg_len --- Alice's private key length /** * @brief dap_enc_sig_tesla_key_new_generate - * - * @param key - * @param kex_buf - * @param kex_size - * @param seed - * @param seed_size - * @param key_size + * + * @param key + * @param kex_buf + * @param kex_size + * @param seed + * @param seed_size + * @param key_size */ void dap_enc_sig_tesla_key_new_generate(struct dap_enc_key * key, const void *kex_buf, size_t kex_size, const void * seed, size_t seed_size, @@ -66,7 +66,7 @@ void dap_enc_sig_tesla_key_new_generate(struct dap_enc_key * key, const void *ke key->pub_key_data = malloc(key->pub_key_data_size); retcode = tesla_crypto_sign_keypair((tesla_public_key_t *) key->pub_key_data, - (tesla_private_key_t *) key->priv_key_data, _tesla_type, seed, seed_size); + (tesla_private_key_t *) key->priv_key_data, (tesla_kind_t)_tesla_type, seed, seed_size); if(retcode != 0) { tesla_private_and_public_keys_delete((tesla_private_key_t *) key->pub_key_data, (tesla_public_key_t *) key->pub_key_data); diff --git a/modules/global-db/dap_chain_global_db_driver_mdbx.c b/modules/global-db/dap_chain_global_db_driver_mdbx.c index 62090f899a..8da7cc0b25 100644 --- a/modules/global-db/dap_chain_global_db_driver_mdbx.c +++ b/modules/global-db/dap_chain_global_db_driver_mdbx.c @@ -88,7 +88,7 @@ static int s_db_mdbx_deinit(); static int s_db_mdbx_flush(void); static int s_db_mdbx_apply_store_obj (dap_store_obj_t *a_store_obj); static dap_store_obj_t *s_db_mdbx_read_last_store_obj(const char* a_group); -static int s_db_mdbx_is_obj(const char *a_group, const char *a_key); +static bool s_db_mdbx_is_obj(const char *a_group, const char *a_key); static dap_store_obj_t *s_db_mdbx_read_store_obj(const char *a_group, const char *a_key, size_t *a_count_out); static dap_store_obj_t *s_db_mdbx_read_cond_store_obj(const char *a_group, uint64_t a_id, size_t *a_count_out); static size_t s_db_mdbx_read_count_store(const char *a_group, uint64_t a_id); @@ -459,7 +459,7 @@ size_t l_upper_limit_of_db_size = 16; a_drv_dpt->read_cond_store_obj = s_db_mdbx_read_cond_store_obj; a_drv_dpt->read_count_store = s_db_mdbx_read_count_store; a_drv_dpt->get_groups_by_mask = s_db_mdbx_get_groups_by_mask; - a_drv_dpt->is_obj = (dap_db_driver_is_obj_callback_t) s_db_mdbx_is_obj; + a_drv_dpt->is_obj = s_db_mdbx_is_obj; a_drv_dpt->deinit = s_db_mdbx_deinit; a_drv_dpt->flush = s_db_mdbx_flush; @@ -651,7 +651,7 @@ dap_store_obj_t *l_obj; * 1 - SUCCESS, record is exist * 0 - Record-No-Found */ -int s_db_mdbx_is_obj(const char *a_group, const char *a_key) +bool s_db_mdbx_is_obj(const char *a_group, const char *a_key) { int l_rc, l_rc2; dap_db_ctx_t *l_db_ctx; @@ -1260,7 +1260,7 @@ struct __record_suffix__ *l_suff; */ l_rc2 = l_count_out * sizeof(dap_store_obj_t); if ( !(l_obj_arr = (dap_store_obj_t *) DAP_NEW_Z_SIZE(char, l_rc2)) ) { - log_it(L_ERROR, "Cannot allocate %zu octets for %d store objects", l_count_out * sizeof(dap_store_obj_t), l_count_out); + log_it(L_ERROR, "Cannot allocate %zu octets for %"DAP_UINT64_FORMAT_U" store objects", l_count_out * sizeof(dap_store_obj_t), l_count_out); break; } diff --git a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c index c665c87c83..9e5d0bb988 100644 --- a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c +++ b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c @@ -8,18 +8,18 @@ This file is part of DAP (Deus Applications Prototypes) the open source project - DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ #include "dap_chain_net_srv.h" @@ -81,12 +81,12 @@ enum error_code { * @brief The cond_params struct thats placed in tx_cond->params[] section */ typedef struct cond_params { - dap_time_t time_unlock; - uint32_t flags; + dap_time_t time_unlock; + uint32_t flags; uint8_t reinvest; uint8_t padding[7]; - dap_hash_fast_t token_delegated; // Delegate token - dap_hash_fast_t pkey_delegated; // Delegate public key + dap_hash_fast_t token_delegated; // Delegate token + dap_hash_fast_t pkey_delegated; // Delegate public key } DAP_ALIGN_PACKED cond_params_t; typedef struct dap_chain_ledger_token_emission_for_stake_lock_item { @@ -111,21 +111,21 @@ dap_chain_ledger_token_emission_for_stake_lock_item_t *s_emission_for_stake_lock */ int dap_chain_net_srv_stake_lock_init() { - dap_cli_server_cmd_add("stake_lock", s_cli_stake_lock, "Stake lock service commands", + dap_cli_server_cmd_add("stake_lock", s_cli_stake_lock, "Stake lock service commands", "stake_lock hold -net <net_name> -wallet <wallet_name> -time_staking <in YYMMDD>\n" "\t-token <token_ticker> -coins <value> -reinvest <percentage from 1 to 100 (not necessary)>\n" "\t-cert <priv_cert_name> -chain <chain (not necessary)> -chain_emission <chain (not necessary)>\n" "stake_lock take -net <net_name> -tx <transaction_hash> -wallet <wallet_name>\n" "\t-chain <chain (not necessary)>\n" - ); + ); s_debug_more = dap_config_get_item_bool_default(g_config,"ledger","debug_more",false); dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_LOCK_ID }; dap_chain_net_srv_callbacks_t l_srv_callbacks = {}; l_srv_callbacks.decree = s_callback_decree; - dap_chain_net_srv_t* l_srv = dap_chain_net_srv_add(l_uid, "stake_lock", &l_srv_callbacks); - return 0; + dap_chain_net_srv_t* l_srv = dap_chain_net_srv_add(l_uid, "stake_lock", &l_srv_callbacks); + return 0; } /** @@ -158,17 +158,17 @@ static void s_callback_decree(dap_chain_net_srv_t* a_srv, dap_chain_net_t* a_net */ static dap_chain_datum_tx_receipt_t* s_receipt_create(dap_hash_fast_t* hash_burning_transaction, const char* token, uint256_t datoshi_burned) { - uint32_t l_ext_size = sizeof(dap_hash_fast_t) + dap_strlen(token) + 1; - uint8_t* l_ext = DAP_NEW_STACK_SIZE(uint8_t, l_ext_size); + uint32_t l_ext_size = sizeof(dap_hash_fast_t) + dap_strlen(token) + 1; + uint8_t* l_ext = DAP_NEW_STACK_SIZE(uint8_t, l_ext_size); - memcpy(l_ext, hash_burning_transaction, sizeof(dap_hash_fast_t)); - strcpy((char*)&l_ext[sizeof(dap_hash_fast_t)], token); + memcpy(l_ext, hash_burning_transaction, sizeof(dap_hash_fast_t)); + strcpy((char*)&l_ext[sizeof(dap_hash_fast_t)], token); - dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_UNDEFINED }; - dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_LOCK_ID }; - dap_chain_datum_tx_receipt_t* l_receipt = dap_chain_datum_tx_receipt_create(l_uid, l_unit, 0, datoshi_burned, - l_ext, l_ext_size); - return l_receipt; + dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_UNDEFINED }; + dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_LOCK_ID }; + dap_chain_datum_tx_receipt_t* l_receipt = dap_chain_datum_tx_receipt_create(l_uid, l_unit, 0, datoshi_burned, + l_ext, l_ext_size); + return l_receipt; } /** @@ -206,27 +206,27 @@ static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, da dap_tsd_t *l_tsd; dap_chain_datum_token_tsd_delegate_from_stake_lock_t l_tsd_section; - dap_string_append_printf(output_line, "---> HOLD <---\n"); + dap_string_append_printf(output_line, "---> HOLD <---\n"); - if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-net", &l_net_str) - || NULL == l_net_str) - return NET_ARG_ERROR; + if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-net", &l_net_str) + || NULL == l_net_str) + return NET_ARG_ERROR; - if (NULL == (l_net = dap_chain_net_by_name(l_net_str))) { - dap_string_append_printf(output_line, "'%s'", l_net_str); - return NET_ERROR; - } + if (NULL == (l_net = dap_chain_net_by_name(l_net_str))) { + dap_string_append_printf(output_line, "'%s'", l_net_str); + return NET_ERROR; + } if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-token", &l_ticker_str) || NULL == l_ticker_str || dap_strlen(l_ticker_str) > 8) // for 'm' delegated - return TOKEN_ARG_ERROR; + return TOKEN_ARG_ERROR; l_ledger = l_net->pub.ledger; if (NULL == dap_chain_ledger_token_ticker_check(l_ledger, l_ticker_str)) { dap_string_append_printf(output_line, "'%s'", l_ticker_str); - return TOKEN_ERROR; - } + return TOKEN_ERROR; + } strcpy(delegate_ticker_str + 1, l_ticker_str); @@ -243,11 +243,11 @@ static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, da return TOKEN_ERROR; if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-coins", &l_coins_str) - || NULL == l_coins_str) - return COINS_ARG_ERROR; + || NULL == l_coins_str) + return COINS_ARG_ERROR; - if (IS_ZERO_256((l_value = dap_chain_balance_scan(l_coins_str)))) - return COINS_FORMAT_ERROR; + if (IS_ZERO_256((l_value = dap_chain_balance_scan(l_coins_str)))) + return COINS_FORMAT_ERROR; if (!IS_ZERO_256(l_tsd_section.emission_rate)) { MULT_256_COIN(l_value, l_tsd_section.emission_rate, &l_value_delegated); @@ -257,45 +257,45 @@ static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, da l_value_delegated = l_value; } - if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-cert", &l_cert_str) - || NULL == l_cert_str) - return CERT_ARG_ERROR; - - if (NULL == (l_cert = dap_cert_find_by_name(l_cert_str))) { - dap_string_append_printf(output_line, "'%s'", l_cert_str); - return CERT_LOAD_ERROR; - } - - if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-chain", &l_chain_str) - && 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) - return CHAIN_ERROR; - - if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-chain_emission", &l_chain_emission_str) - && l_chain_emission_str) - l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_str); - else - l_chain_emission = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_EMISSION); - if (!l_chain_emission) - return CHAIN_EMISSION_ERROR; - - if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-wallet", &l_wallet_str) - || NULL == l_wallet_str) - return WALLET_ARG_ERROR; - - // Read time staking - if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-time_staking", &l_time_staking_str) - || NULL == l_time_staking_str) - return TIME_ERROR; + if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-cert", &l_cert_str) + || NULL == l_cert_str) + return CERT_ARG_ERROR; + + if (NULL == (l_cert = dap_cert_find_by_name(l_cert_str))) { + dap_string_append_printf(output_line, "'%s'", l_cert_str); + return CERT_LOAD_ERROR; + } + + if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-chain", &l_chain_str) + && 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) + return CHAIN_ERROR; + + if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-chain_emission", &l_chain_emission_str) + && l_chain_emission_str) + l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_str); + else + l_chain_emission = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_EMISSION); + if (!l_chain_emission) + return CHAIN_EMISSION_ERROR; + + if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-wallet", &l_wallet_str) + || NULL == l_wallet_str) + return WALLET_ARG_ERROR; + + // Read time staking + if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-time_staking", &l_time_staking_str) + || NULL == l_time_staking_str) + return TIME_ERROR; if (0 == (l_time_staking = dap_time_from_str_simplified(l_time_staking_str)) - || (time_t)(l_time_staking - dap_time_now()) <= 0) - return TIME_ERROR; + || (time_t)(l_time_staking - dap_time_now()) <= 0) + return TIME_ERROR; - l_time_staking -= dap_time_now(); + l_time_staking -= dap_time_now(); if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-l_reinvest_percent", &l_reinvest_percent_str) && NULL != l_reinvest_percent_str) { @@ -306,77 +306,77 @@ static enum error_code s_cli_hold(int a_argc, char** a_argv, int a_arg_index, da /*________________________________________________________________________________________________________________*/ - if (NULL == (l_wallet = dap_chain_wallet_open(l_wallet_str, l_wallets_path))) { - dap_string_append_printf(output_line, "'%s'", l_wallet_str); - return WALLET_OPEN_ERROR; - } + if (NULL == (l_wallet = dap_chain_wallet_open(l_wallet_str, l_wallets_path))) { + dap_string_append_printf(output_line, "'%s'", l_wallet_str); + return WALLET_OPEN_ERROR; + } if (compare256(dap_chain_wallet_get_balance(l_wallet, l_net->pub.id, l_ticker_str), l_value) == -1) { - dap_chain_wallet_close(l_wallet); - return NO_MONEY_ERROR; - } - - if (NULL == (l_addr_holder = dap_chain_wallet_get_addr(l_wallet, l_net->pub.id))) { - dap_chain_wallet_close(l_wallet); - dap_string_append_printf(output_line, "'%s'", l_wallet_str); - return WALLET_ADDR_ERROR; - } - - l_key_from = dap_chain_wallet_get_key(l_wallet, 0); - if (NULL == (l_key_cond = dap_pkey_from_enc_key(l_cert->enc_key))) { - dap_chain_wallet_close(l_wallet); - DAP_DEL_Z(l_addr_holder); - dap_string_append_printf(output_line, "'%s'", l_cert_str); - return CERT_KEY_ERROR; - } + dap_chain_wallet_close(l_wallet); + return NO_MONEY_ERROR; + } + + if (NULL == (l_addr_holder = dap_chain_wallet_get_addr(l_wallet, l_net->pub.id))) { + dap_chain_wallet_close(l_wallet); + dap_string_append_printf(output_line, "'%s'", l_wallet_str); + return WALLET_ADDR_ERROR; + } + + l_key_from = dap_chain_wallet_get_key(l_wallet, 0); + if (NULL == (l_key_cond = dap_pkey_from_enc_key(l_cert->enc_key))) { + dap_chain_wallet_close(l_wallet); + DAP_DEL_Z(l_addr_holder); + dap_string_append_printf(output_line, "'%s'", l_cert_str); + return CERT_KEY_ERROR; + } l_tx_cond_hash = dap_chain_net_srv_stake_lock_mempool_create(l_net, l_key_from, l_key_cond, l_ticker_str, l_value, l_uid, l_addr_holder, l_time_staking, l_reinvest_percent); - dap_chain_wallet_close(l_wallet); - DAP_DEL_Z(l_key_cond); + dap_chain_wallet_close(l_wallet); + DAP_DEL_Z(l_key_cond); - l_hash_str = (l_tx_cond_hash) ? dap_chain_hash_fast_to_str_new(l_tx_cond_hash) : NULL; + l_hash_str = (l_tx_cond_hash) ? dap_chain_hash_fast_to_str_new(l_tx_cond_hash) : NULL; - if (l_hash_str) - dap_string_append_printf(output_line, "TX STAKE LOCK CREATED\nSuccessfully hash=%s\nSave to take!\n", l_hash_str); - else { - DAP_DEL_Z(l_addr_holder); - return CREATE_LOCK_TX_ERROR; - } + if (l_hash_str) + dap_string_append_printf(output_line, "TX STAKE LOCK CREATED\nSuccessfully hash=%s\nSave to take!\n", l_hash_str); + else { + DAP_DEL_Z(l_addr_holder); + return CREATE_LOCK_TX_ERROR; + } - DAP_DEL_Z(l_hash_str); + DAP_DEL_Z(l_hash_str); - l_base_tx_hash = dap_chain_mempool_base_tx_create(l_chain_emission, l_tx_cond_hash, l_chain_emission->id, + l_base_tx_hash = dap_chain_mempool_base_tx_create(l_chain_emission, l_tx_cond_hash, l_chain_emission->id, l_value_delegated, delegate_ticker_str, l_addr_holder, &l_cert, 1); - l_hash_str = (l_base_tx_hash) ? dap_chain_hash_fast_to_str_new(l_base_tx_hash) : NULL; + l_hash_str = (l_base_tx_hash) ? dap_chain_hash_fast_to_str_new(l_base_tx_hash) : NULL; - if (l_hash_str) - dap_string_append_printf(output_line, "BASE_TX_DATUM_HASH=%s\n", l_hash_str); - else { - DAP_DEL_Z(l_addr_holder); - DAP_DEL_Z(l_tx_cond_hash); - return BASE_TX_CREATE_ERROR; - } + if (l_hash_str) + dap_string_append_printf(output_line, "BASE_TX_DATUM_HASH=%s\n", l_hash_str); + else { + DAP_DEL_Z(l_addr_holder); + DAP_DEL_Z(l_tx_cond_hash); + return BASE_TX_CREATE_ERROR; + } - DAP_DEL_Z(l_addr_holder); - DAP_DEL_Z(l_tx_cond_hash); - DAP_DEL_Z(l_base_tx_hash); - DAP_DEL_Z(l_hash_str); + DAP_DEL_Z(l_addr_holder); + DAP_DEL_Z(l_tx_cond_hash); + DAP_DEL_Z(l_base_tx_hash); + DAP_DEL_Z(l_hash_str); - return STAKE_NO_ERROR; + return STAKE_NO_ERROR; } static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, dap_string_t* output_line) { const char *l_net_str, *l_ticker_str, *l_wallet_str, *l_tx_str, *l_tx_burning_str, *l_chain_str; l_net_str = l_ticker_str = l_wallet_str = l_tx_str = l_tx_burning_str = l_chain_str = NULL; - dap_chain_net_t* l_net = NULL; - const char* l_wallets_path = dap_chain_wallet_get_path(g_config); + dap_chain_net_t* l_net = NULL; + const char* l_wallets_path = dap_chain_wallet_get_path(g_config); char delegate_ticker_str[DAP_CHAIN_TICKER_SIZE_MAX] = {[0] = 'm'}; int l_prev_cond_idx = 0; uint256_t l_value_delegated = {}; @@ -384,8 +384,8 @@ static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, da char *l_datum_hash_str; dap_ledger_t *l_ledger; dap_chain_wallet_t *l_wallet; - dap_hash_fast_t l_tx_hash; - dap_hash_fast_t l_tx_burning_hash; + dap_hash_fast_t l_tx_hash; + dap_hash_fast_t l_tx_burning_hash; dap_chain_datum_t *l_datum_burning_tx; dap_chain_datum_tx_receipt_t *l_receipt; dap_chain_datum_tx_t *l_tx; @@ -393,40 +393,40 @@ static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, da dap_chain_tx_out_cond_t *l_tx_out_cond; dap_chain_addr_t *l_owner_addr; dap_enc_key_t *l_owner_key; - size_t l_tx_size; + size_t l_tx_size; dap_chain_datum_t *l_datum; dap_chain_t *l_chain; dap_chain_datum_token_t *delegate_token; dap_tsd_t *l_tsd; dap_chain_datum_token_tsd_delegate_from_stake_lock_t l_tsd_section; - dap_string_append_printf(output_line, "---> TAKE <---\n"); + dap_string_append_printf(output_line, "---> TAKE <---\n"); - if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-net", &l_net_str) - || NULL == l_net_str) - return NET_ARG_ERROR; + if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-net", &l_net_str) + || NULL == l_net_str) + return NET_ARG_ERROR; - if (NULL == (l_net = dap_chain_net_by_name(l_net_str))) { - dap_string_append_printf(output_line, "'%s'", l_net_str); - return NET_ERROR; - } + if (NULL == (l_net = dap_chain_net_by_name(l_net_str))) { + dap_string_append_printf(output_line, "'%s'", l_net_str); + return NET_ERROR; + } - if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-chain", &l_chain_str) - && 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) - return CHAIN_ERROR; + if (dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-chain", &l_chain_str) + && 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) + return CHAIN_ERROR; - if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-tx", &l_tx_str) - || NULL == l_tx_str) - return TX_ARG_ERROR; + if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-tx", &l_tx_str) + || NULL == l_tx_str) + return TX_ARG_ERROR; - dap_chain_hash_fast_from_hex_str(l_tx_str, &l_tx_hash); + dap_chain_hash_fast_from_hex_str(l_tx_str, &l_tx_hash); - if (dap_hash_fast_is_blank(&l_tx_hash)) - return HASH_IS_BLANK_ERROR; + if (dap_hash_fast_is_blank(&l_tx_hash)) + return HASH_IS_BLANK_ERROR; l_ledger = l_net->pub.ledger; @@ -441,33 +441,34 @@ static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, da || !delegate_token->header_native_decl.tsd_total_size || NULL == (l_tsd = dap_tsd_find(delegate_token->data_n_tsd, delegate_token->header_native_decl.tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK))) { dap_string_append_printf(output_line, "'%s'", delegate_ticker_str); - return NO_DELEGATE_TOKEN_ERROR; + return NO_DELEGATE_TOKEN_ERROR; } l_tsd_section = dap_tsd_get_scalar(l_tsd, dap_chain_datum_token_tsd_delegate_from_stake_lock_t); - if (strcmp(l_ticker_str, l_tsd_section.ticker_token_from)) + if (strcmp(l_ticker_str, l_tsd_section.ticker_token_from)) { return TOKEN_ERROR; + } - l_cond_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, &l_tx_hash); + l_cond_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, &l_tx_hash); - if (NULL == (l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_cond_tx, &l_prev_cond_idx))) - return NO_TX_ERROR; + if (NULL == (l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_cond_tx, &l_prev_cond_idx))) + return NO_TX_ERROR; - if (l_tx_out_cond->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK) - return NO_VALID_SUBTYPE_ERROR; + if (l_tx_out_cond->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK) + return NO_VALID_SUBTYPE_ERROR; - if (dap_chain_ledger_tx_hash_is_used_out_item(l_ledger, &l_tx_hash, l_prev_cond_idx)) { - return IS_USED_OUT_ERROR; - } + if (dap_chain_ledger_tx_hash_is_used_out_item(l_ledger, &l_tx_hash, l_prev_cond_idx)) { + return IS_USED_OUT_ERROR; + } - if (l_tx_out_cond->params_size != sizeof(*l_params))// Wrong params size - return WRONG_PARAM_SIZE; - l_params = (cond_params_t*)l_tx_out_cond->params; + if (l_tx_out_cond->params_size != sizeof(*l_params))// Wrong params size + return WRONG_PARAM_SIZE; + l_params = (cond_params_t*)l_tx_out_cond->params; - if (l_params->flags & DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME) { - if (l_params->time_unlock > dap_time_now()) - return NOT_ENOUGH_TIME; - } + if (l_params->flags & DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME) { + if (l_params->time_unlock > dap_time_now()) + return NOT_ENOUGH_TIME; + } if (!IS_ZERO_256(l_tsd_section.emission_rate)) { MULT_256_COIN(l_tx_out_cond->header.value, l_tsd_section.emission_rate, &l_value_delegated); @@ -477,103 +478,103 @@ static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, da l_value_delegated = l_tx_out_cond->header.value; } - if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-wallet", &l_wallet_str) - || NULL == l_wallet_str) - return WALLET_ARG_ERROR; + if (!dap_cli_server_cmd_find_option_val(a_argv, a_arg_index, a_argc, "-wallet", &l_wallet_str) + || NULL == l_wallet_str) + return WALLET_ARG_ERROR; - if (NULL == (l_wallet = dap_chain_wallet_open(l_wallet_str, l_wallets_path))) - return WALLET_OPEN_ERROR; + if (NULL == (l_wallet = dap_chain_wallet_open(l_wallet_str, l_wallets_path))) + return WALLET_OPEN_ERROR; - if (NULL == (l_owner_addr = (dap_chain_addr_t*)dap_chain_wallet_get_addr(l_wallet, l_net->pub.id))) { - dap_chain_wallet_close(l_wallet); - return WALLET_ADDR_ERROR; - } + if (NULL == (l_owner_addr = (dap_chain_addr_t*)dap_chain_wallet_get_addr(l_wallet, l_net->pub.id))) { + dap_chain_wallet_close(l_wallet); + return WALLET_ADDR_ERROR; + } - if (NULL == (l_owner_key = dap_chain_wallet_get_key(l_wallet, 0))) { - dap_chain_wallet_close(l_wallet); - DAP_DEL_Z(l_owner_addr); - return OWNER_KEY_ERROR; - } + if (NULL == (l_owner_key = dap_chain_wallet_get_key(l_wallet, 0))) { + dap_chain_wallet_close(l_wallet); + DAP_DEL_Z(l_owner_addr); + return OWNER_KEY_ERROR; + } - /*________________________________________________________________________________________________________________*/ + /*________________________________________________________________________________________________________________*/ - //add tx - if (NULL == (l_tx = dap_chain_datum_tx_create())) {//malloc - dap_chain_wallet_close(l_wallet); - DAP_DEL_Z(l_owner_addr); - return CREATE_TX_ERROR; - } + //add tx + if (NULL == (l_tx = dap_chain_datum_tx_create())) {//malloc + dap_chain_wallet_close(l_wallet); + DAP_DEL_Z(l_owner_addr); + return CREATE_TX_ERROR; + } - dap_chain_datum_tx_add_in_cond_item(&l_tx, &l_tx_hash, l_prev_cond_idx, 0); + dap_chain_datum_tx_add_in_cond_item(&l_tx, &l_tx_hash, l_prev_cond_idx, 0); - dap_chain_datum_tx_add_out_item(&l_tx, l_owner_addr, l_tx_out_cond->header.value); + dap_chain_datum_tx_add_out_item(&l_tx, l_owner_addr, l_tx_out_cond->header.value); - //add burning tx - if (NULL == (l_datum_burning_tx = dap_chain_burning_tx_create(l_chain, l_owner_key, l_owner_addr, NULL, + //add burning tx + if (NULL == (l_datum_burning_tx = dap_chain_burning_tx_create(l_chain, l_owner_key, l_owner_addr, NULL, delegate_ticker_str, l_value_delegated))) {//malloc - dap_chain_wallet_close(l_wallet); - DAP_DEL_Z(l_owner_addr); - dap_chain_datum_tx_delete(l_tx); - return CREATE_BURNING_TX_ERROR; - } + dap_chain_wallet_close(l_wallet); + DAP_DEL_Z(l_owner_addr); + dap_chain_datum_tx_delete(l_tx); + return CREATE_BURNING_TX_ERROR; + } - //get tx hash - dap_hash_fast(l_datum_burning_tx->data, l_datum_burning_tx->header.data_size, &l_tx_burning_hash); + //get tx hash + dap_hash_fast(l_datum_burning_tx->data, l_datum_burning_tx->header.data_size, &l_tx_burning_hash); if (NULL == (l_receipt = s_receipt_create(&l_tx_burning_hash, delegate_ticker_str, l_value_delegated))) { - dap_chain_wallet_close(l_wallet); - DAP_DEL_Z(l_owner_addr); - dap_chain_datum_tx_delete(l_tx); - DAP_DEL_Z(l_datum_burning_tx); - return CREATE_RECEIPT_ERROR; - } - - dap_chain_datum_tx_add_item(&l_tx, (byte_t*)l_receipt); - - if (dap_chain_datum_tx_add_sign_item(&l_tx, l_owner_key) != 1) { - dap_chain_wallet_close(l_wallet); - DAP_DEL_Z(l_owner_addr); - dap_chain_datum_tx_delete(l_tx); - DAP_DEL_Z(l_datum_burning_tx); - log_it(L_ERROR, "Can't add sign output"); - return SIGN_ERROR; - } - - dap_chain_wallet_close(l_wallet); - DAP_DEL_Z(l_owner_addr); - - // Put the transaction to mempool or directly to chains - l_tx_size = dap_chain_datum_tx_get_size(l_tx); - if (NULL == (l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size))) { - dap_chain_datum_tx_delete(l_tx); - DAP_DEL_Z(l_datum_burning_tx); - return CREATE_DATUM_ERROR; - } - - dap_chain_datum_tx_delete(l_tx); - - if (NULL == (l_datum_hash_str = dap_chain_mempool_datum_add(l_datum_burning_tx, l_chain))) { - DAP_DEL_Z(l_datum_burning_tx); - DAP_DEL_Z(l_datum); - return ADD_DATUM_BURNING_TX_ERROR; - } - - dap_string_append_printf(output_line, "BURNING_TX_DATUM_HASH=%s\n", l_datum_hash_str); - DAP_DEL_Z(l_datum_burning_tx); - DAP_DEL_Z(l_datum_hash_str); - - // Processing will be made according to autoprocess policy - if (NULL == (l_datum_hash_str = dap_chain_mempool_datum_add(l_datum, l_chain))) { - DAP_DEL_Z(l_datum); - return ADD_DATUM_TX_TAKE_ERROR; - } - - dap_string_append_printf(output_line, "TAKE_TX_DATUM_HASH=%s\n", l_datum_hash_str); - - DAP_DEL_Z(l_datum_hash_str); - DAP_DEL_Z(l_datum); - - return STAKE_NO_ERROR; + dap_chain_wallet_close(l_wallet); + DAP_DEL_Z(l_owner_addr); + dap_chain_datum_tx_delete(l_tx); + DAP_DEL_Z(l_datum_burning_tx); + return CREATE_RECEIPT_ERROR; + } + + dap_chain_datum_tx_add_item(&l_tx, (byte_t*)l_receipt); + + if (dap_chain_datum_tx_add_sign_item(&l_tx, l_owner_key) != 1) { + dap_chain_wallet_close(l_wallet); + DAP_DEL_Z(l_owner_addr); + dap_chain_datum_tx_delete(l_tx); + DAP_DEL_Z(l_datum_burning_tx); + log_it(L_ERROR, "Can't add sign output"); + return SIGN_ERROR; + } + + dap_chain_wallet_close(l_wallet); + DAP_DEL_Z(l_owner_addr); + + // Put the transaction to mempool or directly to chains + l_tx_size = dap_chain_datum_tx_get_size(l_tx); + if (NULL == (l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size))) { + dap_chain_datum_tx_delete(l_tx); + DAP_DEL_Z(l_datum_burning_tx); + return CREATE_DATUM_ERROR; + } + + dap_chain_datum_tx_delete(l_tx); + + if (NULL == (l_datum_hash_str = dap_chain_mempool_datum_add(l_datum_burning_tx, l_chain))) { + DAP_DEL_Z(l_datum_burning_tx); + DAP_DEL_Z(l_datum); + return ADD_DATUM_BURNING_TX_ERROR; + } + + dap_string_append_printf(output_line, "BURNING_TX_DATUM_HASH=%s\n", l_datum_hash_str); + DAP_DEL_Z(l_datum_burning_tx); + DAP_DEL_Z(l_datum_hash_str); + + // Processing will be made according to autoprocess policy + if (NULL == (l_datum_hash_str = dap_chain_mempool_datum_add(l_datum, l_chain))) { + DAP_DEL_Z(l_datum); + return ADD_DATUM_TX_TAKE_ERROR; + } + + dap_string_append_printf(output_line, "TAKE_TX_DATUM_HASH=%s\n", l_datum_hash_str); + + DAP_DEL_Z(l_datum_hash_str); + DAP_DEL_Z(l_datum); + + return STAKE_NO_ERROR; } /** @@ -583,172 +584,172 @@ static enum error_code s_cli_take(int a_argc, char** a_argv, int a_arg_index, da */ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line) { - dap_string_append_printf(output_line, "ERROR!\n"); - switch (errorCode) - { - case NET_ARG_ERROR: { - dap_string_append_printf(output_line, "stake_lock command required parameter -net"); - } break; - - case NET_ERROR: { + dap_string_append_printf(output_line, "ERROR!\n"); + switch (errorCode) + { + case NET_ARG_ERROR: { + dap_string_append_printf(output_line, "stake_lock command required parameter -net"); + } break; + + case NET_ERROR: { dap_string_append_printf(output_line, "^^^ network not found"); - } break; + } break; - case TOKEN_ARG_ERROR: { - dap_string_append_printf(output_line, "stake_lock command required parameter -token"); - } break; + case TOKEN_ARG_ERROR: { + dap_string_append_printf(output_line, "stake_lock command required parameter -token"); + } break; - case TOKEN_ERROR: { + case TOKEN_ERROR: { dap_string_append_printf(output_line, "^^^ token ticker not found"); - } break; + } break; - case COINS_ARG_ERROR: { - dap_string_append_printf(output_line, "stake_lock command required parameter -coins"); - } break; + case COINS_ARG_ERROR: { + dap_string_append_printf(output_line, "stake_lock command required parameter -coins"); + } break; - case COINS_FORMAT_ERROR: { - dap_string_append_printf(output_line, "Format -coins <256 bit integer>"); - } break; + case COINS_FORMAT_ERROR: { + dap_string_append_printf(output_line, "Format -coins <256 bit integer>"); + } break; - case ADDR_ARG_ERROR: { - dap_string_append_printf(output_line, "stake_lock command required parameter -addr_holder"); - } break; + case ADDR_ARG_ERROR: { + dap_string_append_printf(output_line, "stake_lock command required parameter -addr_holder"); + } break; - case ADDR_FORMAT_ERROR: { - dap_string_append_printf(output_line, "wrong address holder format"); - } break; + case ADDR_FORMAT_ERROR: { + dap_string_append_printf(output_line, "wrong address holder format"); + } break; - case CERT_ARG_ERROR: { - dap_string_append_printf(output_line, "stake_lock command required parameter -cert"); - } break; + case CERT_ARG_ERROR: { + dap_string_append_printf(output_line, "stake_lock command required parameter -cert"); + } break; - case CERT_LOAD_ERROR: { + case CERT_LOAD_ERROR: { dap_string_append_printf(output_line, "^^^ can't load cert"); - } break; + } break; - case CHAIN_ERROR: { - dap_string_append_printf(output_line, "stake_lock command requires parameter '-chain'.\n" - "you can set default datum type in chain configuration file"); - } break; + case CHAIN_ERROR: { + dap_string_append_printf(output_line, "stake_lock command requires parameter '-chain'.\n" + "you can set default datum type in chain configuration file"); + } break; - case CHAIN_EMISSION_ERROR: { - dap_string_append_printf(output_line, "stake_lock command requires parameter '-chain_emission'.\n" - "you can set default datum type in chain configuration file"); - } break; + case CHAIN_EMISSION_ERROR: { + dap_string_append_printf(output_line, "stake_lock command requires parameter '-chain_emission'.\n" + "you can set default datum type in chain configuration file"); + } break; - case TIME_ERROR: { + case TIME_ERROR: { dap_string_append_printf(output_line, "stake_ext command requires parameter '-time_staking' in simplified format YYMMDD\n" "Example: \"220610\" == \"10 june 2022 00:00\""); - } break; + } break; - case NO_MONEY_ERROR: { - dap_string_append_printf(output_line, "Not enough money"); - } break; + case NO_MONEY_ERROR: { + dap_string_append_printf(output_line, "Not enough money"); + } break; - case WALLET_ARG_ERROR: { - dap_string_append_printf(output_line, "stake_lock command required parameter -wallet"); - } break; + case WALLET_ARG_ERROR: { + dap_string_append_printf(output_line, "stake_lock command required parameter -wallet"); + } break; - case WALLET_OPEN_ERROR: { + case WALLET_OPEN_ERROR: { dap_string_append_printf(output_line, "^^^ can't open wallet"); - } break; + } break; - case CERT_KEY_ERROR: { + case CERT_KEY_ERROR: { dap_string_append_printf(output_line, "^^^ cert doesn't contain a valid public key"); - } break; + } break; - case WALLET_ADDR_ERROR: { + case WALLET_ADDR_ERROR: { dap_string_append_printf(output_line, "^^^ failed to get wallet address"); - } break; + } break; - case TX_ARG_ERROR: { - dap_string_append_printf(output_line, "stake_lock command required parameter -tx"); - } break; + case TX_ARG_ERROR: { + dap_string_append_printf(output_line, "stake_lock command required parameter -tx"); + } break; - case HASH_IS_BLANK_ERROR: { - dap_string_append_printf(output_line, "tx hash is blank"); - } break; + case HASH_IS_BLANK_ERROR: { + dap_string_append_printf(output_line, "tx hash is blank"); + } break; - case NO_TX_ERROR: { + case NO_TX_ERROR: { dap_string_append_printf(output_line, "^^^ could not find transaction"); - } break; + } break; - case STAKE_ERROR: { - dap_string_append_printf(output_line, "STAKE ERROR"); - } break; + case STAKE_ERROR: { + dap_string_append_printf(output_line, "STAKE ERROR"); + } break; - case NOT_ENOUGH_TIME: { - dap_string_append_printf(output_line, "Not enough time has passed"); - } break; + case NOT_ENOUGH_TIME: { + dap_string_append_printf(output_line, "Not enough time has passed"); + } break; case TX_TICKER_ERROR: { dap_string_append_printf(output_line, "ticker not found"); - } break; + } break; - case NO_DELEGATE_TOKEN_ERROR: { + case NO_DELEGATE_TOKEN_ERROR: { dap_string_append_printf(output_line, " ^^^ delegated token not found"); - } break; + } break; - case NO_VALID_SUBTYPE_ERROR: { - dap_string_append_printf(output_line, "wrong subtype for transaction"); - } break; + case NO_VALID_SUBTYPE_ERROR: { + dap_string_append_printf(output_line, "wrong subtype for transaction"); + } break; - case IS_USED_OUT_ERROR: { - dap_string_append_printf(output_line, "tx hash is used out"); - } break; + case IS_USED_OUT_ERROR: { + dap_string_append_printf(output_line, "tx hash is used out"); + } break; - case OWNER_KEY_ERROR: { - dap_string_append_printf(output_line, "key retrieval error"); - } break; + case OWNER_KEY_ERROR: { + dap_string_append_printf(output_line, "key retrieval error"); + } break; - case CREATE_TX_ERROR: { - dap_string_append_printf(output_line, "memory allocation error when creating a transaction"); - } break; + case CREATE_TX_ERROR: { + dap_string_append_printf(output_line, "memory allocation error when creating a transaction"); + } break; - case CREATE_BURNING_TX_ERROR: { - dap_string_append_printf(output_line, "failed to create a transaction that burns funds"); - } break; + case CREATE_BURNING_TX_ERROR: { + dap_string_append_printf(output_line, "failed to create a transaction that burns funds"); + } break; - case CREATE_RECEIPT_ERROR: { - dap_string_append_printf(output_line, "failed to create receipt"); - } break; + case CREATE_RECEIPT_ERROR: { + dap_string_append_printf(output_line, "failed to create receipt"); + } break; - case SIGN_ERROR: { - dap_string_append_printf(output_line, "failed to sign transaction"); - } break; + case SIGN_ERROR: { + dap_string_append_printf(output_line, "failed to sign transaction"); + } break; - case ADD_DATUM_BURNING_TX_ERROR: { - dap_string_append_printf(output_line, "failed to add datum with burning-transaction to mempool"); - } break; + case ADD_DATUM_BURNING_TX_ERROR: { + dap_string_append_printf(output_line, "failed to add datum with burning-transaction to mempool"); + } break; - case ADD_DATUM_TX_TAKE_ERROR: { - dap_string_append_printf(output_line, "failed to add datum with take-transaction to mempool"); - } break; + case ADD_DATUM_TX_TAKE_ERROR: { + dap_string_append_printf(output_line, "failed to add datum with take-transaction to mempool"); + } break; - case BASE_TX_CREATE_ERROR: { - dap_string_append_printf(output_line, "failed to create the base transaction for emission"); - } break; + case BASE_TX_CREATE_ERROR: { + dap_string_append_printf(output_line, "failed to create the base transaction for emission"); + } break; - case WRONG_PARAM_SIZE: { - dap_string_append_printf(output_line, "error while checking conditional transaction parameters"); - } break; + case WRONG_PARAM_SIZE: { + dap_string_append_printf(output_line, "error while checking conditional transaction parameters"); + } break; - case CREATE_LOCK_TX_ERROR: { - dap_string_append_printf(output_line, "error creating transaction"); - } break; + case CREATE_LOCK_TX_ERROR: { + dap_string_append_printf(output_line, "error creating transaction"); + } break; - case CREATE_DATUM_ERROR: { - dap_string_append_printf(output_line, "error while creating datum from transaction"); - } break; + case CREATE_DATUM_ERROR: { + dap_string_append_printf(output_line, "error while creating datum from transaction"); + } break; case REINVEST_ARG_ERROR: { dap_string_append_printf(output_line, "reinvestment is set as a percentage from 1 to 100"); } break; - default: { - dap_string_append_printf(output_line, "STAKE_LOCK: Unrecognized error"); - } break; - } + default: { + dap_string_append_printf(output_line, "STAKE_LOCK: Unrecognized error"); + } break; + } } /** @@ -760,45 +761,45 @@ static void s_error_handler(enum error_code errorCode, dap_string_t* output_line */ static int s_cli_stake_lock(int a_argc, char** a_argv, char** a_str_reply) { - enum { - CMD_NONE, CMD_HOLD, CMD_TAKE - }; + enum { + CMD_NONE, CMD_HOLD, CMD_TAKE + }; - enum error_code errorCode; - int l_arg_index = 1; - int l_cmd_num = CMD_NONE; - dap_string_t* output_line = dap_string_new(NULL); + enum error_code errorCode; + int l_arg_index = 1; + int l_cmd_num = CMD_NONE; + dap_string_t* output_line = dap_string_new(NULL); - if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "hold", NULL)) - l_cmd_num = CMD_HOLD; - else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "take", NULL)) - l_cmd_num = CMD_TAKE; + if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "hold", NULL)) + l_cmd_num = CMD_HOLD; + else if (dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "take", NULL)) + l_cmd_num = CMD_TAKE; - switch (l_cmd_num) { + switch (l_cmd_num) { - case CMD_HOLD: { - errorCode = s_cli_hold(a_argc, a_argv, l_arg_index + 1, output_line); - } break; + case CMD_HOLD: { + errorCode = s_cli_hold(a_argc, a_argv, l_arg_index + 1, output_line); + } break; - case CMD_TAKE: { - errorCode = s_cli_take(a_argc, a_argv, l_arg_index + 1, output_line); - } break; + case CMD_TAKE: { + errorCode = s_cli_take(a_argc, a_argv, l_arg_index + 1, output_line); + } break; - default: { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Command %s not recognized", a_argv[l_arg_index]); - dap_string_free(output_line, false); - } return 1; - } + default: { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Command %s not recognized", a_argv[l_arg_index]); + dap_string_free(output_line, false); + } return 1; + } - if (STAKE_NO_ERROR != errorCode) - s_error_handler(errorCode, output_line); - else - dap_string_append_printf(output_line, "Contribution successfully made"); + if (STAKE_NO_ERROR != errorCode) + s_error_handler(errorCode, output_line); + else + dap_string_append_printf(output_line, "Contribution successfully made"); - dap_cli_server_cmd_set_reply_text(a_str_reply, output_line->str); - dap_string_free(output_line, true); + dap_cli_server_cmd_set_reply_text(a_str_reply, output_line->str); + dap_string_free(output_line, true); - return 0; + return 0; } /** @@ -809,49 +810,49 @@ static int s_cli_stake_lock(int a_argc, char** a_argv, char** a_str_reply) static const char* s_give_month_str_from_month_count(uint8_t month_count) { - switch (month_count) - { - case 1: { - return "Jan"; - } - case 2: { - return "Feb"; - } - case 3: { - return "Mar"; - } - case 4: { - return "Apr"; - } - case 5: { - return "May"; - } - case 6: { - return "Jun"; - } - case 7: { - return "Jul"; - } - case 8: { - return "Aug"; - } - case 9: { - return "Sep"; - } - case 10: { - return "Oct"; - } - case 11: { - return "Nov"; - } - case 12: { - return "Dec"; - } - - default: { - return ""; - } - } + switch (month_count) + { + case 1: { + return "Jan"; + } + case 2: { + return "Feb"; + } + case 3: { + return "Mar"; + } + case 4: { + return "Apr"; + } + case 5: { + return "May"; + } + case 6: { + return "Jun"; + } + case 7: { + return "Jul"; + } + case 8: { + return "Aug"; + } + case 9: { + return "Sep"; + } + case 10: { + return "Oct"; + } + case 11: { + return "Nov"; + } + case 12: { + return "Dec"; + } + + default: { + return ""; + } + } } /** @@ -861,34 +862,34 @@ static const char* s_give_month_str_from_month_count(uint8_t month_count) */ static uint8_t s_give_month_count_from_time_str(char* time) { - const uint8_t len_month = 3; - - if (!memcmp(&time[MONTH_INDEX], "Jan", len_month)) - return 1; - else if (!memcmp(&time[MONTH_INDEX], "Feb", len_month)) - return 2; - else if (!memcmp(&time[MONTH_INDEX], "Mar", len_month)) - return 3; - else if (!memcmp(&time[MONTH_INDEX], "Apr", len_month)) - return 4; - else if (!memcmp(&time[MONTH_INDEX], "May", len_month)) - return 5; - else if (!memcmp(&time[MONTH_INDEX], "Jun", len_month)) - return 6; - else if (!memcmp(&time[MONTH_INDEX], "Jul", len_month)) - return 7; - else if (!memcmp(&time[MONTH_INDEX], "Aug", len_month)) - return 8; - else if (!memcmp(&time[MONTH_INDEX], "Sep", len_month)) - return 9; - else if (!memcmp(&time[MONTH_INDEX], "Oct", len_month)) - return 10; - else if (!memcmp(&time[MONTH_INDEX], "Nov", len_month)) - return 11; - else if (!memcmp(&time[MONTH_INDEX], "Dec", len_month)) - return 12; - else - return 0; + const uint8_t len_month = 3; + + if (!memcmp(&time[MONTH_INDEX], "Jan", len_month)) + return 1; + else if (!memcmp(&time[MONTH_INDEX], "Feb", len_month)) + return 2; + else if (!memcmp(&time[MONTH_INDEX], "Mar", len_month)) + return 3; + else if (!memcmp(&time[MONTH_INDEX], "Apr", len_month)) + return 4; + else if (!memcmp(&time[MONTH_INDEX], "May", len_month)) + return 5; + else if (!memcmp(&time[MONTH_INDEX], "Jun", len_month)) + return 6; + else if (!memcmp(&time[MONTH_INDEX], "Jul", len_month)) + return 7; + else if (!memcmp(&time[MONTH_INDEX], "Aug", len_month)) + return 8; + else if (!memcmp(&time[MONTH_INDEX], "Sep", len_month)) + return 9; + else if (!memcmp(&time[MONTH_INDEX], "Oct", len_month)) + return 10; + else if (!memcmp(&time[MONTH_INDEX], "Nov", len_month)) + return 11; + else if (!memcmp(&time[MONTH_INDEX], "Dec", len_month)) + return 12; + else + return 0; } /** @@ -899,44 +900,44 @@ static uint8_t s_give_month_count_from_time_str(char* time) */ static char* s_update_date_by_using_month_count(char* time, uint8_t month_count) { - uint8_t current_month; - int current_year; - const char* month_str; - const char* year_str; - - if (!time || !month_count) - return NULL; - if ((current_month = s_give_month_count_from_time_str(time)) == 0) - return NULL; - if ((current_year = atoi(&time[YEAR_INDEX])) <= 0 - || current_year < 22 - || current_year > 99) - return NULL; - - - for (uint8_t i = 0; i < month_count; i++) { - if (current_month == 12) - { - current_month = 1; - current_year++; - } - else - current_month++; - } - - month_str = s_give_month_str_from_month_count(current_month); - year_str = dap_itoa(current_year); - - if (*month_str - && *year_str - && dap_strlen(year_str) == 2) { - memcpy(&time[MONTH_INDEX], month_str, 3); // 3 == len month in time RFC822 format - memcpy(&time[YEAR_INDEX], year_str, 2); // 2 == len year in time RFC822 format - } - else - return NULL; - - return time; + uint8_t current_month; + int current_year; + const char* month_str; + const char* year_str; + + if (!time || !month_count) + return NULL; + if ((current_month = s_give_month_count_from_time_str(time)) == 0) + return NULL; + if ((current_year = atoi(&time[YEAR_INDEX])) <= 0 + || current_year < 22 + || current_year > 99) + return NULL; + + + for (uint8_t i = 0; i < month_count; i++) { + if (current_month == 12) + { + current_month = 1; + current_year++; + } + else + current_month++; + } + + month_str = s_give_month_str_from_month_count(current_month); + year_str = dap_itoa(current_year); + + if (*month_str + && *year_str + && dap_strlen(year_str) == 2) { + memcpy(&time[MONTH_INDEX], month_str, 3); // 3 == len month in time RFC822 format + memcpy(&time[YEAR_INDEX], year_str, 2); // 2 == len year in time RFC822 format + } + else + return NULL; + + return time; } /** @@ -961,28 +962,28 @@ bool s_callback_verificator(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_c const char *l_tx_ticker; dap_chain_datum_token_t *delegate_token; - /*if (!a_owner) TODO: ??? + /*if (!a_owner) TODO: ??? return false;*/ - if (a_cond->params_size != sizeof(*l_params))// Wrong params size - return false; - l_params = (cond_params_t*)a_cond->params; + if (a_cond->params_size != sizeof(*l_params))// Wrong params size + return false; + l_params = (cond_params_t*)a_cond->params; - if (l_params->flags & DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME) { - if (l_params->time_unlock > dap_time_now()) - return false; - } + if (l_params->flags & DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME) { + if (l_params->time_unlock > dap_time_now()) + return false; + } l_receipt = (dap_chain_datum_tx_receipt_t *)dap_chain_datum_tx_item_get(a_tx, 0, TX_ITEM_TYPE_RECEIPT, 0); - if (!l_receipt) - return false; + if (!l_receipt) + return false; #if DAP_CHAIN_NET_SRV_UID_SIZE == 8 - if (l_receipt->receipt_info.srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_LOCK_ID) - return false; + if (l_receipt->receipt_info.srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_LOCK_ID) + return false; #elif DAP_CHAIN_NET_SRV_UID_SIZE == 16 - if (l_receipt->receipt_info.srv_uid.uint128 != DAP_CHAIN_NET_SRV_EXTERNAL_STAKE_ID) - return false; + if (l_receipt->receipt_info.srv_uid.uint128 != DAP_CHAIN_NET_SRV_EXTERNAL_STAKE_ID) + return false; #endif char delegated_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; @@ -993,13 +994,13 @@ bool s_callback_verificator(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_c return false; } - if (dap_hash_fast_is_blank(&hash_burning_transaction)) - return false; + if (dap_hash_fast_is_blank(&hash_burning_transaction)) + return false; l_tx_out = (dap_chain_tx_out_t *)dap_chain_datum_tx_item_get(a_tx, 0, TX_ITEM_TYPE_OUT,0); - if (!l_tx_out) - return false; + if (!l_tx_out) + return false; if (!EQUAL_256(a_cond->header.value, l_tx_out->header.value)) return false; @@ -1023,14 +1024,15 @@ bool s_callback_verificator(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_c return false; if (NULL == (l_tx_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, &hash_burning_transaction))) return false; - if (strcmp(l_tx_ticker, delegated_ticker)) + if (strcmp(l_tx_ticker, delegated_ticker)) { return false; + } - burning_tx = dap_chain_ledger_tx_find_by_hash(a_ledger, &hash_burning_transaction); - burning_transaction_out = (dap_chain_tx_out_t*)dap_chain_datum_tx_item_get(burning_tx, 0, TX_ITEM_TYPE_OUT, 0); + burning_tx = dap_chain_ledger_tx_find_by_hash(a_ledger, &hash_burning_transaction); + burning_transaction_out = (dap_chain_tx_out_t*)dap_chain_datum_tx_item_get(burning_tx, 0, TX_ITEM_TYPE_OUT, 0); - if (!burning_transaction_out) - return false; + if (!burning_transaction_out) + return false; if (!dap_hash_fast_is_blank(&burning_transaction_out->addr.data.hash_fast)) { if (s_debug_more) { @@ -1038,7 +1040,7 @@ bool s_callback_verificator(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_c log_it(L_ERROR, "ADDR from burning NOT BLANK: %s", addr_srt); DAP_DEL_Z(addr_srt); } - return false; + return false; } if (!IS_ZERO_256(l_tsd_section.emission_rate)) { @@ -1061,9 +1063,9 @@ bool s_callback_verificator(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_c } if (!EQUAL_256(burning_transaction_out->header.value, l_value_delegated))//MULT - return false; + return false; - return true; + return true; } /** @@ -1075,21 +1077,21 @@ bool s_callback_verificator(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_c */ bool s_callback_verificator_added(dap_ledger_t * a_ledger,dap_chain_datum_tx_t* a_tx, dap_chain_tx_out_cond_t *a_tx_item) { - dap_chain_hash_fast_t* l_key_hash = DAP_NEW_Z(dap_chain_hash_fast_t); - if (!l_key_hash) - return false; - size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx); - dap_hash_fast(a_tx, l_tx_size, l_key_hash); - if (dap_hash_fast_is_blank(l_key_hash)) { - DAP_DEL_Z(l_key_hash); - return false; - } + dap_chain_hash_fast_t* l_key_hash = DAP_NEW_Z(dap_chain_hash_fast_t); + if (!l_key_hash) + return false; + size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx); + dap_hash_fast(a_tx, l_tx_size, l_key_hash); + if (dap_hash_fast_is_blank(l_key_hash)) { + DAP_DEL_Z(l_key_hash); + return false; + } s_emission_for_stake_lock_item_add(a_ledger, l_key_hash); - DAP_DEL_Z(l_key_hash); + DAP_DEL_Z(l_key_hash); - return true; + return true; } /** @@ -1105,76 +1107,76 @@ bool s_callback_verificator_added(dap_ledger_t * a_ledger,dap_chain_datum_tx_t* * @return */ static dap_chain_datum_t* s_mempool_create(dap_chain_net_t* a_net, - dap_enc_key_t* a_key_from, dap_pkey_t* a_key_cond, - const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], - uint256_t a_value, dap_chain_net_srv_uid_t a_srv_uid, + dap_enc_key_t* a_key_from, dap_pkey_t* a_key_cond, + const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], + uint256_t a_value, dap_chain_net_srv_uid_t a_srv_uid, dap_chain_addr_t* a_addr_holder, dap_time_t a_time_staking, uint8_t reinvest) { - dap_ledger_t* l_ledger = a_net ? dap_chain_ledger_by_net_name(a_net->pub.name) : NULL; - // check valid param - if (!a_net || !l_ledger || !a_key_from || !a_key_cond || - !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || IS_ZERO_256(a_value)) - return NULL; - - // find the transactions from which to take away coins - uint256_t l_value_transfer = {}; // how many coins to transfer + dap_ledger_t* l_ledger = a_net ? dap_chain_ledger_by_net_name(a_net->pub.name) : NULL; + // check valid param + if (!a_net || !l_ledger || !a_key_from || !a_key_cond || + !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || IS_ZERO_256(a_value)) + return NULL; + + // find the transactions from which to take away coins + uint256_t l_value_transfer = {}; // how many coins to transfer // uint256_t l_value_need = {}; // SUM_256_256(a_value, a_value_fee, &l_value_need); - // where to take coins for service - dap_chain_addr_t l_addr_from; - dap_chain_addr_fill_from_key(&l_addr_from, a_key_from, a_net->pub.id); - // list of transaction with 'out' items - dap_list_t* l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_token_ticker, - &l_addr_from, a_value, &l_value_transfer); - if (!l_list_used_out) { - log_it(L_ERROR, "Nothing to tranfer (not enough funds)"); - return NULL; - } - - // create empty transaction - dap_chain_datum_tx_t* l_tx = dap_chain_datum_tx_create(); - // add 'in' items - { - uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out); - assert(EQUAL_256(l_value_to_items, l_value_transfer)); - dap_list_free_full(l_list_used_out, free); - } - // add 'out_cond' and 'out' items - { - uint256_t l_value_pack = {}; // how much coin add to 'out' items + // where to take coins for service + dap_chain_addr_t l_addr_from; + dap_chain_addr_fill_from_key(&l_addr_from, a_key_from, a_net->pub.id); + // list of transaction with 'out' items + dap_list_t* l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_token_ticker, + &l_addr_from, a_value, &l_value_transfer); + if (!l_list_used_out) { + log_it(L_ERROR, "Nothing to tranfer (not enough funds)"); + return NULL; + } + + // create empty transaction + dap_chain_datum_tx_t* l_tx = dap_chain_datum_tx_create(); + // add 'in' items + { + uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out); + assert(EQUAL_256(l_value_to_items, l_value_transfer)); + dap_list_free_full(l_list_used_out, free); + } + // add 'out_cond' and 'out' items + { + uint256_t l_value_pack = {}; // how much coin add to 'out' items dap_chain_tx_out_cond_t* l_tx_out_cond = dap_chain_net_srv_stake_lock_create_cond_out(a_key_cond, a_srv_uid, a_value, a_time_staking, reinvest); - if (l_tx_out_cond) { - SUM_256_256(l_value_pack, a_value, &l_value_pack); - dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*)l_tx_out_cond); - // DAP_DEL_Z(l_tx_out_cond); - // transaction fee - // if (!IS_ZERO_256(a_value_fee)) { - // TODO add condition with fee for mempool-as-service - // } - }//TODO: else return false; - // coin back - uint256_t l_value_back = {}; - SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back); - if (!IS_ZERO_256(l_value_back)) { - if (dap_chain_datum_tx_add_out_item(&l_tx, &l_addr_from, l_value_back) != 1) { - dap_chain_datum_tx_delete(l_tx); - log_it(L_ERROR, "Cant add coin back output"); - return NULL; - } - } - } - - // add 'sign' items - if (dap_chain_datum_tx_add_sign_item(&l_tx, a_key_from) != 1) { - dap_chain_datum_tx_delete(l_tx); - log_it(L_ERROR, "Can't add sign output"); - return NULL; - } - - size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); - dap_chain_datum_t* l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size); - - return l_datum; + if (l_tx_out_cond) { + SUM_256_256(l_value_pack, a_value, &l_value_pack); + dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*)l_tx_out_cond); + // DAP_DEL_Z(l_tx_out_cond); + // transaction fee + // if (!IS_ZERO_256(a_value_fee)) { + // TODO add condition with fee for mempool-as-service + // } + }//TODO: else return false; + // coin back + uint256_t l_value_back = {}; + SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back); + if (!IS_ZERO_256(l_value_back)) { + if (dap_chain_datum_tx_add_out_item(&l_tx, &l_addr_from, l_value_back) != 1) { + dap_chain_datum_tx_delete(l_tx); + log_it(L_ERROR, "Cant add coin back output"); + return NULL; + } + } + } + + // add 'sign' items + if (dap_chain_datum_tx_add_sign_item(&l_tx, a_key_from) != 1) { + dap_chain_datum_tx_delete(l_tx); + log_it(L_ERROR, "Can't add sign output"); + return NULL; + } + + size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); + dap_chain_datum_t* l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size); + + return l_datum; } /** @@ -1189,24 +1191,24 @@ static dap_chain_datum_t* s_mempool_create(dap_chain_net_t* a_net, dap_chain_tx_out_cond_t* dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t* a_key, dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, uint64_t a_time_staking, uint8_t reinvest) { - if (IS_ZERO_256(a_value)) - return NULL; - dap_chain_tx_out_cond_t* l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + sizeof(cond_params_t)); - l_item->header.item_type = TX_ITEM_TYPE_OUT_COND; - l_item->header.value = a_value; - l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK; - l_item->header.srv_uid = a_srv_uid; - l_item->params_size = sizeof(cond_params_t); - cond_params_t* l_params = (cond_params_t*)l_item->params; + if (IS_ZERO_256(a_value)) + return NULL; + dap_chain_tx_out_cond_t* l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + sizeof(cond_params_t)); + l_item->header.item_type = TX_ITEM_TYPE_OUT_COND; + l_item->header.value = a_value; + l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK; + l_item->header.srv_uid = a_srv_uid; + l_item->params_size = sizeof(cond_params_t); + cond_params_t* l_params = (cond_params_t*)l_item->params; l_params->reinvest = reinvest; - if (a_time_staking) { - l_params->time_unlock = dap_time_now() + a_time_staking; - l_params->flags |= DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME; - } - if (a_key) - dap_hash_fast(a_key->pkey, a_key->header.size, &l_params->pkey_delegated); - - return l_item; + if (a_time_staking) { + l_params->time_unlock = dap_time_now() + a_time_staking; + l_params->flags |= DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME; + } + if (a_key) + dap_hash_fast(a_key->pkey, a_key->header.size, &l_params->pkey_delegated); + + return l_item; } @@ -1223,105 +1225,105 @@ dap_chain_tx_out_cond_t* dap_chain_net_srv_stake_lock_create_cond_out(dap_pkey_t * @return */ dap_chain_hash_fast_t* dap_chain_net_srv_stake_lock_mempool_create(dap_chain_net_t* a_net, - dap_enc_key_t* a_key_from, dap_pkey_t* a_key_cond, - const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], - uint256_t a_value, dap_chain_net_srv_uid_t a_srv_uid, + dap_enc_key_t* a_key_from, dap_pkey_t* a_key_cond, + const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], + uint256_t a_value, dap_chain_net_srv_uid_t a_srv_uid, dap_chain_addr_t* a_addr_holder, uint64_t a_time_staking, uint8_t reinvest) { - // Make transfer transaction - dap_chain_datum_t* l_datum = s_mempool_create(a_net, a_key_from, a_key_cond, a_token_ticker, a_value, a_srv_uid, + // Make transfer transaction + dap_chain_datum_t* l_datum = s_mempool_create(a_net, a_key_from, a_key_cond, a_token_ticker, a_value, a_srv_uid, a_addr_holder, a_time_staking, reinvest); - if (!l_datum) - return NULL; + if (!l_datum) + return NULL; - dap_chain_datum_tx_t* l_tx = (dap_chain_datum_tx_t*)&(l_datum->data); - size_t l_tx_size = l_datum->header.data_size; + dap_chain_datum_tx_t* l_tx = (dap_chain_datum_tx_t*)&(l_datum->data); + size_t l_tx_size = l_datum->header.data_size; - dap_chain_hash_fast_t* l_key_hash = DAP_NEW_Z(dap_chain_hash_fast_t); - dap_hash_fast(l_tx, l_tx_size, l_key_hash); + dap_chain_hash_fast_t* l_key_hash = DAP_NEW_Z(dap_chain_hash_fast_t); + dap_hash_fast(l_tx, l_tx_size, l_key_hash); - char* l_key_str = dap_chain_hash_fast_to_str_new(l_key_hash); - char* l_gdb_group = dap_chain_net_get_gdb_group_mempool_by_chain_type(a_net, CHAIN_TYPE_TX); + char* l_key_str = dap_chain_hash_fast_to_str_new(l_key_hash); + char* l_gdb_group = dap_chain_net_get_gdb_group_mempool_by_chain_type(a_net, CHAIN_TYPE_TX); - if (dap_global_db_set(l_gdb_group, l_key_str, l_datum, dap_chain_datum_size(l_datum), false, NULL, NULL) == true) { - log_it(L_NOTICE, "Transaction %s placed in mempool group %s", l_key_str, l_gdb_group); - } + if (dap_global_db_set(l_gdb_group, l_key_str, l_datum, dap_chain_datum_size(l_datum), false, NULL, NULL) == true) { + log_it(L_NOTICE, "Transaction %s placed in mempool group %s", l_key_str, l_gdb_group); + } - DAP_DELETE(l_gdb_group); - DAP_DELETE(l_key_str); + DAP_DELETE(l_gdb_group); + DAP_DELETE(l_key_str); - return l_key_hash; + return l_key_hash; } dap_chain_datum_t* dap_chain_burning_tx_create(dap_chain_t* a_chain, dap_enc_key_t* a_key_from, - const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, - const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], - uint256_t a_value) + const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, + const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], + uint256_t a_value) { - // check valid param - if (!a_chain | !a_key_from || !a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || - !dap_chain_addr_check_sum(a_addr_from) || (a_addr_to && !dap_chain_addr_check_sum(a_addr_to)) || IS_ZERO_256(a_value)) - return NULL; - - // find the transactions from which to take away coins - uint256_t l_value_transfer = {}; // how many coins to transfer - dap_list_t* l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(a_chain->ledger, a_token_ticker, - a_addr_from, a_value, &l_value_transfer); - if (!l_list_used_out) { - log_it(L_WARNING, "Not enough funds to transfer"); - return NULL; - } - // create empty transaction - dap_chain_datum_tx_t* l_tx = dap_chain_datum_tx_create(); - // add 'in' items - { - uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out); - assert(EQUAL_256(l_value_to_items, l_value_transfer)); - dap_list_free_full(l_list_used_out, free); - } - // add 'out' items - { - uint256_t l_value_pack = {}; // how much datoshi add to 'out' items - if (dap_chain_datum_tx_add_out_item(&l_tx, a_addr_to, a_value) == 1) { - SUM_256_256(l_value_pack, a_value, &l_value_pack); - } - // coin back - uint256_t l_value_back; - SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back); - if (!IS_ZERO_256(l_value_back)) { - if (dap_chain_datum_tx_add_out_item(&l_tx, a_addr_from, l_value_back) != 1) { - dap_chain_datum_tx_delete(l_tx); - return NULL; - } - } - } - - // add 'sign' items - if (dap_chain_datum_tx_add_sign_item(&l_tx, a_key_from) != 1) { - dap_chain_datum_tx_delete(l_tx); - return NULL; - } - - size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); - dap_chain_datum_t* l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size); - - DAP_DELETE(l_tx); - - return l_datum; - - // dap_hash_fast_t * l_ret = DAP_NEW_Z(dap_hash_fast_t); - // dap_hash_fast(l_tx, l_tx_size, l_ret); - // DAP_DELETE(l_tx); - // char *l_hash_str = dap_chain_mempool_datum_add(l_datum, a_chain); - - // DAP_DELETE( l_datum ); - // - // if (l_hash_str) { - // DAP_DELETE(l_hash_str); - // return l_ret; - // }else{ - // DAP_DELETE(l_ret); - // return NULL; - // } + // check valid param + if (!a_chain | !a_key_from || !a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || + !dap_chain_addr_check_sum(a_addr_from) || (a_addr_to && !dap_chain_addr_check_sum(a_addr_to)) || IS_ZERO_256(a_value)) + return NULL; + + // find the transactions from which to take away coins + uint256_t l_value_transfer = {}; // how many coins to transfer + dap_list_t* l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(a_chain->ledger, a_token_ticker, + a_addr_from, a_value, &l_value_transfer); + if (!l_list_used_out) { + log_it(L_WARNING, "Not enough funds to transfer"); + return NULL; + } + // create empty transaction + dap_chain_datum_tx_t* l_tx = dap_chain_datum_tx_create(); + // add 'in' items + { + uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out); + assert(EQUAL_256(l_value_to_items, l_value_transfer)); + dap_list_free_full(l_list_used_out, free); + } + // add 'out' items + { + uint256_t l_value_pack = {}; // how much datoshi add to 'out' items + if (dap_chain_datum_tx_add_out_item(&l_tx, a_addr_to, a_value) == 1) { + SUM_256_256(l_value_pack, a_value, &l_value_pack); + } + // coin back + uint256_t l_value_back; + SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back); + if (!IS_ZERO_256(l_value_back)) { + if (dap_chain_datum_tx_add_out_item(&l_tx, a_addr_from, l_value_back) != 1) { + dap_chain_datum_tx_delete(l_tx); + return NULL; + } + } + } + + // add 'sign' items + if (dap_chain_datum_tx_add_sign_item(&l_tx, a_key_from) != 1) { + dap_chain_datum_tx_delete(l_tx); + return NULL; + } + + size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); + dap_chain_datum_t* l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size); + + DAP_DELETE(l_tx); + + return l_datum; + + // dap_hash_fast_t * l_ret = DAP_NEW_Z(dap_hash_fast_t); + // dap_hash_fast(l_tx, l_tx_size, l_ret); + // DAP_DELETE(l_tx); + // char *l_hash_str = dap_chain_mempool_datum_add(l_datum, a_chain); + + // DAP_DELETE( l_datum ); + // + // if (l_hash_str) { + // DAP_DELETE(l_hash_str); + // return l_ret; + // }else{ + // DAP_DELETE(l_ret); + // return NULL; + // } } diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 361bd35f11..3690f5bb49 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -268,7 +268,7 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_dag->datum_add_hashes_count = dap_config_get_item_uint16_default(a_chain_cfg,"dag","datum_add_hashes_count",1); char * l_round_new_str = dap_strdup( dap_config_get_item_str_default(a_chain_cfg,"dag","gdb_group_events_round_new", "new")); dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); - + l_dag->broadcast_disable = true; char *l_gdb_group; if (!l_dag->is_celled) @@ -650,6 +650,7 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_d dap_chain_cs_dag_event_round_item_t *l_round_item = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_round_item_t, sizeof(dap_chain_cs_dag_event_round_item_t)); + dap_hash_fast(a_datum, dap_chain_datum_size(a_datum), &l_datum_hash); l_round_item->round_info.datum_hash = l_datum_hash; dap_chain_cs_dag_event_calc_hash(l_event,l_event_size, &l_event_hash); char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash); @@ -1045,13 +1046,13 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ } } if (!found && a_atom_iter->with_treshold) { - HASH_ITER(hh, l_dag_pvt->events_treshold, l_item_cur, l_item_tmp) { - if (l_item_cur->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) { - a_atom_iter->cur_item = l_item_cur; + HASH_ITER(hh, l_dag_pvt->events_treshold, l_item_cur, l_item_tmp) { + if (l_item_cur->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) { + a_atom_iter->cur_item = l_item_cur; a_atom_iter->found_in_treshold = 1; - break; - } - } + break; + } + } } if ( a_atom_iter->cur_item ){ @@ -1094,7 +1095,7 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts( dap_chain_ato l_ret[i] = l_event_item->event; (*a_lasts_size_array)[i] = l_event_item->event_size; i++; - } + } } pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); return l_ret; -- GitLab