diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 129781cf75b2fa92ffc5ce3c0bcdaa6e1b730073..8192ed7ea5e2034058e23bb2bf60d0f4ed282d4c 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -1241,6 +1241,29 @@ dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags, char *a_net_name) return l_ledger; } +bool s_chain_ledger_token_tsd_check(dap_chain_ledger_token_item_t * l_token_item, dap_chain_datum_token_emission_t *a_token_emission) +{ + // for multiple tsd we need to parse every tsd in cycle + if (!l_token_item){ + log_it(L_WARNING, "Token object is null. Probably, you set unknown token ticker in -token parameter"); + return false; + } + dap_tsd_t *l_tsd = dap_chain_datum_token_tsd_get(l_token_item->datum_token, l_token_item->datum_token_size); + if (!l_tsd) + return false; + switch(l_tsd->type){ + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD: + if (memcmp(&a_token_emission->hdr.address, (dap_chain_addr_t *)l_tsd->data, sizeof(dap_chain_addr_t))) { + log_it(L_WARNING, "Address %s is not allowed for emission for token %s", + dap_chain_addr_to_str(&a_token_emission->hdr.address), l_token_item->ticker); + return false; + } + default: break; + } + log_it(L_WARNING, "Private tokens limitations were checked successful"); + return true; +} + int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size) { int l_ret = 0; @@ -1290,6 +1313,12 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size); if (compare256(l_token_item->current_supply, l_emission->hdr.value_256) < 0) return -4; + //additional check for private tokens + if ((l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL) || + (l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE)) { + if (!s_chain_ledger_token_tsd_check(l_token_item, l_emission)) + return -5; + } switch (l_emission->hdr.type){ case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH:{ dap_chain_ledger_token_item_t *l_token_item=NULL; @@ -1340,46 +1369,6 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ return l_ret; } -bool s_chain_compare_token_addresses(dap_chain_addr_t * l_add_addr01, dap_chain_addr_t * l_add_addr02) -{ - char *l_addr_str01 = dap_chain_addr_to_str(l_add_addr01); - char *l_addr_str02 = dap_chain_addr_to_str(l_add_addr02); - if (strcmp(l_addr_str01, l_addr_str02) == 0) - return true; - else - return false; -} - -// new__ -// s_chain_ledger_token_tsd_check -// - -bool s_chain_ledger_token_tsd_check(dap_ledger_t *a_ledger, dap_chain_ledger_token_item_t * l_token_item, dap_chain_datum_token_emission_t *a_token_emission) -{ - // for multiple tsd we need to parse every tsd in cycle - if (!l_token_item){ - log_it(L_WARNING, "Token object is null. Probably, you set unknown token ticker in -token parameter"); - return false; - } - dap_tsd_t *l_tsd = dap_chain_datum_token_tsd_get(l_token_item->datum_token, l_token_item->datum_token_size); - if (!l_tsd) - return false; - switch(l_tsd->type){ - case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD: { - //s_token_tsd_parse(a_ledger, l_token_item , l_token_item->datum_token, l_token_item->datum_token_size); - dap_chain_addr_t * l_add_addr = (dap_chain_addr_t *) l_tsd->data; - if (!s_chain_compare_token_addresses(&a_token_emission->hdr.address, l_add_addr)){ - log_it(L_WARNING, "Address %s is not allowed for emission for token %s", - dap_chain_addr_to_str(&a_token_emission->hdr.address), l_token_item->ticker); - return false; - } - } break; - default: break; - } - log_it(L_WARNING, "Private tokens limitations were checked successful"); - return true; -} - /** * @brief dap_chain_ledger_token_emission_add * @param a_token_emission @@ -1396,14 +1385,7 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_ pthread_rwlock_rdlock(&l_ledger_priv->tokens_rwlock); HASH_FIND_STR(l_ledger_priv->tokens, c_token_ticker, l_token_item); pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock); - dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL; - //additional check for private tokens - if ((l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL) | (l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE)) - { - if (!s_chain_ledger_token_tsd_check(a_ledger, l_token_item, (dap_chain_datum_token_emission_t *)a_token_emission)) - return -1; - } - + dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL; if (!l_token_item && a_from_threshold) return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; // check if such emission is already present in table