From db6cb237bff8435cb156a344b7a554b5bde772a5 Mon Sep 17 00:00:00 2001 From: fa2a5qj3 <174058787+fa2a5qj3@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:58:05 -0400 Subject: [PATCH] randomize completed trade info, fixes #1099 --- .../trade/statistics/TradeStatistics3.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/haveno/core/trade/statistics/TradeStatistics3.java b/core/src/main/java/haveno/core/trade/statistics/TradeStatistics3.java index 75db5880..dbaa8800 100644 --- a/core/src/main/java/haveno/core/trade/statistics/TradeStatistics3.java +++ b/core/src/main/java/haveno/core/trade/statistics/TradeStatistics3.java @@ -54,6 +54,8 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; import static com.google.common.base.Preconditions.checkNotNull; @@ -88,13 +90,27 @@ public final class TradeStatistics3 implements ProcessOncePersistableNetworkPayl Offer offer = checkNotNull(trade.getOffer()); return new TradeStatistics3(offer.getCurrencyCode(), trade.getPrice().getValue(), - trade.getAmount().longValueExact(), + fuzzTradeAmount(trade.getAmount().longValueExact()), offer.getPaymentMethod().getId(), - trade.getTakeOfferDate().getTime(), + fuzzTradeDate(trade.getTakeOfferDate().getTime()), truncatedArbitratorNodeAddress, extraDataMap); } + private static long fuzzTradeAmount(long exactAmount) { // randomize completed trade info #1099 + long adjustedAmount = (long) ThreadLocalRandom.current().nextDouble( + exactAmount * 0.95, exactAmount * 1.05); + log.info("fuzzed trade amount from {} to {}", exactAmount, adjustedAmount); + return adjustedAmount; + } + + private static long fuzzTradeDate(long originalTimestamp) { // randomize completed trade info #1099 + long adjustedTimestamp = ThreadLocalRandom.current().nextLong( + originalTimestamp-TimeUnit.HOURS.toMillis(24), originalTimestamp); + log.info("fuzzed trade datestamp from {} to {}", new Date(originalTimestamp), new Date(adjustedTimestamp)); + return adjustedTimestamp; + } + // This enum must not change the order as we use the ordinal for storage to reduce data size. // The payment method string can be quite long and would consume 15% more space. // When we get a new payment method we can add it to the enum at the end. Old users would add it as string if not