From 88c3f04be09d5647bda250de349077d37d7151d6 Mon Sep 17 00:00:00 2001 From: woodser Date: Wed, 29 Jan 2025 09:24:20 -0500 Subject: [PATCH] enable floating price offers for cardless cash --- .../core/payment/payload/PaymentMethod.java | 3 +- .../resources/i18n/displayStrings.properties | 4 ++- .../offer/takeoffer/TakeOfferDataModel.java | 17 +++++---- .../offer/takeoffer/TakeOfferViewModel.java | 36 +++++-------------- 4 files changed, 24 insertions(+), 36 deletions(-) diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java index 49302f610a..e8f27c9d7f 100644 --- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java @@ -597,7 +597,6 @@ public final class PaymentMethod implements PersistablePayload, Comparable= 0 && amount.compareTo(BigInteger.valueOf(getMaxTradeLimit())) <= 0) { + this.amount.set(amount); + } calculateTotalToPay(); } diff --git a/desktop/src/main/java/haveno/desktop/main/offer/takeoffer/TakeOfferViewModel.java b/desktop/src/main/java/haveno/desktop/main/offer/takeoffer/TakeOfferViewModel.java index c8f21ff0aa..c73ce988c6 100644 --- a/desktop/src/main/java/haveno/desktop/main/offer/takeoffer/TakeOfferViewModel.java +++ b/desktop/src/main/java/haveno/desktop/main/offer/takeoffer/TakeOfferViewModel.java @@ -208,7 +208,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel im errorMessage.set(offer.getErrorMessage()); xmrValidator.setMaxValue(offer.getAmount()); - xmrValidator.setMaxTradeLimit(BigInteger.valueOf(dataModel.getMaxTradeLimit()).min(offer.getAmount())); + xmrValidator.setMaxTradeLimit(BigInteger.valueOf(dataModel.getMaxTradeLimit())); xmrValidator.setMinValue(offer.getMinAmount()); } @@ -237,7 +237,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel im public void onPaymentAccountSelected(PaymentAccount paymentAccount) { dataModel.onPaymentAccountSelected(paymentAccount); - xmrValidator.setMaxTradeLimit(BigInteger.valueOf(dataModel.getMaxTradeLimit()).min(offer.getAmount())); + xmrValidator.setMaxTradeLimit(BigInteger.valueOf(dataModel.getMaxTradeLimit())); updateButtonDisableState(); } @@ -299,20 +299,13 @@ class TakeOfferViewModel extends ActivatableWithDataModel im Price tradePrice = dataModel.tradePrice; long maxTradeLimit = dataModel.getMaxTradeLimit(); if (PaymentMethod.isRoundedForAtmCash(dataModel.getPaymentMethod().getId())) { - BigInteger adjustedAmountForAtm = CoinUtil.getRoundedAtmCashAmount(dataModel.getAmount().get(), - tradePrice, - maxTradeLimit); - dataModel.applyAmount(adjustedAmountForAtm); - amount.set(HavenoUtils.formatXmr(dataModel.getAmount().get())); + BigInteger adjustedAmountForAtm = CoinUtil.getRoundedAtmCashAmount(dataModel.getAmount().get(), tradePrice, maxTradeLimit); + dataModel.maybeApplyAmount(adjustedAmountForAtm); } else if (dataModel.getOffer().isTraditionalOffer()) { - if (!isAmountEqualMinAmount(dataModel.getAmount().get()) && (!isAmountEqualMaxAmount(dataModel.getAmount().get()))) { - // We only apply the rounding if the amount is variable (minAmount is lower as amount). - // Otherwise we could get an amount lower then the minAmount set by rounding - BigInteger roundedAmount = CoinUtil.getRoundedAmount(dataModel.getAmount().get(), tradePrice, maxTradeLimit, dataModel.getOffer().getCurrencyCode(), dataModel.getOffer().getPaymentMethodId()); - dataModel.applyAmount(roundedAmount); - } - amount.set(HavenoUtils.formatXmr(dataModel.getAmount().get())); + BigInteger roundedAmount = CoinUtil.getRoundedAmount(dataModel.getAmount().get(), tradePrice, maxTradeLimit, dataModel.getOffer().getCurrencyCode(), dataModel.getOffer().getPaymentMethodId()); + dataModel.maybeApplyAmount(roundedAmount); } + amount.set(HavenoUtils.formatXmr(dataModel.getAmount().get())); if (!dataModel.isMinAmountLessOrEqualAmount()) amountValidationResult.set(new InputValidator.ValidationResult(false, @@ -580,25 +573,14 @@ class TakeOfferViewModel extends ActivatableWithDataModel im if (price != null) { if (dataModel.isRoundedForAtmCash()) { amount = CoinUtil.getRoundedAtmCashAmount(amount, price, maxTradeLimit); - } else if (dataModel.getOffer().isTraditionalOffer() - && !isAmountEqualMinAmount(amount) && !isAmountEqualMaxAmount(amount)) { - // We only apply the rounding if the amount is variable (minAmount is lower as amount). - // Otherwise we could get an amount lower then the minAmount set by rounding + } else if (dataModel.getOffer().isTraditionalOffer()) { amount = CoinUtil.getRoundedAmount(amount, price, maxTradeLimit, dataModel.getOffer().getCurrencyCode(), dataModel.getOffer().getPaymentMethodId()); } } - dataModel.applyAmount(amount); + dataModel.maybeApplyAmount(amount); } } - private boolean isAmountEqualMinAmount(BigInteger amount) { - return offer.getMinAmount().equals(amount); - } - - private boolean isAmountEqualMaxAmount(BigInteger amount) { - return offer.getAmount().equals(amount); - } - /////////////////////////////////////////////////////////////////////////////////////////// // Getters ///////////////////////////////////////////////////////////////////////////////////////////