From f98077b7ad673cd7039892a1608b99e983b35610 Mon Sep 17 00:00:00 2001 From: selsta Date: Thu, 6 Aug 2026 16:59:22 +0200 Subject: [PATCH] wallet: fix split transaction change address display Display the first non-zero change address after verifying that all effective change uses the same address. Foreign change is already rejected during signing, so this only fixes misleading display. Reported by xmrack and the MAGIC Monero Fund. --- src/simplewallet/simplewallet.cpp | 3 ++- src/wallet/api/unsigned_transaction.cpp | 3 ++- src/wallet/wallet_rpc_server.cpp | 3 +-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index a78c233f8..fb400a88d 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -7592,7 +7592,8 @@ bool simple_wallet::accept_loaded_tx(const std::function get_num_txes, std::string change_string; if (change > 0) { - std::string address = get_account_address_as_str(m_wallet->nettype(), get_tx(0).subaddr_account > 0, get_tx(0).change_dts.addr); + const tools::wallet2::tx_construction_data &cd = get_tx(first_known_non_zero_change_index); + std::string address = get_account_address_as_str(m_wallet->nettype(), cd.subaddr_account > 0, cd.change_dts.addr); change_string += (boost::format(tr("%s change to %s")) % print_money(change) % address).str(); } else diff --git a/src/wallet/api/unsigned_transaction.cpp b/src/wallet/api/unsigned_transaction.cpp index 11301595d..931b91406 100644 --- a/src/wallet/api/unsigned_transaction.cpp +++ b/src/wallet/api/unsigned_transaction.cpp @@ -212,7 +212,8 @@ bool UnsignedTransactionImpl::checkLoadedTx(const std::function get_nu std::string change_string; if (change > 0) { - std::string address = get_account_address_as_str(m_wallet.m_wallet->nettype(), get_tx(0).subaddr_account > 0, get_tx(0).change_dts.addr); + const tools::wallet2::tx_construction_data &cd = get_tx(first_known_non_zero_change_index); + std::string address = get_account_address_as_str(m_wallet.m_wallet->nettype(), cd.subaddr_account > 0, cd.change_dts.addr); change_string += (boost::format(tr("%s change to %s")) % cryptonote::print_money(change) % address).str(); } else diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp index e64df5866..f8ce24658 100644 --- a/src/wallet/wallet_rpc_server.cpp +++ b/src/wallet/wallet_rpc_server.cpp @@ -1638,8 +1638,7 @@ namespace tools if (desc.change_amount > 0) { - const tools::wallet2::tx_construction_data &cd0 = tx_constructions[0]; - desc.change_address = get_account_address_as_str(m_wallet->nettype(), cd0.subaddr_account > 0, cd0.change_dts.addr); + desc.change_address = get_account_address_as_str(m_wallet->nettype(), cd.subaddr_account > 0, cd.change_dts.addr); res.summary.change_address = desc.change_address; }