From cea3f0f3414939ab2b1b5c1d3412a7e3eda7b4eb Mon Sep 17 00:00:00 2001 From: Some Random Crypto Guy Date: Thu, 16 Oct 2025 14:51:49 +0100 Subject: [PATCH] fixed Carrot wallet exceptions reporting 'unknown error'; fixed wallet.address.txt file to contain Carrot keys as well; fixed sending to subaddress from same wallet --- src/carrot_core/exceptions.h | 6 +++--- src/carrot_core/scan.cpp | 4 ++-- src/wallet/wallet2.cpp | 15 ++++++++++----- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/carrot_core/exceptions.h b/src/carrot_core/exceptions.h index dba0e4b..eb79f8a 100644 --- a/src/carrot_core/exceptions.h +++ b/src/carrot_core/exceptions.h @@ -41,9 +41,9 @@ namespace carrot { -#define CARROT_DEFINE_SIMPLE_ERROR_TYPE(e, b) class e: b { using b::b; }; +#define CARROT_DEFINE_SIMPLE_ERROR_TYPE(e, b) class e: public b { using b::b; }; -class carrot_logic_error: std::logic_error { using std::logic_error::logic_error; }; +class carrot_logic_error: public std::logic_error { using std::logic_error::logic_error; }; CARROT_DEFINE_SIMPLE_ERROR_TYPE(bad_address_type, carrot_logic_error) CARROT_DEFINE_SIMPLE_ERROR_TYPE(component_out_of_order, carrot_logic_error) @@ -55,7 +55,7 @@ CARROT_DEFINE_SIMPLE_ERROR_TYPE(too_few_outputs, carrot_logic_error) CARROT_DEFINE_SIMPLE_ERROR_TYPE(too_many_outputs, carrot_logic_error) CARROT_DEFINE_SIMPLE_ERROR_TYPE(invalid_tx_type, carrot_logic_error) -class carrot_runtime_error: std::runtime_error { using std::runtime_error::runtime_error; }; +class carrot_runtime_error: public std::runtime_error { using std::runtime_error::runtime_error; }; CARROT_DEFINE_SIMPLE_ERROR_TYPE(crypto_function_failed, carrot_runtime_error) CARROT_DEFINE_SIMPLE_ERROR_TYPE(not_enough_money, carrot_runtime_error) diff --git a/src/carrot_core/scan.cpp b/src/carrot_core/scan.cpp index 939c9fb..dadfe31 100644 --- a/src/carrot_core/scan.cpp +++ b/src/carrot_core/scan.cpp @@ -519,7 +519,7 @@ bool try_scan_carrot_enote_internal_receiver(const CarrotEnoteV1 &enote, crypto::secret_key sum_g; sc_add(to_bytes(sum_g), to_bytes(sender_extension_g_out), to_bytes(k_return)); crypto::key_image key_image = account.derive_key_image( - account.get_keys().m_carrot_account_address.m_spend_public_key, + address_spend_pubkey_out, // THIS WAS WRONG!!! -> account.get_keys().m_carrot_account_address.m_spend_public_key, sum_g, sender_extension_t_out, K_r @@ -527,7 +527,7 @@ bool try_scan_carrot_enote_internal_receiver(const CarrotEnoteV1 &enote, crypto::secret_key x, y; account.try_searching_for_opening_for_onetime_address( - account.get_keys().m_carrot_account_address.m_spend_public_key, + address_spend_pubkey_out, // THIS WAS WRONG!!! -> account.get_keys().m_carrot_account_address.m_spend_public_key, sum_g, sender_extension_t_out, x, diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 444fa22..a86b305 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1572,10 +1572,12 @@ cryptonote::account_public_address wallet2::get_subaddress(const cryptonote::sub //---------------------------------------------------------------------------------------------------- boost::optional wallet2::get_subaddress_index(const cryptonote::account_public_address& address) const { - auto index = m_subaddresses.find(address.m_spend_public_key); - if (index == m_subaddresses.end()) + const auto subaddress_map = m_account.get_subaddress_map_ref(); + auto carrot_index = subaddress_map.find(address.m_spend_public_key); + if (carrot_index == subaddress_map.end()) return boost::none; - return index->second; + cryptonote::subaddress_index index{carrot_index->second.index.major, carrot_index->second.index.minor}; + return index; } //---------------------------------------------------------------------------------------------------- crypto::public_key wallet2::get_subaddress_spend_public_key(const cryptonote::subaddress_index& index) const @@ -5628,7 +5630,8 @@ void wallet2::create_keys_file(const std::string &wallet_, bool watch_only, cons if (create_address_file) { - r = save_to_file(m_wallet_file + ".address.txt", m_account.get_public_address_str(m_nettype), true); + std::string addresses = m_account.get_public_address_str(m_nettype) + "\n" + m_account.get_carrot_public_address_str(m_nettype) + "\n"; + r = save_to_file(m_wallet_file + ".address.txt", addresses, true); if(!r) MERROR("String with address text not saved"); } } @@ -6611,7 +6614,9 @@ void wallet2::load(const std::string& wallet_, const epee::wipeable_string& pass { THROW_WALLET_EXCEPTION_IF(true, error::file_read_error, m_keys_file); } - LOG_PRINT_L0("Loaded wallet keys file, with public address: " << m_account.get_public_address_str(m_nettype)); + LOG_PRINT_L0("Loaded wallet keys file, with public addresses: "); + LOG_PRINT_L0(" CN : " << m_account.get_public_address_str(m_nettype)); + LOG_PRINT_L0(" Carrot : " << m_account.get_carrot_public_address_str(m_nettype)); lock_keys_file(); } else if (!load_keys_buf(keys_buf, password))