diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c index 17033619a799a78f5df5fd13544550d0618251f4..5c261fccd23ba1f7906688c7f76025e492c9b959 100644 --- a/modules/common/dap_chain_common.c +++ b/modules/common/dap_chain_common.c @@ -84,6 +84,8 @@ char* dap_chain_addr_to_str(const dap_chain_addr_t *a_addr) if ( a_addr ==NULL) return NULL; + if (dap_chain_addr_is_blank(a_addr)) return dap_strdup("null"); + size_t l_ret_size = DAP_ENC_BASE58_ENCODE_SIZE(sizeof(dap_chain_addr_t)); char * l_ret = DAP_NEW_SIZE(char, l_ret_size); if(dap_enc_base58_encode(a_addr, sizeof(dap_chain_addr_t), l_ret) > 0) @@ -104,6 +106,9 @@ dap_chain_addr_t* dap_chain_addr_from_str(const char *a_str) size_t l_str_len = (a_str) ? strlen(a_str) : 0; if(l_str_len <= 0) return NULL; + if (dap_strcmp(a_str, "null") == 0) { + return DAP_NEW_Z(dap_chain_addr_t); + } size_t l_ret_size = DAP_ENC_BASE58_DECODE_SIZE(l_str_len); dap_chain_addr_t * l_addr = DAP_NEW_Z_SIZE(dap_chain_addr_t, l_ret_size); if(dap_enc_base58_decode(a_str, l_addr) == sizeof(dap_chain_addr_t) && @@ -114,6 +119,11 @@ dap_chain_addr_t* dap_chain_addr_from_str(const char *a_str) return NULL; } +bool dap_chain_addr_is_blank(const dap_chain_addr_t *a_addr){ + dap_chain_addr_t l_addr_blank = {0}; + return !memcmp(a_addr, &l_addr_blank, sizeof(dap_chain_addr_t)); +} + /** * @brief dap_chain_net_srv_uid_from_str * @param a_net_str @@ -207,6 +217,7 @@ int dap_chain_addr_check_sum(const dap_chain_addr_t *a_addr) { if(!a_addr) return -1; + if (dap_chain_addr_is_blank(a_addr)) return 1; dap_chain_hash_fast_t l_checksum; // calc checksum dap_hash_fast(a_addr, sizeof(dap_chain_addr_t) - sizeof(dap_chain_hash_fast_t), &l_checksum); diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c index f82d50fffaf4dea89671ffa7d7d0e8d1cf34f11e..765b25da21f9ff1655f9778db5bf5a3570d23dc2 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -275,10 +275,10 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa */ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value) { - if (IS_ZERO_256(a_value)) + if (!a_addr || IS_ZERO_256(a_value)) return NULL; dap_chain_tx_out_t *l_item = DAP_NEW_Z(dap_chain_tx_out_t); - l_item->addr = a_addr ? *a_addr : (dap_chain_addr_t) { 0 }; + l_item->addr = *a_addr; l_item->header.type = TX_ITEM_TYPE_OUT; l_item->header.value = a_value; return l_item; diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h index 1ec63018bce6e77c14cd4e00360086a9b50c2ba3..41f82afb33bda2959d91e39eaa3b543bd8b66fbd 100644 --- a/modules/common/include/dap_chain_common.h +++ b/modules/common/include/dap_chain_common.h @@ -242,6 +242,7 @@ size_t dap_chain_hash_slow_to_str(dap_chain_hash_slow_t * a_hash, char * a_str, char* dap_chain_addr_to_str(const dap_chain_addr_t *a_addr); dap_chain_addr_t* dap_chain_addr_from_str(const char *str); +bool dap_chain_addr_is_blank(const dap_chain_addr_t *a_addr); dap_chain_net_srv_uid_t dap_chain_net_srv_uid_from_str(const char* a_str); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 8c3500617ca9d4ef31f5fa08626382cc2e779f2b..927f41c99cb29b6f39981f4e5f1a3b7b01ae55cf 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -4958,7 +4958,7 @@ int com_tx_create(int argc, char ** argv, char **str_reply) } // Check, if network ID is same as ID in destination wallet address. If not - operation is cancelled. - if (l_addr_to->net_id.uint64 != l_net->pub.id.uint64) { + if (!dap_chain_addr_is_blank(l_addr_to) && l_addr_to->net_id.uint64 != l_net->pub.id.uint64) { dap_cli_server_cmd_set_reply_text(str_reply, "destination wallet network ID=0x%llx and network ID=0x%llx is not equal. Please, change network name or wallet address", l_addr_to->net_id.uint64, l_net->pub.id.uint64); return -13; 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 5fae0fbe77461e1d71ad0a1e3cd053fa2fc93dd7..a4d7c74178fd1d6274ae8fa1e83ee5c7cbbe7d1a 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 @@ -533,7 +533,8 @@ static enum error_code s_cli_take(int a_argc, char **a_argv, int a_arg_index, da //add burning tx if (l_tx_out_cond->subtype.srv_stake_lock.flags & DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_CREATE_BASE_TX) { - if (NULL == (l_datum_burning_tx = dap_chain_burning_tx_create(l_chain, l_owner_key, l_owner_addr, NULL, + dap_chain_addr_t l_addr_blank = {0}; + if (NULL == (l_datum_burning_tx = dap_chain_burning_tx_create(l_chain, l_owner_key, l_owner_addr, &l_addr_blank, delegate_ticker_str, l_value_delegated))) {//malloc dap_chain_wallet_close(l_wallet); DAP_DEL_Z(l_owner_addr); @@ -1291,7 +1292,7 @@ dap_chain_datum_t *dap_chain_burning_tx_create(dap_chain_t *a_chain, dap_enc_key { // 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)) + !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