From aa02928620029f43929d8d9261574a810b6d2c49 Mon Sep 17 00:00:00 2001 From: Some Random Crypto Guy Date: Fri, 4 Jul 2025 16:03:57 +0100 Subject: [PATCH] fixed keys for pre+post Carrot mining rewards --- src/carrot_impl/account.cpp | 11 +++++++++-- src/cryptonote_basic/account.cpp | 2 +- src/cryptonote_basic/account.h | 5 ++++- src/wallet/scanning_tools.cpp | 6 ++---- src/wallet/tx_builder.cpp | 9 +++++---- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/carrot_impl/account.cpp b/src/carrot_impl/account.cpp index bbbe80ea6..bcf76c861 100644 --- a/src/carrot_impl/account.cpp +++ b/src/carrot_impl/account.cpp @@ -58,8 +58,8 @@ CarrotDestinationV1 carrot_and_legacy_account::cryptonote_address(const payment_ switch (resolve_derive_type(derive_type)) { case AddressDeriveType::Carrot: - make_carrot_integrated_address_v1(get_keys().m_carrot_account_address.m_spend_public_key, - get_keys().m_account_address.m_view_public_key, + make_carrot_integrated_address_v1(get_keys().m_carrot_main_address.m_spend_public_key, + get_keys().m_carrot_main_address.m_view_public_key, payment_id, addr); break; @@ -326,6 +326,13 @@ void carrot_and_legacy_account::set_carrot_keys(const AddressDeriveType default_ m_keys.m_carrot_account_address.m_view_public_key ); + // carrot main wallet address + m_keys.m_carrot_main_address.m_spend_public_key = m_keys.m_carrot_account_address.m_spend_public_key; + k_view_incoming_dev.view_key_scalar_mult_ed25519( + crypto::get_G(), + m_keys.m_carrot_main_address.m_view_public_key + ); + this->default_derive_type = default_derive_type; generate_subaddress_map(); } diff --git a/src/cryptonote_basic/account.cpp b/src/cryptonote_basic/account.cpp index eb034566b..3b66a9026 100644 --- a/src/cryptonote_basic/account.cpp +++ b/src/cryptonote_basic/account.cpp @@ -280,7 +280,7 @@ DISABLE_VS_WARNINGS(4244 4345) std::string account_base::get_carrot_public_address_str(network_type nettype) const { // Build the cryptonote::account_public_address - account_public_address addr{m_keys.m_carrot_account_address.m_spend_public_key, m_keys.m_account_address.m_view_public_key}; + account_public_address addr{m_keys.m_carrot_main_address.m_spend_public_key, m_keys.m_carrot_main_address.m_view_public_key}; // change this code into base 58 return get_account_address_as_str(nettype, false, addr, true); } diff --git a/src/cryptonote_basic/account.h b/src/cryptonote_basic/account.h index b28ef78e8..b6e0b5709 100644 --- a/src/cryptonote_basic/account.h +++ b/src/cryptonote_basic/account.h @@ -61,9 +61,12 @@ namespace cryptonote crypto::secret_key k_generate_image; crypto::secret_key s_generate_address; - // carrot public keys (minus K_v, which is shared with legacy K_v) + // carrot public account address (K_s, K_v) account_public_address m_carrot_account_address; + // carrot main address (K^0_s, K^0_v) + account_public_address m_carrot_main_address; + BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(m_account_address) diff --git a/src/wallet/scanning_tools.cpp b/src/wallet/scanning_tools.cpp index ee77c255c..bf7f28756 100644 --- a/src/wallet/scanning_tools.cpp +++ b/src/wallet/scanning_tools.cpp @@ -767,7 +767,7 @@ void view_incoming_scan_transaction( const bool is_carrot = carrot::is_carrot_transaction_v1(tx); perform_ecdh_derivations(epee::to_span(main_tx_ephemeral_pubkeys), epee::to_span(additional_tx_ephemeral_pubkeys), - account.get_keys().m_view_secret_key, + is_carrot ? account.get_keys().k_view_incoming : account.get_keys().m_view_secret_key, account.get_keys().get_device(), is_carrot, main_derivations, @@ -864,9 +864,7 @@ std::optional try_derive_enote_key_image( { const cryptonote::subaddress_index subaddr_index_cn{enote_scan_info.subaddr_index->index.major, enote_scan_info.subaddr_index->index.minor}; - subaddress_extension = rct::sk2rct( - acc.get_keys().get_device().get_subaddress_secret_key(acc.get_keys().m_view_secret_key, subaddr_index_cn) - ); + subaddress_extension = rct::sk2rct(acc.get_keys().get_device().get_subaddress_secret_key(enote_scan_info.is_carrot ? acc.get_keys().k_view_incoming : acc.get_keys().m_view_secret_key, subaddr_index_cn)); } else // !subaddr_index_cn.is_zero() { diff --git a/src/wallet/tx_builder.cpp b/src/wallet/tx_builder.cpp index c24a68728..164a714dd 100644 --- a/src/wallet/tx_builder.cpp +++ b/src/wallet/tx_builder.cpp @@ -800,12 +800,13 @@ bool get_address_openings_x_y( // 2. perform ECDH derivations std::vector main_derivations; std::vector additional_derivations; + bool is_carrot = carrot::is_carrot_transaction_v1(tx); wallet::perform_ecdh_derivations( main_tx_ephemeral_pubkeys, additional_tx_ephemeral_pubkeys, - w.get_account().get_keys().m_view_secret_key, + is_carrot ? w.get_account().get_keys().k_view_incoming : w.get_account().get_keys().m_view_secret_key, w.get_account().get_keys().get_device(), - carrot::is_carrot_transaction_v1(tx), + is_carrot, main_derivations, additional_derivations ); @@ -948,8 +949,8 @@ cryptonote::transaction finalize_all_proofs_from_transfer_details( //! @TODO: HW device carrot::cryptonote_hierarchy_address_device_ram_borrowed addr_dev( - acc_keys.m_account_address.m_spend_public_key, - acc_keys.m_view_secret_key); + acc_keys.m_carrot_account_address.m_spend_public_key, + acc_keys.k_view_incoming); // finalize enotes LOG_PRINT_L3("Getting output enote proposals");