Skip to content

Commit f460965

Browse files
committed
use separate fees for crypto and traditional payment methods
1 parent 990ed2c commit f460965

File tree

4 files changed

+42
-14
lines changed

4 files changed

+42
-14
lines changed

core/src/main/java/haveno/core/offer/CreateOfferService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,8 @@ public Offer createAndGetOffer(String offerId,
206206
useMarketBasedPriceValue,
207207
amountAsLong,
208208
minAmountAsLong,
209-
hasBuyerAsTakerWithoutDeposit ? HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT : HavenoUtils.MAKER_FEE_PCT,
210-
hasBuyerAsTakerWithoutDeposit ? 0d : HavenoUtils.TAKER_FEE_PCT,
209+
HavenoUtils.getMakerFeePct(currencyCode, hasBuyerAsTakerWithoutDeposit),
210+
HavenoUtils.getTakerFeePct(currencyCode, hasBuyerAsTakerWithoutDeposit),
211211
HavenoUtils.PENALTY_FEE_PCT,
212212
hasBuyerAsTakerWithoutDeposit ? 0d : securityDepositPct, // buyer as taker security deposit is optional for private offers
213213
securityDepositPct,

core/src/main/java/haveno/core/offer/OpenOfferManager.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,8 +1587,9 @@ private void handleSignOfferRequest(SignOfferRequest request, NodeAddress peer)
15871587
if (hasBuyerAsTakerWithoutDeposit) {
15881588

15891589
// verify maker's trade fee
1590-
if (offer.getMakerFeePct() != HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT) {
1591-
errorMessage = "Wrong maker fee for offer " + request.offerId + ". Expected " + HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT + " but got " + offer.getMakerFeePct();
1590+
double makerFeePct = HavenoUtils.getMakerFeePct(request.getOfferPayload().getCounterCurrencyCode(), hasBuyerAsTakerWithoutDeposit);
1591+
if (offer.getMakerFeePct() != makerFeePct) {
1592+
errorMessage = "Wrong maker fee for offer " + request.offerId + ". Expected " + makerFeePct + " but got " + offer.getMakerFeePct();
15921593
log.warn(errorMessage);
15931594
sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
15941595
return;
@@ -1628,16 +1629,18 @@ private void handleSignOfferRequest(SignOfferRequest request, NodeAddress peer)
16281629
}
16291630

16301631
// verify maker's trade fee
1631-
if (offer.getMakerFeePct() != HavenoUtils.MAKER_FEE_PCT) {
1632-
errorMessage = "Wrong maker fee for offer " + request.offerId + ". Expected " + HavenoUtils.MAKER_FEE_PCT + " but got " + offer.getMakerFeePct();
1632+
double makerFeePct = HavenoUtils.getMakerFeePct(request.getOfferPayload().getCounterCurrencyCode(), hasBuyerAsTakerWithoutDeposit);
1633+
if (offer.getMakerFeePct() != makerFeePct) {
1634+
errorMessage = "Wrong maker fee for offer " + request.offerId + ". Expected " + makerFeePct + " but got " + offer.getMakerFeePct();
16331635
log.warn(errorMessage);
16341636
sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
16351637
return;
16361638
}
16371639

16381640
// verify taker's trade fee
1639-
if (offer.getTakerFeePct() != HavenoUtils.TAKER_FEE_PCT) {
1640-
errorMessage = "Wrong taker fee for offer " + request.offerId + ". Expected " + HavenoUtils.TAKER_FEE_PCT + " but got " + offer.getTakerFeePct();
1641+
double takerFeePct = HavenoUtils.getTakerFeePct(request.getOfferPayload().getCounterCurrencyCode(), hasBuyerAsTakerWithoutDeposit);
1642+
if (offer.getTakerFeePct() != takerFeePct) {
1643+
errorMessage = "Wrong taker fee for offer " + request.offerId + ". Expected " + takerFeePct + " but got " + offer.getTakerFeePct();
16411644
log.warn(errorMessage);
16421645
sendAckMessage(request.getClass(), peer, request.getPubKeyRing(), request.getOfferId(), request.getUid(), false, errorMessage);
16431646
return;
@@ -1677,7 +1680,8 @@ private void handleSignOfferRequest(SignOfferRequest request, NodeAddress peer)
16771680
}
16781681

16791682
// verify maker's reserve tx (double spend, trade fee, trade amount, mining fee)
1680-
BigInteger maxTradeFee = HavenoUtils.multiply(offer.getAmount(), hasBuyerAsTakerWithoutDeposit ? HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT : HavenoUtils.MAKER_FEE_PCT);
1683+
double makerFeePct = HavenoUtils.getMakerFeePct(request.getOfferPayload().getCounterCurrencyCode(), hasBuyerAsTakerWithoutDeposit);
1684+
BigInteger maxTradeFee = HavenoUtils.multiply(offer.getAmount(), makerFeePct);
16811685
BigInteger sendTradeAmount = offer.getDirection() == OfferDirection.BUY ? BigInteger.ZERO : offer.getAmount();
16821686
BigInteger securityDeposit = offer.getDirection() == OfferDirection.BUY ? offer.getMaxBuyerSecurityDeposit() : offer.getMaxSellerSecurityDeposit();
16831687
BigInteger penaltyFee = HavenoUtils.multiply(securityDeposit, HavenoUtils.PENALTY_FEE_PCT);

core/src/main/java/haveno/core/trade/HavenoUtils.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import haveno.core.api.CorePaymentAccountsService;
3535
import haveno.core.api.XmrConnectionService;
3636
import haveno.core.app.HavenoSetup;
37+
import haveno.core.locale.CurrencyUtil;
3738
import haveno.core.offer.OfferPayload;
3839
import haveno.core.offer.OpenOfferManager;
3940
import haveno.core.support.dispute.arbitration.ArbitrationManager;
@@ -93,10 +94,13 @@ public class HavenoUtils {
9394

9495
// configure fees
9596
public static final boolean ARBITRATOR_ASSIGNS_TRADE_FEE_ADDRESS = true;
96-
public static final double PENALTY_FEE_PCT = 0.25; // percent of security deposit to charge for penalty
97-
public static final double MAKER_FEE_PCT = 0.0015; // 0.15%
98-
public static final double TAKER_FEE_PCT = 0.0075; // 0.75%
99-
public static final double MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT = MAKER_FEE_PCT + TAKER_FEE_PCT; // customize maker's fee when no deposit or fee from taker
97+
public static final double PENALTY_FEE_PCT = 0.25; // charge 25% of security deposit for penalty
98+
private static final double MAKER_FEE_PCT_CRYPTO = 0.0015;
99+
private static final double TAKER_FEE_PCT_CRYPTO = 0.0075;
100+
private static final double MAKER_FEE_PCT_TRADITIONAL = 0.0015;
101+
private static final double TAKER_FEE_PCT_TRADITIONAL = 0.0075;
102+
private static final double MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT_CRYPTO = MAKER_FEE_PCT_CRYPTO + TAKER_FEE_PCT_CRYPTO; // can customize maker's fee when no deposit from taker
103+
private static final double MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT_TRADITIONAL = MAKER_FEE_PCT_TRADITIONAL + TAKER_FEE_PCT_TRADITIONAL;
100104
public static final double MINER_FEE_TOLERANCE_FACTOR = 5.0; // miner fees must be within 5x of each other
101105

102106
// other configuration
@@ -170,6 +174,26 @@ public static void waitFor(long waitMs) {
170174
GenUtils.waitFor(waitMs);
171175
}
172176

177+
public static double getMakerFeePct(String currencyCode, boolean hasBuyerAsTakerWithoutDeposit) {
178+
if (CurrencyUtil.isCryptoCurrency(currencyCode)) {
179+
return hasBuyerAsTakerWithoutDeposit ? MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT_CRYPTO : MAKER_FEE_PCT_CRYPTO;
180+
} else if (CurrencyUtil.isTraditionalCurrency(currencyCode)) {
181+
return hasBuyerAsTakerWithoutDeposit ? MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT_TRADITIONAL : MAKER_FEE_PCT_TRADITIONAL;
182+
} else {
183+
throw new IllegalArgumentException("Unsupported currency code: " + currencyCode);
184+
}
185+
}
186+
187+
public static double getTakerFeePct(String currencyCode, boolean hasBuyerAsTakerWithoutDeposit) {
188+
if (CurrencyUtil.isCryptoCurrency(currencyCode)) {
189+
return hasBuyerAsTakerWithoutDeposit ? 0d : TAKER_FEE_PCT_CRYPTO;
190+
} else if (CurrencyUtil.isTraditionalCurrency(currencyCode)) {
191+
return hasBuyerAsTakerWithoutDeposit ? 0d : TAKER_FEE_PCT_TRADITIONAL;
192+
} else {
193+
throw new IllegalArgumentException("Unsupported currency code: " + currencyCode);
194+
}
195+
}
196+
173197
// ----------------------- CONVERSION UTILS -------------------------------
174198

175199
public static BigInteger coinToAtomicUnits(Coin coin) {

desktop/src/main/java/haveno/desktop/main/offer/MutableOfferDataModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ ReadOnlyObjectProperty<BigInteger> totalToPayAsProperty() {
701701
}
702702

703703
public BigInteger getMaxMakerFee() {
704-
return HavenoUtils.multiply(amount.get(), buyerAsTakerWithoutDeposit.get() ? HavenoUtils.MAKER_FEE_FOR_TAKER_WITHOUT_DEPOSIT_PCT : HavenoUtils.MAKER_FEE_PCT);
704+
return HavenoUtils.multiply(amount.get(), HavenoUtils.getMakerFeePct(tradeCurrencyCode.get(), buyerAsTakerWithoutDeposit.get()));
705705
}
706706

707707
boolean canPlaceOffer() {

0 commit comments

Comments
 (0)