diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index 30e6cbc5c441fc3e365deac986d017b672731215..fc0dcd4450dd9e8d2f682694b5e5d110e1d30dd7 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -39,10 +39,9 @@ */ dap_chain_datum_tx_t* dap_chain_datum_tx_create(void) { - dap_chain_datum_tx_t *tx = DAP_NEW_Z(dap_chain_datum_tx_t); - return tx - ? tx->header.ts_created = time(NULL), tx - : ( log_it(L_CRITICAL, "%s", c_error_memory_alloc), NULL ); + dap_chain_datum_tx_t *tx = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_datum_tx_t, NULL); + tx->header.ts_created = time(NULL); + return tx; } /** @@ -241,9 +240,13 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *a_tx, int a_sign_num) { dap_return_val_if_pass(!a_tx, -1); int l_ret = -4, l_sign_num = 0; - byte_t *l_item = NULL; size_t l_item_size; + byte_t *l_item = NULL, *l_first_item = NULL; size_t l_item_size; TX_ITEM_ITER_TX(l_item, l_item_size, a_tx) { - if ( *l_item == TX_ITEM_TYPE_SIG && l_sign_num++ == a_sign_num ) + if (*l_item != TX_ITEM_TYPE_SIG) + continue; + if (!l_first_item) + l_first_item = l_item; + if (l_sign_num++ == a_sign_num) break; } if (!l_item || !l_item_size) @@ -255,9 +258,9 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *a_tx, int a_sign_num) dap_chain_datum_tx_t *l_tx; byte_t *l_tx_data; if ( l_sign_item->header.version ) { - l_data_size = (size_t)( l_item - (byte_t*)a_tx ); + l_data_size = (size_t)( l_first_item - (byte_t *)a_tx ); l_tx = dap_config_get_item_bool_default(g_config, "ledger", "mapped", true) - ? DAP_DUP_SIZE(a_tx, dap_chain_datum_tx_get_size(a_tx)) : a_tx; + ? DAP_DUP_SIZE(a_tx, l_data_size) : a_tx; l_tx_data = (byte_t*)l_tx; l_tx->header.tx_items_size = 0; } else { diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c index 9c5ef2084630f51862363e442c8b3d36f8e36b3d..e47b0c38b50c3925a79c277c0181df19d8e6f1be 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -147,10 +147,7 @@ dap_chain_tx_in_ems_t *dap_chain_datum_tx_item_in_ems_create(dap_chain_id_t a_id { if(!a_ticker) return NULL; - dap_chain_tx_in_ems_t *l_item = DAP_NEW_Z(dap_chain_tx_in_ems_t); - if (!l_item) { - return NULL; - } + dap_chain_tx_in_ems_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_in_ems_t, NULL); l_item->header.type = TX_ITEM_TYPE_IN_EMS; l_item->header.token_emission_chain_id.uint64 = a_id.uint64; l_item->header.token_emission_hash = *a_datum_token_hash; @@ -167,9 +164,7 @@ dap_chain_tx_in_t* dap_chain_datum_tx_item_in_create(dap_chain_hash_fast_t *a_tx { if(!a_tx_prev_hash) return NULL; - dap_chain_tx_in_t *l_item = DAP_NEW_Z(dap_chain_tx_in_t); - if (!l_item) - return NULL; + dap_chain_tx_in_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_in_t, NULL); l_item->header.type = TX_ITEM_TYPE_IN; l_item->header.tx_out_prev_idx = a_tx_out_prev_idx; l_item->header.tx_prev_hash = *a_tx_prev_hash; @@ -180,9 +175,7 @@ dap_chain_tx_in_reward_t *dap_chain_datum_tx_item_in_reward_create(dap_chain_has { if (!a_block_hash) return NULL; - dap_chain_tx_in_reward_t *l_item = DAP_NEW_Z(dap_chain_tx_in_reward_t); - if (!l_item) - return NULL; + dap_chain_tx_in_reward_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_in_reward_t, NULL); l_item->type = TX_ITEM_TYPE_IN_REWARD; l_item->block_hash = *a_block_hash; return l_item; @@ -192,17 +185,10 @@ dap_chain_tx_in_reward_t *dap_chain_datum_tx_item_in_reward_create(dap_chain_has * Create tsd section */ dap_chain_tx_tsd_t *dap_chain_datum_tx_item_tsd_create(void *a_data, int a_type, size_t a_size) { - if (!a_data || !a_size) { - return NULL; - } - dap_tsd_t *l_tsd = dap_tsd_create(a_type, a_data, a_size); - size_t l_tsd_sz = dap_tsd_size(l_tsd); - dap_chain_tx_tsd_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_tsd_t, - sizeof(dap_chain_tx_tsd_t) + l_tsd_sz); - memcpy(l_item->tsd, l_tsd, l_tsd_sz); - DAP_DELETE(l_tsd); - l_item->header.type = TX_ITEM_TYPE_TSD; - l_item->header.size = l_tsd_sz; + dap_return_val_if_fail(a_data && a_size, NULL); + dap_chain_tx_tsd_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_tsd_t, sizeof(dap_chain_tx_tsd_t) + sizeof(dap_tsd_t) + a_size, NULL); + *l_item = (dap_chain_tx_tsd_t){ .header = { .type = TX_ITEM_TYPE_TSD, .size = sizeof(dap_tsd_t) + a_size }}; + dap_tsd_write(l_item->tsd, (uint16_t)a_type, a_data, a_size); return l_item; } @@ -218,10 +204,7 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa { if(!a_tx_prev_hash ) return NULL; - dap_chain_tx_in_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_in_cond_t); - if (!l_item) { - return NULL; - } + dap_chain_tx_in_cond_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_in_cond_t, NULL); l_item->header.type = TX_ITEM_TYPE_IN_COND; l_item->header.receipt_idx = a_receipt_idx; l_item->header.tx_out_prev_idx = a_tx_out_prev_idx; @@ -238,10 +221,7 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a { 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); - if (!l_item) { - return NULL; - } + dap_chain_tx_out_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_out_t, NULL); l_item->addr = *a_addr; l_item->header.type = TX_ITEM_TYPE_OUT; l_item->header.value = a_value; @@ -250,14 +230,9 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token) { - if (!a_addr || !a_token) - return NULL; - if (IS_ZERO_256(a_value)) + if (!a_addr || !a_token || IS_ZERO_256(a_value)) return NULL; - dap_chain_tx_out_ext_t *l_item = DAP_NEW_Z(dap_chain_tx_out_ext_t); - if (!l_item) { - return NULL; - } + dap_chain_tx_out_ext_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_out_ext_t, NULL); l_item->header.type = TX_ITEM_TYPE_OUT_EXT; l_item->header.value = a_value; l_item->addr = *a_addr; @@ -269,10 +244,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a { if (IS_ZERO_256(a_value)) return NULL; - dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_out_cond_t); - if (!l_item) { - return NULL; - } + dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, NULL); 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_FEE; @@ -289,14 +261,9 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_pke dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_params, size_t a_params_size) { - if (!a_key || !a_key->header.size ) - return NULL; - if (IS_ZERO_256(a_value)) + if (!a_key || !a_key->header.size || 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) + a_params_size); - if (l_item == NULL) - return NULL; - + dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size, NULL); 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_PAY; @@ -321,7 +288,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap return NULL; if (IS_ZERO_256(a_value_sell) || IS_ZERO_256(a_value_rate)) 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) + a_params_size); + dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size, NULL); l_item->header.item_type = TX_ITEM_TYPE_OUT_COND; l_item->header.value = a_value_sell; l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE; @@ -346,10 +313,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c return NULL; size_t l_tsd_total_size = a_sovereign_addr && !dap_chain_addr_is_blank(a_sovereign_addr) ? dap_chain_datum_tx_item_out_cond_create_srv_stake_get_tsd_size() : 0; - 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) + l_tsd_total_size); - if (!l_item) { - return NULL; - } + dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + l_tsd_total_size, NULL); 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_POS_DELEGATE; @@ -379,10 +343,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake_lock( { if (IS_ZERO_256(a_value)) return NULL; - dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_out_cond_t); - if (!l_item) { - return NULL; - } + dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, NULL); 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; @@ -400,10 +361,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_emit_delega if (IS_ZERO_256(a_value)) return NULL; size_t l_tsd_total_size = a_pkey_hashes_count * (sizeof(dap_hash_fast_t) + sizeof(dap_tsd_t)); - 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) + l_tsd_total_size); - if (!l_item) { - return NULL; - } + dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + l_tsd_total_size, NULL); 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_EMIT_DELEGATE; @@ -416,34 +374,47 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_emit_delega return l_item; } +dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create_from_sign(const dap_sign_t *a_sign) +{ + dap_return_val_if_fail(a_sign, NULL); + size_t l_chain_sign_size = dap_sign_get_size((dap_sign_t *)a_sign); // sign data + dap_chain_tx_sig_t *l_tx_sig = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_sig_t, + sizeof(dap_chain_tx_sig_t) + l_chain_sign_size, NULL); + l_tx_sig->header.type = TX_ITEM_TYPE_SIG; + l_tx_sig->header.version = 1; + l_tx_sig->header.sig_size = (uint32_t)l_chain_sign_size; + memcpy(l_tx_sig->sig, a_sign, l_chain_sign_size); + return l_tx_sig; +} + +dap_sign_t *dap_chain_datum_tx_sign_create(dap_enc_key_t *a_key, const dap_chain_datum_tx_t *a_tx) +{ + dap_return_val_if_fail(a_key && a_tx, NULL); + uint8_t *l_tx_sig_present = dap_chain_datum_tx_item_get(a_tx, NULL, NULL, TX_ITEM_TYPE_SIG, NULL); + size_t l_tx_size = sizeof(dap_chain_datum_tx_t) + + (l_tx_sig_present ? (size_t)(l_tx_sig_present - a_tx->tx_items) + : a_tx->header.tx_items_size); + dap_chain_datum_tx_t *l_tx = DAP_DUP_SIZE_RET_VAL_IF_FAIL((dap_chain_datum_tx_t *)a_tx, l_tx_size, NULL); + l_tx->header.tx_items_size = 0; + dap_sign_t *ret = dap_sign_create(a_key, l_tx, l_tx_size, 0); + DAP_DELETE(l_tx); + return ret; +} + /** * Create item dap_chain_tx_sig_t * * return item, NULL Error */ -dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, dap_chain_datum_tx_t *a_tx) +dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const dap_chain_datum_tx_t *a_tx) { dap_return_val_if_fail(a_key && a_tx, NULL); - size_t l_tx_size = a_tx->header.tx_items_size + sizeof(dap_chain_datum_tx_t); - dap_chain_datum_tx_t *l_tx = DAP_DUP_SIZE(a_tx, l_tx_size); - if (!l_tx) { - log_it(L_CRITICAL, "%s", c_error_memory_alloc); - return NULL; - } - l_tx->header.tx_items_size = 0; - dap_sign_t *l_chain_sign = dap_sign_create(a_key, l_tx, l_tx_size, 0); - DAP_DELETE(l_tx); + dap_sign_t *l_chain_sign = dap_chain_datum_tx_sign_create(a_key, a_tx); if (!l_chain_sign) return NULL; - size_t l_chain_sign_size = dap_sign_get_size(l_chain_sign); // sign data - dap_chain_tx_sig_t *l_tx_sig = DAP_NEW_Z_SIZE(dap_chain_tx_sig_t, - sizeof(dap_chain_tx_sig_t) + l_chain_sign_size); - l_tx_sig->header.type = TX_ITEM_TYPE_SIG; - l_tx_sig->header.version = 1; - l_tx_sig->header.sig_size = (uint32_t)l_chain_sign_size; - memcpy(l_tx_sig->sig, l_chain_sign, l_chain_sign_size); + dap_chain_tx_sig_t *ret = dap_chain_datum_tx_item_sign_create_from_sign(l_chain_sign); DAP_DELETE(l_chain_sign); - return l_tx_sig; + return ret; } /** @@ -484,14 +455,14 @@ byte_t *dap_chain_datum_tx_item_get_data(dap_chain_tx_tsd_t *a_tx_tsd, int *a_ty * a_item_out_size size[out] size of returned item * return item data, NULL Error index or bad format transaction */ -uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_idx, +uint8_t *dap_chain_datum_tx_item_get(const dap_chain_datum_tx_t *a_tx, int *a_item_idx, byte_t *a_iter, dap_chain_tx_item_type_t a_type, size_t *a_item_out_size) { if (!a_tx) return NULL; int i = a_item_idx ? *a_item_idx : 0, j = -1; - byte_t *l_end = a_tx->tx_items + a_tx->header.tx_items_size, - *l_begin = i || !a_iter || a_iter < a_tx->tx_items || a_iter > l_end ? a_tx->tx_items : a_iter; + const byte_t *l_end = a_tx->tx_items + a_tx->header.tx_items_size, + *l_begin = i || !a_iter || a_iter < a_tx->tx_items || a_iter > l_end ? a_tx->tx_items : a_iter; size_t l_left_size = (size_t)(l_end - l_begin), l_tx_item_size; byte_t *l_item; #define m_item_idx_n_size(item, idx, size) ({ \ diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h index 9c004c1979c886658bcd5d9c4ba8d74f27e494f6..34c30d75e41b773dc70f77bb8e732a70c5f40c20 100644 --- a/modules/common/include/dap_chain_datum_tx_items.h +++ b/modules/common/include/dap_chain_datum_tx_items.h @@ -216,7 +216,11 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_emit_delega * * return item, NULL Error */ -dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, dap_chain_datum_tx_t *a_tx); +dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const dap_chain_datum_tx_t *a_tx); + +dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create_from_sign(const dap_sign_t *a_sign); + +dap_sign_t *dap_chain_datum_tx_sign_create(dap_enc_key_t *a_key, const dap_chain_datum_tx_t *a_tx); /** * Get sign from sign item @@ -237,7 +241,7 @@ dap_chain_tx_tsd_t *dap_chain_datum_tx_item_get_tsd_by_type(dap_chain_datum_tx_t * a_item_out_size size[out] size of returned item * return item data, NULL Error index or bad format transaction */ -uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_idx_start, +uint8_t* dap_chain_datum_tx_item_get(const dap_chain_datum_tx_t *a_tx, int *a_item_idx_start, byte_t *a_iter, dap_chain_tx_item_type_t a_type, size_t *a_item_out_size); // Get Nth item of pointed type uint8_t *dap_chain_datum_tx_item_get_nth(dap_chain_datum_tx_t *a_tx, dap_chain_tx_item_type_t a_type, int a_item_idx); diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index 3ba0e8d3367b66847563df3c455116da4114b019..1bfef5ffba1eff4fc3de9da9d6aa4833398bd3b8 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -703,6 +703,10 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c dap_guuid_compose(l_net->pub.id.uint64, DAP_CHAIN_CLUSTER_ID_DAG), l_dag->gdb_group_events_round_new, DAG_ROUND_NEW_TTL, true, DAP_GDB_MEMBER_ROLE_NOBODY, DAP_CLUSTER_TYPE_AUTONOMIC); + if (!l_dag_cluster) { + log_it(L_ERROR, "Can't create cluster for consensus communication. Can't start the DAG consensus"); + return -1; + } dap_global_db_cluster_add_notify_callback(l_dag_cluster, s_round_changes_notify, l_dag); dap_chain_net_add_auth_nodes_to_cluster(l_net, l_dag_cluster); dap_link_manager_add_net_associate(l_net->pub.id.uint64, l_dag_cluster->links_cluster); diff --git a/modules/service/emit-delegate/dap_chain_net_srv_emit_delegate.c b/modules/service/emit-delegate/dap_chain_net_srv_emit_delegate.c index 5494b0ee718bac1e07545f504e1d01572a2bc551..56ee6499627333c9b8311f41cb2a8120121c795e 100644 --- a/modules/service/emit-delegate/dap_chain_net_srv_emit_delegate.c +++ b/modules/service/emit-delegate/dap_chain_net_srv_emit_delegate.c @@ -32,6 +32,7 @@ #include "dap_chain_net_tx.h" #include "dap_chain_net_srv_emit_delegate.h" #include "dap_chain_node_cli_cmd.h" +#include "dap_list.h" enum emit_delegation_error { @@ -289,7 +290,7 @@ static bool s_is_key_present(dap_chain_tx_out_cond_t *a_cond, dap_enc_key_t *a_e } dap_chain_datum_tx_t *dap_chain_net_srv_emit_delegate_taking_tx_create(json_object *a_json_arr_reply, dap_chain_net_t *a_net, dap_enc_key_t *a_enc_key, - dap_chain_addr_t *a_addr_to, uint256_t a_value, uint256_t a_fee, dap_hash_fast_t *a_tx_in_hash) + dap_chain_addr_t *a_addr_to, uint256_t a_value, uint256_t a_fee, dap_hash_fast_t *a_tx_in_hash, dap_list_t* tsd_items) { // create empty transaction dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create(); @@ -367,6 +368,12 @@ dap_chain_datum_tx_t *dap_chain_net_srv_emit_delegate_taking_tx_create(json_obje m_tx_fail(ERROR_COMPOSE, "Can't add TSD section item with withdraw value"); DAP_DELETE(l_takeoff_tsd); + //add other tsd if available + for ( dap_list_t *l_tsd = tsd_items; l_tsd; l_tsd = l_tsd->next ) { + if ( dap_chain_datum_tx_add_item(&l_tx, l_tsd->data) != 1 ) + m_tx_fail(ERROR_COMPOSE, "Can't add custom TSD section item "); + } + // add fee items if (l_net_fee_used) { int rc = l_taking_native ? dap_chain_datum_tx_add_out_item(&l_tx, &l_net_fee_addr, l_net_fee) @@ -380,8 +387,12 @@ dap_chain_datum_tx_t *dap_chain_net_srv_emit_delegate_taking_tx_create(json_obje uint256_t l_fee_back = {}; // fee coin back SUBTRACT_256_256(l_fee_transfer, l_fee_total, &l_fee_back); - if (!IS_ZERO_256(l_fee_back) && dap_chain_datum_tx_add_out_ext_item(&l_tx, &l_owner_addr, l_fee_back, a_net->pub.native_ticker) != 1) - m_tx_fail(ERROR_COMPOSE, "Cant add fee back output"); + if (!IS_ZERO_256(l_fee_back)) { + int rc = l_taking_native ? dap_chain_datum_tx_add_out_item(&l_tx, &l_owner_addr, l_fee_back) + : dap_chain_datum_tx_add_out_ext_item(&l_tx, &l_owner_addr, l_fee_back, a_net->pub.native_ticker); + if (rc != 1) + m_tx_fail(ERROR_COMPOSE, "Cant add fee back output"); + } // add 'sign' item if (dap_chain_datum_tx_add_sign_item(&l_tx, a_enc_key) != 1) @@ -616,7 +627,7 @@ static int s_cli_take(int a_argc, char **a_argv, int a_arg_index, json_object ** return ERROR_VALUE; } // Create emission from conditional transaction - dap_chain_datum_tx_t *l_tx = dap_chain_net_srv_emit_delegate_taking_tx_create(*a_json_arr_reply, a_net, l_enc_key, l_addr, l_value, l_fee, &l_tx_in_hash); + dap_chain_datum_tx_t *l_tx = dap_chain_net_srv_emit_delegate_taking_tx_create(*a_json_arr_reply, a_net, l_enc_key, l_addr, l_value, l_fee, &l_tx_in_hash, NULL); DAP_DEL_MULTY(l_enc_key, l_addr); if (!l_tx) { dap_json_rpc_error_add(*a_json_arr_reply, ERROR_CREATE, "Can't compose transaction for delegated emission"); diff --git a/modules/service/emit-delegate/include/dap_chain_net_srv_emit_delegate.h b/modules/service/emit-delegate/include/dap_chain_net_srv_emit_delegate.h index 210f73c531198bce14b6c75f02408b10f2d9dc88..8cca1e2faa3dd7a585a89c9a4cbbd84f001b4f71 100644 --- a/modules/service/emit-delegate/include/dap_chain_net_srv_emit_delegate.h +++ b/modules/service/emit-delegate/include/dap_chain_net_srv_emit_delegate.h @@ -12,6 +12,6 @@ void dap_chain_net_srv_emit_delegate_deinit(); dap_chain_datum_tx_t *dap_chain_net_srv_emit_delegate_taking_tx_create(json_object *a_json_arr_rweply, dap_chain_net_t *a_net, dap_enc_key_t *a_enc_key, - dap_chain_addr_t *a_addr_to, uint256_t a_value, uint256_t a_fee, dap_hash_fast_t *a_tx_in_hash); + dap_chain_addr_t *a_addr_to, uint256_t a_value, uint256_t a_fee, dap_hash_fast_t *a_tx_in_hash, dap_list_t *tsd_items); dap_chain_datum_tx_t *dap_chain_net_srv_emit_delegate_taking_tx_sign(json_object *a_json_arr_reply, dap_chain_net_t *a_net, dap_enc_key_t *a_enc_key, dap_chain_datum_tx_t *a_tx_in);