cap stagenet fiat offers to 1 xmr until trade credits supported (#355)

This commit is contained in:
woodser 2022-07-13 18:09:19 -04:00 committed by GitHub
parent 7157defea5
commit 4a171c9baa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 43 additions and 40 deletions

View file

@ -68,10 +68,12 @@ import bisq.core.payment.UpiAccount;
import bisq.core.payment.VerseAccount; import bisq.core.payment.VerseAccount;
import bisq.core.payment.WeChatPayAccount; import bisq.core.payment.WeChatPayAccount;
import bisq.core.payment.WesternUnionAccount; import bisq.core.payment.WesternUnionAccount;
import bisq.core.util.ParsingUtils;
import bisq.core.locale.CurrencyUtil; import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res; import bisq.core.locale.Res;
import bisq.core.locale.TradeCurrency; import bisq.core.locale.TradeCurrency;
import bisq.common.config.BaseCurrencyNetwork;
import bisq.common.config.Config;
import bisq.common.proto.persistable.PersistablePayload; import bisq.common.proto.persistable.PersistablePayload;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
@ -113,6 +115,7 @@ public final class PaymentMethod implements PersistablePayload, Comparable<Payme
private static final Coin DEFAULT_TRADE_LIMIT_LOW_RISK = Coin.parseCoin("50"); private static final Coin DEFAULT_TRADE_LIMIT_LOW_RISK = Coin.parseCoin("50");
private static final Coin DEFAULT_TRADE_LIMIT_MID_RISK = Coin.parseCoin("25"); private static final Coin DEFAULT_TRADE_LIMIT_MID_RISK = Coin.parseCoin("25");
private static final Coin DEFAULT_TRADE_LIMIT_HIGH_RISK = Coin.parseCoin("12.5"); private static final Coin DEFAULT_TRADE_LIMIT_HIGH_RISK = Coin.parseCoin("12.5");
private static final double MAX_FIAT_STAGENET_XMR = 1.0; // denominated in XMR
public static final String UPHOLD_ID = "UPHOLD"; public static final String UPHOLD_ID = "UPHOLD";
public static final String MONEY_BEAM_ID = "MONEY_BEAM"; public static final String MONEY_BEAM_ID = "MONEY_BEAM";
@ -477,9 +480,19 @@ public final class PaymentMethod implements PersistablePayload, Comparable<Payme
Coin.valueOf(maxTradeLimit).toFriendlyString(), this); Coin.valueOf(maxTradeLimit).toFriendlyString(), this);
} }
// get risk based trade limit
TradeLimits tradeLimits = new TradeLimits(); TradeLimits tradeLimits = new TradeLimits();
long maxTradeLimit = tradeLimits.getMaxTradeLimit().value; long maxTradeLimit = tradeLimits.getMaxTradeLimit().value;
return Coin.valueOf(tradeLimits.getRoundedRiskBasedTradeLimit(maxTradeLimit, riskFactor)); long riskBasedTradeLimit = tradeLimits.getRoundedRiskBasedTradeLimit(maxTradeLimit, riskFactor); // as centineros
// if fiat and stagenet, cap offer amounts before trade credits supported
// TODO: remove this when trade credits supported
boolean isFiat = CurrencyUtil.isFiatCurrency(currencyCode);
boolean isStagenet = Config.baseCurrencyNetwork() == BaseCurrencyNetwork.XMR_STAGENET;
if (isFiat && isStagenet && ParsingUtils.centinerosToXmr(riskBasedTradeLimit) > MAX_FIAT_STAGENET_XMR) {
riskBasedTradeLimit = ParsingUtils.xmrToCentineros(MAX_FIAT_STAGENET_XMR);
}
return Coin.valueOf(riskBasedTradeLimit);
} }
public String getShortName() { public String getShortName() {

View file

@ -17,53 +17,40 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
public class ParsingUtils { public class ParsingUtils {
/** // multipliers to convert units
* Multiplier to convert centineros (the base XMR unit of Coin) to atomic units.
*
* TODO: change base unit to atomic units and long
* TODO: move these static utilities?
*/
private static BigInteger CENTINEROS_AU_MULTIPLIER = new BigInteger("10000"); private static BigInteger CENTINEROS_AU_MULTIPLIER = new BigInteger("10000");
private static BigInteger MONERO_AU_MULTIPLIER = new BigInteger("1000000000000"); private static BigInteger XMR_AU_MULTIPLIER = new BigInteger("1000000000000");
/**
* Convert Coin (denominated in centineros) to atomic units.
*
* @param coin has an amount denominated in centineros
* @return BigInteger the coin amount denominated in atomic units
*/
public static BigInteger coinToAtomicUnits(Coin coin) { public static BigInteger coinToAtomicUnits(Coin coin) {
return centinerosToAtomicUnits(coin.value); return centinerosToAtomicUnits(coin.value);
} }
/**
* Convert centineros (the base unit of Coin) to atomic units.
*
* @param centineros denominates an amount of XMR in centineros
* @return BigInteger the amount denominated in atomic units
*/
public static BigInteger centinerosToAtomicUnits(long centineros) { public static BigInteger centinerosToAtomicUnits(long centineros) {
return BigInteger.valueOf(centineros).multiply(ParsingUtils.CENTINEROS_AU_MULTIPLIER); return BigInteger.valueOf(centineros).multiply(ParsingUtils.CENTINEROS_AU_MULTIPLIER);
} }
/** public static double centinerosToXmr(long centineros) {
* Convert atomic units to centineros. return atomicUnitsToXmr(centinerosToAtomicUnits(centineros));
* }
* @param atomicUnits is an amount in atomic units
* @return the amount in centineros public static long atomicUnitsToCentineros(long atomicUnits) { // TODO: atomic units should be BigInteger; remove this?
*/
public static long atomicUnitsToCentineros(long atomicUnits) { // TODO: atomic units should be BigInteger, this should return double, else losing precision
return atomicUnits / CENTINEROS_AU_MULTIPLIER.longValue(); return atomicUnits / CENTINEROS_AU_MULTIPLIER.longValue();
} }
/** public static long atomicUnitsToCentineros(BigInteger atomicUnits) {
* Convert atomic units to centineros. return atomicUnits.divide(CENTINEROS_AU_MULTIPLIER).longValueExact();
* }
* @param atomicUnits is an amount in atomic units
* @return the amount in centineros
*/
public static double atomicUnitsToXmr(BigInteger atomicUnits) { public static double atomicUnitsToXmr(BigInteger atomicUnits) {
return new BigDecimal(atomicUnits).divide(new BigDecimal(MONERO_AU_MULTIPLIER)).doubleValue(); return new BigDecimal(atomicUnits).divide(new BigDecimal(XMR_AU_MULTIPLIER)).doubleValue();
}
public static BigInteger xmrToAtomicUnits(double xmr) {
return BigDecimal.valueOf(xmr).multiply(new BigDecimal(XMR_AU_MULTIPLIER)).toBigInteger();
}
public static long xmrToCentineros(double xmr) {
return atomicUnitsToCentineros(xmrToAtomicUnits(xmr));
} }
public static Coin parseToCoin(String input, CoinFormatter coinFormatter) { public static Coin parseToCoin(String input, CoinFormatter coinFormatter) {

View file

@ -72,7 +72,9 @@ public class TextFieldWithIcon extends AnchorPane {
} }
public void setText(String text) { public void setText(String text) {
textField.setText(text); UserThread.execute(() -> {
dummyTextField.setText(text); textField.setText(text);
dummyTextField.setText(text);
});
} }
} }

View file

@ -717,9 +717,10 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
minAmountValidationResult.set(isBtcInputValid(minAmount.get())); minAmountValidationResult.set(isBtcInputValid(minAmount.get()));
} else if (amount.get() != null && btcValidator.getMaxTradeLimit() != null && btcValidator.getMaxTradeLimit().value == OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.value) { } else if (amount.get() != null && btcValidator.getMaxTradeLimit() != null && btcValidator.getMaxTradeLimit().value == OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.value) {
amount.set(btcFormatter.formatCoin(btcValidator.getMaxTradeLimit())); amount.set(btcFormatter.formatCoin(btcValidator.getMaxTradeLimit()));
new Popup().information(Res.get("popup.warning.tradeLimitDueAccountAgeRestriction.buyer", boolean isBuy = dataModel.getDirection() == OfferDirection.BUY;
btcFormatter.formatCoinWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT), new Popup().information(Res.get(isBuy ? "popup.warning.tradeLimitDueAccountAgeRestriction.buyer" : "popup.warning.tradeLimitDueAccountAgeRestriction.seller",
Res.get("offerbook.warning.newVersionAnnouncement"))) btcFormatter.formatCoinWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT),
Res.get("offerbook.warning.newVersionAnnouncement")))
.width(900) .width(900)
.show(); .show();
} }