From c07698fcc8a845dfd01f1396737ccbcee63127d7 Mon Sep 17 00:00:00 2001 From: somerandomcryptoguy <139346562+somerandomcryptoguy@users.noreply.github.com> Date: Fri, 3 Oct 2025 13:10:28 +0100 Subject: [PATCH] improvements to wallet address formatting (#64) * bumped version to v1.0.0 * added fast sync points up to 325,000 * added fast sync points up to 325,000 (part 2) * initial import of CLI wallet improvements for address printing * updated wallet address display in various places --------- Co-authored-by: Some Random Crypto Guy --- README.md | 2 +- src/blocks/checkpoints.dat | Bin 24324 -> 40580 bytes src/cryptonote_core/blockchain.cpp | 2 +- src/simplewallet/simplewallet.cpp | 64 +++++++++++++------ src/version.cpp.in | 2 +- src/wallet/wallet2.cpp | 43 ++++++++++++- src/wallet/wallet2.h | 17 ++++- src/wallet/wallet_rpc_server_commands_defs.h | 9 +++ 8 files changed, 114 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index b84d4f911..4a5cefe56 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Salvium One v1.0.0 -Copyright (c) 2023-2024, Salvium +Copyright (c) 2023-2025, Salvium Portions Copyright (c) 2014-2023, The Monero Project Portions Copyright (c) 2012-2013 The Cryptonote developers. diff --git a/src/blocks/checkpoints.dat b/src/blocks/checkpoints.dat index 890c1dd3a1d9dc960164cefa2c3ff2b59ad07441..83134e50bac6ab9b072e37a04f9da7d0c6fb89b4 100644 GIT binary patch delta 16397 zcmV+oK=QwYz5#^20s?vhu>t~LfAxoBvn6;kz!~q6Zs4AQbEN3%NqQ#(4K;04#q+i} zya$?>k8lmSHWgWCpW#X=CqB!RI$QN}nH_%Uc5IYgm76v;N4e}48bmXss{ zIx^s1C&>?@k~Ea->vl<%^`{TLUR7vEzEr&on48=7-VDOLMqXM-_ltA*xm>&8znY&l zjT}F$ZzVW{Gim@T<9}@#-dL`D#Rr5^~x}$-yo(;V+*f0Ioj|OWmRh-TC5y z(gBl?$tc)0Jd{Wlo!>1ge{+g@r&+TGX%s0P8D~Xw5Ux8>mr}SOZr6;~S9z*zjdPsE zeuD9Vh%gYDFiE~22a=m?ipR=Iu2v5IGr+=r%0Dxj6omQ4edN>BZL#G+AoUAMeO1D( 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ⓈEh>8GK%ROb(?cDkv=lK z7S{WzQ0c$iiXY_#XWjvMc`YK8JyWPfCyw$|>)K7s>ND~Yg?KDJm3u&Um6Gn1@|s9t z)Yy$?vc^ohiDo-1wSQ*qT_6dmTa1ibn^H?T=ljt??_s#{b(zxUs~5HrD0f#Yve!u2 ze~90L&HDzRNGH2mKE+e5eFOx9N=2bBHQCPB&(7N9c>CB~Ps~11#-mH71mYMq8UO$Q diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp index 0e7f205d7..9b8f61870 100644 --- a/src/cryptonote_core/blockchain.cpp +++ b/src/cryptonote_core/blockchain.cpp @@ -6514,7 +6514,7 @@ void Blockchain::cancel() } #if defined(PER_BLOCK_CHECKPOINT) -static const char expected_block_hashes_hash[] = "a2a5a9bc5d606392ac5c14be55b90a92b8577b8ffdac5c63cc6174f41764c753"; +static const char expected_block_hashes_hash[] = "1cf6e8892e0512c246cef62610ccf524f30f484e307ae01959a5a7dd166aa328"; void Blockchain::load_compiled_in_block_hashes(const GetCheckpointsCallback& get_checkpoints) { if (get_checkpoints == nullptr || !m_fast_sync) diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index ce0f1948a..a23898a8b 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -6472,7 +6472,7 @@ bool simple_wallet::show_balance_unlocked(bool detailed) if (!detailed || balance_per_subaddress.empty()) continue; success_msg_writer() << tr("Balance per address:"); - success_msg_writer() << boost::format("%15s %21s %21s %7s %21s") % tr("Address") % tr("Balance") % tr("Unlocked balance") % tr("Outputs") % tr("Label"); + success_msg_writer() << boost::format("%16s %21s %21s %7s %21s") % tr("Address") % tr("Balance") % tr("Unlocked balance") % tr("Outputs") % tr("Label"); std::vector transfers; m_wallet->get_transfers(transfers); for (const auto& i : balance_per_subaddress) @@ -6480,9 +6480,9 @@ bool simple_wallet::show_balance_unlocked(bool detailed) carrot::subaddress_index_extended subaddr = {{m_current_subaddress_account, i.first}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}; cryptonote::subaddress_index subaddr_index = {m_current_subaddress_account, i.first}; - std::string address_str = m_wallet->get_subaddress_as_str(subaddr).substr(0, 6); + std::string address_str = m_wallet->get_subaddress_as_str(subaddr).substr(0, 8); uint64_t num_unspent_outputs = std::count_if(transfers.begin(), transfers.end(), [&subaddr_index](const tools::wallet2::transfer_details& td) { return !td.m_spent && td.m_subaddr_index == subaddr_index; }); - success_msg_writer() << boost::format(tr("%8u %6s %21s %21s %7u %21s")) % i.first % address_str % print_money(i.second) % print_money(unlocked_balance_per_subaddress[i.first].first) % num_unspent_outputs % m_wallet->get_subaddress_label(subaddr_index); + success_msg_writer() << boost::format(tr("%8u %8s %21s %21s %7u %21s")) % i.first % address_str % print_money(i.second) % print_money(unlocked_balance_per_subaddress[i.first].first) % num_unspent_outputs % m_wallet->get_subaddress_label(subaddr_index); } } return true; @@ -9902,7 +9902,7 @@ bool simple_wallet::get_transfers(std::vector& local_args, std::vec if (payment_id.substr(16).find_first_not_of('0') == std::string::npos) payment_id = payment_id.substr(0,16); std::string note = m_wallet->get_tx_note(pd.m_tx_hash); - std::string destination = m_wallet->get_subaddress_as_str({m_current_subaddress_account, pd.m_subaddr_index.minor}); + std::string destination = m_wallet->get_subaddress_as_str({{m_current_subaddress_account, pd.m_subaddr_index.minor}, pd.m_is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}); const std::string type = pd.m_tx_type == cryptonote::transaction_type::STAKE ? "stake" : pd.m_coinbase ? tr("block") : tr("in"); @@ -10105,7 +10105,7 @@ bool simple_wallet::show_transfers(const std::vector &args_) { if (!destinations.empty()) destinations += ", "; - destinations += (transfer.direction == "in" ? output.first.substr(0, 6) : output.first) + ":" + print_money(output.second); + destinations += ((transfer.direction == "in" || transfer.direction == "block") ? output.first.substr(0, 8) : output.first) + ":" + print_money(output.second); } } @@ -10631,7 +10631,7 @@ std::string simple_wallet::get_prompt() const { if (m_locked) return std::string("[") + tr("locked due to inactivity") + "]"; - std::string addr_start = m_wallet->get_subaddress_as_str({m_current_subaddress_account, 0}).substr(0, 6); + std::string addr_start = m_wallet->get_subaddress_as_str({m_current_subaddress_account, 0}).substr(0, 8); std::string prompt = std::string("[") + tr("wallet") + " " + addr_start; if (!m_wallet->check_connection(NULL)) prompt += tr(" (no daemon)"); @@ -10854,7 +10854,7 @@ void simple_wallet::print_accounts(const std::string& tag) success_msg_writer() << tr("Accounts with tag: ") << tag; success_msg_writer() << tr("Tag's description: ") << account_tags.first.find(tag)->second; } - success_msg_writer() << boost::format(" %15s %21s %21s %21s %21s") % tr("Account") % tr("Balance") % tr("Unlocked balance") % tr("Asset") % tr("Label"); + success_msg_writer() << boost::format(" %18s %21s %21s %6s %21s") % tr("Account") % tr("Balance") % tr("Unlocked balance") % tr("Asset") % tr("Label"); std::map> total_balances; std::vector asset_types_in_wallet = m_wallet->list_asset_types(); for (const auto& asset: asset_types_in_wallet) { @@ -10868,10 +10868,10 @@ void simple_wallet::print_accounts(const std::string& tag) auto unlocked_balance = m_wallet->unlocked_balance(account_index, asset, false); if (balance == 0) continue; - success_msg_writer() << boost::format(tr(" %c%8u %6s %21s %21s %21s %21s")) + success_msg_writer() << boost::format(tr(" %c%8u %8s %21s %21s %6s %21s")) % (m_current_subaddress_account == account_index ? '*' : ' ') % account_index - % m_wallet->get_subaddress_as_str({account_index, 0}).substr(0, 6) + % m_wallet->get_subaddress_as_str({{account_index, 0}, carrot::AddressDeriveType::Auto}).substr(0, 8) % print_money(balance) % print_money(unlocked_balance) % asset @@ -10882,9 +10882,9 @@ void simple_wallet::print_accounts(const std::string& tag) if (total_balance > 0) total_balances[asset] = std::pair(total_balance, total_unlocked_balance); } - success_msg_writer() << tr("------------------------------------------------------------------------------------"); + success_msg_writer() << tr("------------------------------------------------------------------------------------------------------"); for (const auto& it: total_balances) - success_msg_writer() << boost::format(tr("%15s %21s %21s %15s")) % "Total" % print_money(it.second.first) % print_money(it.second.second) % it.first; + success_msg_writer() << boost::format(tr("%18s %21s %21s %6s")) % "Total" % print_money(it.second.first) % print_money(it.second.second) % it.first; } //---------------------------------------------------------------------------------------------------- bool simple_wallet::print_address(const std::vector &args/* = std::vector()*/) @@ -10900,16 +10900,35 @@ bool simple_wallet::print_address(const std::vector &args/* = std:: std::vector local_args = args; tools::wallet2::transfer_container transfers; m_wallet->get_transfers(transfers); - bool is_carrot = m_wallet->get_current_hard_fork() >= HF_VERSION_CARROT; - auto print_address_sub = [this, &transfers, is_carrot](uint32_t index) + auto print_address_sub = [this, &transfers](uint32_t index, bool cryptonote = true, bool carrot = true) { bool used = std::find_if( transfers.begin(), transfers.end(), [this, &index](const tools::wallet2::transfer_details& td) { return td.m_subaddr_index == cryptonote::subaddress_index{ m_current_subaddress_account, index }; }) != transfers.end(); - success_msg_writer() << index << " " << m_wallet->get_subaddress_as_str({{m_current_subaddress_account, index}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}) << " " << (index == 0 ? tr("Primary address") : m_wallet->get_subaddress_label({m_current_subaddress_account, index})) << " " << (used ? tr("(used)") : ""); + if (!cryptonote) { + success_msg_writer() << boost::format(tr("%8u %96s %21s %6s")) + % index + % m_wallet->get_subaddress_as_str({{m_current_subaddress_account, index}, carrot::AddressDeriveType::Carrot}) + % (index == 0 ? tr("Primary address") : m_wallet->get_subaddress_label({m_current_subaddress_account, index})) + % (used ? tr("(used)") : ""); + } else if (!carrot) { + success_msg_writer() << boost::format(tr("%8u %96s %21s %6s")) + % index + % m_wallet->get_subaddress_as_str({{m_current_subaddress_account, index}, carrot::AddressDeriveType::PreCarrot}) + % (index == 0 ? tr("Primary address") : m_wallet->get_subaddress_label({m_current_subaddress_account, index})) + % (used ? tr("(used)") : ""); + } else { + success_msg_writer() << boost::format(tr("%8u %96s %21s %6s\n %96s\n")) + % index + % m_wallet->get_subaddress_as_str({{m_current_subaddress_account, index}, carrot::AddressDeriveType::PreCarrot}) + % (index == 0 ? tr("Primary address") : m_wallet->get_subaddress_label({m_current_subaddress_account, index})) + % (used ? tr("(used)") : "") + % m_wallet->get_subaddress_as_str({{m_current_subaddress_account, index}, carrot::AddressDeriveType::Carrot}); + } + //success_msg_writer() << index << " " << m_wallet->get_subaddress_as_str({{m_current_subaddress_account, index}, is_carrot ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot}) << " " << (index == 0 ? tr("Primary address") : m_wallet->get_subaddress_label({m_current_subaddress_account, index})) << " " << (used ? tr("(used)") : ""); }; uint32_t index = 0; @@ -10917,11 +10936,18 @@ bool simple_wallet::print_address(const std::vector &args/* = std:: { print_address_sub(index); } - else if (local_args.size() == 1 && local_args[0] == "all") + else if (local_args[0] == "all") { local_args.erase(local_args.begin()); - for (; index < m_wallet->get_num_subaddresses(m_current_subaddress_account); ++index) - print_address_sub(index); + if (local_args.size() == 0) + for (; index < m_wallet->get_num_subaddresses(m_current_subaddress_account); ++index) + print_address_sub(index); + else if (local_args[0] == "cn") + for (; index < m_wallet->get_num_subaddresses(m_current_subaddress_account); ++index) + print_address_sub(index, true, false); + else + for (; index < m_wallet->get_num_subaddresses(m_current_subaddress_account); ++index) + print_address_sub(index, false, true); } else if (local_args[0] == "new") { @@ -11321,7 +11347,9 @@ bool simple_wallet::wallet_info(const std::vector &args) } message_writer() << tr("Filename: ") << m_wallet->get_wallet_file(); message_writer() << tr("Description: ") << description; - message_writer() << tr("Address: ") << m_wallet->get_account().get_public_address_str(m_wallet->nettype()); + message_writer() << tr("CN Address: ") << m_wallet->get_account().get_public_address_str(m_wallet->nettype()); + message_writer() << tr("Carrot Address: ") << m_wallet->get_account().get_carrot_public_address_str(m_wallet->nettype()); + std::string type; if (m_wallet->watch_only()) type = tr("Watch only"); diff --git a/src/version.cpp.in b/src/version.cpp.in index b707d723d..c625cc4f0 100644 --- a/src/version.cpp.in +++ b/src/version.cpp.in @@ -1,5 +1,5 @@ #define DEF_SALVIUM_VERSION_TAG "@VERSIONTAG@" -#define DEF_SALVIUM_VERSION "1.0.0-rc6" +#define DEF_SALVIUM_VERSION "1.0.0" #define DEF_MONERO_VERSION_TAG "release" #define DEF_MONERO_VERSION "0.18.3.4" #define DEF_MONERO_RELEASE_NAME "One" diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 544bde49b..3cd06a14c 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1584,11 +1584,24 @@ crypto::public_key wallet2::get_subaddress_spend_public_key(const cryptonote::su return hwdev.get_subaddress_spend_public_key(m_account.get_keys(), index); } //---------------------------------------------------------------------------------------------------- -std::string wallet2::get_subaddress_as_str(const carrot::subaddress_index_extended& subaddr) const +std::string wallet2::get_subaddress_as_str(const carrot::subaddress_index_extended& subaddr_const) const { - carrot::CarrotDestinationV1 address = m_account.subaddress(subaddr); + // Make a non-const copy of subaddr + carrot::subaddress_index_extended subaddr(subaddr_const); + + // Handle "auto" - the account class doesn't know the HF version, so this is the cleanest solution + if (subaddr.derive_type == carrot::AddressDeriveType::Auto) { + + // Get the HF version + uint32_t hf_version = estimate_current_hard_fork(); + THROW_WALLET_EXCEPTION_IF(hf_version == 0, error::wallet_internal_error, "unable to estimate the current hard fork - cannot generate subaddress as string"); + + // Change the non-const derivation type + subaddr.derive_type = (hf_version >= HF_VERSION_CARROT) ? carrot::AddressDeriveType::Carrot : carrot::AddressDeriveType::PreCarrot; + } // Build the cryptonote::account_public_address + carrot::CarrotDestinationV1 address = m_account.subaddress(subaddr); account_public_address addr{address.address_spend_pubkey, address.address_view_pubkey}; addr.m_is_carrot = subaddr.derive_type == carrot::AddressDeriveType::Carrot; @@ -2936,6 +2949,7 @@ void wallet2::process_new_scanned_transaction( payment.m_coinbase = miner_tx; payment.m_subaddr_index = i.first; payment.m_tx_type = tx.type; + payment.m_is_carrot = (tx.version >= TRANSACTION_VERSION_CARROT); if (pool) { if (emplace_or_replace(m_unconfirmed_payments, payment_id, pool_payment_details{payment, double_spend_seen})) all_same = false; @@ -12312,6 +12326,31 @@ 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 +{ + // Get the last-seen top height by the wallet + uint64_t guessed_height = m_blockchain.size(); + + // Get the correct hardfork table, based on current net type + const hardfork_t *hfs = + (m_nettype == cryptonote::MAINNET) ? mainnet_hard_forks : + (m_nettype == cryptonote::TESTNET) ? testnet_hard_forks : + stagenet_hard_forks; + size_t hfs_count = + (m_nettype == cryptonote::MAINNET) ? num_mainnet_hard_forks : + (m_nettype == cryptonote::TESTNET) ? num_testnet_hard_forks : + num_stagenet_hard_forks; + + // Iterate over the hard fork table, to see what the current fork is for the guessed height + for (size_t i = hfs_count-1; i>=0; --i) { + if (hfs[i].height <= guessed_height) + return hfs[i].version; + } + + // return "no value found" to the caller + return 0; +} +//---------------------------------------------------------------------------------------------------- uint8_t wallet2::get_current_hard_fork() { if (m_offline) diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 0158ec7d2..1d3ef2405 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -496,9 +496,10 @@ private: bool m_coinbase; cryptonote::subaddress_index m_subaddr_index; cryptonote::transaction_type m_tx_type; + bool m_is_carrot; BEGIN_SERIALIZE_OBJECT() - VERSION_FIELD(0) + VERSION_FIELD(1) FIELD(m_tx_hash) VARINT_FIELD(m_amount) FIELD(m_asset_type) @@ -510,6 +511,11 @@ private: FIELD(m_coinbase) FIELD(m_subaddr_index) VARINT_FIELD(m_tx_type) + if (version < 1) { + m_is_carrot = false; + return true; + } + FIELD(m_is_carrot) END_SERIALIZE() }; @@ -1661,6 +1667,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 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); @@ -2293,7 +2300,7 @@ BOOST_CLASS_VERSION(tools::wallet2::transfer_details, 12) BOOST_CLASS_VERSION(tools::wallet2::multisig_info, 1) BOOST_CLASS_VERSION(tools::wallet2::multisig_info::LR, 0) BOOST_CLASS_VERSION(tools::wallet2::multisig_tx_set, 1) -BOOST_CLASS_VERSION(tools::wallet2::payment_details, 5) +BOOST_CLASS_VERSION(tools::wallet2::payment_details, 6) BOOST_CLASS_VERSION(tools::wallet2::pool_payment_details, 1) BOOST_CLASS_VERSION(tools::wallet2::unconfirmed_transfer_details, 8) BOOST_CLASS_VERSION(tools::wallet2::confirmed_transfer_details, 6) @@ -2622,6 +2629,12 @@ namespace boost a & x.m_amounts; a & x.m_asset_type; a & x.m_tx_type; + if (ver < 6) + { + x.m_is_carrot = false; + return; + } + a & x.m_is_carrot; } template diff --git a/src/wallet/wallet_rpc_server_commands_defs.h b/src/wallet/wallet_rpc_server_commands_defs.h index d734f23fc..0564822d2 100644 --- a/src/wallet/wallet_rpc_server_commands_defs.h +++ b/src/wallet/wallet_rpc_server_commands_defs.h @@ -67,6 +67,7 @@ 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) @@ -74,6 +75,7 @@ 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; @@ -83,6 +85,7 @@ 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; @@ -94,6 +97,7 @@ 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) @@ -139,6 +143,7 @@ namespace wallet_rpc { uint32_t account_index; std::vector address_index; + bool carrot_first; BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(account_index) KV_SERIALIZE(address_index) @@ -149,12 +154,14 @@ namespace wallet_rpc struct address_info { std::string address; + std::string address_alt; std::string label; uint32_t address_index; bool used; BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(address) + KV_SERIALIZE(address_alt) KV_SERIALIZE(label) KV_SERIALIZE(address_index) KV_SERIALIZE(used) @@ -164,10 +171,12 @@ 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() };