security deposit is based on trade amount

This commit is contained in:
woodser 2023-10-31 14:57:49 -04:00
parent 7610d65d38
commit 23525d89ee
40 changed files with 215 additions and 158 deletions

View file

@ -291,8 +291,8 @@ abstract public class OfferBookView<R extends GridPane, M extends OfferBookViewM
depositColumn.setComparator(Comparator.comparing(item -> {
boolean isSellOffer = item.getOffer().getDirection() == OfferDirection.SELL;
BigInteger deposit = isSellOffer ?
item.getOffer().getBuyerSecurityDeposit() :
item.getOffer().getSellerSecurityDeposit();
item.getOffer().getMaxBuyerSecurityDeposit() :
item.getOffer().getMaxSellerSecurityDeposit();
long amountValue = item.getOffer().getAmount().longValueExact();
if ((deposit == null || amountValue == 0)) {
@ -1015,8 +1015,8 @@ abstract public class OfferBookView<R extends GridPane, M extends OfferBookViewM
super.updateItem(item, empty);
if (item != null && !empty) {
var isSellOffer = item.getOffer().getDirection() == OfferDirection.SELL;
var deposit = isSellOffer ? item.getOffer().getBuyerSecurityDeposit() :
item.getOffer().getSellerSecurityDeposit();
var deposit = isSellOffer ? item.getOffer().getMaxBuyerSecurityDeposit() :
item.getOffer().getMaxSellerSecurityDeposit();
if (deposit == null) {
setText(Res.get("shared.na"));
setGraphic(null);

View file

@ -460,11 +460,11 @@ class TakeOfferDataModel extends OfferDataModel {
}
public BigInteger getBuyerSecurityDeposit() {
return offer.getBuyerSecurityDeposit();
return offer.getOfferPayload().getBuyerSecurityDepositForTradeAmount(amount.get());
}
public BigInteger getSellerSecurityDeposit() {
return offer.getSellerSecurityDeposit();
return offer.getOfferPayload().getSellerSecurityDepositForTradeAmount(amount.get());
}
public boolean isRoundedForAtmCash() {

View file

@ -154,11 +154,11 @@ public class ContractWindow extends Overlay<ContractWindow> {
VolumeUtil.formatVolumeWithCode(contract.getTradeVolume()));
String securityDeposit = Res.getWithColAndCap("shared.buyer") +
" " +
HavenoUtils.formatXmr(offer.getBuyerSecurityDeposit(), true) +
HavenoUtils.formatXmr(offer.getOfferPayload().getBuyerSecurityDepositForTradeAmount(contract.getTradeAmount()), true) +
" / " +
Res.getWithColAndCap("shared.seller") +
" " +
HavenoUtils.formatXmr(offer.getSellerSecurityDeposit(), true);
HavenoUtils.formatXmr(offer.getOfferPayload().getSellerSecurityDepositForTradeAmount(contract.getTradeAmount()), true);
addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), securityDeposit);
addConfirmationLabelTextField(gridPane,
++rowIndex,

View file

@ -334,11 +334,11 @@ public class OfferDetailsWindow extends Overlay<OfferDetailsWindow> {
DisplayUtils.formatDateTime(offer.getDate()));
String value = Res.getWithColAndCap("shared.buyer") +
" " +
HavenoUtils.formatXmr(offer.getBuyerSecurityDeposit(), true) +
HavenoUtils.formatXmr(offer.getOfferPayload().getMaxBuyerSecurityDeposit(), true) +
" / " +
Res.getWithColAndCap("shared.seller") +
" " +
HavenoUtils.formatXmr(offer.getSellerSecurityDeposit(), true);
HavenoUtils.formatXmr(offer.getOfferPayload().getMaxSellerSecurityDeposit(), true);
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), value);
if (countryCode != null && !isF2F)

View file

@ -203,11 +203,11 @@ public class TradeDetailsWindow extends Overlay<TradeDetailsWindow> {
DisplayUtils.formatDateTime(trade.getDate()));
String securityDeposit = Res.getWithColAndCap("shared.buyer") +
" " +
HavenoUtils.formatXmr(offer.getBuyerSecurityDeposit(), true) +
HavenoUtils.formatXmr(offer.getMaxBuyerSecurityDeposit(), true) +
" / " +
Res.getWithColAndCap("shared.seller") +
" " +
HavenoUtils.formatXmr(offer.getSellerSecurityDeposit(), true);
HavenoUtils.formatXmr(offer.getMaxSellerSecurityDeposit(), true);
addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), securityDeposit);
NodeAddress arbitratorNodeAddress = trade.getArbitratorNodeAddress();

View file

@ -210,10 +210,10 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
return "BTC" + tradeFee;
}, Comparator.nullsFirst(Comparator.naturalOrder())));
buyerSecurityDepositColumn.setComparator(nullsFirstComparing(o ->
o.getTradable().getOffer() != null ? o.getTradable().getOffer().getBuyerSecurityDeposit() : null
o.getTradable().getOffer() != null ? o.getTradable().getOffer().getMaxBuyerSecurityDeposit() : null
));
sellerSecurityDepositColumn.setComparator(nullsFirstComparing(o ->
o.getTradable().getOffer() != null ? o.getTradable().getOffer().getSellerSecurityDeposit() : null
o.getTradable().getOffer() != null ? o.getTradable().getOffer().getMaxSellerSecurityDeposit() : null
));
stateColumn.setComparator(Comparator.comparing(ClosedTradesListItem::getState));

View file

@ -95,7 +95,7 @@ class DuplicateOfferDataModel extends MutableOfferDataModel {
}
private double getBuyerSecurityAsPercent(Offer offer) {
BigInteger offerBuyerSecurityDeposit = getBoundedBuyerSecurityDeposit(offer.getBuyerSecurityDeposit());
BigInteger offerBuyerSecurityDeposit = getBoundedBuyerSecurityDeposit(offer.getMaxBuyerSecurityDeposit());
double offerBuyerSecurityDepositAsPercent = CoinUtil.getAsPercentPerBtc(offerBuyerSecurityDeposit,
offer.getAmount());
return Math.min(offerBuyerSecurityDepositAsPercent,

View file

@ -122,13 +122,15 @@ class EditOfferDataModel extends MutableOfferDataModel {
else
paymentAccount.setSelectedTradeCurrency(selectedTradeCurrency);
}
// TODO: update for XMR to use percent as double?
// If the security deposit got bounded because it was below the coin amount limit, it can be bigger
// by percentage than the restriction. We can't determine the percentage originally entered at offer
// creation, so just use the default value as it doesn't matter anyway.
double buyerSecurityDepositPercent = CoinUtil.getAsPercentPerBtc(offer.getBuyerSecurityDeposit(), offer.getAmount());
double buyerSecurityDepositPercent = CoinUtil.getAsPercentPerBtc(offer.getMaxBuyerSecurityDeposit(), offer.getAmount());
if (buyerSecurityDepositPercent > Restrictions.getMaxBuyerSecurityDepositAsPercent()
&& offer.getBuyerSecurityDeposit().equals(Restrictions.getMinBuyerSecurityDeposit()))
&& offer.getMaxBuyerSecurityDeposit().equals(Restrictions.getMinBuyerSecurityDeposit()))
buyerSecurityDepositPct.set(Restrictions.getDefaultBuyerSecurityDepositAsPercent());
else
buyerSecurityDepositPct.set(buyerSecurityDepositPercent);
@ -199,8 +201,8 @@ class EditOfferDataModel extends MutableOfferDataModel {
offerPayload.getVersionNr(),
offerPayload.getBlockHeightAtOfferCreation(),
offerPayload.getMakerFee(),
offerPayload.getBuyerSecurityDeposit(),
offerPayload.getSellerSecurityDeposit(),
offerPayload.getBuyerSecurityDepositPct(),
offerPayload.getSellerSecurityDepositPct(),
offerPayload.getMaxTradeLimit(),
offerPayload.getMaxTradePeriod(),
offerPayload.isUseAutoClose(),

View file

@ -304,8 +304,8 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
Trade trade = dataModel.getTrade();
if (offer != null && trade != null && trade.getAmount() != null) {
BigInteger securityDeposit = dataModel.isBuyer() ?
offer.getBuyerSecurityDeposit()
: offer.getSellerSecurityDeposit();
offer.getMaxBuyerSecurityDeposit()
: offer.getMaxSellerSecurityDeposit();
BigInteger minSecurityDeposit = dataModel.isBuyer() ?
Restrictions.getMinBuyerSecurityDeposit() :

View file

@ -85,7 +85,6 @@ import javafx.scene.text.Text;
import javafx.util.Callback;
import javafx.util.Duration;
import lombok.Getter;
import org.bitcoinj.core.Coin;
import org.fxmisc.easybind.EasyBind;
import org.fxmisc.easybind.Subscription;
@ -691,8 +690,8 @@ public abstract class DisputeView extends ActivatableView<VBox, Void> {
String paymentMethod = Res.get(contract.getPaymentMethodId());
String currency = CurrencyUtil.getNameAndCode(contract.getOfferPayload().getCurrencyCode());
String tradeAmount = HavenoUtils.formatXmr(contract.getTradeAmount(), true);
String buyerDeposit = Coin.valueOf(contract.getOfferPayload().getBuyerSecurityDeposit()).toFriendlyString();
String sellerDeposit = Coin.valueOf(contract.getOfferPayload().getSellerSecurityDeposit()).toFriendlyString();
String buyerDeposit = HavenoUtils.formatXmr(contract.getOfferPayload().getBuyerSecurityDepositForTradeAmount(contract.getTradeAmount()), true);
String sellerDeposit = HavenoUtils.formatXmr(contract.getOfferPayload().getSellerSecurityDepositForTradeAmount(contract.getTradeAmount()), true);
stringBuilder.append("Payment method: ")
.append(paymentMethod)
.append("\n")
@ -702,7 +701,7 @@ public abstract class DisputeView extends ActivatableView<VBox, Void> {
.append("Trade amount: ")
.append(tradeAmount)
.append("\n")
.append("Buyer/seller security deposit: ")
.append("Buyer/seller security deposit %: ")
.append(buyerDeposit)
.append("/")
.append(sellerDeposit)