diff --git a/dap-sdk b/dap-sdk index 919d73ce8bc32506a11fb96b588666a00b8d101c..df57c58e1327f2cf1719b39e64d5ef20c6f86d93 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 919d73ce8bc32506a11fb96b588666a00b8d101c +Subproject commit df57c58e1327f2cf1719b39e64d5ef20c6f86d93 diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 10253754e525e87ceec09f3579294af93e8cd357..5472dd79289098cc4b54f8b4927857f06d493cd3 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -190,6 +190,8 @@ typedef struct dap_chain_ledger_token_item { size_t tx_send_allow_size; dap_chain_addr_t * tx_send_block; size_t tx_send_block_size; + char *description_token; + size_t description_token_size; UT_hash_handle hh; } dap_chain_ledger_token_item_t; @@ -1164,7 +1166,8 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t * .auth_pkeys = DAP_NEW_Z_SIZE(dap_pkey_t*, sizeof(dap_pkey_t*) * l_token->signs_total), .auth_pkeys_hash = DAP_NEW_Z_SIZE(dap_chain_hash_fast_t, sizeof(dap_chain_hash_fast_t) * l_token->signs_total), .auth_signs_total = l_auth_signs_total, - .auth_signs_valid = l_auth_signs_valid + .auth_signs_valid = l_auth_signs_valid, + .description_token_size = 0 }; if ( !l_token_item->auth_pkeys ) { if (l_token) @@ -1687,6 +1690,19 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite return -10; } }break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION: { + if (l_tsd->size == 0){ + if (s_debug_more) + log_it(L_ERROR, "TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION expected to " + "have 0 bytes data length"); + return -10; + } + if (a_token_item->description_token_size != 0) + DAP_DELETE(a_token_item->description_token); + a_token_item->description_token_size = l_tsd->size; + a_token_item->description_token = DAP_NEW_Z_SIZE(char, l_tsd->size); + memcpy(a_token_item->description_token, l_tsd->data, l_tsd->size); + } break; default:{} } } @@ -2018,7 +2034,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) size_t l_certs_field_size = l_token_item->datum_token_size - sizeof(*l_token_item->datum_token) - l_token_item->datum_token->header_native_decl.tsd_total_size; dap_chain_datum_token_certs_dump(l_str_tmp, l_token_item->datum_token->data_n_tsd + l_token_item->datum_token->header_native_decl.tsd_total_size, l_certs_field_size, "hex"); - l_item_str = dap_strdup_printf("-->Token name '%s', type %s, flags: %s\n" + l_item_str = dap_strdup_printf("-->Token name '%s', type %s, flags: %s, description: '%s'\n" "\tSupply (current/total) %s/%s\n" "\tDecimals: 18\n" "\tAuth signs (valid/total) %zu/%zu\n" @@ -2026,6 +2042,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) "%s" "\tTotal emissions %u\n___\n", l_token_item->ticker, l_type_str, s_flag_str_from_code(l_token_item->datum_token->header_native_decl.flags), + l_token_item->description_token_size != 0 ? l_token_item->description_token : "The token description is not set", l_balance_cur, l_balance_total, l_token_item->auth_signs_valid, l_token_item->auth_signs_total, l_str_tmp->str, diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index 6681b046e01a303fa920097a4ec08f4444a189e4..dafae10e2933d5c059d56f1fdc450bdd56fcaaf1 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -213,6 +213,9 @@ void dap_chain_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_tok dap_string_append_printf(a_str_out, "tx_receiver_blocked_remove: %s\n", dap_tsd_get_string_const(l_tsd) ); continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION: + dap_string_append_printf(a_str_out, "description: '%s'\n", l_tsd->data); + continue; default: dap_string_append_printf(a_str_out, "<0x%04hX>: <size %u>\n", l_tsd->type, l_tsd->size); } } diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index 2cd1b1060ba220353df0e5127ed9ed4b26d1910a..a47c2161893549c34f478f136b6f50e0063d80f5 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -266,6 +266,9 @@ extern const char *c_dap_chain_datum_token_flag_str[]; // Emission for delegated token #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK 0x0027 +// Description token +#define DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION 0x0028 + diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index eeb9a77da79c3818bbc184e2975138c9788bacc5..72d0730e0dc715ad007c1fbfb6b6cedbf4f48cf3 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -173,6 +173,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\t -flags <value>:\t List of flags from <value> to token declaration or update\n" "\t -total_supply <value>:\t Set total supply - emission's maximum - to the <value>\n" "\t -total_signs_valid <value>:\t Set valid signatures count's minimum\n" + "\t -description <value>:\t Updated description for this token\n" "\nDatum type allowed/blocked:\n" "\t -datum_type_allowed <value>:\t Set allowed datum type(s)\n" "\t -datum_type_blocked <value>:\t Set blocked datum type(s)\n" @@ -222,6 +223,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\t -flags <value>:\t List of flags from <value> to token declaration\n" "\t -total_supply <value>:\t Set total supply - emission's maximum - to the <value>\n" "\t -total_signs_valid <value>:\t Set valid signatures count's minimum\n" + "\t -description <value>:\t Updated description for this token\n" "\nDatum type allowed/blocked:\n" "\t -datum_type_allowed <value>:\t Set allowed datum type(s)\n" "\t -datum_type_blocked <value>:\t Set blocked datum type(s)\n" diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index c9d75f04a2e1df6f0e72ccebb0f6a2d7e0fa8e55..9586c4befe5d86c116615daf1ac0ec536a58e085 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -3273,9 +3273,10 @@ typedef struct _dap_cli_token_additional_params { const char* tx_receiver_blocked; const char* tx_sender_allowed; const char* tx_sender_blocked; - uint16_t parsed_flags; - size_t tsd_total_size; - byte_t *parsed_tsd; + uint16_t parsed_flags; + size_t tsd_total_size; + byte_t *parsed_tsd; + size_t parsed_tsd_size; } dap_cli_token_additional_params; typedef struct _dap_sdk_cli_params { @@ -3428,6 +3429,7 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, char ** size_t l_tsd_total_size = 0; uint16_t l_flags = 0; char ** l_str_flags = NULL; + a_params->ext.parsed_tsd_size = 0; if (a_params->ext.flags){ // Flags l_str_flags = dap_strsplit(a_params->ext.flags,",",0xffff ); @@ -3492,6 +3494,8 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, char ** const char* l_remove_signs = NULL; dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-new_certs", &l_new_certs_str); dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-remove_certs", &l_remove_signs); + const char *l_description_token = NULL; + dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-description", &l_description_token); //Added remove signs if (l_remove_signs) { @@ -3531,6 +3535,13 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, char ** } DAP_DEL_Z(l_new_certs); } + if (l_description_token) { + dap_tsd_t *l_desc_token = dap_tsd_create(DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION, l_description_token, + dap_strlen(l_description_token));//dap_tsd_create_string(DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION, l_description_token); + l_tsd_list = dap_list_append(l_tsd_list, l_desc_token); + l_tsd_total_size += dap_tsd_size(l_desc_token); + a_params->ext.parsed_tsd_size += dap_tsd_size(l_desc_token); + } size_t l_tsd_offset = 0; a_params->ext.parsed_tsd = DAP_NEW_SIZE(byte_t, l_tsd_total_size); if(l_tsd_total_size && !a_params->ext.parsed_tsd) { @@ -3581,6 +3592,9 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, char ** } else log_it(L_DEBUG,"== total_pkeys_add: <WRONG SIZE %u>", l_tsd->size); break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TOKEN_DESCRIPTION: + log_it(L_DEBUG, "== description: %s", l_tsd->data); + break; default: log_it(L_DEBUG, "== 0x%04X: binary data %u size ",l_tsd->type, l_tsd->size ); } size_t l_tsd_size = dap_tsd_size(l_tsd); @@ -3811,9 +3825,12 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) if (l_params->ext.tx_sender_blocked) l_tsd_list = s_parse_wallet_addresses(l_params->ext.tx_sender_blocked, l_tsd_list, &l_tsd_total_size, DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD); + if (l_params->ext.parsed_tsd) + l_tsd_total_size += l_params->ext.parsed_tsd_size; + // Create new datum token - l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t) + l_params->ext.tsd_total_size); + l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t) + l_tsd_total_size); if (!l_datum_token) { log_it(L_CRITICAL, "Memory allocation error"); dap_cli_server_cmd_set_reply_text(a_str_reply, "Out of memory in com_token_decl"); @@ -3824,20 +3841,20 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) l_datum_token->type = l_params->type; l_datum_token->subtype = l_params->subtype; if (l_params->subtype == DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE) { - log_it(L_DEBUG,"Prepared TSD sections for private token on %zd total size", l_params->ext.tsd_total_size); + log_it(L_DEBUG,"Prepared TSD sections for private token on %zd total size", l_tsd_total_size); snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker); l_datum_token->header_private_decl.flags = l_params->ext.parsed_flags; l_datum_token->total_supply = l_total_supply; l_datum_token->signs_valid = l_signs_emission; - l_datum_token->header_private_decl.tsd_total_size = l_params->ext.tsd_total_size; + l_datum_token->header_private_decl.tsd_total_size = l_tsd_total_size; l_datum_token->header_private_decl.decimals = atoi(l_params->decimals_str); } else { //DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL - log_it(L_DEBUG,"Prepared TSD sections for CF20 token on %zd total size", l_params->ext.tsd_total_size); + log_it(L_DEBUG,"Prepared TSD sections for CF20 token on %zd total size", l_tsd_total_size); snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker); l_datum_token->header_native_decl.flags = l_params->ext.parsed_flags; l_datum_token->total_supply = l_total_supply; l_datum_token->signs_valid = l_signs_emission; - l_datum_token->header_native_decl.tsd_total_size = l_params->ext.tsd_total_size; + l_datum_token->header_native_decl.tsd_total_size = l_tsd_total_size; l_datum_token->header_native_decl.decimals = atoi(l_params->decimals_str); } // Add TSD sections in the end @@ -3876,6 +3893,13 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) memcpy(l_datum_token->data_n_tsd + l_datum_data_offset, l_tsd, l_tsd_size); l_datum_data_offset += l_tsd_size; } + if (l_params->ext.parsed_tsd) { + memcpy(l_datum_token->data_n_tsd + l_datum_data_offset, + l_params->ext.parsed_tsd, + l_params->ext.tsd_total_size); + l_datum_data_offset += l_params->ext.tsd_total_size; + DAP_DELETE(l_params->ext.parsed_tsd); + } log_it(L_DEBUG, "%s token declaration '%s' initialized", l_params->subtype == DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE ? "Private" : "CF20", l_datum_token->ticker); }break;//end @@ -4081,7 +4105,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) // Add TSD sections in the end // Add TSD sections in the end if (l_params->ext.tsd_total_size) { - memcpy(l_datum_token->data_n_tsd, l_params->ext.parsed_tsd, l_params->ext.tsd_total_size); + memcpy(l_datum_token->data_n_tsd, l_params->ext.parsed_tsd, l_params->ext.parsed_tsd_size); DAP_DELETE(l_params->ext.parsed_tsd); } log_it(L_DEBUG, "%s token declaration update '%s' initialized", ( l_params->subtype == DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE) ?