remove unused messages and fields from protobuf models

rename BitcoinModule to MoneroModule
change to HavenoUtils.formatXmr(...)
remove "_as_long" postfix from models
This commit is contained in:
woodser 2023-03-07 13:14:27 -05:00
parent 1a1fb130c0
commit e71f9a54ac
103 changed files with 556 additions and 1681 deletions

View file

@ -161,7 +161,7 @@ abstract class AbstractTradeListBuilder extends AbstractTableBuilder {
protected final Function<TradeInfo, String> toTradeVolumeAsString = (t) -> protected final Function<TradeInfo, String> toTradeVolumeAsString = (t) ->
isFiatTrade.test(t) isFiatTrade.test(t)
? t.getTradeVolume() ? t.getTradeVolume()
: formatSatoshis(t.getAmountAsLong()); : formatSatoshis(t.getAmount());
protected final Function<TradeInfo, Long> toTradeVolumeAsLong = (t) -> protected final Function<TradeInfo, Long> toTradeVolumeAsLong = (t) ->
isFiatTrade.test(t) isFiatTrade.test(t)
@ -170,7 +170,7 @@ abstract class AbstractTradeListBuilder extends AbstractTableBuilder {
protected final Function<TradeInfo, Long> toTradeAmount = (t) -> protected final Function<TradeInfo, Long> toTradeAmount = (t) ->
isFiatTrade.test(t) isFiatTrade.test(t)
? t.getAmountAsLong() ? t.getAmount()
: toTradeVolumeAsLong.apply(t); : toTradeVolumeAsLong.apply(t);
protected final Function<TradeInfo, String> toMarket = (t) -> protected final Function<TradeInfo, String> toMarket = (t) ->
@ -192,13 +192,13 @@ abstract class AbstractTradeListBuilder extends AbstractTableBuilder {
if (isMyOffer) { if (isMyOffer) {
return t.getOffer().getMakerFee(); return t.getOffer().getMakerFee();
} else { } else {
return t.getTakerFeeAsLong(); return t.getTakerFee();
} }
}; };
protected final Function<TradeInfo, Long> toMyMakerOrTakerFee = (t) -> { protected final Function<TradeInfo, Long> toMyMakerOrTakerFee = (t) -> {
return isTaker.test(t) return isTaker.test(t)
? t.getTakerFeeAsLong() ? t.getTakerFee()
: t.getOffer().getMakerFee(); : t.getOffer().getMakerFee();
}; };

View file

@ -54,7 +54,7 @@ class ClosedTradeTableBuilder extends AbstractTradeListBuilder {
colMarket.addRow(toMarket.apply(t)); colMarket.addRow(toMarket.apply(t));
colPrice.addRow(t.getPrice()); colPrice.addRow(t.getPrice());
colPriceDeviation.addRow(toPriceDeviation.apply(t)); colPriceDeviation.addRow(toPriceDeviation.apply(t));
colAmount.addRow(t.getAmountAsLong()); colAmount.addRow(t.getAmount());
colMixedAmount.addRow(t.getTradeVolume()); colMixedAmount.addRow(t.getTradeVolume());
colCurrency.addRow(toPaymentCurrencyCode.apply(t)); colCurrency.addRow(toPaymentCurrencyCode.apply(t));

View file

@ -52,7 +52,7 @@ class FailedTradeTableBuilder extends AbstractTradeListBuilder {
colCreateDate.addRow(t.getDate()); colCreateDate.addRow(t.getDate());
colMarket.addRow(toMarket.apply(t)); colMarket.addRow(toMarket.apply(t));
colPrice.addRow(t.getPrice()); colPrice.addRow(t.getPrice());
colAmount.addRow(t.getAmountAsLong()); colAmount.addRow(t.getAmount());
colMixedAmount.addRow(t.getTradeVolume()); colMixedAmount.addRow(t.getTradeVolume());
colCurrency.addRow(toPaymentCurrencyCode.apply(t)); colCurrency.addRow(toPaymentCurrencyCode.apply(t));
colOfferType.addRow(toOfferType.apply(t)); colOfferType.addRow(toOfferType.apply(t));

View file

@ -51,7 +51,7 @@ class OpenTradeTableBuilder extends AbstractTradeListBuilder {
colCreateDate.addRow(t.getDate()); colCreateDate.addRow(t.getDate());
colMarket.addRow(toMarket.apply(t)); colMarket.addRow(toMarket.apply(t));
colPrice.addRow(t.getPrice()); colPrice.addRow(t.getPrice());
colAmount.addRow(t.getAmountAsLong()); colAmount.addRow(t.getAmount());
colMixedAmount.addRow(t.getTradeVolume()); colMixedAmount.addRow(t.getTradeVolume());
colCurrency.addRow(toPaymentCurrencyCode.apply(t)); colCurrency.addRow(toPaymentCurrencyCode.apply(t));
colPaymentMethod.addRow(t.getOffer().getPaymentMethodShortName()); colPaymentMethod.addRow(t.getOffer().getPaymentMethodShortName());

View file

@ -251,7 +251,7 @@ public class CoreDisputesService {
String agentNodeAddress = checkNotNull(disputeManager.getAgentNodeAddress(dispute)).getFullAddress(); String agentNodeAddress = checkNotNull(disputeManager.getAgentNodeAddress(dispute)).getFullAddress();
Contract contract = dispute.getContract(); Contract contract = dispute.getContract();
String currencyCode = contract.getOfferPayload().getCurrencyCode(); String currencyCode = contract.getOfferPayload().getCurrencyCode();
String amount = HavenoUtils.formatToXmrWithCode(contract.getTradeAmount()); String amount = HavenoUtils.formatXmr(contract.getTradeAmount(), true);
String textToSign = Res.get("disputeSummaryWindow.close.msg", String textToSign = Res.get("disputeSummaryWindow.close.msg",
FormattingUtils.formatDateTime(disputeResult.getCloseDate(), true), FormattingUtils.formatDateTime(disputeResult.getCloseDate(), true),
@ -261,8 +261,8 @@ public class CoreDisputesService {
currencyCode, currencyCode,
Res.get("disputeSummaryWindow.reason." + reason.name()), Res.get("disputeSummaryWindow.reason." + reason.name()),
amount, amount,
HavenoUtils.formatToXmrWithCode(disputeResult.getBuyerPayoutAmount()), HavenoUtils.formatXmr(disputeResult.getBuyerPayoutAmount(), true),
HavenoUtils.formatToXmrWithCode(disputeResult.getSellerPayoutAmount()), HavenoUtils.formatXmr(disputeResult.getSellerPayoutAmount(), true),
disputeResult.summaryNotesProperty().get() disputeResult.summaryNotesProperty().get()
); );

View file

@ -33,7 +33,6 @@ import haveno.core.offer.OfferFilterService.Result;
import haveno.core.payment.PaymentAccount; import haveno.core.payment.PaymentAccount;
import haveno.core.user.User; import haveno.core.user.User;
import haveno.core.util.PriceUtil; import haveno.core.util.PriceUtil;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import org.bitcoinj.utils.Fiat; import org.bitcoinj.utils.Fiat;
@ -184,14 +183,12 @@ public class CoreOffersService {
Price price = priceAsString.isEmpty() ? null : Price.valueOf(upperCaseCurrencyCode, priceStringToLong(priceAsString, upperCaseCurrencyCode)); Price price = priceAsString.isEmpty() ? null : Price.valueOf(upperCaseCurrencyCode, priceStringToLong(priceAsString, upperCaseCurrencyCode));
BigInteger amount = BigInteger.valueOf(amountAsLong); BigInteger amount = BigInteger.valueOf(amountAsLong);
BigInteger minAmount = BigInteger.valueOf(minAmountAsLong); BigInteger minAmount = BigInteger.valueOf(minAmountAsLong);
Coin useDefaultTxFee = Coin.ZERO;
Offer offer = createOfferService.createAndGetOffer(offerId, Offer offer = createOfferService.createAndGetOffer(offerId,
direction, direction,
upperCaseCurrencyCode, upperCaseCurrencyCode,
amount, amount,
minAmount, minAmount,
price, price,
useDefaultTxFee,
useMarketBasedPrice, useMarketBasedPrice,
exactMultiply(marketPriceMargin, 0.01), exactMultiply(marketPriceMargin, 0.01),
buyerSecurityDeposit, buyerSecurityDeposit,
@ -219,14 +216,12 @@ public class CoreOffersService {
BigInteger minAmount, BigInteger minAmount,
double buyerSecurityDeposit, double buyerSecurityDeposit,
PaymentAccount paymentAccount) { PaymentAccount paymentAccount) {
Coin useDefaultTxFee = Coin.ZERO;
return createOfferService.createAndGetOffer(offerId, return createOfferService.createAndGetOffer(offerId,
direction, direction,
currencyCode.toUpperCase(), currencyCode.toUpperCase(),
amount, amount,
minAmount, minAmount,
price, price,
useDefaultTxFee,
useMarketBasedPrice, useMarketBasedPrice,
exactMultiply(marketPriceMargin, 0.01), exactMultiply(marketPriceMargin, 0.01),
buyerSecurityDeposit, buyerSecurityDeposit,

View file

@ -52,7 +52,6 @@ public class OfferInfo implements Payload {
private final long minAmount; private final long minAmount;
private final String volume; private final String volume;
private final String minVolume; private final String minVolume;
private final long txFee;
private final long makerFee; private final long makerFee;
@Nullable @Nullable
private final String offerFeePaymentTxId; private final String offerFeePaymentTxId;
@ -87,7 +86,6 @@ public class OfferInfo implements Payload {
this.minAmount = builder.getMinAmount(); this.minAmount = builder.getMinAmount();
this.volume = builder.getVolume(); this.volume = builder.getVolume();
this.minVolume = builder.getMinVolume(); this.minVolume = builder.getMinVolume();
this.txFee = builder.getTxFee();
this.makerFee = builder.getMakerFee(); this.makerFee = builder.getMakerFee();
this.offerFeePaymentTxId = builder.getOfferFeePaymentTxId(); this.offerFeePaymentTxId = builder.getOfferFeePaymentTxId();
this.buyerSecurityDeposit = builder.getBuyerSecurityDeposit(); this.buyerSecurityDeposit = builder.getBuyerSecurityDeposit();
@ -189,7 +187,6 @@ public class OfferInfo implements Payload {
.setVolume(volume) .setVolume(volume)
.setMinVolume(minVolume) .setMinVolume(minVolume)
.setMakerFee(makerFee) .setMakerFee(makerFee)
.setTxFee(txFee)
.setBuyerSecurityDeposit(buyerSecurityDeposit) .setBuyerSecurityDeposit(buyerSecurityDeposit)
.setSellerSecurityDeposit(sellerSecurityDeposit) .setSellerSecurityDeposit(sellerSecurityDeposit)
.setTriggerPrice(triggerPrice == null ? "0" : triggerPrice) .setTriggerPrice(triggerPrice == null ? "0" : triggerPrice)
@ -224,7 +221,6 @@ public class OfferInfo implements Payload {
.withVolume(proto.getVolume()) .withVolume(proto.getVolume())
.withMinVolume(proto.getMinVolume()) .withMinVolume(proto.getMinVolume())
.withMakerFee(proto.getMakerFee()) .withMakerFee(proto.getMakerFee())
.withTxFee(proto.getTxFee())
.withOfferFeePaymentTxId(ProtoUtil.stringOrNullFromProto(proto.getOfferFeePaymentTxId())) .withOfferFeePaymentTxId(ProtoUtil.stringOrNullFromProto(proto.getOfferFeePaymentTxId()))
.withBuyerSecurityDeposit(proto.getBuyerSecurityDeposit()) .withBuyerSecurityDeposit(proto.getBuyerSecurityDeposit())
.withSellerSecurityDeposit(proto.getSellerSecurityDeposit()) .withSellerSecurityDeposit(proto.getSellerSecurityDeposit())

View file

@ -63,11 +63,11 @@ public class TradeInfo implements Payload {
private final String shortId; private final String shortId;
private final long date; private final long date;
private final String role; private final String role;
private final long takerFeeAsLong; private final long takerFee;
private final String makerDepositTxId; private final String makerDepositTxId;
private final String takerDepositTxId; private final String takerDepositTxId;
private final String payoutTxId; private final String payoutTxId;
private final long amountAsLong; private final long amount;
private final long buyerSecurityDeposit; private final long buyerSecurityDeposit;
private final long sellerSecurityDeposit; private final long sellerSecurityDeposit;
private final String price; private final String price;
@ -97,11 +97,11 @@ public class TradeInfo implements Payload {
this.shortId = builder.getShortId(); this.shortId = builder.getShortId();
this.date = builder.getDate(); this.date = builder.getDate();
this.role = builder.getRole(); this.role = builder.getRole();
this.takerFeeAsLong = builder.getTakerFeeAsLong(); this.takerFee = builder.getTakerFee();
this.makerDepositTxId = builder.getMakerDepositTxId(); this.makerDepositTxId = builder.getMakerDepositTxId();
this.takerDepositTxId = builder.getTakerDepositTxId(); this.takerDepositTxId = builder.getTakerDepositTxId();
this.payoutTxId = builder.getPayoutTxId(); this.payoutTxId = builder.getPayoutTxId();
this.amountAsLong = builder.getAmountAsLong(); this.amount = builder.getAmount();
this.buyerSecurityDeposit = builder.getBuyerSecurityDeposit(); this.buyerSecurityDeposit = builder.getBuyerSecurityDeposit();
this.sellerSecurityDeposit = builder.getSellerSecurityDeposit(); this.sellerSecurityDeposit = builder.getSellerSecurityDeposit();
this.price = builder.getPrice(); this.price = builder.getPrice();
@ -154,11 +154,11 @@ public class TradeInfo implements Payload {
.withShortId(trade.getShortId()) .withShortId(trade.getShortId())
.withDate(trade.getDate().getTime()) .withDate(trade.getDate().getTime())
.withRole(role == null ? "" : role) .withRole(role == null ? "" : role)
.withTakerFeeAsLong(trade.getTakerFeeAsLong()) .withTakerFee(trade.getTakerFee().longValueExact())
.withMakerDepositTxId(trade.getMaker().getDepositTxHash()) .withMakerDepositTxId(trade.getMaker().getDepositTxHash())
.withTakerDepositTxId(trade.getTaker().getDepositTxHash()) .withTakerDepositTxId(trade.getTaker().getDepositTxHash())
.withPayoutTxId(trade.getPayoutTxId()) .withPayoutTxId(trade.getPayoutTxId())
.withAmountAsLong(trade.getAmountAsLong()) .withAmount(trade.getAmount().longValueExact())
.withBuyerSecurityDeposit(trade.getBuyerSecurityDeposit() == null ? -1 : trade.getBuyerSecurityDeposit().longValueExact()) .withBuyerSecurityDeposit(trade.getBuyerSecurityDeposit() == null ? -1 : trade.getBuyerSecurityDeposit().longValueExact())
.withSellerSecurityDeposit(trade.getSellerSecurityDeposit() == null ? -1 : trade.getSellerSecurityDeposit().longValueExact()) .withSellerSecurityDeposit(trade.getSellerSecurityDeposit() == null ? -1 : trade.getSellerSecurityDeposit().longValueExact())
.withPrice(toPreciseTradePrice.apply(trade)) .withPrice(toPreciseTradePrice.apply(trade))
@ -197,11 +197,11 @@ public class TradeInfo implements Payload {
.setShortId(shortId) .setShortId(shortId)
.setDate(date) .setDate(date)
.setRole(role) .setRole(role)
.setTakerFeeAsLong(takerFeeAsLong) .setTakerFee(takerFee)
.setMakerDepositTxId(makerDepositTxId == null ? "" : makerDepositTxId) .setMakerDepositTxId(makerDepositTxId == null ? "" : makerDepositTxId)
.setTakerDepositTxId(takerDepositTxId == null ? "" : takerDepositTxId) .setTakerDepositTxId(takerDepositTxId == null ? "" : takerDepositTxId)
.setPayoutTxId(payoutTxId == null ? "" : payoutTxId) .setPayoutTxId(payoutTxId == null ? "" : payoutTxId)
.setAmountAsLong(amountAsLong) .setAmount(amount)
.setBuyerSecurityDeposit(buyerSecurityDeposit) .setBuyerSecurityDeposit(buyerSecurityDeposit)
.setSellerSecurityDeposit(sellerSecurityDeposit) .setSellerSecurityDeposit(sellerSecurityDeposit)
.setPrice(price) .setPrice(price)
@ -234,11 +234,11 @@ public class TradeInfo implements Payload {
.withShortId(proto.getShortId()) .withShortId(proto.getShortId())
.withDate(proto.getDate()) .withDate(proto.getDate())
.withRole(proto.getRole()) .withRole(proto.getRole())
.withTakerFeeAsLong(proto.getTakerFeeAsLong()) .withTakerFee(proto.getTakerFee())
.withMakerDepositTxId(proto.getMakerDepositTxId()) .withMakerDepositTxId(proto.getMakerDepositTxId())
.withTakerDepositTxId(proto.getTakerDepositTxId()) .withTakerDepositTxId(proto.getTakerDepositTxId())
.withPayoutTxId(proto.getPayoutTxId()) .withPayoutTxId(proto.getPayoutTxId())
.withAmountAsLong(proto.getAmountAsLong()) .withAmount(proto.getAmount())
.withBuyerSecurityDeposit(proto.getBuyerSecurityDeposit()) .withBuyerSecurityDeposit(proto.getBuyerSecurityDeposit())
.withSellerSecurityDeposit(proto.getSellerSecurityDeposit()) .withSellerSecurityDeposit(proto.getSellerSecurityDeposit())
.withPrice(proto.getPrice()) .withPrice(proto.getPrice())
@ -271,11 +271,11 @@ public class TradeInfo implements Payload {
", shortId='" + shortId + '\'' + "\n" + ", shortId='" + shortId + '\'' + "\n" +
", date='" + date + '\'' + "\n" + ", date='" + date + '\'' + "\n" +
", role='" + role + '\'' + "\n" + ", role='" + role + '\'' + "\n" +
", takerFeeAsLong='" + takerFeeAsLong + '\'' + "\n" + ", takerFee='" + takerFee + '\'' + "\n" +
", makerDepositTxId='" + makerDepositTxId + '\'' + "\n" + ", makerDepositTxId='" + makerDepositTxId + '\'' + "\n" +
", takerDepositTxId='" + takerDepositTxId + '\'' + "\n" + ", takerDepositTxId='" + takerDepositTxId + '\'' + "\n" +
", payoutTxId='" + payoutTxId + '\'' + "\n" + ", payoutTxId='" + payoutTxId + '\'' + "\n" +
", amountAsLong='" + amountAsLong + '\'' + "\n" + ", amount='" + amount + '\'' + "\n" +
", buyerSecurityDeposit='" + buyerSecurityDeposit + '\'' + "\n" + ", buyerSecurityDeposit='" + buyerSecurityDeposit + '\'' + "\n" +
", sellerSecurityDeposit='" + sellerSecurityDeposit + '\'' + "\n" + ", sellerSecurityDeposit='" + sellerSecurityDeposit + '\'' + "\n" +
", price='" + price + '\'' + "\n" + ", price='" + price + '\'' + "\n" +

View file

@ -38,7 +38,6 @@ public final class OfferInfoBuilder {
private long minAmount; private long minAmount;
private String volume; private String volume;
private String minVolume; private String minVolume;
private long txFee;
private long makerFee; private long makerFee;
private String offerFeePaymentTxId; private String offerFeePaymentTxId;
private long buyerSecurityDeposit; private long buyerSecurityDeposit;
@ -107,11 +106,6 @@ public final class OfferInfoBuilder {
return this; return this;
} }
public OfferInfoBuilder withTxFee(long txFee) {
this.txFee = txFee;
return this;
}
public OfferInfoBuilder withMakerFee(long makerFee) { public OfferInfoBuilder withMakerFee(long makerFee) {
this.makerFee = makerFee; this.makerFee = makerFee;
return this; return this;

View file

@ -37,14 +37,14 @@ public final class TradeInfoV1Builder {
private long date; private long date;
private String role; private String role;
private boolean isCurrencyForTakerFeeBtc; private boolean isCurrencyForTakerFeeBtc;
private long txFeeAsLong; private long totalTxFee;
private long takerFeeAsLong; private long takerFee;
private long buyerSecurityDeposit; private long buyerSecurityDeposit;
private long sellerSecurityDeposit; private long sellerSecurityDeposit;
private String makerDepositTxId; private String makerDepositTxId;
private String takerDepositTxId; private String takerDepositTxId;
private String payoutTxId; private String payoutTxId;
private long amountAsLong; private long amount;
private String price; private String price;
private String volume; private String volume;
private String arbitratorNodeAddress; private String arbitratorNodeAddress;
@ -97,13 +97,13 @@ public final class TradeInfoV1Builder {
return this; return this;
} }
public TradeInfoV1Builder withTxFeeAsLong(long txFeeAsLong) { public TradeInfoV1Builder withTotalTxFee(long totalTxFee) {
this.txFeeAsLong = txFeeAsLong; this.totalTxFee = totalTxFee;
return this; return this;
} }
public TradeInfoV1Builder withTakerFeeAsLong(long takerFeeAsLong) { public TradeInfoV1Builder withTakerFee(long takerFee) {
this.takerFeeAsLong = takerFeeAsLong; this.takerFee = takerFee;
return this; return this;
} }
@ -132,8 +132,8 @@ public final class TradeInfoV1Builder {
return this; return this;
} }
public TradeInfoV1Builder withAmountAsLong(long amountAsLong) { public TradeInfoV1Builder withAmount(long amount) {
this.amountAsLong = amountAsLong; this.amount = amount;
return this; return this;
} }

View file

@ -23,7 +23,7 @@ import haveno.common.config.Config;
import haveno.common.proto.network.NetworkProtoResolver; import haveno.common.proto.network.NetworkProtoResolver;
import haveno.common.proto.persistable.PersistenceProtoResolver; import haveno.common.proto.persistable.PersistenceProtoResolver;
import haveno.core.alert.AlertModule; import haveno.core.alert.AlertModule;
import haveno.core.btc.BitcoinModule; import haveno.core.btc.MoneroModule;
import haveno.core.filter.FilterModule; import haveno.core.filter.FilterModule;
import haveno.core.network.CoreNetworkFilter; import haveno.core.network.CoreNetworkFilter;
import haveno.core.network.p2p.seed.DefaultSeedNodeRepository; import haveno.core.network.p2p.seed.DefaultSeedNodeRepository;
@ -82,7 +82,7 @@ public class CoreModule extends AppModule {
install(new EncryptionServiceModule(config)); install(new EncryptionServiceModule(config));
install(new OfferModule(config)); install(new OfferModule(config));
install(new P2PModule(config)); install(new P2PModule(config));
install(new BitcoinModule(config)); install(new MoneroModule(config));
install(new AlertModule(config)); install(new AlertModule(config));
install(new FilterModule(config)); install(new FilterModule(config));
install(new CorePresentationModule(config)); install(new CorePresentationModule(config));

View file

@ -27,7 +27,7 @@ import haveno.common.proto.network.NetworkProtoResolver;
import haveno.common.proto.persistable.PersistenceProtoResolver; import haveno.common.proto.persistable.PersistenceProtoResolver;
import haveno.core.alert.AlertModule; import haveno.core.alert.AlertModule;
import haveno.core.app.TorSetup; import haveno.core.app.TorSetup;
import haveno.core.btc.BitcoinModule; import haveno.core.btc.MoneroModule;
import haveno.core.filter.FilterModule; import haveno.core.filter.FilterModule;
import haveno.core.network.CoreNetworkFilter; import haveno.core.network.CoreNetworkFilter;
import haveno.core.network.p2p.seed.DefaultSeedNodeRepository; import haveno.core.network.p2p.seed.DefaultSeedNodeRepository;
@ -85,7 +85,7 @@ public class ModuleForAppWithP2p extends AppModule {
install(new EncryptionServiceModule(config)); install(new EncryptionServiceModule(config));
install(new OfferModule(config)); install(new OfferModule(config));
install(new P2PModule(config)); install(new P2PModule(config));
install(new BitcoinModule(config)); install(new MoneroModule(config));
install(new AlertModule(config)); install(new AlertModule(config));
install(new FilterModule(config)); install(new FilterModule(config));
install(new MoneroConnectionModule(config)); install(new MoneroConnectionModule(config));

View file

@ -44,9 +44,9 @@ import static haveno.common.config.Config.PROVIDERS;
import static haveno.common.config.Config.WALLET_DIR; import static haveno.common.config.Config.WALLET_DIR;
import static haveno.common.config.Config.WALLET_RPC_BIND_PORT; import static haveno.common.config.Config.WALLET_RPC_BIND_PORT;
public class BitcoinModule extends AppModule { public class MoneroModule extends AppModule {
public BitcoinModule(Config config) { public MoneroModule(Config config) {
super(config); super(config);
} }

View file

@ -39,7 +39,6 @@ import haveno.core.user.User;
import haveno.core.util.coin.CoinUtil; import haveno.core.util.coin.CoinUtil;
import haveno.network.p2p.NodeAddress; import haveno.network.p2p.NodeAddress;
import haveno.network.p2p.P2PService; import haveno.network.p2p.P2PService;
import org.bitcoinj.core.Coin;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
@ -105,7 +104,6 @@ public class CreateOfferService {
BigInteger amount, BigInteger amount,
BigInteger minAmount, BigInteger minAmount,
Price price, Price price,
Coin txFee,
boolean useMarketBasedPrice, boolean useMarketBasedPrice,
double marketPriceMargin, double marketPriceMargin,
double buyerSecurityDepositAsDouble, double buyerSecurityDepositAsDouble,

View file

@ -112,8 +112,8 @@ public class OfferForJson {
priceDisplayString = altcoinFormat.noCode().format(price.getMonetary()).toString(); priceDisplayString = altcoinFormat.noCode().format(price.getMonetary()).toString();
primaryMarketMinAmountDisplayString = altcoinFormat.noCode().format(getMinVolume().getMonetary()).toString(); primaryMarketMinAmountDisplayString = altcoinFormat.noCode().format(getMinVolume().getMonetary()).toString();
primaryMarketAmountDisplayString = altcoinFormat.noCode().format(getVolume().getMonetary()).toString(); primaryMarketAmountDisplayString = altcoinFormat.noCode().format(getVolume().getMonetary()).toString();
primaryMarketMinVolumeDisplayString = HavenoUtils.formatToXmr(getMinAmount()).toString(); primaryMarketMinVolumeDisplayString = HavenoUtils.formatXmr(getMinAmount()).toString();
primaryMarketVolumeDisplayString = HavenoUtils.formatToXmr(getAmount()).toString(); primaryMarketVolumeDisplayString = HavenoUtils.formatXmr(getAmount()).toString();
primaryMarketPrice = price.getValue(); primaryMarketPrice = price.getValue();
primaryMarketMinAmount = getMinVolume().getValue(); primaryMarketMinAmount = getMinVolume().getValue();
@ -125,8 +125,8 @@ public class OfferForJson {
currencyPair = Res.getBaseCurrencyCode() + "/" + currencyCode; currencyPair = Res.getBaseCurrencyCode() + "/" + currencyCode;
priceDisplayString = fiatFormat.noCode().format(price.getMonetary()).toString(); priceDisplayString = fiatFormat.noCode().format(price.getMonetary()).toString();
primaryMarketMinAmountDisplayString = HavenoUtils.formatToXmr(getMinAmount()).toString(); primaryMarketMinAmountDisplayString = HavenoUtils.formatXmr(getMinAmount()).toString();
primaryMarketAmountDisplayString = HavenoUtils.formatToXmr(getAmount()).toString(); primaryMarketAmountDisplayString = HavenoUtils.formatXmr(getAmount()).toString();
primaryMarketMinVolumeDisplayString = fiatFormat.noCode().format(getMinVolume().getMonetary()).toString(); primaryMarketMinVolumeDisplayString = fiatFormat.noCode().format(getMinVolume().getMonetary()).toString();
primaryMarketVolumeDisplayString = fiatFormat.noCode().format(getVolume().getMonetary()).toString(); primaryMarketVolumeDisplayString = fiatFormat.noCode().format(getVolume().getMonetary()).toString();

View file

@ -74,7 +74,7 @@ public class XmrValidator extends NumberValidator {
BigDecimal bd = new BigDecimal(input); BigDecimal bd = new BigDecimal(input);
final BigDecimal atomicUnits = bd.movePointRight(HavenoUtils.XMR_SMALLEST_UNIT_EXPONENT); final BigDecimal atomicUnits = bd.movePointRight(HavenoUtils.XMR_SMALLEST_UNIT_EXPONENT);
if (atomicUnits.scale() > 0) if (atomicUnits.scale() > 0)
return new ValidationResult(false, Res.get("validation.btc.fraction")); return new ValidationResult(false, Res.get("validation.xmr.fraction"));
else else
return new ValidationResult(true); return new ValidationResult(true);
} catch (Throwable t) { } catch (Throwable t) {
@ -86,7 +86,7 @@ public class XmrValidator extends NumberValidator {
try { try {
final BigInteger amount = HavenoUtils.parseXmr(input); final BigInteger amount = HavenoUtils.parseXmr(input);
if (maxValue != null && amount.compareTo(maxValue) > 0) if (maxValue != null && amount.compareTo(maxValue) > 0)
return new ValidationResult(false, Res.get("validation.btc.toLarge", HavenoUtils.formatToXmrWithCode(maxValue))); return new ValidationResult(false, Res.get("validation.xmr.tooLarge", HavenoUtils.formatXmr(maxValue, true)));
else else
return new ValidationResult(true); return new ValidationResult(true);
} catch (Throwable t) { } catch (Throwable t) {
@ -98,7 +98,7 @@ public class XmrValidator extends NumberValidator {
try { try {
final BigInteger amount = HavenoUtils.parseXmr(input); final BigInteger amount = HavenoUtils.parseXmr(input);
if (maxTradeLimit != null && amount.compareTo(maxTradeLimit) > 0) if (maxTradeLimit != null && amount.compareTo(maxTradeLimit) > 0)
return new ValidationResult(false, Res.get("validation.btc.exceedsMaxTradeLimit", HavenoUtils.formatToXmrWithCode(maxTradeLimit))); return new ValidationResult(false, Res.get("validation.btc.exceedsMaxTradeLimit", HavenoUtils.formatXmr(maxTradeLimit, true)));
else else
return new ValidationResult(true); return new ValidationResult(true);
} catch (Throwable t) { } catch (Throwable t) {
@ -110,7 +110,7 @@ public class XmrValidator extends NumberValidator {
try { try {
final BigInteger amount = HavenoUtils.parseXmr(input); final BigInteger amount = HavenoUtils.parseXmr(input);
if (minValue != null && amount.compareTo(minValue) < 0) if (minValue != null && amount.compareTo(minValue) < 0)
return new ValidationResult(false, Res.get("validation.btc.toSmall", HavenoUtils.formatToXmr(minValue))); return new ValidationResult(false, Res.get("validation.xmr.tooSmall", HavenoUtils.formatXmr(minValue)));
else else
return new ValidationResult(true); return new ValidationResult(true);
} catch (Throwable t) { } catch (Throwable t) {

View file

@ -42,13 +42,13 @@ public class BalancePresentation {
@Inject @Inject
public BalancePresentation(Balances balances) { public BalancePresentation(Balances balances) {
balances.getAvailableBalance().addListener((observable, oldValue, newValue) -> { balances.getAvailableBalance().addListener((observable, oldValue, newValue) -> {
UserThread.execute(() -> availableBalance.set(HavenoUtils.formatToXmrWithCode(newValue))); UserThread.execute(() -> availableBalance.set(HavenoUtils.formatXmr(newValue, true)));
}); });
balances.getPendingBalance().addListener((observable, oldValue, newValue) -> { balances.getPendingBalance().addListener((observable, oldValue, newValue) -> {
UserThread.execute(() -> pendingBalance.set(HavenoUtils.formatToXmrWithCode(newValue))); UserThread.execute(() -> pendingBalance.set(HavenoUtils.formatXmr(newValue, true)));
}); });
balances.getReservedBalance().addListener((observable, oldValue, newValue) -> { balances.getReservedBalance().addListener((observable, oldValue, newValue) -> {
UserThread.execute(() -> reservedBalance.set(HavenoUtils.formatToXmrWithCode(newValue))); UserThread.execute(() -> reservedBalance.set(HavenoUtils.formatXmr(newValue, true)));
}); });
} }
} }

View file

@ -79,7 +79,6 @@ import haveno.core.payment.payload.VenmoAccountPayload;
import haveno.core.payment.payload.VerseAccountPayload; import haveno.core.payment.payload.VerseAccountPayload;
import haveno.core.payment.payload.WeChatPayAccountPayload; import haveno.core.payment.payload.WeChatPayAccountPayload;
import haveno.core.payment.payload.WesternUnionAccountPayload; import haveno.core.payment.payload.WesternUnionAccountPayload;
import haveno.core.trade.statistics.TradeStatistics2;
import haveno.core.trade.statistics.TradeStatistics3; import haveno.core.trade.statistics.TradeStatistics3;
import java.time.Clock; import java.time.Clock;
@ -250,8 +249,6 @@ public class CoreProtoResolver implements ProtoResolver {
switch (proto.getMessageCase()) { switch (proto.getMessageCase()) {
case ACCOUNT_AGE_WITNESS: case ACCOUNT_AGE_WITNESS:
return AccountAgeWitness.fromProto(proto.getAccountAgeWitness()); return AccountAgeWitness.fromProto(proto.getAccountAgeWitness());
case TRADE_STATISTICS2:
return TradeStatistics2.fromProto(proto.getTradeStatistics2());
case SIGNED_WITNESS: case SIGNED_WITNESS:
return SignedWitness.fromProto(proto.getSignedWitness()); return SignedWitness.fromProto(proto.getSignedWitness());
case TRADE_STATISTICS3: case TRADE_STATISTICS3:

View file

@ -48,7 +48,6 @@ import haveno.core.trade.messages.MediatedPayoutTxPublishedMessage;
import haveno.core.trade.messages.MediatedPayoutTxSignatureMessage; import haveno.core.trade.messages.MediatedPayoutTxSignatureMessage;
import haveno.core.trade.messages.PaymentReceivedMessage; import haveno.core.trade.messages.PaymentReceivedMessage;
import haveno.core.trade.messages.PaymentSentMessage; import haveno.core.trade.messages.PaymentSentMessage;
import haveno.core.trade.messages.RefreshTradeStateRequest;
import haveno.core.trade.messages.SignContractRequest; import haveno.core.trade.messages.SignContractRequest;
import haveno.core.trade.messages.SignContractResponse; import haveno.core.trade.messages.SignContractResponse;
import haveno.network.p2p.AckMessage; import haveno.network.p2p.AckMessage;
@ -131,9 +130,6 @@ public class CoreNetworkProtoResolver extends CoreProtoResolver implements Netwo
case PREFIXED_SEALED_AND_SIGNED_MESSAGE: case PREFIXED_SEALED_AND_SIGNED_MESSAGE:
return PrefixedSealedAndSignedMessage.fromProto(proto.getPrefixedSealedAndSignedMessage(), messageVersion); return PrefixedSealedAndSignedMessage.fromProto(proto.getPrefixedSealedAndSignedMessage(), messageVersion);
// trade protocol messages
case REFRESH_TRADE_STATE_REQUEST:
return RefreshTradeStateRequest.fromProto(proto.getRefreshTradeStateRequest(), messageVersion);
case INIT_TRADE_REQUEST: case INIT_TRADE_REQUEST:
return InitTradeRequest.fromProto(proto.getInitTradeRequest(), this, messageVersion); return InitTradeRequest.fromProto(proto.getInitTradeRequest(), this, messageVersion);
case INIT_MULTISIG_REQUEST: case INIT_MULTISIG_REQUEST:

View file

@ -37,7 +37,6 @@ import haveno.core.support.dispute.arbitration.ArbitrationDisputeList;
import haveno.core.support.dispute.mediation.MediationDisputeList; import haveno.core.support.dispute.mediation.MediationDisputeList;
import haveno.core.support.dispute.refund.RefundDisputeList; import haveno.core.support.dispute.refund.RefundDisputeList;
import haveno.core.trade.TradableList; import haveno.core.trade.TradableList;
import haveno.core.trade.statistics.TradeStatistics2Store;
import haveno.core.trade.statistics.TradeStatistics3Store; import haveno.core.trade.statistics.TradeStatistics3Store;
import haveno.core.user.PreferencesPayload; import haveno.core.user.PreferencesPayload;
import haveno.core.user.UserPayload; import haveno.core.user.UserPayload;
@ -102,8 +101,6 @@ public class CorePersistenceProtoResolver extends CoreProtoResolver implements P
return PaymentAccountList.fromProto(proto.getPaymentAccountList(), this); return PaymentAccountList.fromProto(proto.getPaymentAccountList(), this);
case ACCOUNT_AGE_WITNESS_STORE: case ACCOUNT_AGE_WITNESS_STORE:
return AccountAgeWitnessStore.fromProto(proto.getAccountAgeWitnessStore()); return AccountAgeWitnessStore.fromProto(proto.getAccountAgeWitnessStore());
case TRADE_STATISTICS2_STORE:
return TradeStatistics2Store.fromProto(proto.getTradeStatistics2Store());
case SIGNED_WITNESS_STORE: case SIGNED_WITNESS_STORE:
return SignedWitnessStore.fromProto(proto.getSignedWitnessStore()); return SignedWitnessStore.fromProto(proto.getSignedWitnessStore());
case TRADE_STATISTICS3_STORE: case TRADE_STATISTICS3_STORE:

View file

@ -1049,14 +1049,14 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
String headline; String headline;
if (potentialGain.compareTo(BigInteger.valueOf(0)) > 0) { if (potentialGain.compareTo(BigInteger.valueOf(0)) > 0) {
headline = "This might be a potential option trade!"; headline = "This might be a potential option trade!";
optionTradeDetails = "\nBTC amount calculated with price at dispute opening: " + HavenoUtils.formatToXmrWithCode(potentialAmountAtDisputeOpening) + optionTradeDetails = "\nBTC amount calculated with price at dispute opening: " + HavenoUtils.formatXmr(potentialAmountAtDisputeOpening, true) +
"\nMax loss of security deposit is: " + HavenoUtils.formatToXmrWithCode(maxLossSecDeposit) + "\nMax loss of security deposit is: " + HavenoUtils.formatXmr(maxLossSecDeposit, true) +
"\nPossible gain from an option trade is: " + HavenoUtils.formatToXmrWithCode(potentialGain); "\nPossible gain from an option trade is: " + HavenoUtils.formatXmr(potentialGain, true);
} else { } else {
headline = "It does not appear to be an option trade."; headline = "It does not appear to be an option trade.";
optionTradeDetails = "\nBTC amount calculated with price at dispute opening: " + HavenoUtils.formatToXmrWithCode(potentialAmountAtDisputeOpening) + optionTradeDetails = "\nBTC amount calculated with price at dispute opening: " + HavenoUtils.formatXmr(potentialAmountAtDisputeOpening, true) +
"\nMax loss of security deposit is: " + HavenoUtils.formatToXmrWithCode(maxLossSecDeposit) + "\nMax loss of security deposit is: " + HavenoUtils.formatXmr(maxLossSecDeposit, true) +
"\nPossible loss from an option trade is: " + HavenoUtils.formatToXmrWithCode(potentialGain.multiply(BigInteger.valueOf(-1))); "\nPossible loss from an option trade is: " + HavenoUtils.formatXmr(potentialGain.multiply(BigInteger.valueOf(-1)), true);
} }
String percentagePriceDetails = offerPayload.isUseMarketBasedPrice() ? String percentagePriceDetails = offerPayload.isUseMarketBasedPrice() ?
@ -1065,7 +1065,7 @@ public abstract class DisputeManager<T extends DisputeList<Dispute>> extends Sup
String priceInfoText = "System message: " + headline + String priceInfoText = "System message: " + headline +
"\n\nTrade price: " + contract.getPrice().toFriendlyString() + percentagePriceDetails + "\n\nTrade price: " + contract.getPrice().toFriendlyString() + percentagePriceDetails +
"\nTrade amount: " + HavenoUtils.formatToXmrWithCode(tradeAmount) + "\nTrade amount: " + HavenoUtils.formatXmr(tradeAmount, true) +
"\nPrice at dispute opening: " + priceAtDisputeOpening.toFriendlyString() + "\nPrice at dispute opening: " + priceAtDisputeOpening.toFriendlyString() +
optionTradeDetails; optionTradeDetails;

View file

@ -58,8 +58,8 @@ public class ArbitratorTrade extends Trade {
} }
return fromProto(new ArbitratorTrade( return fromProto(new ArbitratorTrade(
Offer.fromProto(proto.getOffer()), Offer.fromProto(proto.getOffer()),
BigInteger.valueOf(proto.getAmountAsLong()), BigInteger.valueOf(proto.getAmount()),
BigInteger.valueOf(proto.getTakerFeeAsLong()), BigInteger.valueOf(proto.getTakerFee()),
proto.getPrice(), proto.getPrice(),
xmrWalletService, xmrWalletService,
processModel, processModel,

View file

@ -80,8 +80,8 @@ public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
} }
BuyerAsMakerTrade trade = new BuyerAsMakerTrade( BuyerAsMakerTrade trade = new BuyerAsMakerTrade(
Offer.fromProto(proto.getOffer()), Offer.fromProto(proto.getOffer()),
BigInteger.valueOf(proto.getAmountAsLong()), BigInteger.valueOf(proto.getAmount()),
BigInteger.valueOf(proto.getTakerFeeAsLong()), BigInteger.valueOf(proto.getTakerFee()),
proto.getPrice(), proto.getPrice(),
xmrWalletService, xmrWalletService,
processModel, processModel,
@ -90,7 +90,6 @@ public final class BuyerAsMakerTrade extends BuyerTrade implements MakerTrade {
proto.getProcessModel().getTaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getTaker().getNodeAddress()) : null, proto.getProcessModel().getTaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getTaker().getNodeAddress()) : null,
proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null); proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null);
trade.setAmountAsLong(proto.getAmountAsLong());
trade.setPrice(proto.getPrice()); trade.setPrice(proto.getPrice());
return fromProto(trade, return fromProto(trade,

View file

@ -83,8 +83,8 @@ public final class BuyerAsTakerTrade extends BuyerTrade implements TakerTrade {
} }
return fromProto(new BuyerAsTakerTrade( return fromProto(new BuyerAsTakerTrade(
Offer.fromProto(proto.getOffer()), Offer.fromProto(proto.getOffer()),
BigInteger.valueOf(proto.getAmountAsLong()), BigInteger.valueOf(proto.getAmount()),
BigInteger.valueOf(proto.getTakerFeeAsLong()), BigInteger.valueOf(proto.getTakerFee()),
proto.getPrice(), proto.getPrice(),
xmrWalletService, xmrWalletService,
processModel, processModel,

View file

@ -17,19 +17,16 @@
package haveno.core.trade; package haveno.core.trade;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Monetary; import org.bitcoinj.core.Monetary;
import org.bitcoinj.utils.Fiat; import org.bitcoinj.utils.Fiat;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
import static haveno.core.trade.ClosedTradableUtil.*; import static haveno.core.trade.ClosedTradableUtil.*;
import static haveno.core.trade.Trade.DisputeState.DISPUTE_CLOSED; import static haveno.core.trade.Trade.DisputeState.DISPUTE_CLOSED;
import static haveno.core.trade.Trade.DisputeState.MEDIATION_CLOSED; import static haveno.core.trade.Trade.DisputeState.MEDIATION_CLOSED;
import static haveno.core.trade.Trade.DisputeState.REFUND_REQUEST_CLOSED; import static haveno.core.trade.Trade.DisputeState.REFUND_REQUEST_CLOSED;
import static haveno.core.util.FormattingUtils.BTC_FORMATTER_KEY;
import static haveno.core.util.FormattingUtils.formatPercentagePrice; import static haveno.core.util.FormattingUtils.formatPercentagePrice;
import static haveno.core.util.FormattingUtils.formatToPercentWithSymbol; import static haveno.core.util.FormattingUtils.formatToPercentWithSymbol;
import static haveno.core.util.VolumeUtil.formatVolume; import static haveno.core.util.VolumeUtil.formatVolume;
@ -41,7 +38,9 @@ import haveno.core.monetary.Altcoin;
import haveno.core.monetary.Volume; import haveno.core.monetary.Volume;
import haveno.core.offer.OpenOffer; import haveno.core.offer.OpenOffer;
import haveno.core.util.FormattingUtils; import haveno.core.util.FormattingUtils;
import haveno.core.util.coin.CoinFormatter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -55,56 +54,53 @@ public class ClosedTradableFormatter {
// having "generic-enough" property values to be referenced in the core layer. // having "generic-enough" property values to be referenced in the core layer.
private static final String I18N_KEY_TOTAL_AMOUNT = "closedTradesSummaryWindow.totalAmount.value"; private static final String I18N_KEY_TOTAL_AMOUNT = "closedTradesSummaryWindow.totalAmount.value";
private static final String I18N_KEY_TOTAL_TX_FEE = "closedTradesSummaryWindow.totalMinerFee.value"; private static final String I18N_KEY_TOTAL_TX_FEE = "closedTradesSummaryWindow.totalMinerFee.value";
private static final String I18N_KEY_TOTAL_TRADE_FEE_BTC = "closedTradesSummaryWindow.totalTradeFeeInBtc.value"; private static final String I18N_KEY_TOTAL_TRADE_FEE_BTC = "closedTradesSummaryWindow.totalTradeFeeInXmr.value";
private final CoinFormatter btcFormatter;
private final ClosedTradableManager closedTradableManager; private final ClosedTradableManager closedTradableManager;
@Inject @Inject
public ClosedTradableFormatter(ClosedTradableManager closedTradableManager, public ClosedTradableFormatter(ClosedTradableManager closedTradableManager) {
@Named(BTC_FORMATTER_KEY) CoinFormatter btcFormatter) {
this.closedTradableManager = closedTradableManager; this.closedTradableManager = closedTradableManager;
this.btcFormatter = btcFormatter;
} }
public String getAmountAsString(Tradable tradable) { public String getAmountAsString(Tradable tradable) {
return tradable.getOptionalAmount().map(HavenoUtils::formatToXmr).orElse(""); return tradable.getOptionalAmount().map(HavenoUtils::formatXmr).orElse("");
} }
public String getTotalAmountWithVolumeAsString(Coin totalTradeAmount, Volume volume) { public String getTotalAmountWithVolumeAsString(BigInteger totalTradeAmount, Volume volume) {
return Res.get(I18N_KEY_TOTAL_AMOUNT, return Res.get(I18N_KEY_TOTAL_AMOUNT,
btcFormatter.formatCoin(totalTradeAmount, true), HavenoUtils.formatXmr(totalTradeAmount, true),
formatVolumeWithCode(volume)); formatVolumeWithCode(volume));
} }
public String getTxFeeAsString(Tradable tradable) { public String getTotalTxFeeAsString(Tradable tradable) {
return btcFormatter.formatCoin(getTxFee(tradable)); return HavenoUtils.formatXmr(getTotalTxFee(tradable));
} }
public String getTotalTxFeeAsString(Coin totalTradeAmount, Coin totalTxFee) { public String getTotalTxFeeAsString(BigInteger totalTradeAmount, BigInteger totalTxFee) {
double percentage = ((double) totalTxFee.value) / totalTradeAmount.value; double percentage = new BigDecimal(totalTxFee).divide(new BigDecimal(totalTradeAmount)).doubleValue();
return Res.get(I18N_KEY_TOTAL_TX_FEE, return Res.get(I18N_KEY_TOTAL_TX_FEE,
btcFormatter.formatCoin(totalTxFee, true), HavenoUtils.formatXmr(totalTxFee, true),
formatToPercentWithSymbol(percentage)); formatToPercentWithSymbol(percentage));
} }
public String getBuyerSecurityDepositAsString(Tradable tradable) { public String getBuyerSecurityDepositAsString(Tradable tradable) {
return HavenoUtils.formatToXmr(tradable.getOffer().getBuyerSecurityDeposit()); return HavenoUtils.formatXmr(tradable.getOffer().getBuyerSecurityDeposit());
} }
public String getSellerSecurityDepositAsString(Tradable tradable) { public String getSellerSecurityDepositAsString(Tradable tradable) {
return HavenoUtils.formatToXmr(tradable.getOffer().getSellerSecurityDeposit()); return HavenoUtils.formatXmr(tradable.getOffer().getSellerSecurityDeposit());
} }
public String getTradeFeeAsString(Tradable tradable, boolean appendCode) { public String getTradeFeeAsString(Tradable tradable, boolean appendCode) {
closedTradableManager.getBtcTradeFee(tradable); BigInteger tradeFee = closedTradableManager.getXmrTradeFee(tradable);
return btcFormatter.formatCoin(Coin.valueOf(closedTradableManager.getBtcTradeFee(tradable)), appendCode); return HavenoUtils.formatXmr(tradeFee, appendCode);
} }
public String getTotalTradeFeeInBtcAsString(Coin totalTradeAmount, Coin totalTradeFee) { public String getTotalTradeFeeAsString(BigInteger totalTradeAmount, BigInteger totalTradeFee) {
double percentage = ((double) totalTradeFee.value) / totalTradeAmount.value; double percentage = new BigDecimal(totalTradeFee).divide(new BigDecimal(totalTradeAmount)).doubleValue();
return Res.get(I18N_KEY_TOTAL_TRADE_FEE_BTC, return Res.get(I18N_KEY_TOTAL_TRADE_FEE_BTC,
btcFormatter.formatCoin(totalTradeFee, true), HavenoUtils.formatXmr(totalTradeFee, true),
formatToPercentWithSymbol(percentage)); formatToPercentWithSymbol(percentage));
} }

View file

@ -214,20 +214,20 @@ public class ClosedTradableManager implements PersistedDataHost {
.count(); .count();
} }
public Coin getTotalTradeFee(List<Tradable> tradableList) { public BigInteger getTotalTradeFee(List<Tradable> tradableList) {
return Coin.valueOf(tradableList.stream() return BigInteger.valueOf(tradableList.stream()
.mapToLong(tradable -> getTradeFee(tradable)) .mapToLong(tradable -> getTradeFee(tradable).longValueExact())
.sum()); .sum());
} }
private long getTradeFee(Tradable tradable) { private BigInteger getTradeFee(Tradable tradable) {
return getBtcTradeFee(tradable); return getXmrTradeFee(tradable);
} }
public long getBtcTradeFee(Tradable tradable) { public BigInteger getXmrTradeFee(Tradable tradable) {
return isMaker(tradable) ? return isMaker(tradable) ?
tradable.getOptionalMakerFee().orElse(BigInteger.valueOf(0)).longValueExact() : tradable.getOptionalMakerFee().orElse(BigInteger.valueOf(0)) :
tradable.getOptionalTakerFee().orElse(BigInteger.valueOf(0)).longValueExact(); tradable.getOptionalTakerFee().orElse(BigInteger.valueOf(0));
} }
public boolean isMaker(Tradable tradable) { public boolean isMaker(Tradable tradable) {

View file

@ -17,25 +17,24 @@
package haveno.core.trade; package haveno.core.trade;
import org.bitcoinj.core.Coin;
import haveno.core.offer.OpenOffer; import haveno.core.offer.OpenOffer;
import haveno.core.trade.Tradable;
import haveno.core.trade.Trade; import java.math.BigInteger;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public class ClosedTradableUtil { public class ClosedTradableUtil {
public static Coin getTotalAmount(List<Tradable> tradableList) { public static BigInteger getTotalAmount(List<Tradable> tradableList) {
return Coin.valueOf(tradableList.stream() return BigInteger.valueOf(tradableList.stream()
.flatMap(tradable -> tradable.getOptionalAmountAsLong().stream()) .flatMap(tradable -> tradable.getOptionalAmount().stream())
.mapToLong(value -> value) .mapToLong(value -> value.longValueExact())
.sum()); .sum());
} }
public static Coin getTotalTxFee(List<Tradable> tradableList) { public static BigInteger getTotalTxFee(List<Tradable> tradableList) {
return Coin.valueOf(tradableList.stream() return BigInteger.valueOf(tradableList.stream()
.mapToLong(tradable -> getTxFee(tradable).getValue()) .mapToLong(tradable -> getTotalTxFee(tradable).longValueExact())
.sum()); .sum());
} }
@ -51,8 +50,8 @@ public class ClosedTradableUtil {
return map; return map;
} }
public static Coin getTxFee(Tradable tradable) { public static BigInteger getTotalTxFee(Tradable tradable) {
return tradable.getOptionalTxFee().orElse(Coin.ZERO); return tradable.getTotalTxFee();
} }
public static boolean isOpenOffer(Tradable tradable) { public static boolean isOpenOffer(Tradable tradable) {

View file

@ -132,16 +132,32 @@ public class HavenoUtils {
// ------------------------- FORMAT UTILS --------------------------------- // ------------------------- FORMAT UTILS ---------------------------------
public static String formatToXmr(BigInteger atomicUnits) { public static String formatXmr(BigInteger atomicUnits) {
return formatXmr(atomicUnits, false);
}
public static String formatXmr(BigInteger atomicUnits, int decimalPlaces) {
return formatXmr(atomicUnits, false, decimalPlaces);
}
public static String formatXmr(BigInteger atomicUnits, boolean appendCode) {
return formatXmr(atomicUnits, appendCode, 0);
}
public static String formatXmr(BigInteger atomicUnits, boolean appendCode, int decimalPlaces) {
if (atomicUnits == null) return ""; if (atomicUnits == null) return "";
return formatToXmr(atomicUnits.longValueExact()); return formatXmr(atomicUnits.longValueExact(), appendCode, decimalPlaces);
} }
public static String formatToXmr(BigInteger atomicUnits, int decimalPlaces) { public static String formatXmr(long atomicUnits) {
return applyDecimals(formatToXmr(atomicUnits), decimalPlaces); return formatXmr(atomicUnits, false, 0);
} }
public static String formatToXmr(long atomicUnits) { public static String formatXmr(long atomicUnits, boolean appendCode) {
return formatXmr(atomicUnits, appendCode, 0);
}
public static String formatXmr(long atomicUnits, boolean appendCode, int decimalPlaces) {
String formatted = XMR_FORMATTER.format(atomicUnitsToXmr(atomicUnits)); String formatted = XMR_FORMATTER.format(atomicUnitsToXmr(atomicUnits));
// strip trailing 0s // strip trailing 0s
@ -150,7 +166,7 @@ public class HavenoUtils {
formatted = formatted.substring(0, formatted.length() - 1); formatted = formatted.substring(0, formatted.length() - 1);
} }
} }
return applyDecimals(formatted, 2); return applyDecimals(formatted, Math.max(2, decimalPlaces)) + (appendCode ? " XMR" : "");
} }
private static String applyDecimals(String decimalStr, int decimalPlaces) { private static String applyDecimals(String decimalStr, int decimalPlaces) {
@ -164,15 +180,6 @@ public class HavenoUtils {
return zeros; return zeros;
} }
public static String formatToXmrWithCode(BigInteger atomicUnits) {
if (atomicUnits == null) return "";
return formatToXmrWithCode(atomicUnits.longValueExact());
}
public static String formatToXmrWithCode(long atomicUnits) {
return formatToXmr(atomicUnits).concat(" XMR");
}
public static BigInteger parseXmr(String input) { public static BigInteger parseXmr(String input) {
if (input == null || input.length() == 0) return BigInteger.valueOf(0); if (input == null || input.length() == 0) return BigInteger.valueOf(0);
try { try {

View file

@ -83,8 +83,8 @@ public final class SellerAsMakerTrade extends SellerTrade implements MakerTrade
} }
SellerAsMakerTrade trade = new SellerAsMakerTrade( SellerAsMakerTrade trade = new SellerAsMakerTrade(
Offer.fromProto(proto.getOffer()), Offer.fromProto(proto.getOffer()),
BigInteger.valueOf(proto.getAmountAsLong()), BigInteger.valueOf(proto.getAmount()),
BigInteger.valueOf(proto.getTakerFeeAsLong()), BigInteger.valueOf(proto.getTakerFee()),
proto.getPrice(), proto.getPrice(),
xmrWalletService, xmrWalletService,
processModel, processModel,
@ -93,7 +93,6 @@ public final class SellerAsMakerTrade extends SellerTrade implements MakerTrade
proto.getProcessModel().getTaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getTaker().getNodeAddress()) : null, proto.getProcessModel().getTaker().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getTaker().getNodeAddress()) : null,
proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null); proto.getProcessModel().getArbitrator().hasNodeAddress() ? NodeAddress.fromProto(proto.getProcessModel().getArbitrator().getNodeAddress()) : null);
trade.setAmountAsLong(proto.getAmountAsLong());
trade.setPrice(proto.getPrice()); trade.setPrice(proto.getPrice());
return fromProto(trade, return fromProto(trade,

View file

@ -83,8 +83,8 @@ public final class SellerAsTakerTrade extends SellerTrade implements TakerTrade
} }
return fromProto(new SellerAsTakerTrade( return fromProto(new SellerAsTakerTrade(
Offer.fromProto(proto.getOffer()), Offer.fromProto(proto.getOffer()),
BigInteger.valueOf(proto.getAmountAsLong()), BigInteger.valueOf(proto.getAmount()),
BigInteger.valueOf(proto.getTakerFeeAsLong()), BigInteger.valueOf(proto.getTakerFee()),
proto.getPrice(), proto.getPrice(),
xmrWalletService, xmrWalletService,
processModel, processModel,

View file

@ -22,7 +22,6 @@ import haveno.core.monetary.Price;
import haveno.core.monetary.Volume; import haveno.core.monetary.Volume;
import haveno.core.offer.Offer; import haveno.core.offer.Offer;
import haveno.network.p2p.NodeAddress; import haveno.network.p2p.NodeAddress;
import org.bitcoinj.core.Coin;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Date; import java.util.Date;
@ -57,12 +56,8 @@ public interface Tradable extends PersistablePayload {
return asTradeModel().map(Trade::getAmount); return asTradeModel().map(Trade::getAmount);
} }
default Optional<Long> getOptionalAmountAsLong() { default BigInteger getTotalTxFee() {
return asTradeModel().map(Trade::getAmountAsLong); return asTradeModel().map(Trade::getTotalTxFee).get();
}
default Optional<Coin> getOptionalTxFee() {
return asTradeModel().map(Trade::getTxFee);
} }
default Optional<BigInteger> getOptionalTakerFee() { default Optional<BigInteger> getOptionalTakerFee() {

View file

@ -324,8 +324,7 @@ public abstract class Trade implements Tradable, Model {
private final ProcessModel processModel; private final ProcessModel processModel;
@Getter @Getter
private final Offer offer; private final Offer offer;
@Getter private final long takerFee;
private final long takerFeeAsLong;
// Added in 1.5.1 // Added in 1.5.1
@Getter @Getter
@ -335,9 +334,7 @@ public abstract class Trade implements Tradable, Model {
private long takeOfferDate; private long takeOfferDate;
// Mutable // Mutable
@Getter private long amount;
@Setter
private long amountAsLong;
@Setter @Setter
private long price; private long price;
@Nullable @Nullable
@ -373,9 +370,7 @@ public abstract class Trade implements Tradable, Model {
// Transient // Transient
// Immutable // Immutable
@Getter @Getter
transient final private Coin txFee; transient final private BigInteger totalTxFee;
@Getter
transient final private BigInteger takerFee;
@Getter @Getter
transient final private XmrWalletService xmrWalletService; transient final private XmrWalletService xmrWalletService;
@ -401,9 +396,6 @@ public abstract class Trade implements Tradable, Model {
transient private boolean isShutDown; transient private boolean isShutDown;
// Added in v1.2.0 // Added in v1.2.0
@Nullable
transient private BigInteger tradeAmount;
transient private ObjectProperty<BigInteger> tradeAmountProperty; transient private ObjectProperty<BigInteger> tradeAmountProperty;
transient private ObjectProperty<Volume> tradeVolumeProperty; transient private ObjectProperty<Volume> tradeVolumeProperty;
@ -479,15 +471,13 @@ public abstract class Trade implements Tradable, Model {
@Nullable NodeAddress takerNodeAddress, @Nullable NodeAddress takerNodeAddress,
@Nullable NodeAddress arbitratorNodeAddress) { @Nullable NodeAddress arbitratorNodeAddress) {
this.offer = offer; this.offer = offer;
this.tradeAmount = tradeAmount; this.amount = tradeAmount.longValueExact();
this.txFee = Coin.valueOf(0); // TODO (woodser): remove this field this.takerFee = takerFee.longValueExact();
this.takerFee = takerFee; this.totalTxFee = BigInteger.valueOf(0); // TODO: sum tx fees
this.price = tradePrice; this.price = tradePrice;
this.xmrWalletService = xmrWalletService; this.xmrWalletService = xmrWalletService;
this.processModel = processModel; this.processModel = processModel;
this.uid = uid; this.uid = uid;
this.takerFeeAsLong = takerFee.longValueExact();
this.takeOfferDate = new Date().getTime(); this.takeOfferDate = new Date().getTime();
this.tradeListeners = new ArrayList<TradeListener>(); this.tradeListeners = new ArrayList<TradeListener>();
@ -1262,9 +1252,8 @@ public abstract class Trade implements Tradable, Model {
} }
public void setAmount(BigInteger tradeAmount) { public void setAmount(BigInteger tradeAmount) {
this.tradeAmount = tradeAmount; this.amount = tradeAmount.longValueExact();
amountAsLong = tradeAmount.longValueExact(); getAmountProperty().set(getAmount());
getAmountProperty().set(tradeAmount);
getVolumeProperty().set(getVolume()); getVolumeProperty().set(getVolume());
} }
@ -1566,15 +1555,17 @@ public abstract class Trade implements Tradable, Model {
@Nullable @Nullable
public BigInteger getAmount() { public BigInteger getAmount() {
if (tradeAmount == null) return BigInteger.valueOf(amount);
tradeAmount = BigInteger.valueOf(amountAsLong);
return tradeAmount;
} }
public BigInteger getMakerFee() { public BigInteger getMakerFee() {
return offer.getMakerFee(); return offer.getMakerFee();
} }
public BigInteger getTakerFee() {
return BigInteger.valueOf(takerFee);
}
public BigInteger getBuyerSecurityDeposit() { public BigInteger getBuyerSecurityDeposit() {
if (getBuyer().getDepositTxHash() == null) return null; if (getBuyer().getDepositTxHash() == null) return null;
return BigInteger.valueOf(getBuyer().getSecurityDeposit()); return BigInteger.valueOf(getBuyer().getSecurityDeposit());
@ -1858,10 +1849,10 @@ public abstract class Trade implements Tradable, Model {
public Message toProtoMessage() { public Message toProtoMessage() {
protobuf.Trade.Builder builder = protobuf.Trade.newBuilder() protobuf.Trade.Builder builder = protobuf.Trade.newBuilder()
.setOffer(offer.toProtoMessage()) .setOffer(offer.toProtoMessage())
.setTakerFeeAsLong(takerFeeAsLong) .setTakerFee(takerFee)
.setTakeOfferDate(takeOfferDate) .setTakeOfferDate(takeOfferDate)
.setProcessModel(processModel.toProtoMessage()) .setProcessModel(processModel.toProtoMessage())
.setAmountAsLong(amountAsLong) .setAmount(amount)
.setPrice(price) .setPrice(price)
.setState(Trade.State.toProtoMessage(state)) .setState(Trade.State.toProtoMessage(state))
.setPayoutState(Trade.PayoutState.toProtoMessage(payoutState)) .setPayoutState(Trade.PayoutState.toProtoMessage(payoutState))
@ -1927,11 +1918,11 @@ public abstract class Trade implements Tradable, Model {
public String toString() { public String toString() {
return "Trade{" + return "Trade{" +
"\n offer=" + offer + "\n offer=" + offer +
",\n takerFeeAsLong=" + takerFeeAsLong + ",\n takerFee=" + takerFee +
",\n takeOfferDate=" + takeOfferDate + ",\n takeOfferDate=" + takeOfferDate +
",\n processModel=" + processModel + ",\n processModel=" + processModel +
",\n payoutTxId='" + payoutTxId + '\'' + ",\n payoutTxId='" + payoutTxId + '\'' +
",\n tradeAmountAsLong=" + amountAsLong + ",\n amount=" + amount +
",\n tradePrice=" + price + ",\n tradePrice=" + price +
",\n state=" + state + ",\n state=" + state +
",\n payoutState=" + payoutState + ",\n payoutState=" + payoutState +
@ -1945,7 +1936,7 @@ public abstract class Trade implements Tradable, Model {
",\n counterCurrencyExtraData='" + counterCurrencyExtraData + '\'' + ",\n counterCurrencyExtraData='" + counterCurrencyExtraData + '\'' +
",\n assetTxProofResult='" + assetTxProofResult + '\'' + ",\n assetTxProofResult='" + assetTxProofResult + '\'' +
",\n chatMessages=" + chatMessages + ",\n chatMessages=" + chatMessages +
",\n txFee=" + txFee + ",\n totalTxFee=" + totalTxFee +
",\n takerFee=" + takerFee + ",\n takerFee=" + takerFee +
",\n xmrWalletService=" + xmrWalletService + ",\n xmrWalletService=" + xmrWalletService +
",\n stateProperty=" + stateProperty + ",\n stateProperty=" + stateProperty +
@ -1954,7 +1945,7 @@ public abstract class Trade implements Tradable, Model {
",\n tradePeriodStateProperty=" + tradePeriodStateProperty + ",\n tradePeriodStateProperty=" + tradePeriodStateProperty +
",\n errorMessageProperty=" + errorMessageProperty + ",\n errorMessageProperty=" + errorMessageProperty +
",\n payoutTx=" + payoutTx + ",\n payoutTx=" + payoutTx +
",\n tradeAmount=" + tradeAmount + ",\n amount=" + amount +
",\n tradeAmountProperty=" + tradeAmountProperty + ",\n tradeAmountProperty=" + tradeAmountProperty +
",\n tradeVolumeProperty=" + tradeVolumeProperty + ",\n tradeVolumeProperty=" + tradeVolumeProperty +
",\n mediationResultState=" + mediationResultState + ",\n mediationResultState=" + mediationResultState +

View file

@ -787,7 +787,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
trade.getProcessModel().setTradeMessage(model.getTradeRequest()); trade.getProcessModel().setTradeMessage(model.getTradeRequest());
trade.getProcessModel().setMakerSignature(model.getMakerSignature()); trade.getProcessModel().setMakerSignature(model.getMakerSignature());
trade.getProcessModel().setUseSavingsWallet(useSavingsWallet); trade.getProcessModel().setUseSavingsWallet(useSavingsWallet);
trade.getProcessModel().setFundsNeededForTradeAsLong(fundsNeededForTrade.longValueExact()); trade.getProcessModel().setFundsNeededForTrade(fundsNeededForTrade.longValueExact());
trade.getMaker().setPubKeyRing(trade.getOffer().getPubKeyRing()); trade.getMaker().setPubKeyRing(trade.getOffer().getPubKeyRing());
trade.getSelf().setPubKeyRing(model.getPubKeyRing()); trade.getSelf().setPubKeyRing(model.getPubKeyRing());
trade.getSelf().setPaymentAccountId(paymentAccountId); trade.getSelf().setPaymentAccountId(paymentAccountId);

View file

@ -1,64 +0,0 @@
/*
* This file is part of Haveno.
*
* Haveno is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Haveno is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package haveno.core.trade.messages;
import haveno.network.p2p.NodeAddress;
import lombok.EqualsAndHashCode;
import lombok.Value;
/**
* Not used anymore since v1.4.0
* We do the re-sending of the payment sent message via the BuyerSendPaymentSentMessage task on the
* buyer side, so seller do not need to do anything interactively.
*/
@Deprecated
@SuppressWarnings("ALL")
@EqualsAndHashCode(callSuper = true)
@Value
public class RefreshTradeStateRequest extends TradeMailboxMessage {
private final NodeAddress senderNodeAddress;
///////////////////////////////////////////////////////////////////////////////////////////
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
private RefreshTradeStateRequest(String messageVersion,
String uid,
String tradeId,
NodeAddress senderNodeAddress) {
super(messageVersion, tradeId, uid);
this.senderNodeAddress = senderNodeAddress;
}
@Override
public protobuf.NetworkEnvelope toProtoNetworkEnvelope() {
final protobuf.RefreshTradeStateRequest.Builder builder = protobuf.RefreshTradeStateRequest.newBuilder();
builder.setUid(uid)
.setTradeId(tradeId)
.setSenderNodeAddress(senderNodeAddress.toProtoMessage());
return getNetworkEnvelopeBuilder().setRefreshTradeStateRequest(builder).build();
}
public static RefreshTradeStateRequest fromProto(protobuf.RefreshTradeStateRequest proto, String messageVersion) {
return new RefreshTradeStateRequest(messageVersion,
proto.getUid(),
proto.getTradeId(),
NodeAddress.fromProto(proto.getSenderNodeAddress()));
}
}

View file

@ -25,7 +25,6 @@ import haveno.common.proto.ProtoUtil;
import haveno.common.proto.persistable.PersistablePayload; import haveno.common.proto.persistable.PersistablePayload;
import haveno.common.taskrunner.Model; import haveno.common.taskrunner.Model;
import haveno.core.account.witness.AccountAgeWitnessService; import haveno.core.account.witness.AccountAgeWitnessService;
import haveno.core.btc.model.RawTransactionInput;
import haveno.core.btc.wallet.BtcWalletService; import haveno.core.btc.wallet.BtcWalletService;
import haveno.core.btc.wallet.TradeWalletService; import haveno.core.btc.wallet.TradeWalletService;
import haveno.core.btc.wallet.XmrWalletService; import haveno.core.btc.wallet.XmrWalletService;
@ -56,9 +55,7 @@ import org.bitcoinj.core.Transaction;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -86,14 +83,6 @@ public class ProcessModel implements Model, PersistablePayload {
transient private TradeManager tradeManager; transient private TradeManager tradeManager;
transient private Offer offer; transient private Offer offer;
// Added in v1.2.0
@Setter
@Nullable
transient private byte[] delayedPayoutTxSignature;
@Setter
@Nullable
transient private Transaction preparedDelayedPayoutTx;
// Added in v1.4.0 // Added in v1.4.0
// MessageState of the last message sent from the seller to the buyer in the take offer process. // MessageState of the last message sent from the seller to the buyer in the take offer process.
// It is used only in a task which would not be executed after restart, so no need to persist it. // It is used only in a task which would not be executed after restart, so no need to persist it.
@ -121,21 +110,11 @@ public class ProcessModel implements Model, PersistablePayload {
@Nullable @Nullable
@Setter @Setter
private byte[] preparedDepositTx; private byte[] preparedDepositTx;
@Nullable
@Setter
private List<RawTransactionInput> rawTransactionInputs;
@Setter
private long changeOutputValue;
@Nullable
@Setter
private String changeOutputAddress;
@Setter @Setter
private boolean useSavingsWallet; private boolean useSavingsWallet;
@Setter @Setter
private long fundsNeededForTradeAsLong; private long fundsNeededForTrade;
@Nullable
@Setter
private byte[] myMultiSigPubKey;
// that is used to store temp. the peers address when we get an incoming message before the message is verified. // that is used to store temp. the peers address when we get an incoming message before the message is verified.
// After successful verified we copy that over to the trade.tradePeerAddress // After successful verified we copy that over to the trade.tradePeerAddress
@Nullable @Nullable
@ -229,9 +208,8 @@ public class ProcessModel implements Model, PersistablePayload {
.setOfferId(offerId) .setOfferId(offerId)
.setAccountId(accountId) .setAccountId(accountId)
.setPubKeyRing(pubKeyRing.toProtoMessage()) .setPubKeyRing(pubKeyRing.toProtoMessage())
.setChangeOutputValue(changeOutputValue)
.setUseSavingsWallet(useSavingsWallet) .setUseSavingsWallet(useSavingsWallet)
.setFundsNeededForTradeAsLong(fundsNeededForTradeAsLong) .setFundsNeededForTrade(fundsNeededForTrade)
.setPaymentSentMessageState(paymentSentMessageStateProperty.get().name()) .setPaymentSentMessageState(paymentSentMessageStateProperty.get().name())
.setBuyerPayoutAmountFromMediation(buyerPayoutAmountFromMediation) .setBuyerPayoutAmountFromMediation(buyerPayoutAmountFromMediation)
.setSellerPayoutAmountFromMediation(sellerPayoutAmountFromMediation) .setSellerPayoutAmountFromMediation(sellerPayoutAmountFromMediation)
@ -241,9 +219,6 @@ public class ProcessModel implements Model, PersistablePayload {
Optional.ofNullable(arbitrator).ifPresent(e -> builder.setArbitrator((protobuf.TradePeer) arbitrator.toProtoMessage())); Optional.ofNullable(arbitrator).ifPresent(e -> builder.setArbitrator((protobuf.TradePeer) arbitrator.toProtoMessage()));
Optional.ofNullable(takeOfferFeeTxId).ifPresent(builder::setTakeOfferFeeTxId); Optional.ofNullable(takeOfferFeeTxId).ifPresent(builder::setTakeOfferFeeTxId);
Optional.ofNullable(payoutTxSignature).ifPresent(e -> builder.setPayoutTxSignature(ByteString.copyFrom(payoutTxSignature))); Optional.ofNullable(payoutTxSignature).ifPresent(e -> builder.setPayoutTxSignature(ByteString.copyFrom(payoutTxSignature)));
Optional.ofNullable(rawTransactionInputs).ifPresent(e -> builder.addAllRawTransactionInputs(ProtoUtil.collectionToProto(rawTransactionInputs, protobuf.RawTransactionInput.class)));
Optional.ofNullable(changeOutputAddress).ifPresent(builder::setChangeOutputAddress);
Optional.ofNullable(myMultiSigPubKey).ifPresent(e -> builder.setMyMultiSigPubKey(ByteString.copyFrom(myMultiSigPubKey)));
Optional.ofNullable(tempTradePeerNodeAddress).ifPresent(e -> builder.setTempTradePeerNodeAddress(tempTradePeerNodeAddress.toProtoMessage())); Optional.ofNullable(tempTradePeerNodeAddress).ifPresent(e -> builder.setTempTradePeerNodeAddress(tempTradePeerNodeAddress.toProtoMessage()));
Optional.ofNullable(makerSignature).ifPresent(e -> builder.setMakerSignature(makerSignature)); Optional.ofNullable(makerSignature).ifPresent(e -> builder.setMakerSignature(makerSignature));
Optional.ofNullable(multisigAddress).ifPresent(e -> builder.setMultisigAddress(multisigAddress)); Optional.ofNullable(multisigAddress).ifPresent(e -> builder.setMultisigAddress(multisigAddress));
@ -259,9 +234,8 @@ public class ProcessModel implements Model, PersistablePayload {
TradePeer taker = TradePeer.fromProto(proto.getTaker(), coreProtoResolver); TradePeer taker = TradePeer.fromProto(proto.getTaker(), coreProtoResolver);
PubKeyRing pubKeyRing = PubKeyRing.fromProto(proto.getPubKeyRing()); PubKeyRing pubKeyRing = PubKeyRing.fromProto(proto.getPubKeyRing());
ProcessModel processModel = new ProcessModel(proto.getOfferId(), proto.getAccountId(), pubKeyRing, arbitrator, maker, taker); ProcessModel processModel = new ProcessModel(proto.getOfferId(), proto.getAccountId(), pubKeyRing, arbitrator, maker, taker);
processModel.setChangeOutputValue(proto.getChangeOutputValue());
processModel.setUseSavingsWallet(proto.getUseSavingsWallet()); processModel.setUseSavingsWallet(proto.getUseSavingsWallet());
processModel.setFundsNeededForTradeAsLong(proto.getFundsNeededForTradeAsLong()); processModel.setFundsNeededForTrade(proto.getFundsNeededForTrade());
processModel.setBuyerPayoutAmountFromMediation(proto.getBuyerPayoutAmountFromMediation()); processModel.setBuyerPayoutAmountFromMediation(proto.getBuyerPayoutAmountFromMediation());
processModel.setSellerPayoutAmountFromMediation(proto.getSellerPayoutAmountFromMediation()); processModel.setSellerPayoutAmountFromMediation(proto.getSellerPayoutAmountFromMediation());
processModel.setDepositsConfirmedMessagesDelivered(proto.getDepositsConfirmedMessagesDelivered()); processModel.setDepositsConfirmedMessagesDelivered(proto.getDepositsConfirmedMessagesDelivered());
@ -269,12 +243,6 @@ public class ProcessModel implements Model, PersistablePayload {
// nullable // nullable
processModel.setTakeOfferFeeTxId(ProtoUtil.stringOrNullFromProto(proto.getTakeOfferFeeTxId())); processModel.setTakeOfferFeeTxId(ProtoUtil.stringOrNullFromProto(proto.getTakeOfferFeeTxId()));
processModel.setPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getPayoutTxSignature())); processModel.setPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getPayoutTxSignature()));
List<RawTransactionInput> rawTransactionInputs = proto.getRawTransactionInputsList().isEmpty() ?
null : proto.getRawTransactionInputsList().stream()
.map(RawTransactionInput::fromProto).collect(Collectors.toList());
processModel.setRawTransactionInputs(rawTransactionInputs);
processModel.setChangeOutputAddress(ProtoUtil.stringOrNullFromProto(proto.getChangeOutputAddress()));
processModel.setMyMultiSigPubKey(ProtoUtil.byteArrayOrNullFromProto(proto.getMyMultiSigPubKey()));
processModel.setTempTradePeerNodeAddress(proto.hasTempTradePeerNodeAddress() ? NodeAddress.fromProto(proto.getTempTradePeerNodeAddress()) : null); processModel.setTempTradePeerNodeAddress(proto.hasTempTradePeerNodeAddress() ? NodeAddress.fromProto(proto.getTempTradePeerNodeAddress()) : null);
processModel.setMediatedPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMediatedPayoutTxSignature())); processModel.setMediatedPayoutTxSignature(ProtoUtil.byteArrayOrNullFromProto(proto.getMediatedPayoutTxSignature()));
processModel.setMakerSignature(proto.getMakerSignature()); processModel.setMakerSignature(proto.getMakerSignature());
@ -311,7 +279,7 @@ public class ProcessModel implements Model, PersistablePayload {
} }
public Coin getFundsNeededForTrade() { public Coin getFundsNeededForTrade() {
return Coin.valueOf(fundsNeededForTradeAsLong); return Coin.valueOf(fundsNeededForTrade);
} }
public MoneroTxWallet resolveTakeOfferFeeTx(Trade trade) { public MoneroTxWallet resolveTakeOfferFeeTx(Trade trade) {

View file

@ -131,7 +131,7 @@ public class ProcessInitTradeRequest extends TradeTask {
// check trade amount // check trade amount
checkArgument(request.getTradeAmount() > 0); checkArgument(request.getTradeAmount() > 0);
trade.setAmount(BigInteger.valueOf(request.getTradeAmount())); checkArgument(request.getTradeAmount() == trade.getAmount().longValueExact(), "Trade amount does not match request's trade amount");
// persist trade // persist trade
processModel.getTradeManager().requestPersistence(); processModel.getTradeManager().requestPersistence();

View file

@ -1,79 +0,0 @@
/*
* This file is part of Haveno.
*
* Haveno is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Haveno is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package haveno.core.trade.protocol.tasks;
import haveno.common.taskrunner.TaskRunner;
import haveno.core.offer.Offer;
import haveno.core.offer.OfferPayload;
import haveno.core.trade.Trade;
import haveno.core.trade.statistics.TradeStatistics2;
import haveno.network.p2p.NodeAddress;
import haveno.network.p2p.network.NetworkNode;
import haveno.network.p2p.network.TorNetworkNode;
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import static com.google.common.base.Preconditions.checkNotNull;
@Slf4j
public class PublishTradeStatistics extends TradeTask {
public PublishTradeStatistics(TaskRunner<Trade> taskHandler, Trade trade) {
super(taskHandler, trade);
}
@Override
protected void run() {
try {
runInterceptHook();
checkNotNull(trade.getMakerDepositTx());
checkNotNull(trade.getTakerDepositTx());
Map<String, String> extraDataMap = new HashMap<>();
if (processModel.getReferralIdService().getOptionalReferralId().isPresent()) {
extraDataMap.put(OfferPayload.REFERRAL_ID, processModel.getReferralIdService().getOptionalReferralId().get());
}
NodeAddress mediatorNodeAddress = checkNotNull(trade.getArbitrator().getNodeAddress());
// The first 4 chars are sufficient to identify a mediator.
// For testing with regtest/localhost we use the full address as its localhost and would result in
// same values for multiple mediators.
NetworkNode networkNode = model.getProcessModel().getP2PService().getNetworkNode();
String address = networkNode instanceof TorNetworkNode ?
mediatorNodeAddress.getFullAddress().substring(0, 4) :
mediatorNodeAddress.getFullAddress();
extraDataMap.put(TradeStatistics2.ARBITRATOR_ADDRESS, address);
Offer offer = checkNotNull(trade.getOffer());
TradeStatistics2 tradeStatistics = new TradeStatistics2(offer.getOfferPayload(),
trade.getPrice(),
trade.getAmount(),
trade.getDate(),
trade.getMaker().getDepositTxHash(),
trade.getTaker().getDepositTxHash(),
extraDataMap);
processModel.getP2PService().addPersistableNetworkPayload(tradeStatistics, true);
complete();
} catch (Throwable t) {
failed(t);
}
}
}

View file

@ -1,377 +0,0 @@
/*
* This file is part of Haveno.
*
* Haveno is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Haveno is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package haveno.core.trade.statistics;
import com.google.protobuf.ByteString;
import haveno.common.app.Capabilities;
import haveno.common.app.Capability;
import haveno.common.crypto.Hash;
import haveno.common.proto.ProtoUtil;
import haveno.common.util.CollectionUtils;
import haveno.common.util.ExtraDataMapValidator;
import haveno.common.util.JsonExclude;
import haveno.common.util.Utilities;
import haveno.core.monetary.Altcoin;
import haveno.core.monetary.AltcoinExchangeRate;
import haveno.core.monetary.Price;
import haveno.core.monetary.Volume;
import haveno.core.offer.Offer;
import haveno.core.offer.OfferDirection;
import haveno.core.offer.OfferPayload;
import haveno.core.trade.HavenoUtils;
import haveno.core.trade.Trade;
import haveno.core.util.JsonUtil;
import haveno.core.util.VolumeUtil;
import haveno.network.p2p.NodeAddress;
import haveno.network.p2p.storage.payload.CapabilityRequiringPayload;
import haveno.network.p2p.storage.payload.PersistableNetworkPayload;
import haveno.network.p2p.storage.payload.ProcessOncePersistableNetworkPayload;
import org.bitcoinj.utils.ExchangeRate;
import org.bitcoinj.utils.Fiat;
import com.google.common.base.Charsets;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Serialized size is about 180-210 byte. Nov 2017 we have 5500 objects
*/
@Deprecated
@Slf4j
@Value
public final class TradeStatistics2 implements ProcessOncePersistableNetworkPayload, PersistableNetworkPayload,
CapabilityRequiringPayload, Comparable<TradeStatistics2> {
public static TradeStatistics2 from(Trade trade,
@Nullable String referralId,
boolean isTorNetworkNode) {
Map<String, String> extraDataMap = new HashMap<>();
if (referralId != null) {
extraDataMap.put(OfferPayload.REFERRAL_ID, referralId);
}
NodeAddress arbitratorNodeAddress = trade.getArbitratorNodeAddress();
if (arbitratorNodeAddress != null) {
// The first 4 chars are sufficient to identify a arbitrator.
// For testing with regtest/localhost we use the full address as its localhost and would result in
// same values for multiple arbitrators.
String address = isTorNetworkNode ?
arbitratorNodeAddress.getFullAddress().substring(0, 4) :
arbitratorNodeAddress.getFullAddress();
extraDataMap.put(TradeStatistics2.ARBITRATOR_ADDRESS, address);
}
Offer offer = trade.getOffer();
checkNotNull(offer, "offer must not ne null");
checkNotNull(trade.getAmount(), "trade.getTradeAmount() must not ne null");
return new TradeStatistics2(offer.getOfferPayload(),
trade.getPrice(),
trade.getAmount(),
trade.getDate(),
trade.getMaker().getDepositTxHash(),
trade.getTaker().getDepositTxHash(),
extraDataMap);
}
@SuppressWarnings("SpellCheckingInspection")
public static final String ARBITRATOR_ADDRESS = "arbAddr";
@SuppressWarnings("SpellCheckingInspection")
public static final String REFUND_AGENT_ADDRESS = "refAddr";
private final OfferDirection direction;
private final String baseCurrency;
private final String counterCurrency;
private final String offerPaymentMethod;
private final long offerDate;
private final boolean offerUseMarketBasedPrice;
private final double offerMarketPriceMargin;
private final long offerAmount;
private final long offerMinAmount;
private final String offerId;
private final long tradePrice;
private final long tradeAmount;
// tradeDate is different for both peers so we ignore it for hash
@JsonExclude
private final long tradeDate;
@JsonExclude
@Nullable
private final String makerDepositTxId;
@Nullable
private final String takerDepositTxId;
// Hash get set in constructor from json of all the other data fields (with hash = null).
@JsonExclude
private final byte[] hash;
// PB field signature_pub_key_bytes not used anymore from v0.6 on
// Should be only used in emergency case if we need to add data but do not want to break backward compatibility
// at the P2P network storage checks. The hash of the object will be used to verify if the data is valid. Any new
// field in a class would break that hash and therefore break the storage mechanism.
@Nullable
@JsonExclude
private Map<String, String> extraDataMap;
public TradeStatistics2(OfferPayload offerPayload,
Price tradePrice,
BigInteger tradeAmount,
Date tradeDate,
String makerDepositTxId,
String takerDepositTxId,
Map<String, String> extraDataMap) {
this(offerPayload.getDirection(),
offerPayload.getBaseCurrencyCode(),
offerPayload.getCounterCurrencyCode(),
offerPayload.getPaymentMethodId(),
offerPayload.getDate(),
offerPayload.isUseMarketBasedPrice(),
offerPayload.getMarketPriceMarginPct(),
offerPayload.getAmount(),
offerPayload.getMinAmount(),
offerPayload.getId(),
tradePrice.getValue(),
tradeAmount.longValueExact(),
tradeDate.getTime(),
makerDepositTxId,
takerDepositTxId,
null,
extraDataMap);
}
///////////////////////////////////////////////////////////////////////////////////////////
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
public TradeStatistics2(OfferDirection direction,
String baseCurrency,
String counterCurrency,
String offerPaymentMethod,
long offerDate,
boolean offerUseMarketBasedPrice,
double offerMarketPriceMargin,
long offerAmount,
long offerMinAmount,
String offerId,
long tradePrice,
long tradeAmount,
long tradeDate,
@Nullable String makerDepositTxId,
@Nullable String takerDepositTxId,
@Nullable byte[] hash,
@Nullable Map<String, String> extraDataMap) {
this.direction = direction;
this.baseCurrency = baseCurrency;
this.counterCurrency = counterCurrency;
this.offerPaymentMethod = offerPaymentMethod;
this.offerDate = offerDate;
this.offerUseMarketBasedPrice = offerUseMarketBasedPrice;
this.offerMarketPriceMargin = offerMarketPriceMargin;
this.offerAmount = offerAmount;
this.offerMinAmount = offerMinAmount;
this.offerId = offerId;
this.tradePrice = tradePrice;
this.tradeAmount = tradeAmount;
this.tradeDate = tradeDate;
this.makerDepositTxId = makerDepositTxId;
this.takerDepositTxId = takerDepositTxId;
this.extraDataMap = ExtraDataMapValidator.getValidatedExtraDataMap(extraDataMap);
this.hash = hash == null ? createHash() : hash;
}
public byte[] createHash() {
// We create hash from all fields excluding hash itself. We use json as simple data serialisation.
// TradeDate is different for both peers so we ignore it for hash. ExtraDataMap is ignored as well as at
// software updates we might have different entries which would cause a different hash.
return Hash.getSha256Ripemd160hash(JsonUtil.objectToJson(this).getBytes(Charsets.UTF_8));
}
private protobuf.TradeStatistics2.Builder getBuilder() {
final protobuf.TradeStatistics2.Builder builder = protobuf.TradeStatistics2.newBuilder()
.setDirection(OfferDirection.toProtoMessage(direction))
.setBaseCurrency(baseCurrency)
.setCounterCurrency(counterCurrency)
.setPaymentMethodId(offerPaymentMethod)
.setOfferDate(offerDate)
.setOfferUseMarketBasedPrice(offerUseMarketBasedPrice)
.setOfferMarketPriceMargin(offerMarketPriceMargin)
.setOfferAmount(offerAmount)
.setOfferMinAmount(offerMinAmount)
.setOfferId(offerId)
.setTradePrice(tradePrice)
.setTradeAmount(tradeAmount)
.setTradeDate(tradeDate)
.setHash(ByteString.copyFrom(hash));
Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData);
Optional.ofNullable(makerDepositTxId).ifPresent(builder::setMakerDepositTxId);
Optional.ofNullable(takerDepositTxId).ifPresent(builder::setTakerDepositTxId);
return builder;
}
public protobuf.TradeStatistics2 toProtoTradeStatistics2() {
return getBuilder().build();
}
@Override
public protobuf.PersistableNetworkPayload toProtoMessage() {
return protobuf.PersistableNetworkPayload.newBuilder().setTradeStatistics2(getBuilder()).build();
}
public static TradeStatistics2 fromProto(protobuf.TradeStatistics2 proto) {
return new TradeStatistics2(
OfferDirection.fromProto(proto.getDirection()),
proto.getBaseCurrency(),
proto.getCounterCurrency(),
proto.getPaymentMethodId(),
proto.getOfferDate(),
proto.getOfferUseMarketBasedPrice(),
proto.getOfferMarketPriceMargin(),
proto.getOfferAmount(),
proto.getOfferMinAmount(),
proto.getOfferId(),
proto.getTradePrice(),
proto.getTradeAmount(),
proto.getTradeDate(),
ProtoUtil.stringOrNullFromProto(proto.getMakerDepositTxId()),
ProtoUtil.stringOrNullFromProto(proto.getTakerDepositTxId()),
null, // We want to clean up the hashes with the changed hash method in v.1.2.0 so we don't use the value from the proto
CollectionUtils.isEmpty(proto.getExtraDataMap()) ? null : proto.getExtraDataMap());
}
///////////////////////////////////////////////////////////////////////////////////////////
// API
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public byte[] getHash() {
return hash;
}
@Override
public boolean verifyHashSize() {
checkNotNull(hash, "hash must not be null");
return hash.length == 20;
}
// With v1.2.0 we changed the way how the hash is created. To not create too heavy load for seed nodes from
// requests from old nodes we use the TRADE_STATISTICS_HASH_UPDATE capability to send trade statistics only to new
// nodes. As trade statistics are only used for informational purpose it will not have any critical issue for the
// old nodes beside that they don't see the latest trades. We added TRADE_STATISTICS_HASH_UPDATE in v1.2.2 to fix a
// problem of not handling the hashes correctly.
@Override
public Capabilities getRequiredCapabilities() {
return new Capabilities(Capability.TRADE_STATISTICS_HASH_UPDATE);
}
///////////////////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////////////////
public Date getTradeDate() {
return new Date(tradeDate);
}
public Price getPrice() {
return Price.valueOf(getCurrencyCode(), tradePrice);
}
public String getCurrencyCode() {
return baseCurrency.equals("XMR") ? counterCurrency : baseCurrency;
}
public BigInteger getTradeAmount() {
return BigInteger.valueOf(tradeAmount);
}
public Volume getTradeVolume() {
if (getPrice().getMonetary() instanceof Altcoin) {
return new Volume(new AltcoinExchangeRate((Altcoin) getPrice().getMonetary()).coinToAltcoin(HavenoUtils.atomicUnitsToCoin(getTradeAmount())));
} else {
Volume volume = new Volume(new ExchangeRate((Fiat) getPrice().getMonetary()).coinToFiat(HavenoUtils.atomicUnitsToCoin(getTradeAmount())));
return VolumeUtil.getRoundedFiatVolume(volume);
}
}
public boolean isValid() {
// Exclude a disputed BSQ trade where the price was off by a factor 10 due to a mistake by the maker.
// Since the trade wasn't executed it's better to filter it out to avoid it having an undue influence on the
// BSQ trade stats.
boolean excludedFailedTrade = offerId.equals("6E5KOI6O-3a06a037-6f03-4bfa-98c2-59f49f73466a-112");
boolean makerDepositTxIdValid = makerDepositTxId == null || !makerDepositTxId.isEmpty();
boolean takerDepositTxIdValid = takerDepositTxId == null || !takerDepositTxId.isEmpty();
return tradeAmount > 0 && tradePrice > 0 && !excludedFailedTrade && makerDepositTxIdValid && takerDepositTxIdValid;
}
// TODO: Can be removed as soon as everyone uses v1.2.6+
@Override
public int compareTo(@NotNull TradeStatistics2 o) {
if (direction.equals(o.direction) &&
baseCurrency.equals(o.baseCurrency) &&
counterCurrency.equals(o.counterCurrency) &&
offerPaymentMethod.equals(o.offerPaymentMethod) &&
offerDate == o.offerDate &&
offerUseMarketBasedPrice == o.offerUseMarketBasedPrice &&
offerAmount == o.offerAmount &&
offerMinAmount == o.offerMinAmount &&
offerId.equals(o.offerId) &&
tradePrice == o.tradePrice &&
tradeAmount == o.tradeAmount) {
return 0;
}
return -1;
}
@Override
public String toString() {
return "TradeStatistics2{" +
"\n direction=" + direction +
",\n baseCurrency='" + baseCurrency + '\'' +
",\n counterCurrency='" + counterCurrency + '\'' +
",\n offerPaymentMethod='" + offerPaymentMethod + '\'' +
",\n offerDate=" + offerDate +
",\n offerUseMarketBasedPrice=" + offerUseMarketBasedPrice +
",\n offerMarketPriceMargin=" + offerMarketPriceMargin +
",\n offerAmount=" + offerAmount +
",\n offerMinAmount=" + offerMinAmount +
",\n offerId='" + offerId + '\'' +
",\n tradePrice=" + tradePrice +
",\n tradeAmount=" + tradeAmount +
",\n tradeDate=" + tradeDate +
",\n makerDepositTxId='" + makerDepositTxId + '\'' +
",\n takerDepositTxId='" + takerDepositTxId + '\'' +
",\n hash=" + Utilities.bytesAsHexString(hash) +
",\n extraDataMap=" + extraDataMap +
"\n}";
}
}

View file

@ -1,105 +0,0 @@
/*
* This file is part of Haveno.
*
* Haveno is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Haveno is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package haveno.core.trade.statistics;
import haveno.common.config.Config;
import haveno.common.persistence.PersistenceManager;
import haveno.network.p2p.storage.P2PDataStorage;
import haveno.network.p2p.storage.payload.PersistableNetworkPayload;
import haveno.network.p2p.storage.persistence.MapStoreService;
import javax.inject.Inject;
import javax.inject.Named;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TradeStatistics2StorageService extends MapStoreService<TradeStatistics2Store, PersistableNetworkPayload> {
private static final String FILE_NAME = "TradeStatistics2Store";
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
@Inject
public TradeStatistics2StorageService(@Named(Config.STORAGE_DIR) File storageDir,
PersistenceManager<TradeStatistics2Store> persistenceManager) {
super(storageDir, persistenceManager);
}
///////////////////////////////////////////////////////////////////////////////////////////
// API
///////////////////////////////////////////////////////////////////////////////////////////
@Override
protected void initializePersistenceManager() {
persistenceManager.initialize(store, PersistenceManager.Source.NETWORK);
}
@Override
public String getFileName() {
return FILE_NAME;
}
@Override
public Map<P2PDataStorage.ByteArray, PersistableNetworkPayload> getMap() {
// As it is used for data request and response and we do not want to send any old trade stat data anymore.
return new HashMap<>();
}
// We overwrite that method to receive old trade stats from the network. As we deactivated getMap to not deliver
// hashes we needed to use the getMapOfAllData method to actually store the data.
// That's a bit of a hack but it's just for transition and can be removed after a few months anyway.
// Alternatively we could create a new interface to handle it differently on the other client classes but that
// seems to be not justified as it is needed only temporarily.
@Override
protected PersistableNetworkPayload putIfAbsent(P2PDataStorage.ByteArray hash, PersistableNetworkPayload payload) {
return getMapOfAllData().putIfAbsent(hash, payload);
}
@Override
protected void readFromResources(String postFix, Runnable completeHandler) {
// We do not attempt to read from resources as that file is not provided anymore
readStore(persisted -> completeHandler.run());
}
public Map<P2PDataStorage.ByteArray, PersistableNetworkPayload> getMapOfAllData() {
return store.getMap();
}
@Override
public boolean canHandle(PersistableNetworkPayload payload) {
return payload instanceof TradeStatistics2;
}
///////////////////////////////////////////////////////////////////////////////////////////
// Protected
///////////////////////////////////////////////////////////////////////////////////////////
@Override
protected TradeStatistics2Store createStore() {
return new TradeStatistics2Store();
}
}

View file

@ -1,66 +0,0 @@
/*
* This file is part of Haveno.
*
* Haveno is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Haveno is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package haveno.core.trade.statistics;
import com.google.protobuf.Message;
import haveno.network.p2p.storage.persistence.PersistableNetworkPayloadStore;
import java.util.List;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
/**
* We store only the payload in the PB file to save disc space. The hash of the payload can be created anyway and
* is only used as key in the map. So we have a hybrid data structure which is represented as list in the protobuffer
* definition and provide a hashMap for the domain access.
*/
@Slf4j
public class TradeStatistics2Store extends PersistableNetworkPayloadStore<TradeStatistics2> {
TradeStatistics2Store() {
}
///////////////////////////////////////////////////////////////////////////////////////////
// PROTO BUFFER
///////////////////////////////////////////////////////////////////////////////////////////
private TradeStatistics2Store(List<TradeStatistics2> list) {
super(list);
}
public Message toProtoMessage() {
return protobuf.PersistableEnvelope.newBuilder()
.setTradeStatistics2Store(getBuilder())
.build();
}
private protobuf.TradeStatistics2Store.Builder getBuilder() {
final List<protobuf.TradeStatistics2> protoList = map.values().stream()
.map(payload -> (TradeStatistics2) payload)
.map(TradeStatistics2::toProtoTradeStatistics2)
.collect(Collectors.toList());
return protobuf.TradeStatistics2Store.newBuilder().addAllItems(protoList);
}
public static TradeStatistics2Store fromProto(protobuf.TradeStatistics2Store proto) {
List<TradeStatistics2> list = proto.getItemsList().stream()
.map(TradeStatistics2::fromProto).collect(Collectors.toList());
return new TradeStatistics2Store(list);
}
}

View file

@ -94,7 +94,7 @@ public final class TradeStatistics3 implements ProcessOncePersistableNetworkPayl
Offer offer = checkNotNull(trade.getOffer()); Offer offer = checkNotNull(trade.getOffer());
return new TradeStatistics3(offer.getCurrencyCode(), return new TradeStatistics3(offer.getCurrencyCode(),
trade.getPrice().getValue(), trade.getPrice().getValue(),
trade.getAmountAsLong(), trade.getAmount().longValueExact(),
offer.getPaymentMethod().getId(), offer.getPaymentMethod().getId(),
trade.getTakeOfferDate().getTime(), trade.getTakeOfferDate().getTime(),
truncatedArbitratorNodeAddress, truncatedArbitratorNodeAddress,

View file

@ -1,173 +0,0 @@
/*
* This file is part of Haveno.
*
* Haveno is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Haveno is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package haveno.core.trade.statistics;
import com.google.inject.Inject;
import haveno.common.UserThread;
import haveno.common.config.Config;
import haveno.common.file.FileUtil;
import haveno.common.util.Utilities;
import haveno.core.offer.availability.DisputeAgentSelection;
import haveno.network.p2p.BootstrapListener;
import haveno.network.p2p.P2PService;
import haveno.network.p2p.storage.P2PDataStorage;
import haveno.network.p2p.storage.payload.PersistableNetworkPayload;
import haveno.network.p2p.storage.persistence.AppendOnlyDataStoreService;
import javax.inject.Named;
import javax.inject.Singleton;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import lombok.extern.slf4j.Slf4j;
@Singleton
@Slf4j
public class TradeStatisticsConverter {
private ExecutorService executor;
@Inject
public TradeStatisticsConverter(P2PService p2PService,
P2PDataStorage p2PDataStorage,
TradeStatistics2StorageService tradeStatistics2StorageService,
TradeStatistics3StorageService tradeStatistics3StorageService,
AppendOnlyDataStoreService appendOnlyDataStoreService,
@Named(Config.STORAGE_DIR) File storageDir) {
File tradeStatistics2Store = new File(storageDir, "TradeStatistics2Store");
appendOnlyDataStoreService.addService(tradeStatistics2StorageService);
p2PService.addP2PServiceListener(new BootstrapListener() {
@Override
public void onTorNodeReady() {
if (!tradeStatistics2Store.exists()) {
return;
}
executor = Utilities.getSingleThreadExecutor("TradeStatisticsConverter");
executor.submit(() -> {
// We convert early once tor is initialized but still not ready to receive data
Map<P2PDataStorage.ByteArray, PersistableNetworkPayload> tempMap = new HashMap<>();
convertToTradeStatistics3(tradeStatistics2StorageService.getMapOfAllData().values())
.forEach(e -> tempMap.put(new P2PDataStorage.ByteArray(e.getHash()), e));
// We map to user thread to avoid potential threading issues
UserThread.execute(() -> {
tradeStatistics3StorageService.getMapOfLiveData().putAll(tempMap);
tradeStatistics3StorageService.persistNow();
});
try {
log.info("We delete now the old trade statistics file as it was converted to the new format.");
FileUtil.deleteFileIfExists(tradeStatistics2Store);
} catch (IOException e) {
e.printStackTrace();
log.error(e.toString());
}
});
}
@Override
public void onUpdatedDataReceived() {
}
});
// We listen to old TradeStatistics2 objects, convert and store them and rebroadcast.
p2PDataStorage.addAppendOnlyDataStoreListener(payload -> {
if (payload instanceof TradeStatistics2) {
TradeStatistics3 tradeStatistics3 = convertToTradeStatistics3((TradeStatistics2) payload);
// We add it to the p2PDataStorage, which handles to get the data stored in the maps and maybe
// re-broadcast as tradeStatistics3 object if not already received.
p2PDataStorage.addPersistableNetworkPayload(tradeStatistics3, null, true);
}
});
}
public void shutDown() {
if (executor != null)
executor.shutdown();
}
private static List<TradeStatistics3> convertToTradeStatistics3(Collection<PersistableNetworkPayload> persistableNetworkPayloads) {
List<TradeStatistics3> list = new ArrayList<>();
long ts = System.currentTimeMillis();
// We might have duplicate entries from both traders as the trade date was different from old clients.
// This should not be the case with converting old persisted data as we did filter those out but it is the case
// when we receive old trade stat objects from the network of 2 not updated traders.
// The hash was ignoring the trade date so we use that to get a unique list
Map<P2PDataStorage.ByteArray, TradeStatistics2> mapWithoutDuplicates = new HashMap<>();
persistableNetworkPayloads.stream()
.filter(e -> e instanceof TradeStatistics2)
.map(e -> (TradeStatistics2) e)
.filter(TradeStatistics2::isValid)
.forEach(e -> mapWithoutDuplicates.putIfAbsent(new P2PDataStorage.ByteArray(e.getHash()), e));
log.info("We convert the existing {} trade statistics objects to the new format.", mapWithoutDuplicates.size());
mapWithoutDuplicates.values().stream()
.map(TradeStatisticsConverter::convertToTradeStatistics3)
.filter(TradeStatistics3::isValid)
.forEach(list::add);
int size = list.size();
log.info("Conversion to {} new trade statistic objects has been completed after {} ms",
size, System.currentTimeMillis() - ts);
// We prune mediator and refundAgent data from all objects but the last 100 as we only use the
// last 100 entries (DisputeAgentSelection.LOOK_BACK_RANGE).
list.sort(Comparator.comparing(TradeStatistics3::getDateAsLong));
if (size > DisputeAgentSelection.LOOK_BACK_RANGE) {
int start = size - DisputeAgentSelection.LOOK_BACK_RANGE;
for (int i = start; i < size; i++) {
TradeStatistics3 tradeStatistics3 = list.get(i);
tradeStatistics3.pruneOptionalData();
}
}
return list;
}
private static TradeStatistics3 convertToTradeStatistics3(TradeStatistics2 tradeStatistics2) {
Map<String, String> extraDataMap = tradeStatistics2.getExtraDataMap();
String mediator = extraDataMap != null ? extraDataMap.get(TradeStatistics2.ARBITRATOR_ADDRESS) : null; // TODO (woodser): using mediator as arbitrator
long time = tradeStatistics2.getTradeDate().getTime();
// We need to avoid that we duplicate tradeStatistics2 objects in case both traders have not updated yet.
// Before v1.4.0 both traders published the trade statistics. If one trader has updated he will check
// the capabilities of the peer and if the peer has not updated he will leave publishing to the peer, so we
// do not have the problem of duplicated objects.
// Also at conversion of locally stored old trade statistics we need to avoid duplicated entries.
// To ensure we add only one object we will use the hash of the tradeStatistics2 object which is the same
// for both traders as it excluded the trade date which is different for both.
byte[] hash = tradeStatistics2.getHash();
return new TradeStatistics3(tradeStatistics2.getCurrencyCode(),
tradeStatistics2.getPrice().getValue(),
tradeStatistics2.getTradeAmount().longValueExact(),
tradeStatistics2.getOfferPaymentMethod(),
time,
mediator,
hash);
}
}

View file

@ -20,7 +20,6 @@ package haveno.core.trade.statistics;
import com.google.inject.Inject; import com.google.inject.Inject;
import haveno.common.config.Config; import haveno.common.config.Config;
import haveno.common.file.JsonFileManager; import haveno.common.file.JsonFileManager;
import haveno.common.util.Utilities;
import haveno.core.locale.CurrencyTuple; import haveno.core.locale.CurrencyTuple;
import haveno.core.locale.CurrencyUtil; import haveno.core.locale.CurrencyUtil;
import haveno.core.locale.Res; import haveno.core.locale.Res;
@ -57,7 +56,6 @@ public class TradeStatisticsManager {
private final P2PService p2PService; private final P2PService p2PService;
private final PriceFeedService priceFeedService; private final PriceFeedService priceFeedService;
private final TradeStatistics3StorageService tradeStatistics3StorageService; private final TradeStatistics3StorageService tradeStatistics3StorageService;
private final TradeStatisticsConverter tradeStatisticsConverter;
private final File storageDir; private final File storageDir;
private final boolean dumpStatistics; private final boolean dumpStatistics;
private final ObservableSet<TradeStatistics3> observableTradeStatisticsSet = FXCollections.observableSet(); private final ObservableSet<TradeStatistics3> observableTradeStatisticsSet = FXCollections.observableSet();
@ -68,13 +66,11 @@ public class TradeStatisticsManager {
PriceFeedService priceFeedService, PriceFeedService priceFeedService,
TradeStatistics3StorageService tradeStatistics3StorageService, TradeStatistics3StorageService tradeStatistics3StorageService,
AppendOnlyDataStoreService appendOnlyDataStoreService, AppendOnlyDataStoreService appendOnlyDataStoreService,
TradeStatisticsConverter tradeStatisticsConverter,
@Named(Config.STORAGE_DIR) File storageDir, @Named(Config.STORAGE_DIR) File storageDir,
@Named(Config.DUMP_STATISTICS) boolean dumpStatistics) { @Named(Config.DUMP_STATISTICS) boolean dumpStatistics) {
this.p2PService = p2PService; this.p2PService = p2PService;
this.priceFeedService = priceFeedService; this.priceFeedService = priceFeedService;
this.tradeStatistics3StorageService = tradeStatistics3StorageService; this.tradeStatistics3StorageService = tradeStatistics3StorageService;
this.tradeStatisticsConverter = tradeStatisticsConverter;
this.storageDir = storageDir; this.storageDir = storageDir;
this.dumpStatistics = dumpStatistics; this.dumpStatistics = dumpStatistics;
@ -83,7 +79,6 @@ public class TradeStatisticsManager {
} }
public void shutDown() { public void shutDown() {
tradeStatisticsConverter.shutDown();
if (jsonFileManager != null) { if (jsonFileManager != null) {
jsonFileManager.shutDown(); jsonFileManager.shutDown();
} }
@ -184,17 +179,6 @@ public class TradeStatisticsManager {
return; return;
} }
// If we did not find a TradeStatistics3 we look up if we find a TradeStatistics3 converted from
// TradeStatistics2 where we used the original hash, which is not the native hash of the
// TradeStatistics3 but of TradeStatistics2.
TradeStatistics2 tradeStatistics2 = TradeStatistics2.from(trade, referralId, isTorNetworkNode);
boolean hasTradeStatistics2 = hashes.contains(new P2PDataStorage.ByteArray(tradeStatistics2.getHash()));
if (hasTradeStatistics2) {
log.debug("Trade: {}. We have already a tradeStatistics matching the hash of tradeStatistics2. ",
trade.getShortId());
return;
}
if (!tradeStatistics3.isValid()) { if (!tradeStatistics3.isValid()) {
log.warn("Trade: {}. Trade statistics is invalid. We do not publish it.", tradeStatistics3); log.warn("Trade: {}. Trade statistics is invalid. We do not publish it.", tradeStatistics3);
return; return;

View file

@ -328,7 +328,7 @@ class XmrTxProofRequestsPerTrade implements AssetTxProofRequestsPerTrade {
BigInteger tradeLimit = BigInteger.valueOf(autoConfirmSettings.getTradeLimit()); BigInteger tradeLimit = BigInteger.valueOf(autoConfirmSettings.getTradeLimit());
if (tradeAmount != null && tradeAmount.compareTo(tradeLimit) > 0) { if (tradeAmount != null && tradeAmount.compareTo(tradeLimit) > 0) {
log.warn("Trade amount {} is higher than limit from auto-conf setting {}.", log.warn("Trade amount {} is higher than limit from auto-conf setting {}.",
HavenoUtils.formatToXmrWithCode(tradeAmount), HavenoUtils.formatToXmrWithCode(tradeLimit)); HavenoUtils.formatXmr(tradeAmount, true), HavenoUtils.formatXmr(tradeLimit, true));
return true; return true;
} }
return false; return false;

View file

@ -912,7 +912,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid
void setSelectedPaymentAccountForCreateOffer(@Nullable PaymentAccount paymentAccount); void setSelectedPaymentAccountForCreateOffer(@Nullable PaymentAccount paymentAccount);
void setPayFeeInBtc(boolean payFeeInBtc); void setPayFeeInXmr(boolean payFeeInXmr);
void setFiatCurrencies(List<FiatCurrency> currencies); void setFiatCurrencies(List<FiatCurrency> currencies);

View file

@ -89,9 +89,6 @@ public final class PreferencesPayload implements PersistableEnvelope {
private List<String> ignoreTradersList = new ArrayList<>(); private List<String> ignoreTradersList = new ArrayList<>();
private String directoryChooserPath; private String directoryChooserPath;
@Deprecated // Superseded by buyerSecurityDepositAsPercent
private long buyerSecurityDepositAsLong;
private boolean useAnimations; private boolean useAnimations;
private int cssTheme; private int cssTheme;
@Nullable @Nullable
@ -178,7 +175,6 @@ public final class PreferencesPayload implements PersistableEnvelope {
.setBitcoinNodes(bitcoinNodes) .setBitcoinNodes(bitcoinNodes)
.addAllIgnoreTradersList(ignoreTradersList) .addAllIgnoreTradersList(ignoreTradersList)
.setDirectoryChooserPath(directoryChooserPath) .setDirectoryChooserPath(directoryChooserPath)
.setBuyerSecurityDepositAsLong(buyerSecurityDepositAsLong)
.setUseAnimations(useAnimations) .setUseAnimations(useAnimations)
.setCssTheme(cssTheme) .setCssTheme(cssTheme)
.setBridgeOptionOrdinal(bridgeOptionOrdinal) .setBridgeOptionOrdinal(bridgeOptionOrdinal)
@ -268,7 +264,6 @@ public final class PreferencesPayload implements PersistableEnvelope {
proto.getBitcoinNodes(), proto.getBitcoinNodes(),
proto.getIgnoreTradersListList(), proto.getIgnoreTradersListList(),
proto.getDirectoryChooserPath(), proto.getDirectoryChooserPath(),
proto.getBuyerSecurityDepositAsLong(),
proto.getUseAnimations(), proto.getUseAnimations(),
proto.getCssTheme(), proto.getCssTheme(),
paymentAccount, paymentAccount,

View file

@ -28,6 +28,9 @@ import haveno.core.monetary.AltcoinExchangeRate;
import haveno.core.monetary.Price; import haveno.core.monetary.Price;
import haveno.core.monetary.Volume; import haveno.core.monetary.Volume;
import haveno.core.offer.Offer; import haveno.core.offer.Offer;
import haveno.core.trade.HavenoUtils;
import java.math.BigInteger;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.NumberFormat; import java.text.NumberFormat;
@ -64,11 +67,12 @@ public class VolumeUtil {
return Volume.parse(String.valueOf(roundedVolume), volumeByAmount.getCurrencyCode()); return Volume.parse(String.valueOf(roundedVolume), volumeByAmount.getCurrencyCode());
} }
public static Volume getVolume(Coin amount, Price price) { public static Volume getVolume(BigInteger amount, Price price) {
// TODO: conversion to Coin loses precision
if (price.getMonetary() instanceof Altcoin) { if (price.getMonetary() instanceof Altcoin) {
return new Volume(new AltcoinExchangeRate((Altcoin) price.getMonetary()).coinToAltcoin(amount)); return new Volume(new AltcoinExchangeRate((Altcoin) price.getMonetary()).coinToAltcoin(HavenoUtils.atomicUnitsToCoin(amount)));
} else { } else {
return new Volume(new ExchangeRate((Fiat) price.getMonetary()).coinToFiat(amount)); return new Volume(new ExchangeRate((Fiat) price.getMonetary()).coinToFiat(HavenoUtils.atomicUnitsToCoin(amount)));
} }
} }

View file

@ -45,10 +45,10 @@ public class IntegerValidator extends InputValidator {
return new ValidationResult(false, Res.get("validation.notAnInteger")); return new ValidationResult(false, Res.get("validation.notAnInteger"));
if (isBelowMinValue(intValue)) if (isBelowMinValue(intValue))
return new ValidationResult(false, Res.get("validation.btc.toSmall", minValue)); return new ValidationResult(false, Res.get("validation.xmr.tooSmall", minValue));
if (isAboveMaxValue(intValue)) if (isAboveMaxValue(intValue))
return new ValidationResult(false, Res.get("validation.btc.toLarge", maxValue)); return new ValidationResult(false, Res.get("validation.xmr.tooLarge", maxValue));
return validationResult; return validationResult;
} }

View file

@ -53,7 +53,7 @@ public abstract class MonetaryValidator extends NumberValidator {
protected ValidationResult validateIfNotExceedsMinValue(String input) { protected ValidationResult validateIfNotExceedsMinValue(String input) {
double d = Double.parseDouble(input); double d = Double.parseDouble(input);
if (d < getMinValue()) if (d < getMinValue())
return new ValidationResult(false, Res.get("validation.fiat.toSmall")); return new ValidationResult(false, Res.get("validation.fiat.tooSmall"));
else else
return new ValidationResult(true); return new ValidationResult(true);
} }
@ -61,7 +61,7 @@ public abstract class MonetaryValidator extends NumberValidator {
protected ValidationResult validateIfNotExceedsMaxValue(String input) { protected ValidationResult validateIfNotExceedsMaxValue(String input) {
double d = Double.parseDouble(input); double d = Double.parseDouble(input);
if (d > getMaxValue()) if (d > getMaxValue())
return new ValidationResult(false, Res.get("validation.fiat.toLarge")); return new ValidationResult(false, Res.get("validation.fiat.tooLarge"));
else else
return new ValidationResult(true); return new ValidationResult(true);
} }

View file

@ -2009,8 +2009,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in XMR
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=Enter password to unlock walletPasswordWindow.headline=Enter password to unlock
torNetworkSettingWindow.header=Tor networks settings torNetworkSettingWindow.header=Tor networks settings
@ -3230,11 +3230,11 @@ validation.NaN=Input is not a valid number.
validation.notAnInteger=Input is not an integer value. validation.notAnInteger=Input is not an integer value.
validation.zero=Input of 0 is not allowed. validation.zero=Input of 0 is not allowed.
validation.negative=A negative value is not allowed. validation.negative=A negative value is not allowed.
validation.fiat.toSmall=Input smaller than minimum possible amount is not allowed. validation.fiat.tooSmall=Input smaller than minimum possible amount is not allowed.
validation.fiat.toLarge=Input larger than maximum possible amount is not allowed. validation.fiat.tooLarge=Input larger than maximum possible amount is not allowed.
validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.xmr.fraction=Input will result in a bitcoin value of less than 1 satoshi
validation.btc.toLarge=Input larger than {0} is not allowed. validation.xmr.tooLarge=Input larger than {0} is not allowed.
validation.btc.toSmall=Input smaller than {0} is not allowed. validation.xmr.tooSmall=Input smaller than {0} is not allowed.
validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters.
validation.passwordTooLong=The password you entered is too long. It cannot be longer than 50 characters. validation.passwordTooLong=The password you entered is too long. It cannot be longer than 50 characters.
validation.sortCodeNumber={0} must consist of {1} numbers. validation.sortCodeNumber={0} must consist of {1} numbers.

View file

@ -1511,8 +1511,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} podle aktuální tržní ce
closedTradesSummaryWindow.totalVolume.title=Celkový objem obchodovaný v {0} closedTradesSummaryWindow.totalVolume.title=Celkový objem obchodovaný v {0}
closedTradesSummaryWindow.totalMinerFee.title=Suma poplatků za těžbu closedTradesSummaryWindow.totalMinerFee.title=Suma poplatků za těžbu
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} z celkového objemu obchodů) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} z celkového objemu obchodů)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Suma obchodních poplatků v BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Suma obchodních poplatků v BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} z celkového objemu obchodů) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} z celkového objemu obchodů)
walletPasswordWindow.headline=Pro odemknutí zadejte heslo walletPasswordWindow.headline=Pro odemknutí zadejte heslo
torNetworkSettingWindow.header=Nastavení sítě Tor torNetworkSettingWindow.header=Nastavení sítě Tor
@ -2152,11 +2152,11 @@ validation.NaN=Vstup není platné číslo.
validation.notAnInteger=Vstup není celočíselná hodnota. validation.notAnInteger=Vstup není celočíselná hodnota.
validation.zero=Vstup 0 není povolen. validation.zero=Vstup 0 není povolen.
validation.negative=Záporná hodnota není povolena. validation.negative=Záporná hodnota není povolena.
validation.fiat.toSmall=Vstup menší než minimální možné množství není povolen. validation.fiat.tooSmall=Vstup menší než minimální možné množství není povolen.
validation.fiat.toLarge=Vstup větší než maximální možné množství není povolen. validation.fiat.tooLarge=Vstup větší než maximální možné množství není povolen.
validation.btc.fraction=Zadání povede k hodnotě bitcoinu menší než 1 satoshi validation.xmr.fraction=Zadání povede k hodnotě bitcoinu menší než 1 satoshi
validation.btc.toLarge=Vstup větší než {0} není povolen. validation.xmr.tooLarge=Vstup větší než {0} není povolen.
validation.btc.toSmall=Vstup menší než {0} není povolen. validation.xmr.tooSmall=Vstup menší než {0} není povolen.
validation.passwordTooShort=Zadané heslo je příliš krátké. Musí mít min. 8 znaků. validation.passwordTooShort=Zadané heslo je příliš krátké. Musí mít min. 8 znaků.
validation.passwordTooLong=Zadané heslo je příliš dlouhé. Nemůže být delší než 50 znaků. validation.passwordTooLong=Zadané heslo je příliš dlouhé. Nemůže být delší než 50 znaků.
validation.sortCodeNumber={0} se musí skládat z {1} čísel. validation.sortCodeNumber={0} se musí skládat z {1} čísel.

View file

@ -1511,8 +1511,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=Passwort zum Entsperren eingeben walletPasswordWindow.headline=Passwort zum Entsperren eingeben
torNetworkSettingWindow.header=Tor-Netzwerkeinstellungen torNetworkSettingWindow.header=Tor-Netzwerkeinstellungen
@ -2152,11 +2152,11 @@ validation.NaN=Die Eingabe ist keine gültige Zahl.
validation.notAnInteger=Eingabe ist keine ganze Zahl. validation.notAnInteger=Eingabe ist keine ganze Zahl.
validation.zero=Die Eingabe von 0 ist nicht erlaubt. validation.zero=Die Eingabe von 0 ist nicht erlaubt.
validation.negative=Ein negativer Wert ist nicht erlaubt. validation.negative=Ein negativer Wert ist nicht erlaubt.
validation.fiat.toSmall=Eingaben kleiner als der minimal mögliche Betrag sind nicht erlaubt. validation.fiat.tooSmall=Eingaben kleiner als der minimal mögliche Betrag sind nicht erlaubt.
validation.fiat.toLarge=Eingaben größer als der maximal mögliche Betrag sind nicht erlaubt. validation.fiat.tooLarge=Eingaben größer als der maximal mögliche Betrag sind nicht erlaubt.
validation.btc.fraction=Input wird einem Bitcoin Wert von weniger als 1 satoshi entsprechen validation.xmr.fraction=Input wird einem Bitcoin Wert von weniger als 1 satoshi entsprechen
validation.btc.toLarge=Eingaben größer als {0} sind nicht erlaubt. validation.xmr.tooLarge=Eingaben größer als {0} sind nicht erlaubt.
validation.btc.toSmall=Eingabe kleiner als {0} ist nicht erlaubt. validation.xmr.tooSmall=Eingabe kleiner als {0} ist nicht erlaubt.
validation.passwordTooShort=Das Passwort das Sie eingegeben haben ist zu kurz. Es muss mindestens 8 Zeichen enthalten. validation.passwordTooShort=Das Passwort das Sie eingegeben haben ist zu kurz. Es muss mindestens 8 Zeichen enthalten.
validation.passwordTooLong=Das eingegebene Passwort ist zu lang. Es darf nicht aus mehr als 50 Zeichen bestehen. validation.passwordTooLong=Das eingegebene Passwort ist zu lang. Es darf nicht aus mehr als 50 Zeichen bestehen.
validation.sortCodeNumber={0} muss aus {1} Zahlen bestehen. validation.sortCodeNumber={0} muss aus {1} Zahlen bestehen.

View file

@ -1511,8 +1511,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} con el precio de mercado ac
closedTradesSummaryWindow.totalVolume.title=Cantidad total intercambiada en {0} closedTradesSummaryWindow.totalVolume.title=Cantidad total intercambiada en {0}
closedTradesSummaryWindow.totalMinerFee.title=Suma de todas las trasas de minado closedTradesSummaryWindow.totalMinerFee.title=Suma de todas las trasas de minado
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} de la cantidad total intercambiada) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} de la cantidad total intercambiada)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Suma de todas las tasas de intercambio pagadas en BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Suma de todas las tasas de intercambio pagadas en BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} de la cantidad total intercambiada) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} de la cantidad total intercambiada)
walletPasswordWindow.headline=Introducir contraseña para desbloquear walletPasswordWindow.headline=Introducir contraseña para desbloquear
torNetworkSettingWindow.header=Confirmación de red Tor torNetworkSettingWindow.header=Confirmación de red Tor
@ -2152,11 +2152,11 @@ validation.NaN=El valor introducido no es válido
validation.notAnInteger=El valor introducido no es entero validation.notAnInteger=El valor introducido no es entero
validation.zero=El 0 no es un valor permitido. validation.zero=El 0 no es un valor permitido.
validation.negative=No se permiten entradas negativas. validation.negative=No se permiten entradas negativas.
validation.fiat.toSmall=No se permite introducir un valor menor que el mínimo posible validation.fiat.tooSmall=No se permite introducir un valor menor que el mínimo posible
validation.fiat.toLarge=No se permiten entradas más grandes que la mayor posible. validation.fiat.tooLarge=No se permiten entradas más grandes que la mayor posible.
validation.btc.fraction=El valor introducido resulta en un valor de bitcoin menor a 1 satoshi validation.xmr.fraction=El valor introducido resulta en un valor de bitcoin menor a 1 satoshi
validation.btc.toLarge=No se permiten valores mayores que {0}. validation.xmr.tooLarge=No se permiten valores mayores que {0}.
validation.btc.toSmall=Valores menores que {0} no se permiten. validation.xmr.tooSmall=Valores menores que {0} no se permiten.
validation.passwordTooShort=El password introducido es muy corto. Necesita tener al menos 8 caracteres. validation.passwordTooShort=El password introducido es muy corto. Necesita tener al menos 8 caracteres.
validation.passwordTooLong=La clave introducida es demasiado larga. Máximo 50 caracteres. validation.passwordTooLong=La clave introducida es demasiado larga. Máximo 50 caracteres.
validation.sortCodeNumber={0} debe consistir en {1} números. validation.sortCodeNumber={0} debe consistir en {1} números.

View file

@ -1511,8 +1511,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=وارد کردن رمز عبور به منظور باز کردن walletPasswordWindow.headline=وارد کردن رمز عبور به منظور باز کردن
torNetworkSettingWindow.header=تنظیمات شبکه Tor  torNetworkSettingWindow.header=تنظیمات شبکه Tor 
@ -2152,11 +2152,11 @@ validation.NaN=ورودی، یک عدد معتبر نیست.
validation.notAnInteger=ورودی یک مقدار صحیح نیست. validation.notAnInteger=ورودی یک مقدار صحیح نیست.
validation.zero=ورودی 0 مجاز نیست. validation.zero=ورودی 0 مجاز نیست.
validation.negative=یک مقدار منفی مجاز نیست. validation.negative=یک مقدار منفی مجاز نیست.
validation.fiat.toSmall=ورودی کوچکتر از حداقل مقدار ممکن مجاز نیست. validation.fiat.tooSmall=ورودی کوچکتر از حداقل مقدار ممکن مجاز نیست.
validation.fiat.toLarge=ورودی بزرگتر از حداکثر مقدار ممکن مجاز نیست. validation.fiat.tooLarge=ورودی بزرگتر از حداکثر مقدار ممکن مجاز نیست.
validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.xmr.fraction=Input will result in a bitcoin value of less than 1 satoshi
validation.btc.toLarge=ورودی بزرگتر از {0} مجاز نیست. validation.xmr.tooLarge=ورودی بزرگتر از {0} مجاز نیست.
validation.btc.toSmall=ورودی کوچکتر از {0} مجاز نیست. validation.xmr.tooSmall=ورودی کوچکتر از {0} مجاز نیست.
validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters.
validation.passwordTooLong=رمز عبور که شما وارد کرده اید خیلی طولانی است.رمز عبور بیش از 50 کاراکتر نمی تواند باشد. validation.passwordTooLong=رمز عبور که شما وارد کرده اید خیلی طولانی است.رمز عبور بیش از 50 کاراکتر نمی تواند باشد.
validation.sortCodeNumber={0} باید شامل {1} عدد باشد. validation.sortCodeNumber={0} باید شامل {1} عدد باشد.

View file

@ -1512,8 +1512,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} avec le prix courant du mar
closedTradesSummaryWindow.totalVolume.title=Montant total échangé en {0} closedTradesSummaryWindow.totalVolume.title=Montant total échangé en {0}
closedTradesSummaryWindow.totalMinerFee.title=Somme de tous les frais de mineur closedTradesSummaryWindow.totalMinerFee.title=Somme de tous les frais de mineur
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} du montant total du trade) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} du montant total du trade)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Somme de tous les frais de trade payés en BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Somme de tous les frais de trade payés en BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} du montant total du trade) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} du montant total du trade)
walletPasswordWindow.headline=Entrer le mot de passe pour déverouiller walletPasswordWindow.headline=Entrer le mot de passe pour déverouiller
torNetworkSettingWindow.header=Paramètres du réseau Tor torNetworkSettingWindow.header=Paramètres du réseau Tor
@ -2153,11 +2153,11 @@ validation.NaN=La valeur saisie n'est pas un nombre valide.
validation.notAnInteger=Input is not an integer value. validation.notAnInteger=Input is not an integer value.
validation.zero=La saisie d'une valeur égale à 0 n'est pas autorisé. validation.zero=La saisie d'une valeur égale à 0 n'est pas autorisé.
validation.negative=Une valeur négative n'est pas autorisée. validation.negative=Une valeur négative n'est pas autorisée.
validation.fiat.toSmall=La saisie d'une valeur plus petite que le montant minimal possible n'est pas autorisée. validation.fiat.tooSmall=La saisie d'une valeur plus petite que le montant minimal possible n'est pas autorisée.
validation.fiat.toLarge=La saisie d'une valeur supérieure au montant maximal possible n'est pas autorisée. validation.fiat.tooLarge=La saisie d'une valeur supérieure au montant maximal possible n'est pas autorisée.
validation.btc.fraction=L'entrée résultera dans une valeur bitcoin plus petite qu'1 satoshi validation.xmr.fraction=L'entrée résultera dans une valeur bitcoin plus petite qu'1 satoshi
validation.btc.toLarge=La saisie d''une valeur supérieure à {0} n''est pas autorisée. validation.xmr.tooLarge=La saisie d''une valeur supérieure à {0} n''est pas autorisée.
validation.btc.toSmall=La saisie d''une valeur inférieure à {0} n''est pas autorisée. validation.xmr.tooSmall=La saisie d''une valeur inférieure à {0} n''est pas autorisée.
validation.passwordTooShort=Le mot de passe que vous avez saisi est trop court. Il doit comporter un minimum de 8 caractères. validation.passwordTooShort=Le mot de passe que vous avez saisi est trop court. Il doit comporter un minimum de 8 caractères.
validation.passwordTooLong=Le mot de passe que vous avez saisi est trop long. Il ne doit pas contenir plus de 50 caractères. validation.passwordTooLong=Le mot de passe que vous avez saisi est trop long. Il ne doit pas contenir plus de 50 caractères.
validation.sortCodeNumber={0} doit être composer de {1} chiffres. validation.sortCodeNumber={0} doit être composer de {1} chiffres.

View file

@ -1511,8 +1511,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=Inserisci la password per sbloccare walletPasswordWindow.headline=Inserisci la password per sbloccare
torNetworkSettingWindow.header=Impostazioni rete Tor torNetworkSettingWindow.header=Impostazioni rete Tor
@ -2152,11 +2152,11 @@ validation.NaN=L'input non è un numero valido.
validation.notAnInteger=L'input non è un valore intero. validation.notAnInteger=L'input non è un valore intero.
validation.zero=Un input di 0 non è consentito. validation.zero=Un input di 0 non è consentito.
validation.negative=Un valore negativo non è consentito. validation.negative=Un valore negativo non è consentito.
validation.fiat.toSmall=Non è consentito un input inferiore al minimo possibile. validation.fiat.tooSmall=Non è consentito un input inferiore al minimo possibile.
validation.fiat.toLarge=Non è consentito un input maggiore del massimo possibile. validation.fiat.tooLarge=Non è consentito un input maggiore del massimo possibile.
validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.xmr.fraction=Input will result in a bitcoin value of less than 1 satoshi
validation.btc.toLarge=L'immissione maggiore di {0} non è consentita. validation.xmr.tooLarge=L'immissione maggiore di {0} non è consentita.
validation.btc.toSmall=L'immissione inferiore a {0} non è consentita. validation.xmr.tooSmall=L'immissione inferiore a {0} non è consentita.
validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters.
validation.passwordTooLong=La password inserita è troppo lunga. Non può contenere più di 50 caratteri. validation.passwordTooLong=La password inserita è troppo lunga. Non può contenere più di 50 caratteri.
validation.sortCodeNumber={0} deve essere composto da {1} numeri. validation.sortCodeNumber={0} deve essere composto da {1} numeri.

View file

@ -1511,8 +1511,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=アンロックするためにパスワードを入力してください walletPasswordWindow.headline=アンロックするためにパスワードを入力してください
torNetworkSettingWindow.header=Torネットワークの設定 torNetworkSettingWindow.header=Torネットワークの設定
@ -2152,11 +2152,11 @@ validation.NaN=入力が不正な数です。
validation.notAnInteger=入力が整数値ではありません。 validation.notAnInteger=入力が整数値ではありません。
validation.zero=0の入力は許可されていません。 validation.zero=0の入力は許可されていません。
validation.negative=負の値は許可されていません。 validation.negative=負の値は許可されていません。
validation.fiat.toSmall=可能な最小量より小さい入力は許可されていません。 validation.fiat.tooSmall=可能な最小量より小さい入力は許可されていません。
validation.fiat.toLarge=可能な最大量より大きい入力は許可されていません。 validation.fiat.tooLarge=可能な最大量より大きい入力は許可されていません。
validation.btc.fraction=この入力では1サトシ以下のビットコイン値が生成されます。 validation.xmr.fraction=この入力では1サトシ以下のビットコイン値が生成されます。
validation.btc.toLarge={0}より大きい入力は許可されていません。 validation.xmr.tooLarge={0}より大きい入力は許可されていません。
validation.btc.toSmall={0}より小さい入力は許可されていません。 validation.xmr.tooSmall={0}より小さい入力は許可されていません。
validation.passwordTooShort=入力したパスワードが短すぎます。最低8文字が必要です。 validation.passwordTooShort=入力したパスワードが短すぎます。最低8文字が必要です。
validation.passwordTooLong=入力したパスワードが長すぎます。 50文字を超えることはできません。 validation.passwordTooLong=入力したパスワードが長すぎます。 50文字を超えることはできません。
validation.sortCodeNumber={0}は{1}個の数字で構成されている必要があります。 validation.sortCodeNumber={0}は{1}個の数字で構成されている必要があります。

View file

@ -1516,8 +1516,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=Digite senha para abrir: walletPasswordWindow.headline=Digite senha para abrir:
@ -2160,11 +2160,11 @@ validation.NaN=Número inválido
validation.notAnInteger=A quantia não é um valor inteiro. validation.notAnInteger=A quantia não é um valor inteiro.
validation.zero=Número 0 não é permitido validation.zero=Número 0 não é permitido
validation.negative=Valores negativos não são permitidos. validation.negative=Valores negativos não são permitidos.
validation.fiat.toSmall=Quantia menor do que a mínima permitida. validation.fiat.tooSmall=Quantia menor do que a mínima permitida.
validation.fiat.toLarge=Quantia maior do que a máxima permitida. validation.fiat.tooLarge=Quantia maior do que a máxima permitida.
validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.xmr.fraction=Input will result in a bitcoin value of less than 1 satoshi
validation.btc.toLarge=Quantia máx. permitida: {0} validation.xmr.tooLarge=Quantia máx. permitida: {0}
validation.btc.toSmall=Quantia mín. permitida: {0} validation.xmr.tooSmall=Quantia mín. permitida: {0}
validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters.
validation.passwordTooLong=A senha inserida é muito longa. Não pode ser maior do que 50 caracteres validation.passwordTooLong=A senha inserida é muito longa. Não pode ser maior do que 50 caracteres
validation.sortCodeNumber={0} deve consistir de {1} números. validation.sortCodeNumber={0} deve consistir de {1} números.

View file

@ -1509,8 +1509,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=Digite senha para abrir: walletPasswordWindow.headline=Digite senha para abrir:
torNetworkSettingWindow.header=Definições de redes Tor torNetworkSettingWindow.header=Definições de redes Tor
@ -2150,11 +2150,11 @@ validation.NaN=Número inválido
validation.notAnInteger=O input não é um número inteiro. validation.notAnInteger=O input não é um número inteiro.
validation.zero=Número 0 não é permitido validation.zero=Número 0 não é permitido
validation.negative=Valores negativos não são permitidos. validation.negative=Valores negativos não são permitidos.
validation.fiat.toSmall=Input menor do que a quantia mínima permitida. validation.fiat.tooSmall=Input menor do que a quantia mínima permitida.
validation.fiat.toLarge=Input maior do que a quantia máxima permitida. validation.fiat.tooLarge=Input maior do que a quantia máxima permitida.
validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.xmr.fraction=Input will result in a bitcoin value of less than 1 satoshi
validation.btc.toLarge=O input maior que {0} não é permitido. validation.xmr.tooLarge=O input maior que {0} não é permitido.
validation.btc.toSmall=Input menor que {0} não é permitido. validation.xmr.tooSmall=Input menor que {0} não é permitido.
validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters.
validation.passwordTooLong=A senha inserida é muito longa. Não pode ser maior do que 50 caracteres. validation.passwordTooLong=A senha inserida é muito longa. Não pode ser maior do que 50 caracteres.
validation.sortCodeNumber={0} deve consistir de {1} números. validation.sortCodeNumber={0} deve consistir de {1} números.

View file

@ -1511,8 +1511,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=Введите пароль для разблокировки walletPasswordWindow.headline=Введите пароль для разблокировки
torNetworkSettingWindow.header=Настройки сети Тоr torNetworkSettingWindow.header=Настройки сети Тоr
@ -2152,11 +2152,11 @@ validation.NaN=Введённое число недопустимо.
validation.notAnInteger=Введённое число не является целым. validation.notAnInteger=Введённое число не является целым.
validation.zero=Введённое значение не может быть равно 0. validation.zero=Введённое значение не может быть равно 0.
validation.negative=Отрицательное значение недопустимо. validation.negative=Отрицательное значение недопустимо.
validation.fiat.toSmall=Ввод значения меньше минимально возможного не допускается. validation.fiat.tooSmall=Ввод значения меньше минимально возможного не допускается.
validation.fiat.toLarge=Ввод значения больше максимально возможного не допускается. validation.fiat.tooLarge=Ввод значения больше максимально возможного не допускается.
validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.xmr.fraction=Input will result in a bitcoin value of less than 1 satoshi
validation.btc.toLarge=Значение не может превышать {0}. validation.xmr.tooLarge=Значение не может превышать {0}.
validation.btc.toSmall=Значение не может быть меньше {0}. validation.xmr.tooSmall=Значение не может быть меньше {0}.
validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters.
validation.passwordTooLong=Введенный пароль слишком длинный. Его длина не должна превышать 50 символов. validation.passwordTooLong=Введенный пароль слишком длинный. Его длина не должна превышать 50 символов.
validation.sortCodeNumber={0} должен состоять из {1} цифр. validation.sortCodeNumber={0} должен состоять из {1} цифр.

View file

@ -1511,8 +1511,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=ป้อนรหัสผ่านเพื่อปลดล็อก walletPasswordWindow.headline=ป้อนรหัสผ่านเพื่อปลดล็อก
torNetworkSettingWindow.header=ตั้งค่าเครือข่าย Tor torNetworkSettingWindow.header=ตั้งค่าเครือข่าย Tor
@ -2152,11 +2152,11 @@ validation.NaN=การป้อนข้อมูลไม่ใช่ตั
validation.notAnInteger=ค่าที่ป้อนไม่ใช่ค่าจำนวนเต็ม validation.notAnInteger=ค่าที่ป้อนไม่ใช่ค่าจำนวนเต็ม
validation.zero=ไม่อนุญาตให้ป้อนข้อมูลเป็น 0 validation.zero=ไม่อนุญาตให้ป้อนข้อมูลเป็น 0
validation.negative=ไม่อนุญาตให้ใช้ค่าลบ validation.negative=ไม่อนุญาตให้ใช้ค่าลบ
validation.fiat.toSmall=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดเล็กกว่าจำนวนเป็นไปได้ต่ำสุด validation.fiat.tooSmall=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดเล็กกว่าจำนวนเป็นไปได้ต่ำสุด
validation.fiat.toLarge=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดใหญ่กว่าจำนวนสูงสุดที่เป็นไปได้ validation.fiat.tooLarge=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดใหญ่กว่าจำนวนสูงสุดที่เป็นไปได้
validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.xmr.fraction=Input will result in a bitcoin value of less than 1 satoshi
validation.btc.toLarge=ไม่อนุญาตให้ป้อนข้อมูลขนาดใหญ่กว่า {0} validation.xmr.tooLarge=ไม่อนุญาตให้ป้อนข้อมูลขนาดใหญ่กว่า {0}
validation.btc.toSmall=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดเล็กกว่า {0} validation.xmr.tooSmall=ไม่อนุญาตให้ป้อนข้อมูลที่มีขนาดเล็กกว่า {0}
validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters.
validation.passwordTooLong=รหัสผ่านที่คุณป้อนยาวเกินไป ต้องมีความยาวไม่เกิน 50 ตัว validation.passwordTooLong=รหัสผ่านที่คุณป้อนยาวเกินไป ต้องมีความยาวไม่เกิน 50 ตัว
validation.sortCodeNumber={0} ต้องประกอบด้วย {1} ตัวเลข validation.sortCodeNumber={0} ต้องประกอบด้วย {1} ตัวเลข

View file

@ -1513,8 +1513,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=Nhập mật khẩu để mở khóa walletPasswordWindow.headline=Nhập mật khẩu để mở khóa
torNetworkSettingWindow.header=Cài đặt mạng Tor torNetworkSettingWindow.header=Cài đặt mạng Tor
@ -2154,11 +2154,11 @@ validation.NaN=Giá trị nhập là số không có hiệu lực.
validation.notAnInteger=Giá trị nhập không phải là một số nguyên. validation.notAnInteger=Giá trị nhập không phải là một số nguyên.
validation.zero=Không cho phép nhập giá trị 0. validation.zero=Không cho phép nhập giá trị 0.
validation.negative=Không cho phép nhập giá trị âm. validation.negative=Không cho phép nhập giá trị âm.
validation.fiat.toSmall=Không cho phép giá trị nhập nhỏ hơn giá trị có thể nhỏ nhất. validation.fiat.tooSmall=Không cho phép giá trị nhập nhỏ hơn giá trị có thể nhỏ nhất.
validation.fiat.toLarge=Không cho phép giá trị nhập lớn hơn giá trị có thể lớn nhất. validation.fiat.tooLarge=Không cho phép giá trị nhập lớn hơn giá trị có thể lớn nhất.
validation.btc.fraction=Input will result in a bitcoin value of less than 1 satoshi validation.xmr.fraction=Input will result in a bitcoin value of less than 1 satoshi
validation.btc.toLarge=Không cho phép giá trị nhập lớn hơn {0}. validation.xmr.tooLarge=Không cho phép giá trị nhập lớn hơn {0}.
validation.btc.toSmall=Không cho phép giá trị nhập nhỏ hơn {0}. validation.xmr.tooSmall=Không cho phép giá trị nhập nhỏ hơn {0}.
validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters. validation.passwordTooShort=The password you entered is too short. It needs to have a min. of 8 characters.
validation.passwordTooLong=Mật khẩu bạn vừa nhập quá dài. Không được quá 50 ký tự. validation.passwordTooLong=Mật khẩu bạn vừa nhập quá dài. Không được quá 50 ký tự.
validation.sortCodeNumber={0} phải có {1} số. validation.sortCodeNumber={0} phải có {1} số.

View file

@ -1512,8 +1512,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=输入密码解锁 walletPasswordWindow.headline=输入密码解锁
@ -2156,11 +2156,11 @@ validation.NaN=输入的不是有效数字。
validation.notAnInteger=输入的不是整数。 validation.notAnInteger=输入的不是整数。
validation.zero=不允许输入0。 validation.zero=不允许输入0。
validation.negative=不允许输入负值。 validation.negative=不允许输入负值。
validation.fiat.toSmall=不允许输入比最小可能值还小的数值。 validation.fiat.tooSmall=不允许输入比最小可能值还小的数值。
validation.fiat.toLarge=不允许输入比最大可能值还大的数值。 validation.fiat.tooLarge=不允许输入比最大可能值还大的数值。
validation.btc.fraction=此充值将会产生小于 1 聪的比特币数量。 validation.xmr.fraction=此充值将会产生小于 1 聪的比特币数量。
validation.btc.toLarge=不允许充值大于{0} validation.xmr.tooLarge=不允许充值大于{0}
validation.btc.toSmall=不允许充值小于{0} validation.xmr.tooSmall=不允许充值小于{0}
validation.passwordTooShort=你输入的密码太短。最少 8 个字符。 validation.passwordTooShort=你输入的密码太短。最少 8 个字符。
validation.passwordTooLong=你输入的密码太长。最长不要超过50个字符。 validation.passwordTooLong=你输入的密码太长。最长不要超过50个字符。
validation.sortCodeNumber={0} 必须由 {1} 个数字构成。 validation.sortCodeNumber={0} 必须由 {1} 个数字构成。

View file

@ -1512,8 +1512,8 @@ closedTradesSummaryWindow.totalAmount.value={0} ({1} with current market price)
closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0} closedTradesSummaryWindow.totalVolume.title=Total amount traded in {0}
closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees closedTradesSummaryWindow.totalMinerFee.title=Sum of all miner fees
closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalMinerFee.value={0} ({1} of total trade amount)
closedTradesSummaryWindow.totalTradeFeeInBtc.title=Sum of all trade fees paid in BTC closedTradesSummaryWindow.totalTradeFeeInXmr.title=Sum of all trade fees paid in BTC
closedTradesSummaryWindow.totalTradeFeeInBtc.value={0} ({1} of total trade amount) closedTradesSummaryWindow.totalTradeFeeInXmr.value={0} ({1} of total trade amount)
walletPasswordWindow.headline=輸入密碼解鎖 walletPasswordWindow.headline=輸入密碼解鎖
torNetworkSettingWindow.header=Tor 網絡設置 torNetworkSettingWindow.header=Tor 網絡設置
@ -2152,11 +2152,11 @@ validation.NaN=輸入的不是有效數字。
validation.notAnInteger=輸入的不是整數。 validation.notAnInteger=輸入的不是整數。
validation.zero=不允許輸入0。 validation.zero=不允許輸入0。
validation.negative=不允許輸入負值。 validation.negative=不允許輸入負值。
validation.fiat.toSmall=不允許輸入比最小可能值還小的數值。 validation.fiat.tooSmall=不允許輸入比最小可能值還小的數值。
validation.fiat.toLarge=不允許輸入比最大可能值還大的數值。 validation.fiat.tooLarge=不允許輸入比最大可能值還大的數值。
validation.btc.fraction=此充值將會產生小於 1 聰的比特幣數量。 validation.xmr.fraction=此充值將會產生小於 1 聰的比特幣數量。
validation.btc.toLarge=不允許充值大於{0} validation.xmr.tooLarge=不允許充值大於{0}
validation.btc.toSmall=不允許充值小於{0} validation.xmr.tooSmall=不允許充值小於{0}
validation.passwordTooShort=你輸入的密碼太短。最少 8 個字符。 validation.passwordTooShort=你輸入的密碼太短。最少 8 個字符。
validation.passwordTooLong=你輸入的密碼太長。最長不要超過50個字符。 validation.passwordTooLong=你輸入的密碼太長。最長不要超過50個字符。
validation.sortCodeNumber={0} 必須由 {1} 個數字構成。 validation.sortCodeNumber={0} 必須由 {1} 個數字構成。

View file

@ -67,8 +67,8 @@ public class CoinUtilTest {
1); 1);
assertEquals( assertEquals(
"Minimum trade amount allowed should be adjusted to the smallest trade allowed.", "Minimum trade amount allowed should be adjusted to the smallest trade allowed.",
HavenoUtils.formatToXmrWithCode(Restrictions.MIN_TRADE_AMOUNT), HavenoUtils.formatXmr(Restrictions.MIN_TRADE_AMOUNT, true),
HavenoUtils.formatToXmrWithCode(result) HavenoUtils.formatXmr(result, true)
); );
try { try {
@ -94,7 +94,7 @@ public class CoinUtilTest {
assertEquals( assertEquals(
"Minimum allowed trade amount should not be adjusted.", "Minimum allowed trade amount should not be adjusted.",
"0.10 XMR", "0.10 XMR",
HavenoUtils.formatToXmrWithCode(result) HavenoUtils.formatXmr(result, true)
); );
result = CoinUtil.getAdjustedAmount( result = CoinUtil.getAdjustedAmount(
@ -105,7 +105,7 @@ public class CoinUtilTest {
assertEquals( assertEquals(
"Minimum trade amount allowed should respect maxTradeLimit and factor, if possible.", "Minimum trade amount allowed should respect maxTradeLimit and factor, if possible.",
"0.10 XMR", "0.10 XMR",
HavenoUtils.formatToXmrWithCode(result) HavenoUtils.formatXmr(result, true)
); );
// TODO(chirhonul): The following seems like it should raise an exception or otherwise fail. // TODO(chirhonul): The following seems like it should raise an exception or otherwise fail.
@ -121,7 +121,7 @@ public class CoinUtilTest {
assertEquals( assertEquals(
"Minimum trade amount allowed with low maxTradeLimit should still respect that limit, even if result does not respect the factor specified.", "Minimum trade amount allowed with low maxTradeLimit should still respect that limit, even if result does not respect the factor specified.",
"0.00005 XMR", "0.00005 XMR",
HavenoUtils.formatToXmrWithCode(result) HavenoUtils.formatXmr(result, true)
); );
} }
} }

View file

@ -56,7 +56,7 @@ public class AccountStatusTooltipLabel extends AutoTooltipLabel {
this.textIcon = FormBuilder.getIcon(witnessAgeData.getIcon()); this.textIcon = FormBuilder.getIcon(witnessAgeData.getIcon());
this.popupTitle = witnessAgeData.isLimitLifted() this.popupTitle = witnessAgeData.isLimitLifted()
? Res.get("offerbook.timeSinceSigning.tooltip.accountLimitLifted") ? Res.get("offerbook.timeSinceSigning.tooltip.accountLimitLifted")
: Res.get("offerbook.timeSinceSigning.tooltip.accountLimit", HavenoUtils.formatToXmrWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT)); : Res.get("offerbook.timeSinceSigning.tooltip.accountLimit", HavenoUtils.formatXmr(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT, true));
positionAndActivateIcon(); positionAndActivateIcon();
} }

View file

@ -82,7 +82,7 @@ public class BalanceTextField extends AnchorPane {
private void updateBalance(BigInteger balance) { private void updateBalance(BigInteger balance) {
if (formatter != null) if (formatter != null)
textField.setText(HavenoUtils.formatToXmrWithCode(balance)); textField.setText(HavenoUtils.formatXmr(balance, true));
//TODO: replace with new validation logic //TODO: replace with new validation logic
// if (targetAmount != null) { // if (targetAmount != null) {

View file

@ -285,17 +285,17 @@ public class FiatAccountsView extends PaymentAccountsView<GridPane, FiatAccounts
} else { } else {
String limitsInfoKey = "payment.limits.info"; String limitsInfoKey = "payment.limits.info";
String initialLimit = HavenoUtils.formatToXmrWithCode(maxTradeLimitFirstMonth); String initialLimit = HavenoUtils.formatXmr(maxTradeLimitFirstMonth, true);
if (PaymentMethod.hasChargebackRisk(paymentAccount.getPaymentMethod(), paymentAccount.getTradeCurrencies())) { if (PaymentMethod.hasChargebackRisk(paymentAccount.getPaymentMethod(), paymentAccount.getTradeCurrencies())) {
limitsInfoKey = "payment.limits.info.withSigning"; limitsInfoKey = "payment.limits.info.withSigning";
initialLimit = HavenoUtils.formatToXmrWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT); initialLimit = HavenoUtils.formatXmr(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT, true);
} }
new Popup().information(Res.get(limitsInfoKey, new Popup().information(Res.get(limitsInfoKey,
initialLimit, initialLimit,
HavenoUtils.formatToXmrWithCode(maxTradeLimitSecondMonth), HavenoUtils.formatXmr(maxTradeLimitSecondMonth, true),
HavenoUtils.formatToXmrWithCode(maxTradeLimit))) HavenoUtils.formatXmr(maxTradeLimit, true)))
.width(700) .width(700)
.closeButtonText(Res.get("shared.cancel")) .closeButtonText(Res.get("shared.cancel"))
.actionButtonText(Res.get("shared.iUnderstand")) .actionButtonText(Res.get("shared.iUnderstand"))

View file

@ -66,14 +66,14 @@ class DepositListItem {
@Override @Override
public void onBalanceChanged(BigInteger balance) { public void onBalanceChanged(BigInteger balance) {
DepositListItem.this.balanceAsBI = balance; DepositListItem.this.balanceAsBI = balance;
DepositListItem.this.balance.set(HavenoUtils.formatToXmr(balanceAsBI)); DepositListItem.this.balance.set(HavenoUtils.formatXmr(balanceAsBI));
updateUsage(addressEntry.getSubaddressIndex(), null); updateUsage(addressEntry.getSubaddressIndex(), null);
} }
}; };
xmrWalletService.addBalanceListener(balanceListener); xmrWalletService.addBalanceListener(balanceListener);
balanceAsBI = xmrWalletService.getBalanceForSubaddress(addressEntry.getSubaddressIndex()); balanceAsBI = xmrWalletService.getBalanceForSubaddress(addressEntry.getSubaddressIndex());
balance.set(HavenoUtils.formatToXmr(balanceAsBI)); balance.set(HavenoUtils.formatXmr(balanceAsBI));
updateUsage(addressEntry.getSubaddressIndex(), cachedTxs); updateUsage(addressEntry.getSubaddressIndex(), cachedTxs);

View file

@ -204,7 +204,7 @@ class TransactionsListItem {
} }
public String getAmountStr() { public String getAmountStr() {
return HavenoUtils.formatToXmr(amount); return HavenoUtils.formatXmr(amount);
} }
public BigInteger getAmount() { public BigInteger getAmount() {

View file

@ -70,7 +70,7 @@ class WithdrawalListItem {
private void updateBalance() { private void updateBalance() {
balance = walletService.getBalanceForSubaddress(addressEntry.getSubaddressIndex()); balance = walletService.getBalanceForSubaddress(addressEntry.getSubaddressIndex());
if (balance != null) if (balance != null)
balanceLabel.setText(HavenoUtils.formatToXmr(this.balance)); balanceLabel.setText(HavenoUtils.formatXmr(this.balance));
} }
public final String getLabel() { public final String getLabel() {

View file

@ -134,7 +134,7 @@ public class WithdrawalView extends ActivatableView<VBox, Void> {
amountFocusListener = (observable, oldValue, newValue) -> { amountFocusListener = (observable, oldValue, newValue) -> {
if (oldValue && !newValue) { if (oldValue && !newValue) {
if (amount.compareTo(BigInteger.valueOf(0)) > 0) if (amount.compareTo(BigInteger.valueOf(0)) > 0)
amountTextField.setText(HavenoUtils.formatToXmr(amount)); amountTextField.setText(HavenoUtils.formatXmr(amount));
else else
amountTextField.setText(""); amountTextField.setText("");
} }
@ -186,10 +186,10 @@ public class WithdrawalView extends ActivatableView<VBox, Void> {
BigInteger sendersAmount = receiverAmount; BigInteger sendersAmount = receiverAmount;
BigInteger fee = tx.getFee(); BigInteger fee = tx.getFee();
String messageText = Res.get("shared.sendFundsDetailsWithFee", String messageText = Res.get("shared.sendFundsDetailsWithFee",
HavenoUtils.formatToXmrWithCode(sendersAmount), HavenoUtils.formatXmr(sendersAmount, true),
withdrawToAddress, withdrawToAddress,
HavenoUtils.formatToXmrWithCode(fee), HavenoUtils.formatXmr(fee, true),
HavenoUtils.formatToXmrWithCode(receiverAmount)); HavenoUtils.formatXmr(receiverAmount, true));
// popup confirmation message // popup confirmation message
new Popup().headLine(Res.get("funds.withdrawal.confirmWithdrawalRequest")) new Popup().headLine(Res.get("funds.withdrawal.confirmWithdrawalRequest"))
@ -203,7 +203,7 @@ public class WithdrawalView extends ActivatableView<VBox, Void> {
xmrWalletService.getWallet().setTxNote(tx.getHash(), withdrawMemoTextField.getText()); // TODO (monero-java): tx note does not persist when tx created then relayed xmrWalletService.getWallet().setTxNote(tx.getHash(), withdrawMemoTextField.getText()); // TODO (monero-java): tx note does not persist when tx created then relayed
String key = "showTransactionSent"; String key = "showTransactionSent";
if (DontShowAgainLookup.showAgain(key)) { if (DontShowAgainLookup.showAgain(key)) {
new TxDetails(tx.getHash(), withdrawToAddress, HavenoUtils.formatToXmrWithCode(sendersAmount), HavenoUtils.formatToXmrWithCode(fee), xmrWalletService.getWallet().getTxNote(tx.getHash())) new TxDetails(tx.getHash(), withdrawToAddress, HavenoUtils.formatXmr(sendersAmount, true), HavenoUtils.formatXmr(fee, true), xmrWalletService.getWallet().getTxNote(tx.getHash()))
.dontShowAgainId(key) .dontShowAgainId(key)
.show(); .show();
} }

View file

@ -129,7 +129,7 @@ public class SpreadView extends ActivatableViewAndModel<GridPane, SpreadViewMode
BigInteger totalAmount = BigInteger.valueOf(0); BigInteger totalAmount = BigInteger.valueOf(0);
for (SpreadItem item : sortedList) totalAmount = totalAmount.add(item.totalAmount); for (SpreadItem item : sortedList) totalAmount = totalAmount.add(item.totalAmount);
String total = HavenoUtils.formatToXmr(totalAmount); String total = HavenoUtils.formatXmr(totalAmount);
UserThread.execute(() -> { UserThread.execute(() -> {
numberOfOffersColumn.setGraphic(new AutoTooltipLabel(Res.get("market.spread.numberOfOffersColumn", numberOfOffers))); numberOfOffersColumn.setGraphic(new AutoTooltipLabel(Res.get("market.spread.numberOfOffersColumn", numberOfOffers)));

View file

@ -54,9 +54,9 @@ public class VolumeBar extends Group {
public void update(double height, double candleWidth, CandleData candleData) { public void update(double height, double candleWidth, CandleData candleData) {
bar.resizeRelocate(-candleWidth / 2, 0, candleWidth, height); bar.resizeRelocate(-candleWidth / 2, 0, candleWidth, height);
String volumeInBtc = volumeStringConverter.toString(candleData.accumulatedAmount); String volumeInXmr = volumeStringConverter.toString(candleData.accumulatedAmount);
String volumeInUsd = VolumeUtil.formatLargeFiat(candleData.volumeInUsd, "USD"); String volumeInUsd = VolumeUtil.formatLargeFiat(candleData.volumeInUsd, "USD");
tooltip.setText(Res.get("market.trades.tooltip.volumeBar", volumeInBtc, volumeInUsd, candleData.numTrades, candleData.date)); tooltip.setText(Res.get("market.trades.tooltip.volumeBar", volumeInXmr, volumeInUsd, candleData.numTrades, candleData.date));
} }
private void updateStyleClasses() { private void updateStyleClasses() {

View file

@ -17,7 +17,6 @@
package haveno.desktop.main.offer; package haveno.desktop.main.offer;
import org.bitcoinj.core.Coin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import com.google.inject.Inject; import com.google.inject.Inject;
import haveno.common.handlers.ErrorMessageHandler; import haveno.common.handlers.ErrorMessageHandler;
@ -290,7 +289,6 @@ public abstract class MutableOfferDataModel extends OfferDataModel {
amount.get(), amount.get(),
minAmount.get(), minAmount.get(),
useMarketBasedPrice.get() ? null : price.get(), useMarketBasedPrice.get() ? null : price.get(),
Coin.ZERO,
useMarketBasedPrice.get(), useMarketBasedPrice.get(),
marketPriceMargin, marketPriceMargin,
buyerSecurityDepositPct.get(), buyerSecurityDepositPct.get(),

View file

@ -136,7 +136,7 @@ public abstract class MutableOfferView<M extends MutableOfferViewModel<?>> exten
private FundsTextField totalToPayTextField; private FundsTextField totalToPayTextField;
private Label amountDescriptionLabel, priceCurrencyLabel, priceDescriptionLabel, volumeDescriptionLabel, private Label amountDescriptionLabel, priceCurrencyLabel, priceDescriptionLabel, volumeDescriptionLabel,
waitingForFundsLabel, marketBasedPriceLabel, percentagePriceDescriptionLabel, tradeFeeDescriptionLabel, waitingForFundsLabel, marketBasedPriceLabel, percentagePriceDescriptionLabel, tradeFeeDescriptionLabel,
resultLabel, tradeFeeInBtcLabel, xLabel, fakeXLabel, buyerSecurityDepositLabel, resultLabel, tradeFeeInXmrLabel, xLabel, fakeXLabel, buyerSecurityDepositLabel,
buyerSecurityDepositPercentageLabel, triggerPriceCurrencyLabel, triggerPriceDescriptionLabel; buyerSecurityDepositPercentageLabel, triggerPriceCurrencyLabel, triggerPriceDescriptionLabel;
protected Label amountBtcLabel, volumeCurrencyLabel, minAmountBtcLabel; protected Label amountBtcLabel, volumeCurrencyLabel, minAmountBtcLabel;
private ComboBox<PaymentAccount> paymentAccountsComboBox; private ComboBox<PaymentAccount> paymentAccountsComboBox;
@ -548,7 +548,7 @@ public abstract class MutableOfferView<M extends MutableOfferViewModel<?>> exten
addressTextField.amountAsProperty().bind(model.getDataModel().getMissingCoin()); addressTextField.amountAsProperty().bind(model.getDataModel().getMissingCoin());
buyerSecurityDepositInputTextField.textProperty().bindBidirectional(model.buyerSecurityDeposit); buyerSecurityDepositInputTextField.textProperty().bindBidirectional(model.buyerSecurityDeposit);
buyerSecurityDepositLabel.textProperty().bind(model.buyerSecurityDepositLabel); buyerSecurityDepositLabel.textProperty().bind(model.buyerSecurityDepositLabel);
tradeFeeInBtcLabel.textProperty().bind(model.tradeFeeInBtcWithFiat); tradeFeeInXmrLabel.textProperty().bind(model.tradeFeeInXmrWithFiat);
tradeFeeDescriptionLabel.textProperty().bind(model.tradeFeeDescription); tradeFeeDescriptionLabel.textProperty().bind(model.tradeFeeDescription);
// Validation // Validation
@ -596,9 +596,9 @@ public abstract class MutableOfferView<M extends MutableOfferViewModel<?>> exten
addressTextField.amountAsProperty().unbind(); addressTextField.amountAsProperty().unbind();
buyerSecurityDepositInputTextField.textProperty().unbindBidirectional(model.buyerSecurityDeposit); buyerSecurityDepositInputTextField.textProperty().unbindBidirectional(model.buyerSecurityDeposit);
buyerSecurityDepositLabel.textProperty().unbind(); buyerSecurityDepositLabel.textProperty().unbind();
tradeFeeInBtcLabel.textProperty().unbind(); tradeFeeInXmrLabel.textProperty().unbind();
tradeFeeDescriptionLabel.textProperty().unbind(); tradeFeeDescriptionLabel.textProperty().unbind();
tradeFeeInBtcLabel.visibleProperty().unbind(); tradeFeeInXmrLabel.visibleProperty().unbind();
tradeFeeDescriptionLabel.visibleProperty().unbind(); tradeFeeDescriptionLabel.visibleProperty().unbind();
// Validation // Validation
@ -731,7 +731,7 @@ public abstract class MutableOfferView<M extends MutableOfferViewModel<?>> exten
if (newValue) { if (newValue) {
Notification walletFundedNotification = new Notification() Notification walletFundedNotification = new Notification()
.headLine(Res.get("notification.walletUpdate.headline")) .headLine(Res.get("notification.walletUpdate.headline"))
.notification(Res.get("notification.walletUpdate.msg", HavenoUtils.formatToXmrWithCode(model.getDataModel().getTotalToPay().get()))) .notification(Res.get("notification.walletUpdate.msg", HavenoUtils.formatXmr(model.getDataModel().getTotalToPay().get(), true)))
.autoClose(); .autoClose();
walletFundedNotification.show(); walletFundedNotification.show();
@ -1347,14 +1347,14 @@ public abstract class MutableOfferView<M extends MutableOfferViewModel<?>> exten
} }
private VBox getTradeFeeFieldsBox() { private VBox getTradeFeeFieldsBox() {
tradeFeeInBtcLabel = new Label(); tradeFeeInXmrLabel = new Label();
tradeFeeInBtcLabel.setMouseTransparent(true); tradeFeeInXmrLabel.setMouseTransparent(true);
tradeFeeInBtcLabel.setId("trade-fee-textfield"); tradeFeeInXmrLabel.setId("trade-fee-textfield");
VBox vBox = new VBox(); VBox vBox = new VBox();
vBox.setSpacing(6); vBox.setSpacing(6);
vBox.setMaxWidth(300); vBox.setMaxWidth(300);
vBox.setAlignment(Pos.CENTER_LEFT); vBox.setAlignment(Pos.CENTER_LEFT);
vBox.getChildren().addAll(tradeFeeInBtcLabel); vBox.getChildren().addAll(tradeFeeInXmrLabel);
HBox hBox = new HBox(); HBox hBox = new HBox();
hBox.getChildren().addAll(vBox); hBox.getChildren().addAll(vBox);

View file

@ -121,7 +121,7 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
public final StringProperty price = new SimpleStringProperty(); public final StringProperty price = new SimpleStringProperty();
public final StringProperty triggerPrice = new SimpleStringProperty(""); public final StringProperty triggerPrice = new SimpleStringProperty("");
final StringProperty tradeFee = new SimpleStringProperty(); final StringProperty tradeFee = new SimpleStringProperty();
final StringProperty tradeFeeInBtcWithFiat = new SimpleStringProperty(); final StringProperty tradeFeeInXmrWithFiat = new SimpleStringProperty();
final StringProperty tradeFeeCurrencyCode = new SimpleStringProperty(); final StringProperty tradeFeeCurrencyCode = new SimpleStringProperty();
final StringProperty tradeFeeDescription = new SimpleStringProperty(); final StringProperty tradeFeeDescription = new SimpleStringProperty();
final BooleanProperty isTradeFeeVisible = new SimpleBooleanProperty(false); final BooleanProperty isTradeFeeVisible = new SimpleBooleanProperty(false);
@ -271,10 +271,10 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
() -> Res.get("createOffer.volume.prompt", dataModel.getTradeCurrencyCode().get()), () -> Res.get("createOffer.volume.prompt", dataModel.getTradeCurrencyCode().get()),
dataModel.getTradeCurrencyCode())); dataModel.getTradeCurrencyCode()));
totalToPay.bind(createStringBinding(() -> HavenoUtils.formatToXmrWithCode(dataModel.totalToPayAsProperty().get()), totalToPay.bind(createStringBinding(() -> HavenoUtils.formatXmr(dataModel.totalToPayAsProperty().get(), true),
dataModel.totalToPayAsProperty())); dataModel.totalToPayAsProperty()));
tradeAmount.bind(createStringBinding(() -> HavenoUtils.formatToXmrWithCode(dataModel.getAmount().get()), tradeAmount.bind(createStringBinding(() -> HavenoUtils.formatXmr(dataModel.getAmount().get(), true),
dataModel.getAmount())); dataModel.getAmount()));
tradeCurrencyCode.bind(dataModel.getTradeCurrencyCode()); tradeCurrencyCode.bind(dataModel.getTradeCurrencyCode());
@ -433,8 +433,8 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
amountListener = (ov, oldValue, newValue) -> { amountListener = (ov, oldValue, newValue) -> {
if (newValue != null) { if (newValue != null) {
amount.set(HavenoUtils.formatToXmr(newValue)); amount.set(HavenoUtils.formatXmr(newValue));
buyerSecurityDepositInBTC.set(HavenoUtils.formatToXmrWithCode(dataModel.getBuyerSecurityDeposit())); buyerSecurityDepositInBTC.set(HavenoUtils.formatXmr(dataModel.getBuyerSecurityDeposit(), true));
} else { } else {
amount.set(""); amount.set("");
buyerSecurityDepositInBTC.set(""); buyerSecurityDepositInBTC.set("");
@ -444,7 +444,7 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
}; };
minAmountListener = (ov, oldValue, newValue) -> { minAmountListener = (ov, oldValue, newValue) -> {
if (newValue != null) if (newValue != null)
minAmount.set(HavenoUtils.formatToXmr(newValue)); minAmount.set(HavenoUtils.formatXmr(newValue));
else else
minAmount.set(""); minAmount.set("");
}; };
@ -473,7 +473,7 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
if (newValue != null) { if (newValue != null) {
buyerSecurityDeposit.set(FormattingUtils.formatToPercent((double) newValue)); buyerSecurityDeposit.set(FormattingUtils.formatToPercent((double) newValue));
if (dataModel.getAmount().get() != null) { if (dataModel.getAmount().get() != null) {
buyerSecurityDepositInBTC.set(HavenoUtils.formatToXmrWithCode(dataModel.getBuyerSecurityDeposit())); buyerSecurityDepositInBTC.set(HavenoUtils.formatXmr(dataModel.getBuyerSecurityDeposit(), true));
} }
updateBuyerSecurityDeposit(); updateBuyerSecurityDeposit();
} else { } else {
@ -504,8 +504,8 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
} }
isTradeFeeVisible.setValue(true); isTradeFeeVisible.setValue(true);
tradeFee.set(HavenoUtils.formatToXmr(makerFee)); tradeFee.set(HavenoUtils.formatXmr(makerFee));
tradeFeeInBtcWithFiat.set(OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, tradeFeeInXmrWithFiat.set(OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil,
dataModel.getMakerFee(), dataModel.getMakerFee(),
btcFormatter)); btcFormatter));
} }
@ -659,8 +659,8 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
updateButtonDisableState(); updateButtonDisableState();
} else { } else {
new Popup().warning(Res.get("shared.notEnoughFunds", new Popup().warning(Res.get("shared.notEnoughFunds",
HavenoUtils.formatToXmrWithCode(dataModel.totalToPayAsProperty().get()), HavenoUtils.formatXmr(dataModel.totalToPayAsProperty().get(), true),
HavenoUtils.formatToXmrWithCode(dataModel.getTotalBalance()))) HavenoUtils.formatXmr(dataModel.getTotalBalance(), true)))
.actionButtonTextWithGoTo("navigation.funds.depositFunds") .actionButtonTextWithGoTo("navigation.funds.depositFunds")
.onAction(() -> navigation.navigateTo(MainView.class, FundsView.class, DepositView.class)) .onAction(() -> navigation.navigateTo(MainView.class, FundsView.class, DepositView.class))
.show(); .show();
@ -680,7 +680,7 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
if (result.isValid) { if (result.isValid) {
setAmountToModel(); setAmountToModel();
ignoreAmountStringListener = true; ignoreAmountStringListener = true;
amount.set(HavenoUtils.formatToXmr(dataModel.getAmount().get())); amount.set(HavenoUtils.formatXmr(dataModel.getAmount().get()));
ignoreAmountStringListener = false; ignoreAmountStringListener = false;
dataModel.calculateVolume(); dataModel.calculateVolume();
@ -692,10 +692,10 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
if (minAmount.get() != null) if (minAmount.get() != null)
minAmountValidationResult.set(isXmrInputValid(minAmount.get())); minAmountValidationResult.set(isXmrInputValid(minAmount.get()));
} else if (amount.get() != null && xmrValidator.getMaxTradeLimit() != null && xmrValidator.getMaxTradeLimit().longValueExact() == OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.longValueExact()) { } else if (amount.get() != null && xmrValidator.getMaxTradeLimit() != null && xmrValidator.getMaxTradeLimit().longValueExact() == OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.longValueExact()) {
amount.set(HavenoUtils.formatToXmr(xmrValidator.getMaxTradeLimit())); amount.set(HavenoUtils.formatXmr(xmrValidator.getMaxTradeLimit()));
boolean isBuy = dataModel.getDirection() == OfferDirection.BUY; boolean isBuy = dataModel.getDirection() == OfferDirection.BUY;
new Popup().information(Res.get(isBuy ? "popup.warning.tradeLimitDueAccountAgeRestriction.buyer" : "popup.warning.tradeLimitDueAccountAgeRestriction.seller", new Popup().information(Res.get(isBuy ? "popup.warning.tradeLimitDueAccountAgeRestriction.buyer" : "popup.warning.tradeLimitDueAccountAgeRestriction.seller",
HavenoUtils.formatToXmrWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT), HavenoUtils.formatXmr(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT, true),
Res.get("offerbook.warning.newVersionAnnouncement"))) Res.get("offerbook.warning.newVersionAnnouncement")))
.width(900) .width(900)
.show(); .show();
@ -732,7 +732,7 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
updateButtonDisableState(); updateButtonDisableState();
} }
this.minAmount.set(HavenoUtils.formatToXmr(minAmount)); this.minAmount.set(HavenoUtils.formatXmr(minAmount));
if (!dataModel.isMinAmountLessOrEqualAmount()) { if (!dataModel.isMinAmountLessOrEqualAmount()) {
this.amount.set(this.minAmount.get()); this.amount.set(this.minAmount.get());
@ -990,7 +990,7 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
} }
public String getSecurityDepositWithCode() { public String getSecurityDepositWithCode() {
return HavenoUtils.formatToXmrWithCode(dataModel.getSecurityDeposit()); return HavenoUtils.formatXmr(dataModel.getSecurityDeposit(), true);
} }
@ -1219,7 +1219,7 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
if (dataModel.isMinBuyerSecurityDeposit()) { if (dataModel.isMinBuyerSecurityDeposit()) {
buyerSecurityDepositLabel.set(Res.get("createOffer.minSecurityDepositUsed")); buyerSecurityDepositLabel.set(Res.get("createOffer.minSecurityDepositUsed"));
buyerSecurityDeposit.set(HavenoUtils.formatToXmr(Restrictions.getMinBuyerSecurityDeposit())); buyerSecurityDeposit.set(HavenoUtils.formatXmr(Restrictions.getMinBuyerSecurityDeposit()));
} else { } else {
buyerSecurityDepositLabel.set(getSecurityDepositLabel()); buyerSecurityDepositLabel.set(getSecurityDepositLabel());
buyerSecurityDeposit.set(FormattingUtils.formatToPercent(dataModel.getBuyerSecurityDepositPct().get())); buyerSecurityDeposit.set(FormattingUtils.formatToPercent(dataModel.getBuyerSecurityDepositPct().get()));

View file

@ -45,7 +45,7 @@ public class OfferViewModelUtil {
BigInteger tradeAmount, BigInteger tradeAmount,
CoinFormatter formatter, CoinFormatter formatter,
BigInteger minTradeFee) { BigInteger minTradeFee) {
String feeAsBtc = HavenoUtils.formatToXmrWithCode(tradeFee); String feeAsBtc = HavenoUtils.formatXmr(tradeFee, true);
String percentage; String percentage;
if (tradeFee.compareTo(minTradeFee) <= 0) { if (tradeFee.compareTo(minTradeFee) <= 0) {
percentage = Res.get("guiUtil.requiredMinimum") percentage = Res.get("guiUtil.requiredMinimum")

View file

@ -1185,7 +1185,7 @@ abstract public class OfferBookView<R extends GridPane, M extends OfferBookViewM
Res.get("offerbook.timeSinceSigning"), Res.get("offerbook.timeSinceSigning"),
Res.get("offerbook.timeSinceSigning.help", Res.get("offerbook.timeSinceSigning.help",
SignedWitnessService.SIGNER_AGE_DAYS, SignedWitnessService.SIGNER_AGE_DAYS,
HavenoUtils.formatToXmrWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT))) { HavenoUtils.formatXmr(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT, true))) {
{ {
setMinWidth(60); setMinWidth(60);
setSortable(true); setSortable(true);

View file

@ -622,7 +622,7 @@ abstract class OfferBookViewModel extends ActivatableViewModel {
} }
public String getMakerFeeAsString(Offer offer) { public String getMakerFeeAsString(Offer offer) {
return HavenoUtils.formatToXmrWithCode(offer.getMakerFee()); return HavenoUtils.formatXmr(offer.getMakerFee(), true);
} }
private static String getDirectionWithCodeDetailed(OfferDirection direction, String currencyCode) { private static String getDirectionWithCodeDetailed(OfferDirection direction, String currencyCode) {
@ -634,7 +634,7 @@ abstract class OfferBookViewModel extends ActivatableViewModel {
public String formatDepositString(BigInteger deposit, long amount) { public String formatDepositString(BigInteger deposit, long amount) {
var percentage = FormattingUtils.formatToRoundedPercentWithSymbol(BigDecimal.valueOf(deposit.longValueExact()).divide(BigDecimal.valueOf(amount)).doubleValue()); var percentage = FormattingUtils.formatToRoundedPercentWithSymbol(BigDecimal.valueOf(deposit.longValueExact()).divide(BigDecimal.valueOf(amount)).doubleValue());
return HavenoUtils.formatToXmr(deposit) + " (" + percentage + ")"; return HavenoUtils.formatXmr(deposit) + " (" + percentage + ")";
} }
PaymentMethod getShowAllEntryForPaymentMethod() { PaymentMethod getShowAllEntryForPaymentMethod() {

View file

@ -134,7 +134,7 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
priceCurrencyLabel, priceAsPercentageLabel, priceCurrencyLabel, priceAsPercentageLabel,
volumeCurrencyLabel, priceDescriptionLabel, volumeDescriptionLabel, volumeCurrencyLabel, priceDescriptionLabel, volumeDescriptionLabel,
waitingForFundsLabel, offerAvailabilityLabel, priceAsPercentageDescription, waitingForFundsLabel, offerAvailabilityLabel, priceAsPercentageDescription,
tradeFeeDescriptionLabel, resultLabel, tradeFeeInBtcLabel, xLabel, tradeFeeDescriptionLabel, resultLabel, tradeFeeInXmrLabel, xLabel,
fakeXLabel; fakeXLabel;
private InputTextField amountTextField; private InputTextField amountTextField;
private TextField paymentMethodTextField, currencyTextField, priceTextField, priceAsPercentageTextField, private TextField paymentMethodTextField, currencyTextField, priceTextField, priceAsPercentageTextField,
@ -204,7 +204,7 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
if (newValue) { if (newValue) {
Notification walletFundedNotification = new Notification() Notification walletFundedNotification = new Notification()
.headLine(Res.get("notification.walletUpdate.headline")) .headLine(Res.get("notification.walletUpdate.headline"))
.notification(Res.get("notification.walletUpdate.msg", HavenoUtils.formatToXmrWithCode(model.dataModel.getTotalToPay().get()))) .notification(Res.get("notification.walletUpdate.msg", HavenoUtils.formatXmr(model.dataModel.getTotalToPay().get(), true)))
.autoClose(); .autoClose();
walletFundedNotification.show(); walletFundedNotification.show();
@ -477,7 +477,7 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
if (walletFundedNotification == null) { if (walletFundedNotification == null) {
walletFundedNotification = new Notification() walletFundedNotification = new Notification()
.headLine(Res.get("notification.walletUpdate.headline")) .headLine(Res.get("notification.walletUpdate.headline"))
.notification(Res.get("notification.takeOffer.walletUpdate.msg", HavenoUtils.formatToXmrWithCode(model.dataModel.getTotalToPay().get()))) .notification(Res.get("notification.takeOffer.walletUpdate.msg", HavenoUtils.formatXmr(model.dataModel.getTotalToPay().get(), true)))
.autoClose(); .autoClose();
walletFundedNotification.show(); walletFundedNotification.show();
} }
@ -543,9 +543,9 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
priceCurrencyLabel.textProperty().bind(createStringBinding(() -> CurrencyUtil.getCounterCurrency(model.dataModel.getCurrencyCode()))); priceCurrencyLabel.textProperty().bind(createStringBinding(() -> CurrencyUtil.getCounterCurrency(model.dataModel.getCurrencyCode())));
priceAsPercentageLabel.prefWidthProperty().bind(priceCurrencyLabel.widthProperty()); priceAsPercentageLabel.prefWidthProperty().bind(priceCurrencyLabel.widthProperty());
nextButton.disableProperty().bind(model.isNextButtonDisabled); nextButton.disableProperty().bind(model.isNextButtonDisabled);
tradeFeeInBtcLabel.textProperty().bind(model.tradeFeeInXmrWithFiat); tradeFeeInXmrLabel.textProperty().bind(model.tradeFeeInXmrWithFiat);
tradeFeeDescriptionLabel.textProperty().bind(model.tradeFeeDescription); tradeFeeDescriptionLabel.textProperty().bind(model.tradeFeeDescription);
tradeFeeInBtcLabel.visibleProperty().bind(model.isTradeFeeVisible); tradeFeeInXmrLabel.visibleProperty().bind(model.isTradeFeeVisible);
tradeFeeDescriptionLabel.visibleProperty().bind(model.isTradeFeeVisible); tradeFeeDescriptionLabel.visibleProperty().bind(model.isTradeFeeVisible);
tradeFeeDescriptionLabel.managedProperty().bind(tradeFeeDescriptionLabel.visibleProperty()); tradeFeeDescriptionLabel.managedProperty().bind(tradeFeeDescriptionLabel.visibleProperty());
@ -567,9 +567,9 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
priceCurrencyLabel.textProperty().unbind(); priceCurrencyLabel.textProperty().unbind();
priceAsPercentageLabel.prefWidthProperty().unbind(); priceAsPercentageLabel.prefWidthProperty().unbind();
nextButton.disableProperty().unbind(); nextButton.disableProperty().unbind();
tradeFeeInBtcLabel.textProperty().unbind(); tradeFeeInXmrLabel.textProperty().unbind();
tradeFeeDescriptionLabel.textProperty().unbind(); tradeFeeDescriptionLabel.textProperty().unbind();
tradeFeeInBtcLabel.visibleProperty().unbind(); tradeFeeInXmrLabel.visibleProperty().unbind();
tradeFeeDescriptionLabel.visibleProperty().unbind(); tradeFeeDescriptionLabel.visibleProperty().unbind();
tradeFeeDescriptionLabel.managedProperty().unbind(); tradeFeeDescriptionLabel.managedProperty().unbind();
@ -1057,15 +1057,15 @@ public class TakeOfferView extends ActivatableViewAndModel<AnchorPane, TakeOffer
} }
private VBox getTradeFeeFieldsBox() { private VBox getTradeFeeFieldsBox() {
tradeFeeInBtcLabel = new Label(); tradeFeeInXmrLabel = new Label();
tradeFeeInBtcLabel.setMouseTransparent(true); tradeFeeInXmrLabel.setMouseTransparent(true);
tradeFeeInBtcLabel.setId("trade-fee-textfield"); tradeFeeInXmrLabel.setId("trade-fee-textfield");
VBox vBox = new VBox(); VBox vBox = new VBox();
vBox.setSpacing(6); vBox.setSpacing(6);
vBox.setMaxWidth(300); vBox.setMaxWidth(300);
vBox.setAlignment(Pos.CENTER_LEFT); vBox.setAlignment(Pos.CENTER_LEFT);
vBox.getChildren().addAll(tradeFeeInBtcLabel); vBox.getChildren().addAll(tradeFeeInXmrLabel);
HBox hBox = new HBox(); HBox hBox = new HBox();
hBox.getChildren().addAll(vBox); hBox.getChildren().addAll(vBox);

View file

@ -166,7 +166,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
volumeDescriptionLabel.set(Res.get(sellVolumeDescriptionKey, dataModel.getCurrencyCode())); volumeDescriptionLabel.set(Res.get(sellVolumeDescriptionKey, dataModel.getCurrencyCode()));
} }
amount.set(HavenoUtils.formatToXmr(dataModel.getAmount().get())); amount.set(HavenoUtils.formatXmr(dataModel.getAmount().get()));
showTransactionPublishedScreen.set(false); showTransactionPublishedScreen.set(false);
// when getting back to an open screen we want to re-check again // when getting back to an open screen we want to re-check again
@ -207,7 +207,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
? Res.get(buyAmountDescriptionKey) ? Res.get(buyAmountDescriptionKey)
: Res.get(sellAmountDescriptionKey); : Res.get(sellAmountDescriptionKey);
amountRange = HavenoUtils.formatToXmr(offer.getMinAmount()) + " - " + HavenoUtils.formatToXmr(offer.getAmount()); amountRange = HavenoUtils.formatXmr(offer.getMinAmount()) + " - " + HavenoUtils.formatXmr(offer.getAmount());
price = FormattingUtils.formatPrice(dataModel.tradePrice); price = FormattingUtils.formatPrice(dataModel.tradePrice);
marketPriceMargin = FormattingUtils.formatToPercent(offer.getMarketPriceMarginPct()); marketPriceMargin = FormattingUtils.formatToPercent(offer.getMarketPriceMarginPct());
paymentLabel = Res.get("takeOffer.fundsBox.paymentLabel", offer.getShortId()); paymentLabel = Res.get("takeOffer.fundsBox.paymentLabel", offer.getShortId());
@ -263,8 +263,8 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
return true; return true;
} else { } else {
new Popup().warning(Res.get("shared.notEnoughFunds", new Popup().warning(Res.get("shared.notEnoughFunds",
HavenoUtils.formatToXmrWithCode(dataModel.getTotalToPay().get()), HavenoUtils.formatXmr(dataModel.getTotalToPay().get(), true),
HavenoUtils.formatToXmrWithCode(dataModel.getTotalAvailableBalance()))) HavenoUtils.formatXmr(dataModel.getTotalAvailableBalance(), true)))
.actionButtonTextWithGoTo("navigation.funds.depositFunds") .actionButtonTextWithGoTo("navigation.funds.depositFunds")
.onAction(() -> navigation.navigateTo(MainView.class, FundsView.class, DepositView.class)) .onAction(() -> navigation.navigateTo(MainView.class, FundsView.class, DepositView.class))
.show(); .show();
@ -280,7 +280,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
} }
isTradeFeeVisible.setValue(true); isTradeFeeVisible.setValue(true);
tradeFee.set(HavenoUtils.formatToXmr(takerFee)); tradeFee.set(HavenoUtils.formatXmr(takerFee));
tradeFeeInXmrWithFiat.set(OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, tradeFeeInXmrWithFiat.set(OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil,
dataModel.getTakerFee(), dataModel.getTakerFee(),
xmrFormatter)); xmrFormatter));
@ -301,7 +301,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
// only allow max 4 decimal places for btc values // only allow max 4 decimal places for btc values
setAmountToModel(); setAmountToModel();
// reformat input // reformat input
amount.set(HavenoUtils.formatToXmr(dataModel.getAmount().get())); amount.set(HavenoUtils.formatXmr(dataModel.getAmount().get()));
calculateVolume(); calculateVolume();
@ -312,7 +312,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
tradePrice, tradePrice,
maxTradeLimit); maxTradeLimit);
dataModel.applyAmount(adjustedAmountForHalCash); dataModel.applyAmount(adjustedAmountForHalCash);
amount.set(HavenoUtils.formatToXmr(dataModel.getAmount().get())); amount.set(HavenoUtils.formatXmr(dataModel.getAmount().get()));
} else if (dataModel.getOffer().isFiatOffer()) { } else if (dataModel.getOffer().isFiatOffer()) {
if (!isAmountEqualMinAmount(dataModel.getAmount().get()) && (!isAmountEqualMaxAmount(dataModel.getAmount().get()))) { if (!isAmountEqualMinAmount(dataModel.getAmount().get()) && (!isAmountEqualMaxAmount(dataModel.getAmount().get()))) {
// We only apply the rounding if the amount is variable (minAmount is lower as amount). // We only apply the rounding if the amount is variable (minAmount is lower as amount).
@ -321,7 +321,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
maxTradeLimit); maxTradeLimit);
dataModel.applyAmount(roundedAmount); dataModel.applyAmount(roundedAmount);
} }
amount.set(HavenoUtils.formatToXmr(dataModel.getAmount().get())); amount.set(HavenoUtils.formatXmr(dataModel.getAmount().get()));
} }
if (!dataModel.isMinAmountLessOrEqualAmount()) if (!dataModel.isMinAmountLessOrEqualAmount())
@ -338,13 +338,13 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
} else if (btcValidator.getMaxTradeLimit() != null && btcValidator.getMaxTradeLimit().equals(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT)) { } else if (btcValidator.getMaxTradeLimit() != null && btcValidator.getMaxTradeLimit().equals(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT)) {
if (dataModel.getDirection() == OfferDirection.BUY) { if (dataModel.getDirection() == OfferDirection.BUY) {
new Popup().information(Res.get("popup.warning.tradeLimitDueAccountAgeRestriction.seller", new Popup().information(Res.get("popup.warning.tradeLimitDueAccountAgeRestriction.seller",
HavenoUtils.formatToXmrWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT), HavenoUtils.formatXmr(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT, true),
Res.get("offerbook.warning.newVersionAnnouncement"))) Res.get("offerbook.warning.newVersionAnnouncement")))
.width(900) .width(900)
.show(); .show();
} else { } else {
new Popup().information(Res.get("popup.warning.tradeLimitDueAccountAgeRestriction.buyer", new Popup().information(Res.get("popup.warning.tradeLimitDueAccountAgeRestriction.buyer",
HavenoUtils.formatToXmrWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT), HavenoUtils.formatXmr(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT, true),
Res.get("offerbook.warning.newVersionAnnouncement"))) Res.get("offerbook.warning.newVersionAnnouncement")))
.width(900) .width(900)
.show(); .show();
@ -466,7 +466,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
private void addBindings() { private void addBindings() {
volume.bind(createStringBinding(() -> VolumeUtil.formatVolume(dataModel.volume.get()), dataModel.volume)); volume.bind(createStringBinding(() -> VolumeUtil.formatVolume(dataModel.volume.get()), dataModel.volume));
totalToPay.bind(createStringBinding(() -> HavenoUtils.formatToXmrWithCode(dataModel.getTotalToPay().get()), dataModel.getTotalToPay())); totalToPay.bind(createStringBinding(() -> HavenoUtils.formatXmr(dataModel.getTotalToPay().get(), true), dataModel.getTotalToPay()));
} }
@ -487,7 +487,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
updateButtonDisableState(); updateButtonDisableState();
}; };
amountListener = (ov, oldValue, newValue) -> { amountListener = (ov, oldValue, newValue) -> {
amount.set(HavenoUtils.formatToXmr(newValue)); amount.set(HavenoUtils.formatXmr(newValue));
applyTakerFee(); applyTakerFee();
}; };
isWalletFundedListener = (ov, oldValue, newValue) -> updateButtonDisableState(); isWalletFundedListener = (ov, oldValue, newValue) -> updateButtonDisableState();
@ -682,7 +682,7 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
} }
public String getSecurityDepositWithCode() { public String getSecurityDepositWithCode() {
return HavenoUtils.formatToXmrWithCode(dataModel.getSecurityDeposit()); return HavenoUtils.formatXmr(dataModel.getSecurityDeposit(), true);
} }
public String getTradeFee() { public String getTradeFee() {

View file

@ -24,12 +24,12 @@ import haveno.core.locale.Res;
import haveno.desktop.main.overlays.Overlay; import haveno.desktop.main.overlays.Overlay;
import haveno.desktop.main.portfolio.closedtrades.ClosedTradesViewModel; import haveno.desktop.main.portfolio.closedtrades.ClosedTradesViewModel;
import haveno.desktop.util.Layout; import haveno.desktop.util.Layout;
import org.bitcoinj.core.Coin;
import javax.inject.Inject; import javax.inject.Inject;
import javafx.geometry.Insets; import javafx.geometry.Insets;
import java.math.BigInteger;
import java.util.Map; import java.util.Map;
public class ClosedTradesSummaryWindow extends Overlay<ClosedTradesSummaryWindow> { public class ClosedTradesSummaryWindow extends Overlay<ClosedTradesSummaryWindow> {
@ -66,7 +66,7 @@ public class ClosedTradesSummaryWindow extends Overlay<ClosedTradesSummaryWindow
Map<String, String> totalVolumeByCurrency = model.getTotalVolumeByCurrency(); Map<String, String> totalVolumeByCurrency = model.getTotalVolumeByCurrency();
int rowSpan = totalVolumeByCurrency.size() + 4; int rowSpan = totalVolumeByCurrency.size() + 4;
addTitledGroupBg(gridPane, rowIndex, rowSpan, Res.get("closedTradesSummaryWindow.headline")); addTitledGroupBg(gridPane, rowIndex, rowSpan, Res.get("closedTradesSummaryWindow.headline"));
Coin totalTradeAmount = model.getTotalTradeAmount(); BigInteger totalTradeAmount = model.getTotalTradeAmount();
addConfirmationLabelLabel(gridPane, rowIndex, addConfirmationLabelLabel(gridPane, rowIndex,
Res.get("closedTradesSummaryWindow.totalAmount.title"), Res.get("closedTradesSummaryWindow.totalAmount.title"),
model.getTotalAmountWithVolume(totalTradeAmount), Layout.TWICE_FIRST_ROW_DISTANCE); model.getTotalAmountWithVolume(totalTradeAmount), Layout.TWICE_FIRST_ROW_DISTANCE);
@ -78,7 +78,7 @@ public class ClosedTradesSummaryWindow extends Overlay<ClosedTradesSummaryWindow
Res.get("closedTradesSummaryWindow.totalMinerFee.title"), Res.get("closedTradesSummaryWindow.totalMinerFee.title"),
model.getTotalTxFee(totalTradeAmount)); model.getTotalTxFee(totalTradeAmount));
addConfirmationLabelLabel(gridPane, ++rowIndex, addConfirmationLabelLabel(gridPane, ++rowIndex,
Res.get("closedTradesSummaryWindow.totalTradeFeeInBtc.title"), Res.get("closedTradesSummaryWindow.totalTradeFeeInXmr.title"),
model.getTotalTradeFeeInBtc(totalTradeAmount)); model.getTotalTradeFee(totalTradeAmount));
} }
} }

View file

@ -148,18 +148,18 @@ public class ContractWindow extends Overlay<ContractWindow> {
addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.tradePrice"), addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.tradePrice"),
FormattingUtils.formatPrice(contract.getPrice())); FormattingUtils.formatPrice(contract.getPrice()));
addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.tradeAmount"), addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.tradeAmount"),
HavenoUtils.formatToXmrWithCode(contract.getTradeAmount())); HavenoUtils.formatXmr(contract.getTradeAmount(), true));
addConfirmationLabelTextField(gridPane, addConfirmationLabelTextField(gridPane,
++rowIndex, ++rowIndex,
VolumeUtil.formatVolumeLabel(currencyCode, ":"), VolumeUtil.formatVolumeLabel(currencyCode, ":"),
VolumeUtil.formatVolumeWithCode(contract.getTradeVolume())); VolumeUtil.formatVolumeWithCode(contract.getTradeVolume()));
String securityDeposit = Res.getWithColAndCap("shared.buyer") + String securityDeposit = Res.getWithColAndCap("shared.buyer") +
" " + " " +
HavenoUtils.formatToXmrWithCode(offer.getBuyerSecurityDeposit()) + HavenoUtils.formatXmr(offer.getBuyerSecurityDeposit(), true) +
" / " + " / " +
Res.getWithColAndCap("shared.seller") + Res.getWithColAndCap("shared.seller") +
" " + " " +
HavenoUtils.formatToXmrWithCode(offer.getSellerSecurityDeposit()); HavenoUtils.formatXmr(offer.getSellerSecurityDeposit(), true);
addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), securityDeposit); addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), securityDeposit);
addConfirmationLabelTextField(gridPane, addConfirmationLabelTextField(gridPane,
++rowIndex, ++rowIndex,

View file

@ -273,26 +273,26 @@ public class DisputeSummaryWindow extends Overlay<DisputeSummaryWindow> {
} }
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("disputeSummaryWindow.role"), role); addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("disputeSummaryWindow.role"), role);
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradeAmount"), addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradeAmount"),
HavenoUtils.formatToXmrWithCode(contract.getTradeAmount())); HavenoUtils.formatXmr(contract.getTradeAmount(), true));
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradePrice"), addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradePrice"),
FormattingUtils.formatPrice(contract.getPrice())); FormattingUtils.formatPrice(contract.getPrice()));
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradeVolume"), addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradeVolume"),
VolumeUtil.formatVolumeWithCode(contract.getTradeVolume())); VolumeUtil.formatVolumeWithCode(contract.getTradeVolume()));
String tradeFee = Res.getWithColAndCap("shared.buyer") + String tradeFee = Res.getWithColAndCap("shared.buyer") +
" " + " " +
HavenoUtils.formatToXmrWithCode(trade.getBuyer() == trade.getMaker() ? trade.getMakerFee() : trade.getTakerFee()) + HavenoUtils.formatXmr(trade.getBuyer() == trade.getMaker() ? trade.getMakerFee() : trade.getTakerFee(), true) +
" / " + " / " +
Res.getWithColAndCap("shared.seller") + Res.getWithColAndCap("shared.seller") +
" " + " " +
HavenoUtils.formatToXmrWithCode(trade.getSeller() == trade.getMaker() ? trade.getMakerFee() : trade.getTakerFee()); HavenoUtils.formatXmr(trade.getSeller() == trade.getMaker() ? trade.getMakerFee() : trade.getTakerFee(), true);
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradeFee"), tradeFee); addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.tradeFee"), tradeFee);
String securityDeposit = Res.getWithColAndCap("shared.buyer") + String securityDeposit = Res.getWithColAndCap("shared.buyer") +
" " + " " +
HavenoUtils.formatToXmrWithCode(trade.getBuyerSecurityDeposit()) + HavenoUtils.formatXmr(trade.getBuyerSecurityDeposit(), true) +
" / " + " / " +
Res.getWithColAndCap("shared.seller") + Res.getWithColAndCap("shared.seller") +
" " + " " +
HavenoUtils.formatToXmrWithCode(trade.getSellerSecurityDeposit()); HavenoUtils.formatXmr(trade.getSellerSecurityDeposit(), true);
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), securityDeposit); addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), securityDeposit);
} }
@ -388,10 +388,10 @@ public class DisputeSummaryWindow extends Overlay<DisputeSummaryWindow> {
if (enteredAmount.compareTo(available) > 0) { if (enteredAmount.compareTo(available) > 0) {
enteredAmount = available; enteredAmount = available;
BigInteger finalEnteredAmount = enteredAmount; BigInteger finalEnteredAmount = enteredAmount;
inputTextField.setText(HavenoUtils.formatToXmr(finalEnteredAmount)); inputTextField.setText(HavenoUtils.formatXmr(finalEnteredAmount));
} }
BigInteger counterPart = available.subtract(enteredAmount); BigInteger counterPart = available.subtract(enteredAmount);
String formattedCounterPartAmount = HavenoUtils.formatToXmr(counterPart); String formattedCounterPartAmount = HavenoUtils.formatXmr(counterPart);
BigInteger buyerAmount; BigInteger buyerAmount;
BigInteger sellerAmount; BigInteger sellerAmount;
if (inputTextField == buyerPayoutAmountInputTextField) { if (inputTextField == buyerPayoutAmountInputTextField) {
@ -622,20 +622,20 @@ public class DisputeSummaryWindow extends Overlay<DisputeSummaryWindow> {
String buyerDetails = ""; String buyerDetails = "";
if (buyerPayoutAmount.compareTo(BigInteger.valueOf(0)) > 0) { if (buyerPayoutAmount.compareTo(BigInteger.valueOf(0)) > 0) {
buyerDetails = Res.get("disputeSummaryWindow.close.txDetails.buyer", buyerDetails = Res.get("disputeSummaryWindow.close.txDetails.buyer",
HavenoUtils.formatToXmrWithCode(buyerPayoutAmount), HavenoUtils.formatXmr(buyerPayoutAmount, true),
buyerPayoutAddressString); buyerPayoutAddressString);
} }
String sellerDetails = ""; String sellerDetails = "";
if (sellerPayoutAmount.compareTo(BigInteger.valueOf(0)) > 0) { if (sellerPayoutAmount.compareTo(BigInteger.valueOf(0)) > 0) {
sellerDetails = Res.get("disputeSummaryWindow.close.txDetails.seller", sellerDetails = Res.get("disputeSummaryWindow.close.txDetails.seller",
HavenoUtils.formatToXmrWithCode(sellerPayoutAmount), HavenoUtils.formatXmr(sellerPayoutAmount, true),
sellerPayoutAddressString); sellerPayoutAddressString);
} }
if (outputAmount.compareTo(BigInteger.valueOf(0)) > 0) { if (outputAmount.compareTo(BigInteger.valueOf(0)) > 0) {
new Popup().width(900) new Popup().width(900)
.headLine(Res.get("disputeSummaryWindow.close.txDetails.headline")) .headLine(Res.get("disputeSummaryWindow.close.txDetails.headline"))
.confirmation(Res.get("disputeSummaryWindow.close.txDetails", .confirmation(Res.get("disputeSummaryWindow.close.txDetails",
HavenoUtils.formatToXmrWithCode(outputAmount), HavenoUtils.formatXmr(outputAmount, true),
buyerDetails, buyerDetails,
sellerDetails, sellerDetails,
formatter.formatCoinWithCode(HavenoUtils.atomicUnitsToCoin(payoutTx.getFee())))) formatter.formatCoinWithCode(HavenoUtils.atomicUnitsToCoin(payoutTx.getFee()))))
@ -711,8 +711,8 @@ public class DisputeSummaryWindow extends Overlay<DisputeSummaryWindow> {
throw new IllegalStateException("Unknown radio button"); throw new IllegalStateException("Unknown radio button");
} }
disputesService.applyPayoutAmountsToDisputeResult(payout, dispute, disputeResult, -1); disputesService.applyPayoutAmountsToDisputeResult(payout, dispute, disputeResult, -1);
buyerPayoutAmountInputTextField.setText(HavenoUtils.formatToXmr(disputeResult.getBuyerPayoutAmount())); buyerPayoutAmountInputTextField.setText(HavenoUtils.formatXmr(disputeResult.getBuyerPayoutAmount()));
sellerPayoutAmountInputTextField.setText(HavenoUtils.formatToXmr(disputeResult.getSellerPayoutAmount())); sellerPayoutAmountInputTextField.setText(HavenoUtils.formatXmr(disputeResult.getSellerPayoutAmount()));
} }
private void applyTradeAmountRadioButtonStates() { private void applyTradeAmountRadioButtonStates() {
@ -724,8 +724,8 @@ public class DisputeSummaryWindow extends Overlay<DisputeSummaryWindow> {
BigInteger buyerPayoutAmount = disputeResult.getBuyerPayoutAmount(); BigInteger buyerPayoutAmount = disputeResult.getBuyerPayoutAmount();
BigInteger sellerPayoutAmount = disputeResult.getSellerPayoutAmount(); BigInteger sellerPayoutAmount = disputeResult.getSellerPayoutAmount();
buyerPayoutAmountInputTextField.setText(HavenoUtils.formatToXmr(buyerPayoutAmount)); buyerPayoutAmountInputTextField.setText(HavenoUtils.formatXmr(buyerPayoutAmount));
sellerPayoutAmountInputTextField.setText(HavenoUtils.formatToXmr(sellerPayoutAmount)); sellerPayoutAmountInputTextField.setText(HavenoUtils.formatXmr(sellerPayoutAmount));
if (buyerPayoutAmount.equals(tradeAmount.add(buyerSecurityDeposit)) && if (buyerPayoutAmount.equals(tradeAmount.add(buyerSecurityDeposit)) &&
sellerPayoutAmount.equals(sellerSecurityDeposit)) { sellerPayoutAmount.equals(sellerSecurityDeposit)) {

View file

@ -206,14 +206,14 @@ public class OfferDetailsWindow extends Overlay<OfferDetailsWindow> {
String btcAmount = Res.get("shared.btcAmount"); String btcAmount = Res.get("shared.btcAmount");
if (takeOfferHandlerOptional.isPresent()) { if (takeOfferHandlerOptional.isPresent()) {
addConfirmationLabelLabel(gridPane, ++rowIndex, btcAmount + btcDirectionInfo, addConfirmationLabelLabel(gridPane, ++rowIndex, btcAmount + btcDirectionInfo,
HavenoUtils.formatToXmrWithCode(tradeAmount)); HavenoUtils.formatXmr(tradeAmount, true));
addConfirmationLabelLabel(gridPane, ++rowIndex, VolumeUtil.formatVolumeLabel(currencyCode) + fiatDirectionInfo, addConfirmationLabelLabel(gridPane, ++rowIndex, VolumeUtil.formatVolumeLabel(currencyCode) + fiatDirectionInfo,
VolumeUtil.formatVolumeWithCode(offer.getVolumeByAmount(tradeAmount))); VolumeUtil.formatVolumeWithCode(offer.getVolumeByAmount(tradeAmount)));
} else { } else {
addConfirmationLabelLabel(gridPane, ++rowIndex, btcAmount + btcDirectionInfo, addConfirmationLabelLabel(gridPane, ++rowIndex, btcAmount + btcDirectionInfo,
HavenoUtils.formatToXmrWithCode(offer.getAmount())); HavenoUtils.formatXmr(offer.getAmount(), true));
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("offerDetailsWindow.minBtcAmount"), addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("offerDetailsWindow.minBtcAmount"),
HavenoUtils.formatToXmrWithCode(offer.getMinAmount())); HavenoUtils.formatXmr(offer.getMinAmount(), true));
String volume = VolumeUtil.formatVolumeWithCode(offer.getVolume()); String volume = VolumeUtil.formatVolumeWithCode(offer.getVolume());
String minVolume = ""; String minVolume = "";
if (offer.getVolume() != null && offer.getMinVolume() != null && if (offer.getVolume() != null && offer.getMinVolume() != null &&
@ -322,11 +322,11 @@ public class OfferDetailsWindow extends Overlay<OfferDetailsWindow> {
DisplayUtils.formatDateTime(offer.getDate())); DisplayUtils.formatDateTime(offer.getDate()));
String value = Res.getWithColAndCap("shared.buyer") + String value = Res.getWithColAndCap("shared.buyer") +
" " + " " +
HavenoUtils.formatToXmrWithCode(offer.getBuyerSecurityDeposit()) + HavenoUtils.formatXmr(offer.getBuyerSecurityDeposit(), true) +
" / " + " / " +
Res.getWithColAndCap("shared.seller") + Res.getWithColAndCap("shared.seller") +
" " + " " +
HavenoUtils.formatToXmrWithCode(offer.getSellerSecurityDeposit()); HavenoUtils.formatXmr(offer.getSellerSecurityDeposit(), true);
addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), value); addConfirmationLabelLabel(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), value);
if (countryCode != null && !isF2F) if (countryCode != null && !isF2F)

View file

@ -159,7 +159,7 @@ public class TradeDetailsWindow extends Overlay<TradeDetailsWindow> {
} }
addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.btcAmount") + btcDirectionInfo, addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.btcAmount") + btcDirectionInfo,
HavenoUtils.formatToXmrWithCode(trade.getAmount())); HavenoUtils.formatXmr(trade.getAmount(), true));
addConfirmationLabelTextField(gridPane, ++rowIndex, addConfirmationLabelTextField(gridPane, ++rowIndex,
VolumeUtil.formatVolumeLabel(offer.getCurrencyCode()) + fiatDirectionInfo, VolumeUtil.formatVolumeLabel(offer.getCurrencyCode()) + fiatDirectionInfo,
VolumeUtil.formatVolumeWithCode(trade.getVolume())); VolumeUtil.formatVolumeWithCode(trade.getVolume()));
@ -212,11 +212,11 @@ public class TradeDetailsWindow extends Overlay<TradeDetailsWindow> {
DisplayUtils.formatDateTime(trade.getDate())); DisplayUtils.formatDateTime(trade.getDate()));
String securityDeposit = Res.getWithColAndCap("shared.buyer") + String securityDeposit = Res.getWithColAndCap("shared.buyer") +
" " + " " +
HavenoUtils.formatToXmrWithCode(offer.getBuyerSecurityDeposit()) + HavenoUtils.formatXmr(offer.getBuyerSecurityDeposit(), true) +
" / " + " / " +
Res.getWithColAndCap("shared.seller") + Res.getWithColAndCap("shared.seller") +
" " + " " +
HavenoUtils.formatToXmrWithCode(offer.getSellerSecurityDeposit()); HavenoUtils.formatXmr(offer.getSellerSecurityDeposit(), true);
addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), securityDeposit); addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("shared.securityDeposit"), securityDeposit);
NodeAddress arbitratorNodeAddress = trade.getArbitratorNodeAddress(); NodeAddress arbitratorNodeAddress = trade.getArbitratorNodeAddress();

View file

@ -17,8 +17,6 @@
package haveno.desktop.main.portfolio.closedtrades; package haveno.desktop.main.portfolio.closedtrades;
import org.bitcoinj.core.Coin;
import com.google.inject.Inject; import com.google.inject.Inject;
import haveno.core.account.witness.AccountAgeWitnessService; import haveno.core.account.witness.AccountAgeWitnessService;
import haveno.core.monetary.Price; import haveno.core.monetary.Price;
@ -37,6 +35,7 @@ import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener; import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import java.math.BigInteger;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -85,15 +84,15 @@ class ClosedTradesDataModel extends ActivatableDataModel {
return list.stream().map(ClosedTradesListItem::getTradable).collect(Collectors.toList()); return list.stream().map(ClosedTradesListItem::getTradable).collect(Collectors.toList());
} }
Coin getTotalAmount() { BigInteger getTotalAmount() {
return ClosedTradableUtil.getTotalAmount(getListAsTradables()); return ClosedTradableUtil.getTotalAmount(getListAsTradables());
} }
Optional<Volume> getVolumeInUserFiatCurrency(Coin amount) { Optional<Volume> getVolumeInUserFiatCurrency(BigInteger amount) {
return getVolume(amount, preferences.getPreferredTradeCurrency().getCode()); return getVolume(amount, preferences.getPreferredTradeCurrency().getCode());
} }
Optional<Volume> getVolume(Coin amount, String currencyCode) { Optional<Volume> getVolume(BigInteger amount, String currencyCode) {
MarketPrice marketPrice = priceFeedService.getMarketPrice(currencyCode); MarketPrice marketPrice = priceFeedService.getMarketPrice(currencyCode);
if (marketPrice == null) { if (marketPrice == null) {
return Optional.empty(); return Optional.empty();
@ -103,15 +102,11 @@ class ClosedTradesDataModel extends ActivatableDataModel {
return Optional.of(VolumeUtil.getVolume(amount, price)); return Optional.of(VolumeUtil.getVolume(amount, price));
} }
Volume getBsqVolumeInUsdWithAveragePrice(Coin amount) { BigInteger getTotalTxFee() {
return closedTradableManager.getBsqVolumeInUsdWithAveragePrice(amount);
}
Coin getTotalTxFee() {
return ClosedTradableUtil.getTotalTxFee(getListAsTradables()); return ClosedTradableUtil.getTotalTxFee(getListAsTradables());
} }
Coin getTotalTradeFee() { BigInteger getTotalTradeFee() {
return closedTradableManager.getTotalTradeFee(getListAsTradables()); return closedTradableManager.getTotalTradeFee(getListAsTradables());
} }

View file

@ -84,7 +84,7 @@ public class ClosedTradesListItem implements FilterableListItem {
} }
public String getTxFeeAsString() { public String getTxFeeAsString() {
return closedTradableFormatter.getTxFeeAsString(tradable); return closedTradableFormatter.getTotalTxFeeAsString(tradable);
} }
public String getTradeFeeAsString(boolean appendCode) { public String getTradeFeeAsString(boolean appendCode) {

View file

@ -17,12 +17,12 @@
package haveno.desktop.main.portfolio.closedtrades; package haveno.desktop.main.portfolio.closedtrades;
import org.bitcoinj.core.Coin;
import com.google.inject.Inject; import com.google.inject.Inject;
import haveno.core.trade.ClosedTradableFormatter; import haveno.core.trade.ClosedTradableFormatter;
import haveno.desktop.common.model.ActivatableWithDataModel; import haveno.desktop.common.model.ActivatableWithDataModel;
import haveno.desktop.common.model.ViewModel; import haveno.desktop.common.model.ViewModel;
import java.math.BigInteger;
import java.util.Map; import java.util.Map;
public class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataModel> implements ViewModel { public class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataModel> implements ViewModel {
@ -39,11 +39,11 @@ public class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTrades
// Used in ClosedTradesSummaryWindow // Used in ClosedTradesSummaryWindow
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public Coin getTotalTradeAmount() { public BigInteger getTotalTradeAmount() {
return dataModel.getTotalAmount(); return dataModel.getTotalAmount();
} }
public String getTotalAmountWithVolume(Coin totalTradeAmount) { public String getTotalAmountWithVolume(BigInteger totalTradeAmount) {
return dataModel.getVolumeInUserFiatCurrency(totalTradeAmount) return dataModel.getVolumeInUserFiatCurrency(totalTradeAmount)
.map(volume -> closedTradableFormatter.getTotalAmountWithVolumeAsString(totalTradeAmount, volume)) .map(volume -> closedTradableFormatter.getTotalAmountWithVolumeAsString(totalTradeAmount, volume))
.orElse(""); .orElse("");
@ -53,13 +53,13 @@ public class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTrades
return closedTradableFormatter.getTotalVolumeByCurrencyAsString(dataModel.getListAsTradables()); return closedTradableFormatter.getTotalVolumeByCurrencyAsString(dataModel.getListAsTradables());
} }
public String getTotalTxFee(Coin totalTradeAmount) { public String getTotalTxFee(BigInteger totalTradeAmount) {
Coin totalTxFee = dataModel.getTotalTxFee(); BigInteger totalTxFee = dataModel.getTotalTxFee();
return closedTradableFormatter.getTotalTxFeeAsString(totalTradeAmount, totalTxFee); return closedTradableFormatter.getTotalTxFeeAsString(totalTradeAmount, totalTxFee);
} }
public String getTotalTradeFeeInBtc(Coin totalTradeAmount) { public String getTotalTradeFee(BigInteger totalTradeAmount) {
Coin totalTradeFee = dataModel.getTotalTradeFee(); BigInteger totalTradeFee = dataModel.getTotalTradeFee();
return closedTradableFormatter.getTotalTradeFeeInBtcAsString(totalTradeAmount, totalTradeFee); return closedTradableFormatter.getTotalTradeFeeAsString(totalTradeAmount, totalTradeFee);
} }
} }

View file

@ -275,7 +275,7 @@ public class FailedTradesView extends ActivatableViewAndModel<VBox, FailedTrades
new Popup().warning(Res.get(msgKey, new Popup().warning(Res.get(msgKey,
buyerOrSeller, buyerOrSeller,
makerOrTaker, makerOrTaker,
HavenoUtils.formatToXmrWithCode(fee), HavenoUtils.formatXmr(fee, true),
"todo", // TODO: set reserve tx miner fee when verified "todo", // TODO: set reserve tx miner fee when verified
reserveTxHash reserveTxHash
) )

View file

@ -52,7 +52,7 @@ class FailedTradesViewModel extends ActivatableWithDataModel<FailedTradesDataMod
String getAmount(FailedTradesListItem item) { String getAmount(FailedTradesListItem item) {
if (item != null && item.getTrade() != null) if (item != null && item.getTrade() != null)
return HavenoUtils.formatToXmr(item.getTrade().getAmount()); return HavenoUtils.formatXmr(item.getTrade().getAmount());
else else
return ""; return "";
} }

View file

@ -159,7 +159,7 @@ class OpenOffersViewModel extends ActivatableWithDataModel<OpenOffersDataModel>
public String getMakerFeeAsString(OpenOffer openOffer) { public String getMakerFeeAsString(OpenOffer openOffer) {
Offer offer = openOffer.getOffer(); Offer offer = openOffer.getOffer();
return HavenoUtils.formatToXmrWithCode(offer.getMakerFee()); return HavenoUtils.formatXmr(offer.getMakerFee(), true);
} }
String getTriggerPrice(OpenOfferListItem item) { String getTriggerPrice(OpenOfferListItem item) {

View file

@ -272,7 +272,7 @@ public class PendingTradesDataModel extends ActivatableDataModel {
return isMaker; return isMaker;
} }
BigInteger getTradeFeeInBTC() { BigInteger getTradeFee() {
Trade trade = getTrade(); Trade trade = getTrade();
if (trade != null) { if (trade != null) {
Offer offer = trade.getOffer(); Offer offer = trade.getOffer();

View file

@ -56,7 +56,7 @@ public class PendingTradesListItem implements FilterableListItem {
} }
public String getAmountAsString() { public String getAmountAsString() {
return HavenoUtils.formatToXmr(trade.getAmount()); return HavenoUtils.formatXmr(trade.getAmount());
} }
public String getPaymentMethod() { public String getPaymentMethod() {

View file

@ -695,7 +695,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
public void updateItem(final PendingTradesListItem item, boolean empty) { public void updateItem(final PendingTradesListItem item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
if (item != null && !empty) if (item != null && !empty)
setGraphic(new AutoTooltipLabel(HavenoUtils.formatToXmr(item.getTrade().getAmount()))); setGraphic(new AutoTooltipLabel(HavenoUtils.formatXmr(item.getTrade().getAmount())));
else else
setGraphic(null); setGraphic(null);
} }

View file

@ -230,7 +230,7 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
public String getPayoutAmount() { public String getPayoutAmount() {
return dataModel.getTrade() != null return dataModel.getTrade() != null
? HavenoUtils.formatToXmrWithCode(dataModel.getTrade().getPayoutAmount()) ? HavenoUtils.formatXmr(dataModel.getTrade().getPayoutAmount(), true)
: ""; : "";
} }
@ -276,7 +276,7 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
// summary // summary
public String getTradeVolume() { public String getTradeVolume() {
return dataModel.getTrade() != null return dataModel.getTrade() != null
? HavenoUtils.formatToXmrWithCode(dataModel.getTrade().getAmount()) ? HavenoUtils.formatXmr(dataModel.getTrade().getAmount(), true)
: ""; : "";
} }
@ -290,15 +290,15 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
if (trade != null && dataModel.getOffer() != null && trade.getAmount() != null) { if (trade != null && dataModel.getOffer() != null && trade.getAmount() != null) {
checkNotNull(dataModel.getTrade()); checkNotNull(dataModel.getTrade());
BigInteger tradeFeeInBTC = dataModel.getTradeFeeInBTC(); BigInteger tradeFeeInXmr = dataModel.getTradeFee();
BigInteger minTradeFee = dataModel.isMaker() ? BigInteger minTradeFee = dataModel.isMaker() ?
HavenoUtils.getMinMakerFee() : HavenoUtils.getMinMakerFee() :
HavenoUtils.getMinTakerFee(); HavenoUtils.getMinTakerFee();
String percentage = GUIUtil.getPercentageOfTradeAmount(tradeFeeInBTC, trade.getAmount(), String percentage = GUIUtil.getPercentageOfTradeAmount(tradeFeeInXmr, trade.getAmount(),
minTradeFee); minTradeFee);
return HavenoUtils.formatToXmrWithCode(tradeFeeInBTC) + percentage; return HavenoUtils.formatXmr(tradeFeeInXmr, true) + percentage;
} else { } else {
return ""; return "";
} }
@ -319,7 +319,7 @@ public class PendingTradesViewModel extends ActivatableWithDataModel<PendingTrad
String percentage = GUIUtil.getPercentageOfTradeAmount(securityDeposit, String percentage = GUIUtil.getPercentageOfTradeAmount(securityDeposit,
trade.getAmount(), trade.getAmount(),
minSecurityDeposit); minSecurityDeposit);
return HavenoUtils.formatToXmrWithCode(securityDeposit) + percentage; return HavenoUtils.formatXmr(securityDeposit, true) + percentage;
} else { } else {
return ""; return "";
} }

View file

@ -669,8 +669,8 @@ public abstract class TradeStepView extends AnchorPane {
DisputeResult disputeResult = optionalDispute.get().getDisputeResultProperty().get(); DisputeResult disputeResult = optionalDispute.get().getDisputeResultProperty().get();
Contract contract = checkNotNull(trade.getContract(), "contract must not be null"); Contract contract = checkNotNull(trade.getContract(), "contract must not be null");
boolean isMyRoleBuyer = contract.isMyRoleBuyer(model.dataModel.getPubKeyRingProvider().get()); boolean isMyRoleBuyer = contract.isMyRoleBuyer(model.dataModel.getPubKeyRingProvider().get());
String buyerPayoutAmount = HavenoUtils.formatToXmrWithCode(disputeResult.getBuyerPayoutAmount()); String buyerPayoutAmount = HavenoUtils.formatXmr(disputeResult.getBuyerPayoutAmount(), true);
String sellerPayoutAmount = HavenoUtils.formatToXmrWithCode(disputeResult.getSellerPayoutAmount()); String sellerPayoutAmount = HavenoUtils.formatXmr(disputeResult.getSellerPayoutAmount(), true);
String myPayoutAmount = isMyRoleBuyer ? buyerPayoutAmount : sellerPayoutAmount; String myPayoutAmount = isMyRoleBuyer ? buyerPayoutAmount : sellerPayoutAmount;
String peersPayoutAmount = isMyRoleBuyer ? sellerPayoutAmount : buyerPayoutAmount; String peersPayoutAmount = isMyRoleBuyer ? sellerPayoutAmount : buyerPayoutAmount;

View file

@ -655,8 +655,8 @@ public abstract class DisputeView extends ActivatableView<VBox, Void> {
DisputeResult disputeResult = firstDispute.getDisputeResultProperty().get(); DisputeResult disputeResult = firstDispute.getDisputeResultProperty().get();
String winner = disputeResult != null && String winner = disputeResult != null &&
disputeResult.getWinner() == DisputeResult.Winner.BUYER ? "Buyer" : "Seller"; disputeResult.getWinner() == DisputeResult.Winner.BUYER ? "Buyer" : "Seller";
String buyerPayoutAmount = disputeResult != null ? HavenoUtils.formatToXmrWithCode(disputeResult.getBuyerPayoutAmount()) : ""; String buyerPayoutAmount = disputeResult != null ? HavenoUtils.formatXmr(disputeResult.getBuyerPayoutAmount(), true) : "";
String sellerPayoutAmount = disputeResult != null ? HavenoUtils.formatToXmrWithCode(disputeResult.getSellerPayoutAmount()) : ""; String sellerPayoutAmount = disputeResult != null ? HavenoUtils.formatXmr(disputeResult.getSellerPayoutAmount(), true) : "";
int index = disputeIndex.incrementAndGet(); int index = disputeIndex.incrementAndGet();
String tradeDateString = dateFormatter.format(firstDispute.getTradeDate()); String tradeDateString = dateFormatter.format(firstDispute.getTradeDate());
@ -703,7 +703,7 @@ public abstract class DisputeView extends ActivatableView<VBox, Void> {
String paymentMethod = Res.get(contract.getPaymentMethodId()); String paymentMethod = Res.get(contract.getPaymentMethodId());
String currency = CurrencyUtil.getNameAndCode(contract.getOfferPayload().getCurrencyCode()); String currency = CurrencyUtil.getNameAndCode(contract.getOfferPayload().getCurrencyCode());
String tradeAmount = HavenoUtils.formatToXmrWithCode(contract.getTradeAmount()); String tradeAmount = HavenoUtils.formatXmr(contract.getTradeAmount(), true);
String buyerDeposit = Coin.valueOf(contract.getOfferPayload().getBuyerSecurityDeposit()).toFriendlyString(); String buyerDeposit = Coin.valueOf(contract.getOfferPayload().getBuyerSecurityDeposit()).toFriendlyString();
String sellerDeposit = Coin.valueOf(contract.getOfferPayload().getSellerSecurityDeposit()).toFriendlyString(); String sellerDeposit = Coin.valueOf(contract.getOfferPayload().getSellerSecurityDeposit()).toFriendlyString();
stringBuilder.append("Payment method: ") stringBuilder.append("Payment method: ")

View file

@ -163,8 +163,8 @@ public class SignedOfferView extends ActivatableView<VBox, Void> {
if(selectedSignedOffer != null) { if(selectedSignedOffer != null) {
new Popup().warning(Res.get("support.prompt.signedOffer.penalty.msg", new Popup().warning(Res.get("support.prompt.signedOffer.penalty.msg",
selectedSignedOffer.getOfferId(), selectedSignedOffer.getOfferId(),
HavenoUtils.formatToXmrWithCode(selectedSignedOffer.getMakerTradeFee()), HavenoUtils.formatXmr(selectedSignedOffer.getMakerTradeFee(), true),
HavenoUtils.formatToXmrWithCode(selectedSignedOffer.getReserveTxMinerFee()), HavenoUtils.formatXmr(selectedSignedOffer.getReserveTxMinerFee(), true),
selectedSignedOffer.getReserveTxHash(), selectedSignedOffer.getReserveTxHash(),
selectedSignedOffer.getReserveTxKeyImages()) selectedSignedOffer.getReserveTxKeyImages())
).onAction(() -> OfferViewUtil.submitTransactionHex(xmrWalletService, tableView, ).onAction(() -> OfferViewUtil.submitTransactionHex(xmrWalletService, tableView,
@ -405,7 +405,7 @@ public class SignedOfferView extends ActivatableView<VBox, Void> {
public void updateItem(final SignedOffer item, boolean empty) { public void updateItem(final SignedOffer item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
if (item != null && !empty) if (item != null && !empty)
setText(HavenoUtils.formatToXmrWithCode(item.getMakerTradeFee())); setText(HavenoUtils.formatXmr(item.getMakerTradeFee(), true));
else else
setText(""); setText("");
} }
@ -431,7 +431,7 @@ public class SignedOfferView extends ActivatableView<VBox, Void> {
public void updateItem(final SignedOffer item, boolean empty) { public void updateItem(final SignedOffer item, boolean empty) {
super.updateItem(item, empty); super.updateItem(item, empty);
if (item != null && !empty) if (item != null && !empty)
setText(HavenoUtils.formatToXmrWithCode(item.getReserveTxMinerFee())); setText(HavenoUtils.formatXmr(item.getReserveTxMinerFee(), true));
else else
setText(""); setText("");
} }

Some files were not shown because too many files have changed in this diff Show more