aboutsummaryrefslogtreecommitdiff
path: root/src/wallet/wallet2.cpp
diff options
context:
space:
mode:
authorj-berman <justinberman@protonmail.com>2023-07-18 16:06:01 -0700
committerj-berman <justinberman@protonmail.com>2023-07-19 07:45:33 -0700
commitb51f4a9244a6aa537306ec041b7a918175e86989 (patch)
tree5365649fd0fb4d5122919d3ccdc5f8735085299d /src/wallet/wallet2.cpp
parentMerge pull request #8917 (diff)
downloadmonero-b51f4a9244a6aa537306ec041b7a918175e86989.tar.xz
scan_tx: fix custom comparator for == case; fixes #8951
Co-authored-by: woodser <woodser@protonmail.com>
Diffstat (limited to '')
-rw-r--r--src/wallet/wallet2.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 727ab32f9..720ce5ed5 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -1733,21 +1733,26 @@ void wallet2::sort_scan_tx_entries(std::vector<process_tx_entry_t> &unsorted_tx_
else // l.tx_entry.block_height == r.tx_entry.block_height
{
// coinbase tx is the first tx in a block
+ if (cryptonote::is_coinbase(r.tx))
+ return false;
if (cryptonote::is_coinbase(l.tx))
return true;
- if (cryptonote::is_coinbase(r.tx))
+
+ // in case std::sort is comparing elem to itself
+ if (l.tx_hash == r.tx_hash)
return false;
// see which tx hash comes first in the block
THROW_WALLET_EXCEPTION_IF(parsed_blocks.find(l.tx_entry.block_height) == parsed_blocks.end(),
- error::wallet_internal_error, "Expected block not returned by daemon");
+ error::wallet_internal_error, std::string("Expected block not returned by daemon, ") +
+ "left tx: " + string_tools::pod_to_hex(l.tx_hash) + ", right tx: " + string_tools::pod_to_hex(r.tx_hash));
const auto &blk = parsed_blocks[l.tx_entry.block_height];
for (const auto &tx_hash : blk.tx_hashes)
{
- if (tx_hash == l.tx_hash)
- return true;
if (tx_hash == r.tx_hash)
return false;
+ if (tx_hash == l.tx_hash)
+ return true;
}
THROW_WALLET_EXCEPTION(error::wallet_internal_error, "Tx hashes not found in block");
return false;