From f1efb700d2235d02a0467fe0552e319331a660e0 Mon Sep 17 00:00:00 2001 From: somerandomcryptoguy <139346562+somerandomcryptoguy@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:06:05 +0100 Subject: [PATCH] improvements to wallet address formatting for RPC (#66) * bumped version to v1.0.0 * added fast sync points up to 325,000 * added fast sync points up to 325,000 (part 2) * RPC address formatting fixes --------- Co-authored-by: Some Random Crypto Guy --- src/wallet/wallet2.cpp | 4 +- src/wallet/wallet2.h | 3 +- src/wallet/wallet_rpc_server.cpp | 46 +++++++------------- src/wallet/wallet_rpc_server_commands_defs.h | 17 ++++---- 4 files changed, 28 insertions(+), 42 deletions(-) diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 3cd06a14c..12348555f 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -12326,10 +12326,10 @@ void wallet2::device_show_address(uint32_t account_index, uint32_t address_index hwdev.display_address(subaddress_index{account_index, address_index}, payment_id); } //---------------------------------------------------------------------------------------------------- -uint8_t wallet2::estimate_current_hard_fork() const +uint8_t wallet2::estimate_current_hard_fork(const uint64_t height) const { // Get the last-seen top height by the wallet - uint64_t guessed_height = m_blockchain.size(); + uint64_t guessed_height = (height > 0) ? height : m_blockchain.size(); // Get the correct hardfork table, based on current net type const hardfork_t *hfs = diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 1d3ef2405..8fd4554bd 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -1203,6 +1203,7 @@ private: std::vector get_subaddress_spend_public_keys(uint32_t account, uint32_t begin, uint32_t end) const; //std::string get_subaddress_as_str(const cryptonote::subaddress_index& index) const; std::string get_subaddress_as_str(const carrot::subaddress_index_extended& index) const; + std::string get_subaddress_as_str(const carrot::subaddress_index_extended& index, const uint64_t height) const; std::string get_address_as_str() const { return get_subaddress_as_str({0, 0}); } std::string get_integrated_address_as_str(const crypto::hash8& payment_id, bool carrot = true) const; void add_subaddress_account(const std::string& label); @@ -1667,7 +1668,7 @@ private: size_t get_num_transfer_details() const { return m_transfers.size(); } const transfer_details &get_transfer_details(size_t idx) const; - uint8_t estimate_current_hard_fork() const; + uint8_t estimate_current_hard_fork(const uint64_t height = 0) const; uint8_t get_current_hard_fork(); void get_hard_fork_info(uint8_t version, uint64_t &earliest_height); bool use_fork_rules(uint8_t version, int64_t early_blocks = 0); diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp index 94f0e91ae..d917207d9 100644 --- a/src/wallet/wallet_rpc_server.cpp +++ b/src/wallet/wallet_rpc_server.cpp @@ -439,7 +439,7 @@ namespace tools entry.subaddr_index = pd.m_subaddr_index; entry.subaddr_indices.push_back(pd.m_subaddr_index); //entry.address = m_wallet->get_subaddress_as_str(pd.m_subaddr_index); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; + bool is_carrot = m_wallet->estimate_current_hard_fork(entry.height) >= HF_VERSION_CARROT; entry.address = m_wallet->get_subaddress_as_str({{pd.m_subaddr_index.major, pd.m_subaddr_index.minor}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); set_confirmations(entry, m_wallet->get_blockchain_current_height(), m_wallet->get_last_block_reward(), pd.m_unlock_time); } @@ -473,7 +473,7 @@ namespace tools for (uint32_t i: pd.m_subaddr_indices) entry.subaddr_indices.push_back({pd.m_subaddr_account, i}); //entry.address = m_wallet->get_subaddress_as_str({pd.m_subaddr_account, 0}); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; + bool is_carrot = m_wallet->estimate_current_hard_fork(entry.height) >= HF_VERSION_CARROT; entry.address = m_wallet->get_subaddress_as_str({{pd.m_subaddr_account, 0}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); set_confirmations(entry, m_wallet->get_blockchain_current_height(), m_wallet->get_last_block_reward(), pd.m_unlock_time); } @@ -508,7 +508,7 @@ namespace tools for (uint32_t i: pd.m_subaddr_indices) entry.subaddr_indices.push_back({pd.m_subaddr_account, i}); //entry.address = m_wallet->get_subaddress_as_str({pd.m_subaddr_account, 0}); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; + bool is_carrot = m_wallet->estimate_current_hard_fork(entry.height) >= HF_VERSION_CARROT; entry.address = m_wallet->get_subaddress_as_str({{pd.m_subaddr_account, 0}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); set_confirmations(entry, m_wallet->get_blockchain_current_height(), m_wallet->get_last_block_reward(), pd.m_tx.unlock_time); } @@ -533,7 +533,7 @@ namespace tools entry.subaddr_index = pd.m_subaddr_index; entry.subaddr_indices.push_back(pd.m_subaddr_index); //entry.address = m_wallet->get_subaddress_as_str(pd.m_subaddr_index); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; + bool is_carrot = m_wallet->estimate_current_hard_fork(entry.height) >= HF_VERSION_CARROT; entry.address = m_wallet->get_subaddress_as_str({{pd.m_subaddr_index.major, pd.m_subaddr_index.minor}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); set_confirmations(entry, m_wallet->get_blockchain_current_height(), m_wallet->get_last_block_reward(), pd.m_unlock_time); } @@ -542,8 +542,8 @@ namespace tools { if (!m_wallet) return not_open(er); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; - + bool is_carrot = m_wallet->estimate_current_hard_fork() >= HF_VERSION_CARROT; + std::vector assets_in_wallet = m_wallet->list_asset_types(); std::string asset_type = req.asset_type.empty() ? "SAL1" : boost::algorithm::to_upper_copy(req.asset_type); // verify that the asset is in the list of in-wallet assets @@ -627,8 +627,6 @@ namespace tools { if (!m_wallet) return not_open(er); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; - try { THROW_WALLET_EXCEPTION_IF(req.account_index >= m_wallet->get_num_subaddress_accounts(), error::account_index_outofbound); @@ -651,14 +649,14 @@ namespace tools res.addresses.resize(res.addresses.size() + 1); auto& info = res.addresses.back(); const cryptonote::subaddress_index index = {req.account_index, i}; - //info.address = m_wallet->get_subaddress_as_str(index); - info.address = m_wallet->get_subaddress_as_str({{req.account_index, i}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); + info.address = m_wallet->get_subaddress_as_str({req.account_index, i}); + info.address_cn = req.cryptonote ? m_wallet->get_subaddress_as_str({{req.account_index, i}, carrot::AddressDeriveType::PreCarrot}) : ""; + info.address_carrot = req.carrot ? m_wallet->get_subaddress_as_str({{req.account_index, i}, carrot::AddressDeriveType::Carrot}) : ""; info.label = m_wallet->get_subaddress_label(index); info.address_index = index.minor; info.used = std::find_if(transfers.begin(), transfers.end(), [&](const tools::wallet2::transfer_details& td) { return td.m_subaddr_index == index; }) != transfers.end(); } - //res.address = m_wallet->get_subaddress_as_str({req.account_index, 0}); - res.address = m_wallet->get_subaddress_as_str({{req.account_index, 0}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); + res.address = m_wallet->get_subaddress_as_str({req.account_index, 0}); } catch (const std::exception& e) { @@ -701,8 +699,6 @@ namespace tools return false; } - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; - std::vector addresses; std::vector address_indices; @@ -713,8 +709,7 @@ namespace tools m_wallet->add_subaddress(req.account_index, req.label); uint32_t new_address_index = m_wallet->get_num_subaddresses(req.account_index) - 1; address_indices.push_back(new_address_index); - //addresses.push_back(m_wallet->get_subaddress_as_str({req.account_index, new_address_index})); - addresses.push_back(m_wallet->get_subaddress_as_str({{req.account_index, new_address_index}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot})); + addresses.push_back(m_wallet->get_subaddress_as_str({req.account_index, new_address_index})); } res.address = addresses[0]; @@ -750,8 +745,6 @@ namespace tools { if (!m_wallet) return not_open(er); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; - try { res.total_balance = 0; @@ -772,8 +765,7 @@ namespace tools continue; wallet_rpc::COMMAND_RPC_GET_ACCOUNTS::subaddress_account_info info; info.account_index = subaddr_index.major; - //info.base_address = m_wallet->get_subaddress_as_str(subaddr_index); - info.base_address = m_wallet->get_subaddress_as_str({{subaddr_index.major, subaddr_index.minor}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); + info.base_address = m_wallet->get_subaddress_as_str({{subaddr_index.major, 0}, carrot::AddressDeriveType::Auto}); //for (const auto& asset: asset_types) { info.balance = m_wallet->balance(subaddr_index.major, "SAL1", req.strict_balances); @@ -810,9 +802,7 @@ namespace tools { m_wallet->add_subaddress_account(req.label); res.account_index = m_wallet->get_num_subaddress_accounts() - 1; - //res.address = m_wallet->get_subaddress_as_str({res.account_index, 0}); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; - res.address = m_wallet->get_subaddress_as_str({{res.account_index, 0}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); + res.address = m_wallet->get_subaddress_as_str({res.account_index, 0}); } catch (const std::exception& e) { @@ -2109,8 +2099,6 @@ namespace tools { if (!m_wallet) return not_open(er); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; - crypto::hash payment_id; crypto::hash8 payment_id8; cryptonote::blobdata payment_id_blob; @@ -2151,7 +2139,7 @@ namespace tools rpc_payment.unlock_time = payment.m_unlock_time; rpc_payment.locked = !m_wallet->is_transfer_unlocked(payment.m_unlock_time, payment.m_block_height); rpc_payment.subaddr_index = payment.m_subaddr_index; - //rpc_payment.address = m_wallet->get_subaddress_as_str(payment.m_subaddr_index); + bool is_carrot = m_wallet->estimate_current_hard_fork(payment.m_block_height) >= HF_VERSION_CARROT; rpc_payment.address = m_wallet->get_subaddress_as_str({{payment.m_subaddr_index.major, payment.m_subaddr_index.minor}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); res.payments.push_back(rpc_payment); } @@ -2163,8 +2151,6 @@ namespace tools { res.payments.clear(); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; - if (!m_wallet) return not_open(er); /* If the payment ID list is empty, we get payments to any payment ID (or lack thereof) */ @@ -2182,7 +2168,7 @@ namespace tools rpc_payment.block_height = payment.second.m_block_height; rpc_payment.unlock_time = payment.second.m_unlock_time; rpc_payment.subaddr_index = payment.second.m_subaddr_index; - //rpc_payment.address = m_wallet->get_subaddress_as_str(payment.second.m_subaddr_index); + bool is_carrot = m_wallet->estimate_current_hard_fork(payment.second.m_block_height) >= HF_VERSION_CARROT; rpc_payment.address = m_wallet->get_subaddress_as_str({{payment.second.m_subaddr_index.major, payment.second.m_subaddr_index.minor}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); rpc_payment.locked = !m_wallet->is_transfer_unlocked(payment.second.m_unlock_time, payment.second.m_block_height); res.payments.push_back(std::move(rpc_payment)); @@ -2238,7 +2224,7 @@ namespace tools rpc_payment.block_height = payment.m_block_height; rpc_payment.unlock_time = payment.m_unlock_time; rpc_payment.subaddr_index = payment.m_subaddr_index; - //rpc_payment.address = m_wallet->get_subaddress_as_str(payment.m_subaddr_index); + bool is_carrot = m_wallet->estimate_current_hard_fork(payment.m_block_height) >= HF_VERSION_CARROT; rpc_payment.address = m_wallet->get_subaddress_as_str({{payment.m_subaddr_index.major, payment.m_subaddr_index.minor}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); rpc_payment.locked = !m_wallet->is_transfer_unlocked(payment.m_unlock_time, payment.m_block_height); res.payments.push_back(std::move(rpc_payment)); diff --git a/src/wallet/wallet_rpc_server_commands_defs.h b/src/wallet/wallet_rpc_server_commands_defs.h index 0564822d2..2d24ee3b7 100644 --- a/src/wallet/wallet_rpc_server_commands_defs.h +++ b/src/wallet/wallet_rpc_server_commands_defs.h @@ -67,7 +67,6 @@ namespace wallet_rpc bool all_accounts; bool all_assets; bool strict; - bool carrot_first; BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(account_index) KV_SERIALIZE(address_indices) @@ -75,7 +74,6 @@ namespace wallet_rpc KV_SERIALIZE_OPT(all_accounts, false); KV_SERIALIZE_OPT(all_assets, false); KV_SERIALIZE_OPT(strict, false); - KV_SERIALIZE_OPT(carrot_first, false); END_KV_SERIALIZE_MAP() }; typedef epee::misc_utils::struct_init request; @@ -85,7 +83,6 @@ namespace wallet_rpc uint32_t account_index; uint32_t address_index; std::string address; - std::string address_alt; uint64_t balance; uint64_t unlocked_balance; std::string label; @@ -97,7 +94,6 @@ namespace wallet_rpc KV_SERIALIZE(account_index) KV_SERIALIZE(address_index) KV_SERIALIZE(address) - KV_SERIALIZE(address_alt) KV_SERIALIZE(balance) KV_SERIALIZE(unlocked_balance) KV_SERIALIZE(label) @@ -143,10 +139,13 @@ namespace wallet_rpc { uint32_t account_index; std::vector address_index; - bool carrot_first; + bool carrot; + bool cryptonote; BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(account_index) KV_SERIALIZE(address_index) + KV_SERIALIZE_OPT(carrot, true); + KV_SERIALIZE_OPT(cryptonote, true); END_KV_SERIALIZE_MAP() }; typedef epee::misc_utils::struct_init request; @@ -154,14 +153,16 @@ namespace wallet_rpc struct address_info { std::string address; - std::string address_alt; + std::string address_cn; + std::string address_carrot; std::string label; uint32_t address_index; bool used; BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(address) - KV_SERIALIZE(address_alt) + KV_SERIALIZE(address_cn) + KV_SERIALIZE(address_carrot) KV_SERIALIZE(label) KV_SERIALIZE(address_index) KV_SERIALIZE(used) @@ -171,12 +172,10 @@ namespace wallet_rpc struct response_t { std::string address; // to remain compatible with older RPC format - std::string address_alt; std::vector addresses; BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(address) - KV_SERIALIZE(address_alt) KV_SERIALIZE(addresses) END_KV_SERIALIZE_MAP() };