diff --git a/core/src/main/java/haveno/core/offer/OfferBookService.java b/core/src/main/java/haveno/core/offer/OfferBookService.java index 16faa81e57..50981a8fa6 100644 --- a/core/src/main/java/haveno/core/offer/OfferBookService.java +++ b/core/src/main/java/haveno/core/offer/OfferBookService.java @@ -149,6 +149,20 @@ public class OfferBookService { Offer offer = new Offer(offerPayload); offer.setPriceFeedService(priceFeedService); announceOfferRemoved(offer); + + // check if invalid offers are now valid + synchronized (invalidOffers) { + for (Offer invalidOffer : new ArrayList(invalidOffers)) { + try { + validateOfferPayload(invalidOffer.getOfferPayload()); + removeInvalidOffer(invalidOffer.getId()); + replaceValidOffer(invalidOffer); + announceOfferAdded(invalidOffer); + } catch (Exception e) { + // ignore + } + } + } } }); }, OfferBookService.class.getSimpleName()); @@ -298,20 +312,6 @@ public class OfferBookService { synchronized (offerBookChangedListeners) { offerBookChangedListeners.forEach(listener -> listener.onRemoved(offer)); } - - // check if invalid offers are now valid - synchronized (invalidOffers) { - for (Offer invalidOffer : new ArrayList(invalidOffers)) { - try { - validateOfferPayload(invalidOffer.getOfferPayload()); - removeInvalidOffer(invalidOffer.getId()); - replaceValidOffer(invalidOffer); - announceOfferAdded(invalidOffer); - } catch (Exception e) { - // ignore - } - } - } } private boolean hasValidOffer(String offerId) { diff --git a/core/src/main/java/haveno/core/offer/OpenOfferManager.java b/core/src/main/java/haveno/core/offer/OpenOfferManager.java index 1dec0aff56..c857ce533e 100644 --- a/core/src/main/java/haveno/core/offer/OpenOfferManager.java +++ b/core/src/main/java/haveno/core/offer/OpenOfferManager.java @@ -1574,14 +1574,6 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe } } - // verify the max version number - if (Version.compare(request.getOfferPayload().getVersionNr(), Version.VERSION) > 0) { - errorMessage = "Offer version number is too high: " + request.getOfferPayload().getVersionNr() + " > " + Version.VERSION; - log.warn(errorMessage); - sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage); - return; - } - // verify maker and taker fees boolean hasBuyerAsTakerWithoutDeposit = offer.getDirection() == OfferDirection.SELL && offer.isPrivateOffer() && offer.getChallengeHash() != null && offer.getChallengeHash().length() > 0 && offer.getTakerFeePct() == 0; if (hasBuyerAsTakerWithoutDeposit) { diff --git a/core/src/main/java/haveno/core/xmr/wallet/XmrKeyImagePoller.java b/core/src/main/java/haveno/core/xmr/wallet/XmrKeyImagePoller.java index 1cde84152c..3bebb71b7f 100644 --- a/core/src/main/java/haveno/core/xmr/wallet/XmrKeyImagePoller.java +++ b/core/src/main/java/haveno/core/xmr/wallet/XmrKeyImagePoller.java @@ -144,7 +144,6 @@ public class XmrKeyImagePoller { if (!keyImageGroups.containsKey(groupId)) keyImageGroups.put(groupId, new HashSet()); Set keyImagesGroup = keyImageGroups.get(groupId); keyImagesGroup.addAll(keyImages); - refreshPolling(); } } @@ -159,8 +158,13 @@ public class XmrKeyImagePoller { if (keyImagesGroup == null) return; keyImagesGroup.removeAll(keyImages); if (keyImagesGroup.isEmpty()) keyImageGroups.remove(groupId); + Set allKeyImages = getKeyImages(); synchronized (lastStatuses) { - for (String lastKeyImage : new HashSet<>(lastStatuses.keySet())) lastStatuses.remove(lastKeyImage); + for (String keyImage : keyImages) { + if (lastStatuses.containsKey(keyImage) && !allKeyImages.contains(keyImage)) { + lastStatuses.remove(keyImage); + } + } } refreshPolling(); } @@ -171,10 +175,10 @@ public class XmrKeyImagePoller { Set keyImagesGroup = keyImageGroups.get(groupId); if (keyImagesGroup == null) return; keyImageGroups.remove(groupId); - Set keyImages = getKeyImages(); + Set allKeyImages = getKeyImages(); synchronized (lastStatuses) { for (String keyImage : keyImagesGroup) { - if (lastStatuses.containsKey(keyImage) && !keyImages.contains(keyImage)) { + if (lastStatuses.containsKey(keyImage) && !allKeyImages.contains(keyImage)) { lastStatuses.remove(keyImage); } } @@ -265,6 +269,7 @@ public class XmrKeyImagePoller { // announce changes if (!changedStatuses.isEmpty()) { + log.info("Announcing " + changedStatuses.size() + " key image spent status changes"); for (XmrKeyImageListener listener : new ArrayList(listeners)) { listener.onSpentStatusChanged(changedStatuses); } diff --git a/desktop/src/main/java/haveno/desktop/main/offer/offerbook/OfferBookViewModel.java b/desktop/src/main/java/haveno/desktop/main/offer/offerbook/OfferBookViewModel.java index 821b081454..9a52902f3e 100644 --- a/desktop/src/main/java/haveno/desktop/main/offer/offerbook/OfferBookViewModel.java +++ b/desktop/src/main/java/haveno/desktop/main/offer/offerbook/OfferBookViewModel.java @@ -174,9 +174,11 @@ abstract class OfferBookViewModel extends ActivatableViewModel { tradeCurrencyListChangeListener = c -> fillCurrencies(); // refresh filter on changes - offerBook.getOfferBookListItems().addListener((ListChangeListener) c -> { - filterOffers(); - }); + // TODO: This is removed because it's expensive to re-filter offers for every change (high cpu for many offers). + // This was used to ensure offer list is fully refreshed, but is unnecessary after refactoring OfferBookService to clone offers? + // offerBook.getOfferBookListItems().addListener((ListChangeListener) c -> { + // filterOffers(); + // }); filterItemsListener = c -> { final Optional highestAmountOffer = filteredItems.stream()