mirror of
https://github.com/bisq-network/bisq.git
synced 2025-02-24 15:10:44 +01:00
Merge branch 'master_origin'
This commit is contained in:
commit
d6337dcaaa
16 changed files with 254 additions and 72 deletions
|
@ -60,7 +60,6 @@ dependencies {
|
|||
|
||||
build.dependsOn installDist
|
||||
installDist.destinationDir = file('build/app')
|
||||
distZip.enabled = true
|
||||
|
||||
// generated with `./gradlew -q calculateChecksums | grep -v network.bisq:bisq-`
|
||||
dependencyVerification {
|
||||
|
|
|
@ -217,6 +217,7 @@ D TradeStatistics (io.bisq.trade.statistics)
|
|||
+ NodeAddress (io.bisq.p2p)
|
||||
C+PaymentAccountContractData (io.bisq.payment)
|
||||
+ AliPayAccountContractData (io.bisq.payment)
|
||||
+ WeChatPayAccountContractData (io.bisq.payment)
|
||||
+ ChaseQuickPayAccountContractData (io.bisq.payment)
|
||||
+ ClearXchangeAccountContractData (io.bisq.payment)
|
||||
C+ CountryBasedPaymentAccountContractData (io.bisq.payment)
|
||||
|
|
|
@ -50,10 +50,10 @@ public class CashAppForm extends PaymentMethodForm {
|
|||
return gridRow;
|
||||
}
|
||||
|
||||
public CashAppForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, CashAppValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
|
||||
public CashAppForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, CashAppValidator cashAppValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
|
||||
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
|
||||
this.account = (CashAppAccount) paymentAccount;
|
||||
this.validator = aliPayValidator;
|
||||
this.validator = cashAppValidator;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -50,10 +50,10 @@ public class MoneyBeamForm extends PaymentMethodForm {
|
|||
return gridRow;
|
||||
}
|
||||
|
||||
public MoneyBeamForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, MoneyBeamValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
|
||||
public MoneyBeamForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, MoneyBeamValidator moneyBeamValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
|
||||
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
|
||||
this.account = (MoneyBeamAccount) paymentAccount;
|
||||
this.validator = aliPayValidator;
|
||||
this.validator = moneyBeamValidator;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -52,10 +52,10 @@ public class PopmoneyForm extends PaymentMethodForm {
|
|||
return gridRow;
|
||||
}
|
||||
|
||||
public PopmoneyForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, PopmoneyValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
|
||||
public PopmoneyForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, PopmoneyValidator popmoneyValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
|
||||
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
|
||||
this.account = (PopmoneyAccount) paymentAccount;
|
||||
this.validator = aliPayValidator;
|
||||
this.validator = popmoneyValidator;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -52,10 +52,10 @@ public class VenmoForm extends PaymentMethodForm {
|
|||
return gridRow;
|
||||
}
|
||||
|
||||
public VenmoForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, VenmoValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
|
||||
public VenmoForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, VenmoValidator venmoValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
|
||||
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
|
||||
this.account = (VenmoAccount) paymentAccount;
|
||||
this.validator = aliPayValidator;
|
||||
this.validator = venmoValidator;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* This file is part of Bisq.
|
||||
*
|
||||
* Bisq 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.
|
||||
*
|
||||
* Bisq 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 Bisq. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.desktop.components.paymentmethods;
|
||||
|
||||
import bisq.desktop.components.InputTextField;
|
||||
import bisq.desktop.util.BSFormatter;
|
||||
import bisq.desktop.util.Layout;
|
||||
import bisq.desktop.util.validation.WeChatPayValidator;
|
||||
|
||||
import bisq.core.locale.Res;
|
||||
import bisq.core.locale.TradeCurrency;
|
||||
import bisq.core.payment.AccountAgeWitnessService;
|
||||
import bisq.core.payment.PaymentAccount;
|
||||
import bisq.core.payment.WeChatPayAccount;
|
||||
import bisq.core.payment.payload.PaymentAccountPayload;
|
||||
import bisq.core.payment.payload.WeChatPayAccountPayload;
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.layout.GridPane;
|
||||
|
||||
import static bisq.desktop.util.FormBuilder.addLabelInputTextField;
|
||||
import static bisq.desktop.util.FormBuilder.addLabelTextField;
|
||||
import static bisq.desktop.util.FormBuilder.addLabelTextFieldWithCopyIcon;
|
||||
|
||||
public class WeChatPayForm extends PaymentMethodForm {
|
||||
|
||||
private final WeChatPayAccount weChatPayAccount;
|
||||
private final WeChatPayValidator weChatPayValidator;
|
||||
private InputTextField accountNrInputTextField;
|
||||
|
||||
public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountPayload paymentAccountPayload) {
|
||||
addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.account.no"), ((WeChatPayAccountPayload) paymentAccountPayload).getAccountNr());
|
||||
return gridRow;
|
||||
}
|
||||
|
||||
public WeChatPayForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, WeChatPayValidator weChatPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) {
|
||||
super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter);
|
||||
this.weChatPayAccount = (WeChatPayAccount) paymentAccount;
|
||||
this.weChatPayValidator = weChatPayValidator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addFormForAddAccount() {
|
||||
gridRowFrom = gridRow + 1;
|
||||
|
||||
accountNrInputTextField = addLabelInputTextField(gridPane, ++gridRow, Res.get("payment.account.no")).second;
|
||||
accountNrInputTextField.setValidator(weChatPayValidator);
|
||||
accountNrInputTextField.textProperty().addListener((ov, oldValue, newValue) -> {
|
||||
weChatPayAccount.setAccountNr(newValue);
|
||||
updateFromInputs();
|
||||
});
|
||||
|
||||
final TradeCurrency singleTradeCurrency = weChatPayAccount.getSingleTradeCurrency();
|
||||
final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "";
|
||||
addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode);
|
||||
addLimitations();
|
||||
addAccountNameTextFieldWithAutoFillCheckBox();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void autoFillNameTextField() {
|
||||
if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) {
|
||||
String accountNr = accountNrInputTextField.getText();
|
||||
accountNr = StringUtils.abbreviate(accountNr, 9);
|
||||
String method = Res.get(paymentAccount.getPaymentMethod().getId());
|
||||
accountNameTextField.setText(method.concat(": ").concat(accountNr));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addFormForDisplayAccount() {
|
||||
gridRowFrom = gridRow;
|
||||
addLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), weChatPayAccount.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE);
|
||||
addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.paymentMethod"), Res.get(weChatPayAccount.getPaymentMethod().getId()));
|
||||
TextField field = addLabelTextField(gridPane, ++gridRow, Res.get("payment.account.no"), weChatPayAccount.getAccountNr()).second;
|
||||
field.setMouseTransparent(false);
|
||||
final TradeCurrency singleTradeCurrency = weChatPayAccount.getSingleTradeCurrency();
|
||||
final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "";
|
||||
addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode);
|
||||
addLimitations();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAllInputsValid() {
|
||||
allInputsValid.set(isAccountNameValid()
|
||||
&& weChatPayValidator.validate(weChatPayAccount.getAccountNr()).isValid
|
||||
&& weChatPayAccount.getTradeCurrencies().size() > 0);
|
||||
}
|
||||
}
|
|
@ -17,6 +17,18 @@
|
|||
|
||||
package bisq.desktop.main.account.content.fiataccounts;
|
||||
|
||||
import bisq.common.UserThread;
|
||||
import bisq.common.util.Tuple2;
|
||||
import bisq.common.util.Tuple3;
|
||||
import bisq.core.app.BisqEnvironment;
|
||||
import bisq.core.locale.Res;
|
||||
import bisq.core.payment.AccountAgeWitnessService;
|
||||
import bisq.core.payment.ClearXchangeAccount;
|
||||
import bisq.core.payment.PaymentAccount;
|
||||
import bisq.core.payment.PaymentAccountFactory;
|
||||
import bisq.core.payment.WesternUnionAccount;
|
||||
import bisq.core.payment.payload.PaymentMethod;
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
import bisq.desktop.common.view.ActivatableViewAndModel;
|
||||
import bisq.desktop.common.view.FxmlView;
|
||||
import bisq.desktop.components.AutoTooltipButton;
|
||||
|
@ -44,6 +56,7 @@ import bisq.desktop.components.paymentmethods.SwishForm;
|
|||
import bisq.desktop.components.paymentmethods.USPostalMoneyOrderForm;
|
||||
import bisq.desktop.components.paymentmethods.UpholdForm;
|
||||
import bisq.desktop.components.paymentmethods.VenmoForm;
|
||||
import bisq.desktop.components.paymentmethods.WeChatPayForm;
|
||||
import bisq.desktop.components.paymentmethods.WesternUnionForm;
|
||||
import bisq.desktop.main.overlays.popups.Popup;
|
||||
import bisq.desktop.util.BSFormatter;
|
||||
|
@ -66,25 +79,10 @@ import bisq.desktop.util.validation.SwishValidator;
|
|||
import bisq.desktop.util.validation.USPostalMoneyOrderValidator;
|
||||
import bisq.desktop.util.validation.UpholdValidator;
|
||||
import bisq.desktop.util.validation.VenmoValidator;
|
||||
|
||||
import bisq.core.app.BisqEnvironment;
|
||||
import bisq.core.locale.Res;
|
||||
import bisq.core.payment.AccountAgeWitnessService;
|
||||
import bisq.core.payment.ClearXchangeAccount;
|
||||
import bisq.core.payment.PaymentAccount;
|
||||
import bisq.core.payment.PaymentAccountFactory;
|
||||
import bisq.core.payment.WesternUnionAccount;
|
||||
import bisq.core.payment.payload.PaymentMethod;
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
|
||||
import bisq.common.UserThread;
|
||||
import bisq.common.util.Tuple2;
|
||||
import bisq.common.util.Tuple3;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import bisq.desktop.util.validation.WeChatPayValidator;
|
||||
import javafx.beans.value.ChangeListener;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.geometry.VPos;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.ComboBox;
|
||||
import javafx.scene.control.Label;
|
||||
|
@ -94,28 +92,24 @@ import javafx.scene.image.ImageView;
|
|||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import javafx.scene.text.TextAlignment;
|
||||
|
||||
import javafx.geometry.VPos;
|
||||
|
||||
import javafx.beans.value.ChangeListener;
|
||||
|
||||
import javafx.collections.FXCollections;
|
||||
|
||||
import javafx.util.Callback;
|
||||
import javafx.util.StringConverter;
|
||||
import org.bitcoinj.core.Coin;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static bisq.desktop.util.FormBuilder.*;
|
||||
import static bisq.desktop.util.FormBuilder.add2ButtonsAfterGroup;
|
||||
import static bisq.desktop.util.FormBuilder.add3ButtonsAfterGroup;
|
||||
import static bisq.desktop.util.FormBuilder.addLabelComboBox;
|
||||
import static bisq.desktop.util.FormBuilder.addLabelListView;
|
||||
import static bisq.desktop.util.FormBuilder.addTitledGroupBg;
|
||||
|
||||
@FxmlView
|
||||
public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAccountsViewModel> {
|
||||
|
||||
private ListView<PaymentAccount> paymentAccountsListView;
|
||||
private ComboBox<PaymentMethod> paymentMethodComboBox;
|
||||
|
||||
private final IBANValidator ibanValidator;
|
||||
private final BICValidator bicValidator;
|
||||
private final InputValidator inputValidator;
|
||||
|
@ -133,10 +127,11 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
|
|||
private final ChaseQuickPayValidator chaseQuickPayValidator;
|
||||
private final InteracETransferValidator interacETransferValidator;
|
||||
private final USPostalMoneyOrderValidator usPostalMoneyOrderValidator;
|
||||
|
||||
private final WeChatPayValidator weChatPayValidator;
|
||||
private final AccountAgeWitnessService accountAgeWitnessService;
|
||||
private final BSFormatter formatter;
|
||||
|
||||
private ListView<PaymentAccount> paymentAccountsListView;
|
||||
private ComboBox<PaymentMethod> paymentMethodComboBox;
|
||||
private PaymentMethodForm paymentMethodForm;
|
||||
private TitledGroupBg accountTitledGroupBg;
|
||||
private Button addAccountButton, saveNewAccountButton, exportButton, importButton;
|
||||
|
@ -162,6 +157,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
|
|||
ChaseQuickPayValidator chaseQuickPayValidator,
|
||||
InteracETransferValidator interacETransferValidator,
|
||||
USPostalMoneyOrderValidator usPostalMoneyOrderValidator,
|
||||
WeChatPayValidator weChatPayValidator,
|
||||
AccountAgeWitnessService accountAgeWitnessService,
|
||||
BSFormatter formatter) {
|
||||
super(model);
|
||||
|
@ -183,6 +179,7 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
|
|||
this.chaseQuickPayValidator = chaseQuickPayValidator;
|
||||
this.interacETransferValidator = interacETransferValidator;
|
||||
this.usPostalMoneyOrderValidator = usPostalMoneyOrderValidator;
|
||||
this.weChatPayValidator = weChatPayValidator;
|
||||
this.accountAgeWitnessService = accountAgeWitnessService;
|
||||
this.formatter = formatter;
|
||||
}
|
||||
|
@ -449,6 +446,8 @@ public class FiatAccountsView extends ActivatableViewAndModel<GridPane, FiatAcco
|
|||
return new SpecificBankForm(paymentAccount, accountAgeWitnessService, inputValidator, root, gridRow, formatter, this::onCancelNewAccount);
|
||||
case PaymentMethod.ALI_PAY_ID:
|
||||
return new AliPayForm(paymentAccount, accountAgeWitnessService, aliPayValidator, inputValidator, root, gridRow, formatter);
|
||||
case PaymentMethod.WECHAT_PAY_ID:
|
||||
return new WeChatPayForm(paymentAccount, accountAgeWitnessService, weChatPayValidator, inputValidator, root, gridRow, formatter);
|
||||
case PaymentMethod.SWISH_ID:
|
||||
return new SwishForm(paymentAccount, accountAgeWitnessService, swishValidator, inputValidator, root, gridRow, formatter);
|
||||
case PaymentMethod.CLEAR_X_CHANGE_ID:
|
||||
|
|
|
@ -51,6 +51,10 @@ import java.util.ArrayList;
|
|||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
class SpreadViewModel extends ActivatableViewModel {
|
||||
|
@ -90,6 +94,11 @@ class SpreadViewModel extends ActivatableViewModel {
|
|||
offerBookListItems.removeListener(listChangeListener);
|
||||
}
|
||||
|
||||
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
|
||||
Set<Object> seen = ConcurrentHashMap.newKeySet();
|
||||
return t -> seen.add(keyExtractor.apply(t));
|
||||
}
|
||||
|
||||
private void update(ObservableList<OfferBookListItem> offerBookListItems) {
|
||||
Map<String, List<Offer>> offersByCurrencyMap = new HashMap<>();
|
||||
for (OfferBookListItem offerBookListItem : offerBookListItems) {
|
||||
|
@ -106,7 +115,10 @@ class SpreadViewModel extends ActivatableViewModel {
|
|||
for (String currencyCode : offersByCurrencyMap.keySet()) {
|
||||
List<Offer> offers = offersByCurrencyMap.get(currencyCode);
|
||||
final boolean isFiatCurrency = CurrencyUtil.isFiatCurrency(currencyCode);
|
||||
List<Offer> buyOffers = offers
|
||||
|
||||
List<Offer> uniqueOffers = offers.stream().filter(distinctByKey(Offer::getId)).collect(Collectors.toList());
|
||||
|
||||
List<Offer> buyOffers = uniqueOffers
|
||||
.stream()
|
||||
.filter(e -> e.getDirection().equals(OfferPayload.Direction.BUY))
|
||||
.sorted((o1, o2) -> {
|
||||
|
@ -123,7 +135,7 @@ class SpreadViewModel extends ActivatableViewModel {
|
|||
})
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<Offer> sellOffers = offers
|
||||
List<Offer> sellOffers = uniqueOffers
|
||||
.stream()
|
||||
.filter(e -> e.getDirection().equals(OfferPayload.Direction.SELL))
|
||||
.sorted((o1, o2) -> {
|
||||
|
@ -198,7 +210,7 @@ class SpreadViewModel extends ActivatableViewModel {
|
|||
|
||||
totalAmount = Coin.valueOf(offers.stream().mapToLong(offer -> offer.getAmount().getValue()).sum());
|
||||
spreadItems.add(new SpreadItem(currencyCode, buyOffers.size(), sellOffers.size(),
|
||||
offers.size(), spread, percentage, totalAmount));
|
||||
uniqueOffers.size(), spread, percentage, totalAmount));
|
||||
}
|
||||
|
||||
maxPlacesForAmount.set(formatAmount(totalAmount, false).length());
|
||||
|
|
|
@ -41,6 +41,7 @@ import bisq.desktop.components.paymentmethods.SwishForm;
|
|||
import bisq.desktop.components.paymentmethods.USPostalMoneyOrderForm;
|
||||
import bisq.desktop.components.paymentmethods.UpholdForm;
|
||||
import bisq.desktop.components.paymentmethods.VenmoForm;
|
||||
import bisq.desktop.components.paymentmethods.WeChatPayForm;
|
||||
import bisq.desktop.components.paymentmethods.WesternUnionForm;
|
||||
import bisq.desktop.main.overlays.popups.Popup;
|
||||
import bisq.desktop.main.portfolio.pendingtrades.PendingTradesViewModel;
|
||||
|
@ -226,6 +227,9 @@ public class BuyerStep2View extends TradeStepView {
|
|||
case PaymentMethod.ALI_PAY_ID:
|
||||
gridRow = AliPayForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload);
|
||||
break;
|
||||
case PaymentMethod.WECHAT_PAY_ID:
|
||||
gridRow = WeChatPayForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload);
|
||||
break;
|
||||
case PaymentMethod.CLEAR_X_CHANGE_ID:
|
||||
gridRow = ClearXchangeForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload);
|
||||
break;
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* This file is part of Bisq.
|
||||
*
|
||||
* Bisq 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.
|
||||
*
|
||||
* Bisq 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 Bisq. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.desktop.util.validation;
|
||||
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
|
||||
public final class WeChatPayValidator extends InputValidator {
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
// TODO
|
||||
return super.validate(input);
|
||||
}
|
||||
}
|
|
@ -33,9 +33,10 @@ public class OfferMaker {
|
|||
public static final Property<Offer, OfferPayload.Direction> direction = new Property<>();
|
||||
public static final Property<Offer, Boolean> useMarketBasedPrice = new Property<>();
|
||||
public static final Property<Offer, Double> marketPriceMargin = new Property<>();
|
||||
public static final Property<Offer, String> id = new Property<>();
|
||||
|
||||
public static final Instantiator<Offer> Offer = lookup -> new Offer(
|
||||
new OfferPayload("",
|
||||
new OfferPayload(lookup.valueOf(id, "1234"),
|
||||
0L,
|
||||
null,
|
||||
null,
|
||||
|
|
|
@ -39,7 +39,7 @@ import org.junit.runner.RunWith;
|
|||
|
||||
import static bisq.core.locale.TradeCurrencyMakers.usd;
|
||||
import static bisq.core.user.PreferenceMakers.empty;
|
||||
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcItem;
|
||||
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcBuyItem;
|
||||
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcSellItem;
|
||||
import static com.natpryce.makeiteasy.MakeItEasy.make;
|
||||
import static com.natpryce.makeiteasy.MakeItEasy.with;
|
||||
|
@ -75,7 +75,7 @@ public class OfferBookChartViewModelTest {
|
|||
|
||||
|
||||
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
|
||||
final OfferBookListItem item = make(OfferBookListItemMaker.btcItem.but(with(OfferBookListItemMaker.useMarketBasedPrice, true)));
|
||||
final OfferBookListItem item = make(OfferBookListItemMaker.btcBuyItem.but(with(OfferBookListItemMaker.useMarketBasedPrice, true)));
|
||||
item.getOffer().setPriceFeedService(priceFeedService);
|
||||
offerBookListItems.addAll(item);
|
||||
|
||||
|
@ -93,16 +93,16 @@ public class OfferBookChartViewModelTest {
|
|||
OfferBook offerBook = mock(OfferBook.class);
|
||||
PriceFeedService service = mock(PriceFeedService.class);
|
||||
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
|
||||
|
||||
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
|
||||
|
||||
final OfferBookChartViewModel model = new OfferBookChartViewModel(offerBook, empty, service, null, null, new BSFormatter());
|
||||
model.activate();
|
||||
assertEquals(7, model.maxPlacesForBuyPrice.intValue());
|
||||
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.price, 94016475L))));
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.price, 94016475L))));
|
||||
assertEquals(9, model.maxPlacesForBuyPrice.intValue());
|
||||
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.price, 101016475L))));
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.price, 101016475L))));
|
||||
assertEquals(10, model.maxPlacesForBuyPrice.intValue());
|
||||
}
|
||||
|
||||
|
@ -122,16 +122,16 @@ public class OfferBookChartViewModelTest {
|
|||
OfferBook offerBook = mock(OfferBook.class);
|
||||
PriceFeedService service = mock(PriceFeedService.class);
|
||||
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
|
||||
|
||||
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
|
||||
|
||||
final OfferBookChartViewModel model = new OfferBookChartViewModel(offerBook, empty, service, null, null, new BSFormatter());
|
||||
model.activate();
|
||||
assertEquals(4, model.maxPlacesForBuyVolume.intValue()); //0.01
|
||||
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.amount, 100000000L))));
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.amount, 100000000L))));
|
||||
assertEquals(5, model.maxPlacesForBuyVolume.intValue()); //10.00
|
||||
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.amount, 22128600000L))));
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.amount, 22128600000L))));
|
||||
assertEquals(7, model.maxPlacesForBuyVolume.intValue()); //2212.86
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,8 @@ import bisq.desktop.main.offer.offerbook.OfferBookListItem;
|
|||
import bisq.desktop.main.offer.offerbook.OfferBookListItemMaker;
|
||||
import bisq.desktop.util.BSFormatter;
|
||||
|
||||
import bisq.core.provider.price.PriceFeedService;
|
||||
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
|
||||
|
@ -32,7 +34,9 @@ import org.powermock.modules.junit4.PowerMockRunner;
|
|||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcItem;
|
||||
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcBuyItem;
|
||||
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcSellItem;
|
||||
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.id;
|
||||
import static com.natpryce.makeiteasy.MakeItEasy.make;
|
||||
import static com.natpryce.makeiteasy.MakeItEasy.with;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
@ -40,7 +44,7 @@ import static org.mockito.Mockito.mock;
|
|||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest(OfferBook.class)
|
||||
@PrepareForTest({OfferBook.class, PriceFeedService.class})
|
||||
public class SpreadViewModelTest {
|
||||
|
||||
@Test
|
||||
|
@ -50,7 +54,7 @@ public class SpreadViewModelTest {
|
|||
|
||||
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
|
||||
|
||||
final SpreadViewModel model = new SpreadViewModel(offerBook, null, new BSFormatter());
|
||||
SpreadViewModel model = new SpreadViewModel(offerBook, null, new BSFormatter());
|
||||
assertEquals(0, model.maxPlacesForAmount.intValue());
|
||||
}
|
||||
|
||||
|
@ -58,14 +62,38 @@ public class SpreadViewModelTest {
|
|||
public void testMaxCharactersForAmount() {
|
||||
OfferBook offerBook = mock(OfferBook.class);
|
||||
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
|
||||
offerBookListItems.addAll(make(btcBuyItem));
|
||||
|
||||
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
|
||||
|
||||
final SpreadViewModel model = new SpreadViewModel(offerBook, null, new BSFormatter());
|
||||
SpreadViewModel model = new SpreadViewModel(offerBook, null, new BSFormatter());
|
||||
model.activate();
|
||||
assertEquals(6, model.maxPlacesForAmount.intValue()); // 0.001
|
||||
offerBookListItems.addAll(make(btcItem.but(with(OfferBookListItemMaker.amount, 1403000000L))));
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(OfferBookListItemMaker.amount, 1403000000L))));
|
||||
assertEquals(7, model.maxPlacesForAmount.intValue()); //14.0300
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFilterSpreadItemsForUniqueOffers() {
|
||||
OfferBook offerBook = mock(OfferBook.class);
|
||||
PriceFeedService priceFeedService = mock(PriceFeedService.class);
|
||||
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
|
||||
offerBookListItems.addAll(make(btcBuyItem));
|
||||
|
||||
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
|
||||
|
||||
SpreadViewModel model = new SpreadViewModel(offerBook, priceFeedService, new BSFormatter());
|
||||
model.activate();
|
||||
|
||||
assertEquals(1, model.spreadItems.get(0).numberOfOffers);
|
||||
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(id, "2345"))),
|
||||
make(btcBuyItem.but(with(id, "2345"))),
|
||||
make(btcSellItem.but(with(id, "3456"))),
|
||||
make(btcSellItem.but(with(id, "3456"))));
|
||||
|
||||
assertEquals(2, model.spreadItems.get(0).numberOfBuyOffers);
|
||||
assertEquals(1, model.spreadItems.get(0).numberOfSellOffers);
|
||||
assertEquals(3, model.spreadItems.get(0).numberOfOffers);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ import static com.natpryce.makeiteasy.MakeItEasy.with;
|
|||
|
||||
public class OfferBookListItemMaker {
|
||||
|
||||
public static final Property<OfferBookListItem, String> id = new Property<>();
|
||||
public static final Property<OfferBookListItem, Long> price = new Property<>();
|
||||
public static final Property<OfferBookListItem, Long> amount = new Property<>();
|
||||
public static final Property<OfferBookListItem, Long> minAmount = new Property<>();
|
||||
|
@ -46,7 +47,8 @@ public class OfferBookListItemMaker {
|
|||
with(OfferMaker.minAmount, lookup.valueOf(amount, 100000L)),
|
||||
with(OfferMaker.direction, lookup.valueOf(direction, OfferPayload.Direction.BUY)),
|
||||
with(OfferMaker.useMarketBasedPrice, lookup.valueOf(useMarketBasedPrice, false)),
|
||||
with(OfferMaker.marketPriceMargin, lookup.valueOf(marketPriceMargin, 0.0)))));
|
||||
with(OfferMaker.marketPriceMargin, lookup.valueOf(marketPriceMargin, 0.0)),
|
||||
with(OfferMaker.id, lookup.valueOf(id, "1234")))));
|
||||
|
||||
public static final Instantiator<OfferBookListItem> OfferBookListItemWithRange = lookup ->
|
||||
new OfferBookListItem(make(btcUsdOffer.but(
|
||||
|
@ -54,7 +56,7 @@ public class OfferBookListItemMaker {
|
|||
with(OfferMaker.minAmount, lookup.valueOf(minAmount, 100000L)),
|
||||
with(OfferMaker.amount, lookup.valueOf(amount, 200000L)))));
|
||||
|
||||
public static final Maker<OfferBookListItem> btcItem = a(OfferBookListItem);
|
||||
public static final Maker<OfferBookListItem> btcBuyItem = a(OfferBookListItem);
|
||||
public static final Maker<OfferBookListItem> btcSellItem = a(OfferBookListItem, with(direction, OfferPayload.Direction.SELL));
|
||||
|
||||
public static final Maker<OfferBookListItem> btcItemWithRange = a(OfferBookListItemWithRange);
|
||||
|
|
|
@ -242,7 +242,7 @@ public class OfferBookViewModelTest {
|
|||
OfferBook offerBook = mock(OfferBook.class);
|
||||
OpenOfferManager openOfferManager = mock(OpenOfferManager.class);
|
||||
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
|
||||
|
||||
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
|
||||
|
||||
|
@ -252,7 +252,7 @@ public class OfferBookViewModelTest {
|
|||
model.activate();
|
||||
|
||||
assertEquals(6, model.maxPlacesForAmount.intValue());
|
||||
offerBookListItems.addAll(make(btcItem.but(with(amount, 2000000000L))));
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(amount, 2000000000L))));
|
||||
assertEquals(7, model.maxPlacesForAmount.intValue());
|
||||
}
|
||||
|
||||
|
@ -296,7 +296,7 @@ public class OfferBookViewModelTest {
|
|||
OfferBook offerBook = mock(OfferBook.class);
|
||||
OpenOfferManager openOfferManager = mock(OpenOfferManager.class);
|
||||
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
|
||||
|
||||
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
|
||||
|
||||
|
@ -306,7 +306,7 @@ public class OfferBookViewModelTest {
|
|||
model.activate();
|
||||
|
||||
assertEquals(8, model.maxPlacesForVolume.intValue());
|
||||
offerBookListItems.addAll(make(btcItem.but(with(amount, 2000000000L))));
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(amount, 2000000000L))));
|
||||
assertEquals(10, model.maxPlacesForVolume.intValue());
|
||||
}
|
||||
|
||||
|
@ -350,7 +350,7 @@ public class OfferBookViewModelTest {
|
|||
OfferBook offerBook = mock(OfferBook.class);
|
||||
OpenOfferManager openOfferManager = mock(OpenOfferManager.class);
|
||||
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcItem));
|
||||
offerBookListItems.addAll(make(OfferBookListItemMaker.btcBuyItem));
|
||||
|
||||
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
|
||||
|
||||
|
@ -360,9 +360,9 @@ public class OfferBookViewModelTest {
|
|||
model.activate();
|
||||
|
||||
assertEquals(7, model.maxPlacesForPrice.intValue());
|
||||
offerBookListItems.addAll(make(btcItem.but(with(price, 149558240L)))); //14955.8240
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(price, 149558240L)))); //14955.8240
|
||||
assertEquals(10, model.maxPlacesForPrice.intValue());
|
||||
offerBookListItems.addAll(make(btcItem.but(with(price, 14955824L)))); //1495.58240
|
||||
offerBookListItems.addAll(make(btcBuyItem.but(with(price, 14955824L)))); //1495.58240
|
||||
assertEquals(10, model.maxPlacesForPrice.intValue());
|
||||
}
|
||||
|
||||
|
@ -386,7 +386,7 @@ public class OfferBookViewModelTest {
|
|||
PriceFeedService priceFeedService = mock(PriceFeedService.class);
|
||||
|
||||
final ObservableList<OfferBookListItem> offerBookListItems = FXCollections.observableArrayList();
|
||||
final Maker<OfferBookListItem> item = btcItem.but(with(useMarketBasedPrice, true));
|
||||
final Maker<OfferBookListItem> item = btcBuyItem.but(with(useMarketBasedPrice, true));
|
||||
|
||||
when(offerBook.getOfferBookListItems()).thenReturn(offerBookListItems);
|
||||
when(priceFeedService.getMarketPrice(anyString())).thenReturn(null);
|
||||
|
@ -428,15 +428,15 @@ public class OfferBookViewModelTest {
|
|||
null, null, null, null, null,
|
||||
new BSFormatter());
|
||||
|
||||
final OfferBookListItem item = make(btcItem.but(
|
||||
final OfferBookListItem item = make(btcBuyItem.but(
|
||||
with(useMarketBasedPrice, true),
|
||||
with(marketPriceMargin, -0.12)));
|
||||
|
||||
final OfferBookListItem lowItem = make(btcItem.but(
|
||||
final OfferBookListItem lowItem = make(btcBuyItem.but(
|
||||
with(useMarketBasedPrice, true),
|
||||
with(marketPriceMargin, 0.01)));
|
||||
|
||||
final OfferBookListItem fixedItem = make(btcItem);
|
||||
final OfferBookListItem fixedItem = make(btcBuyItem);
|
||||
|
||||
item.getOffer().setPriceFeedService(priceFeedService);
|
||||
lowItem.getOffer().setPriceFeedService(priceFeedService);
|
||||
|
|
Loading…
Add table
Reference in a new issue