1
0
Fork 0
forked from lthn/blockchain

implemented add/remove custom assets

This commit is contained in:
cryptozoidberg 2022-12-02 15:24:50 +01:00
parent 11e1836096
commit a14dcb4e8a
No known key found for this signature in database
GPG key ID: 22DEB97A54C6FDEC
4 changed files with 94 additions and 15 deletions

View file

@ -226,6 +226,8 @@ simple_wallet::simple_wallet()
m_cmd_binder.set_handler("tor_enable", boost::bind(&simple_wallet::tor_enable, this, _1), "Enable relaying transactions over TOR network(enabled by default)");
m_cmd_binder.set_handler("tor_disable", boost::bind(&simple_wallet::tor_disable, this, _1), "Enable relaying transactions over TOR network(enabled by default)");
m_cmd_binder.set_handler("deploy_new_asset", boost::bind(&simple_wallet::deploy_new_asset, this, _1), "Deploys new asset in the network, with current wallet as a maintainer");
m_cmd_binder.set_handler("add_custom_asset_id", boost::bind(&simple_wallet::add_custom_asset_id, this, _1), "Approve asset id to be recognized in the wallet and returned in balances");
m_cmd_binder.set_handler("remove_custom_asset_id", boost::bind(&simple_wallet::remove_custom_asset_id, this, _1), "Cancel previously made approval for asset id");
}
//----------------------------------------------------------------------------------------------------
@ -1790,7 +1792,7 @@ bool simple_wallet::deploy_new_asset(const std::vector<std::string> &args)
asset_descriptor_base adb = AUTO_VAL_INIT(adb);
if (!args.size() || args.size() > 1)
{
fail_msg_writer() << "invalid agruments count: " << args.size() << ", expected 1";
fail_msg_writer() << "invalid arguments count: " << args.size() << ", expected 1";
}
bool r = epee::serialization::load_t_from_json_file(adb, args[0]);
if (!r)
@ -1818,6 +1820,63 @@ bool simple_wallet::deploy_new_asset(const std::vector<std::string> &args)
return true;
}
//----------------------------------------------------------------------------------------------------
bool simple_wallet::add_custom_asset_id(const std::vector<std::string> &args)
{
if (!args.size() || args.size() > 1)
{
fail_msg_writer() << "invalid arguments count: " << args.size() << ", expected 1";
}
crypto::hash asset_id = currency::null_hash;
if (!epee::string_tools::parse_tpod_from_hex_string(args[0], asset_id))
{
fail_msg_writer() << "expected valid asset_id";
return true;
}
asset_descriptor_base asset_descriptor = AUTO_VAL_INIT(asset_descriptor);
bool r = m_wallet->add_custom_asset_id(asset_id, asset_descriptor);
if(!r)
{
fail_msg_writer() << "Asset id " << asset_id << " not found as registered asset";
return true;
}
else
{
success_msg_writer() << "Added custom asset:" << ENDL
<< " Id: " << asset_id << ENDL
<< " Title: " << asset_descriptor.full_name << ENDL
<< " Ticker: " << asset_descriptor.ticker << ENDL
<< " Ticker: " << print_fixed_decimal_point(asset_descriptor.current_supply, asset_descriptor.decimal_point) << ENDL
;
}
return true;
}
//----------------------------------------------------------------------------------------------------
bool simple_wallet::remove_custom_asset_id(const std::vector<std::string> &args)
{
if (!args.size() || args.size() > 1)
{
fail_msg_writer() << "invalid arguments count: " << args.size() << ", expected 1";
}
crypto::hash asset_id = currency::null_hash;
if (!epee::string_tools::parse_tpod_from_hex_string(args[0], asset_id))
{
fail_msg_writer() << "expected valid asset_id";
return true;
}
bool r = m_wallet->delete_custom_asset_id(asset_id);
if (!r)
{
fail_msg_writer() << "Asset id " << asset_id << " not present in this wallet";
return true;
}
else
{
success_msg_writer() << "Asset id " << asset_id << " removed from wallet custom list" << ENDL;
}
return true;
}
//----------------------------------------------------------------------------------------------------
bool simple_wallet::sweep_below(const std::vector<std::string> &args)
{
bool r = false;

View file

@ -89,6 +89,9 @@ namespace currency
bool tor_enable(const std::vector<std::string> &args);
bool tor_disable(const std::vector<std::string> &args);
bool deploy_new_asset(const std::vector<std::string> &args);
bool add_custom_asset_id(const std::vector<std::string> &args);
bool remove_custom_asset_id(const std::vector<std::string> &args);
bool validate_wrap_status(uint64_t amount);
bool get_alias_from_daemon(const std::string& alias_name, currency::extra_alias_entry_base& ai);

View file

@ -3148,17 +3148,25 @@ bool wallet2::balance(std::list<wallet_public::asset_balance_entry>& balances, u
balances.clear();
std::unordered_map<crypto::hash, wallet_public::asset_balance_entry_base> balances_map;
this->balance(balances_map, mined);
std::unordered_map<crypto::hash, currency::asset_descriptor_base> custom_assets_local = m_custom_assets;
for (auto& own_asset : m_own_asset_descriptors)
{
custom_assets_local[own_asset.first] = own_asset.second.asset_descriptor;
}
asset_descriptor_base native_asset_info = AUTO_VAL_INIT(native_asset_info);
native_asset_info.full_name = CURRENCY_NAME_SHORT_BASE;
native_asset_info.ticker = CURRENCY_NAME_ABR;
native_asset_info.decimal_point = CURRENCY_DISPLAY_DECIMAL_POINT;
for (const auto& item : balances_map)
{
asset_descriptor_base native_asset_info = AUTO_VAL_INIT(native_asset_info);
native_asset_info.full_name = CURRENCY_NAME_SHORT_BASE;
native_asset_info.ticker = CURRENCY_NAME_ABR;
native_asset_info.decimal_point = CURRENCY_DISPLAY_DECIMAL_POINT;
const asset_descriptor_base* asset_ptr = nullptr;
asset_descriptor_base asset_info = AUTO_VAL_INIT(asset_info);
//check if asset is whitelisted or customly added
if (item.first == currency::null_hash)
{
asset_ptr = &native_asset_info;
asset_info = native_asset_info;
}
else
{
@ -3166,27 +3174,35 @@ bool wallet2::balance(std::list<wallet_public::asset_balance_entry>& balances, u
if (it == m_whitelisted_assets.end())
{
//check if it custom asset
auto it_cust = m_custom_assets.find(item.first);
if (it_cust == m_custom_assets.end())
auto it_cust = custom_assets_local.find(item.first);
if (it_cust == custom_assets_local.end())
{
continue;
}
else
{
asset_ptr = &it_cust->second;
asset_info = it_cust->second;
custom_assets_local.erase(it_cust);
}
}
else
{
asset_ptr = &it->second;
asset_info = it->second;
}
}
balances.push_back(wallet_public::asset_balance_entry());
wallet_public::asset_balance_entry& new_item = balances.back();
static_cast<wallet_public::asset_balance_entry_base&>(new_item) = item.second;
new_item.asset_info.asset_id = item.first;
CHECK_AND_ASSERT_THROW_MES(asset_ptr, "Internal error: asset_ptr i nullptr");
static_cast<currency::asset_descriptor_base&>(new_item.asset_info) = *asset_ptr;
static_cast<currency::asset_descriptor_base&>(new_item.asset_info) = asset_info;
}
//manually added assets should be always present, at least as zero balanced items
for (auto& asset : custom_assets_local)
{
balances.push_back(wallet_public::asset_balance_entry());
wallet_public::asset_balance_entry& new_item = balances.back();
new_item.asset_info.asset_id = asset.first;
static_cast<currency::asset_descriptor_base&>(new_item.asset_info) = asset.second;
}
return true;
@ -3198,7 +3214,7 @@ uint64_t wallet2::balance() const
return balance(stub, stub, stub, stub);
}
//----------------------------------------------------------------------------------------------------
bool wallet2::add_custom_asset_id(const crypto::hash& asset_id)
bool wallet2::add_custom_asset_id(const crypto::hash& asset_id, asset_descriptor_base& asset_descriptor)
{
currency::COMMAND_RPC_GET_ASSET_INFO::request req = AUTO_VAL_INIT(req);
currency::COMMAND_RPC_GET_ASSET_INFO::response resp = AUTO_VAL_INIT(resp);
@ -3207,6 +3223,7 @@ bool wallet2::add_custom_asset_id(const crypto::hash& asset_id)
if (resp.status == API_RETURN_CODE_OK)
{
m_custom_assets[asset_id] = resp.asset_descriptor;
asset_descriptor = resp.asset_descriptor;
return true;
}
return false;

View file

@ -899,7 +899,7 @@ namespace tools
uint64_t get_default_fee() {return TX_DEFAULT_FEE;}
void export_transaction_history(std::ostream& ss, const std::string& format, bool include_pos_transactions = true);
bool add_custom_asset_id(const crypto::hash& asset_id);
bool add_custom_asset_id(const crypto::hash& asset_id, currency::asset_descriptor_base& asset_descriptor);
bool delete_custom_asset_id(const crypto::hash& asset_id);
bool load_whitelisted_tokens_if_not_loaded() const;
bool load_whitelisted_tokens()const;