refactor payment account form api to support structured, dynamic forms

This commit is contained in:
woodser 2022-06-16 18:58:27 -04:00
parent 341ae2bef0
commit faeb9ca8db
203 changed files with 1844 additions and 509 deletions

View file

@ -21,6 +21,8 @@ import bisq.core.api.model.AddressBalanceInfo;
import bisq.core.api.model.BalancesInfo;
import bisq.core.api.model.MarketDepthInfo;
import bisq.core.api.model.MarketPriceInfo;
import bisq.core.api.model.PaymentAccountForm;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.api.model.TxFeeRateInfo;
import bisq.core.app.AppStartupState;
import bisq.core.monetary.Price;
@ -488,8 +490,8 @@ public class CoreApi {
// PaymentAccounts
///////////////////////////////////////////////////////////////////////////////////////////
public PaymentAccount createPaymentAccount(String jsonString) {
return paymentAccountsService.createPaymentAccount(jsonString);
public PaymentAccount createPaymentAccount(PaymentAccountForm form) {
return paymentAccountsService.createPaymentAccount(form);
}
public Set<PaymentAccount> getPaymentAccounts() {
@ -500,8 +502,8 @@ public class CoreApi {
return paymentAccountsService.getFiatPaymentMethods();
}
public String getPaymentAccountForm(String paymentMethodId) {
return paymentAccountsService.getPaymentAccountFormAsString(paymentMethodId);
public PaymentAccountForm getPaymentAccountForm(String paymentMethodId) {
return paymentAccountsService.getPaymentAccountForm(paymentMethodId);
}
public PaymentAccount createCryptoCurrencyPaymentAccount(String accountName,
@ -517,6 +519,10 @@ public class CoreApi {
public List<PaymentMethod> getCryptoCurrencyPaymentMethods() {
return paymentAccountsService.getCryptoCurrencyPaymentMethods();
}
public void validateFormField(PaymentAccountForm form, PaymentAccountFormField.FieldId fieldId, String value) {
paymentAccountsService.validateFormField(form, fieldId, value);
}
///////////////////////////////////////////////////////////////////////////////////////////
// Prices

View file

@ -19,7 +19,11 @@ package bisq.core.api;
import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.api.model.PaymentAccountForm;
import bisq.core.api.model.PaymentAccountForm;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CryptoCurrency;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.AssetAccount;
import bisq.core.payment.CryptoCurrencyAccount;
import bisq.core.payment.InstantCryptoCurrencyAccount;
@ -27,7 +31,6 @@ import bisq.core.payment.PaymentAccount;
import bisq.core.payment.PaymentAccountFactory;
import bisq.core.payment.payload.PaymentMethod;
import bisq.core.user.User;
import javax.inject.Inject;
import javax.inject.Singleton;
@ -50,24 +53,22 @@ class CorePaymentAccountsService {
private final CoreAccountService accountService;
private final AccountAgeWitnessService accountAgeWitnessService;
private final PaymentAccountForm paymentAccountForm;
private final User user;
@Inject
public CorePaymentAccountsService(CoreAccountService accountService,
AccountAgeWitnessService accountAgeWitnessService,
PaymentAccountForm paymentAccountForm,
User user) {
this.accountService = accountService;
this.accountAgeWitnessService = accountAgeWitnessService;
this.paymentAccountForm = paymentAccountForm;
this.user = user;
}
// Fiat Currency Accounts
PaymentAccount createPaymentAccount(String jsonString) {
PaymentAccount paymentAccount = paymentAccountForm.toPaymentAccount(jsonString);
PaymentAccount createPaymentAccount(PaymentAccountForm form) {
PaymentAccount paymentAccount = form.toPaymentAccount();
setSelectedTradeCurrency(paymentAccount); // TODO: selected trade currency is function of offer, not payment account payload
verifyPaymentAccountHasRequiredFields(paymentAccount);
user.addPaymentAccountIfNotExists(paymentAccount);
accountAgeWitnessService.publishMyAccountAgeWitness(paymentAccount.getPaymentAccountPayload());
@ -76,6 +77,18 @@ class CorePaymentAccountsService {
paymentAccount.getPaymentAccountPayload().getPaymentMethodId());
return paymentAccount;
}
private static void setSelectedTradeCurrency(PaymentAccount paymentAccount) {
TradeCurrency singleTradeCurrency = paymentAccount.getSingleTradeCurrency();
List<TradeCurrency> tradeCurrencies = paymentAccount.getTradeCurrencies();
if (singleTradeCurrency != null) return;
else if (tradeCurrencies != null && !tradeCurrencies.isEmpty()) {
if (tradeCurrencies.contains(CurrencyUtil.getDefaultTradeCurrency()))
paymentAccount.setSelectedTradeCurrency(CurrencyUtil.getDefaultTradeCurrency());
else
paymentAccount.setSelectedTradeCurrency(tradeCurrencies.get(0));
}
}
Set<PaymentAccount> getPaymentAccounts() {
return user.getPaymentAccounts();
@ -88,14 +101,18 @@ class CorePaymentAccountsService {
.collect(Collectors.toList());
}
String getPaymentAccountFormAsString(String paymentMethodId) {
File jsonForm = getPaymentAccountForm(paymentMethodId);
jsonForm.deleteOnExit(); // If just asking for a string, delete the form file.
return paymentAccountForm.toJsonString(jsonForm);
PaymentAccountForm getPaymentAccountForm(String paymentMethodId) {
return PaymentAccountForm.getForm(paymentMethodId);
}
File getPaymentAccountForm(String paymentMethodId) {
return paymentAccountForm.getPaymentAccountForm(paymentMethodId);
String getPaymentAccountFormAsString(String paymentMethodId) {
File jsonForm = getPaymentAccountFormFile(paymentMethodId);
jsonForm.deleteOnExit(); // If just asking for a string, delete the form file.
return PaymentAccountForm.toJsonString(jsonForm);
}
File getPaymentAccountFormFile(String paymentMethodId) {
return PaymentAccountForm.getPaymentAccountForm(paymentMethodId);
}
// Crypto Currency Accounts
@ -134,6 +151,16 @@ class CorePaymentAccountsService {
.collect(Collectors.toList());
}
void validateFormField(PaymentAccountForm form, PaymentAccountFormField.FieldId fieldId, String value) {
// get payment method id
PaymentAccountForm.FormId formId = form.getId();
// validate field with empty payment account
PaymentAccount paymentAccount = PaymentAccountFactory.getPaymentAccount(PaymentMethod.getPaymentMethod(formId.toString()));
paymentAccount.validateFormField(form, fieldId, value);
}
private void verifyPaymentAccountHasRequiredFields(PaymentAccount paymentAccount) {
if (!paymentAccount.hasMultipleCurrencies() && paymentAccount.getSingleTradeCurrency() == null)
throw new IllegalArgumentException(format("no trade currency defined for %s payment account",

View file

@ -17,130 +17,137 @@
package bisq.core.api.model;
import bisq.core.payment.PaymentAccount;
import bisq.core.payment.PaymentAccountFactory;
import bisq.core.payment.payload.PaymentMethod;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import javax.inject.Singleton;
import com.google.common.annotations.VisibleForTesting;
import org.apache.commons.lang3.StringUtils;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Map;
import java.lang.reflect.Type;
import lombok.extern.slf4j.Slf4j;
import static bisq.core.payment.payload.PaymentMethod.getPaymentMethod;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.lang.String.format;
import static java.lang.System.getProperty;
import static java.nio.charset.StandardCharsets.UTF_8;
import bisq.common.proto.ProtoUtil;
import bisq.common.proto.persistable.PersistablePayload;
import bisq.core.payment.PaymentAccount;
import bisq.core.payment.PaymentAccountFactory;
import bisq.core.payment.payload.PaymentMethod;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.CaseFormat;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Type;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.concurrent.Immutable;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
/**
* <p>
* An instance of this class can write new payment account forms (editable json files),
* and de-serialize edited json files into {@link PaymentAccount}
* instances.
* </p>
* <p>
* Example use case: (1) ask for a blank Hal Cash account form, (2) edit it, (3) derive a
* {@link bisq.core.payment.HalCashAccount} instance from the edited json file.
* </p>
* <br>
* <p>
* (1) Ask for a hal cash account form: Pass a {@link PaymentMethod#HAL_CASH_ID}
* to {@link PaymentAccountForm#getPaymentAccountForm(String)} to
* get the json Hal Cash payment account form:
* <pre>
* {
* "_COMMENTS_": [
* "Do not manually edit the paymentMethodId field.",
* "Edit the salt field only if you are recreating a payment account on a new installation and wish to preserve the account age."
* ],
* "paymentMethodId": "HAL_CASH",
* "accountName": "Your accountname",
* "mobileNr": "Your mobilenr"
* "salt": ""
* }
* </pre>
* </p>
* <p>
* (2) Save the Hal Cash payment account form to disk, and edit it:
* <pre>
* {
* "_COMMENTS_": [
* "Do not manually edit the paymentMethodId field.",
* "Edit the salt field only if you are recreating a payment account on a new installation and wish to preserve the account age."
* ],
* "paymentMethodId": "HAL_CASH",
* "accountName": "Hal Cash Acct",
* "mobileNr": "798 123 456"
* "salt": ""
* }
* </pre>
* </p>
* (3) De-serialize the edited json account form: Pass the edited json file to
* {@link PaymentAccountForm#toPaymentAccount(File)}, or
* a json string to {@link PaymentAccountForm#toPaymentAccount(String)}
* and get a {@link bisq.core.payment.HalCashAccount} instance.
* <pre>
* PaymentAccount(
* paymentMethod=PaymentMethod(id=HAL_CASH,
* maxTradePeriod=86400000,
* maxTradeLimit=50000000),
* id=e33c9d94-1a1a-43fd-aa11-fcaacbb46100,
* creationDate=Mon Nov 16 12:26:43 BRST 2020,
* paymentAccountPayload=HalCashAccountPayload(mobileNr=798 123 456),
* accountName=Hal Cash Acct,
* tradeCurrencies=[FiatCurrency(currency=EUR)],
* selectedTradeCurrency=FiatCurrency(currency=EUR)
* )
* </pre>
*/
@Singleton
@Getter
@Immutable
@EqualsAndHashCode
@ToString
@Slf4j
public class PaymentAccountForm {
private final GsonBuilder gsonBuilder = new GsonBuilder()
public final class PaymentAccountForm implements PersistablePayload {
private static final GsonBuilder gsonBuilder = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls();
public enum FormId {
REVOLUT,
SEPA,
TRANSFERWISE,
CLEAR_X_CHANGE,
SWIFT,
F2F,
STRIKE;
// A list of PaymentAccount fields to exclude from json forms.
private final String[] excludedFields = new String[]{
"log",
"id",
"acceptedCountryCodes",
"countryCode",
"creationDate",
"excludeFromJsonDataMap",
"maxTradePeriod",
"paymentAccountPayload",
"paymentMethod",
"paymentMethodId", // Will be included, but handled differently.
"persistedAccountName", // Automatically set in PaymentAccount.onPersistChanges().
"selectedTradeCurrency", // May be included, but handled differently.
"tradeCurrencies", // May be included, but handled differently.
"HOLDER_NAME",
"SALT" // Will be included, but handled differently.
};
public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) {
return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name());
}
public static protobuf.PaymentAccountForm.FormId toProtoMessage(PaymentAccountForm.FormId formId) {
return protobuf.PaymentAccountForm.FormId.valueOf(formId.name());
}
}
private final FormId id;
private final List<PaymentAccountFormField> fields;
public PaymentAccountForm(FormId id) {
this.id = id;
this.fields = new ArrayList<PaymentAccountFormField>();
}
public PaymentAccountForm(FormId id, List<PaymentAccountFormField> fields) {
this.id = id;
this.fields = fields;
}
@Override
public protobuf.PaymentAccountForm toProtoMessage() {
return protobuf.PaymentAccountForm.newBuilder()
.setId(PaymentAccountForm.FormId.toProtoMessage(id))
.addAllFields(fields.stream().map(field -> field.toProtoMessage()).collect(Collectors.toList()))
.build();
}
public static PaymentAccountForm fromProto(protobuf.PaymentAccountForm proto) {
List<PaymentAccountFormField> fields = proto.getFieldsList().isEmpty() ? null : proto.getFieldsList().stream().map(PaymentAccountFormField::fromProto).collect(Collectors.toList());
return new PaymentAccountForm(FormId.fromProto(proto.getId()), fields);
}
/**
* Get a structured form for the given payment method.
*/
public static PaymentAccountForm getForm(String paymentMethodId) {
PaymentAccount paymentAccount = PaymentAccountFactory.getPaymentAccount(PaymentMethod.getPaymentMethod(paymentMethodId));
return paymentAccount.toForm();
}
/**
* Convert this form to a PaymentAccount json string.
*/
public String toPaymentAccountJsonString() {
Map<String, Object> formMap = new HashMap<String, Object>();
formMap.put("paymentMethodId", getId().toString());
for (PaymentAccountFormField field : getFields()) {
formMap.put(toCamelCase(field.getId().toString()), field.getValue());
}
return new Gson().toJson(formMap);
}
/**
* Convert this form to a PaymentAccount.
*/
public PaymentAccount toPaymentAccount() {
return toPaymentAccount(toPaymentAccountJsonString());
}
/**
* De-serialize a PaymentAccount json string into a new PaymentAccount instance.
*
* @param paymentAccountJsonString The json data representing a new payment account form.
* @return A populated PaymentAccount subclass instance.
*/
public static PaymentAccount toPaymentAccount(String paymentAccountJsonString) {
Class<? extends PaymentAccount> clazz = getPaymentAccountClassFromJson(paymentAccountJsonString);
Gson gson = gsonBuilder.registerTypeAdapter(clazz, new PaymentAccountTypeAdapter(clazz)).create();
return gson.fromJson(paymentAccountJsonString, clazz);
}
// ----------------------------- OLD FORM API -----------------------------
/**
* Returns a blank payment account form (json) for the given paymentMethodId.
@ -148,14 +155,12 @@ public class PaymentAccountForm {
* @param paymentMethodId Determines what kind of json form to return.
* @return A uniquely named tmp file used to define new payment account details.
*/
public File getPaymentAccountForm(String paymentMethodId) {
public static File getPaymentAccountForm(String paymentMethodId) {
PaymentMethod paymentMethod = getPaymentMethod(paymentMethodId);
File file = getTmpJsonFile(paymentMethodId);
try (OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(checkNotNull(file), false), UTF_8)) {
PaymentAccount paymentAccount = PaymentAccountFactory.getPaymentAccount(paymentMethod);
Class<? extends PaymentAccount> clazz = paymentAccount.getClass();
Gson gson = gsonBuilder.registerTypeAdapter(clazz, new PaymentAccountTypeAdapter(clazz, excludedFields)).create();
String json = gson.toJson(paymentAccount); // serializes target to json
String json = paymentAccount.toForm().toPaymentAccountJsonString();
outputStreamWriter.write(json);
} catch (Exception ex) {
String errMsg = format("cannot create a payment account form for a %s payment method", paymentMethodId);
@ -173,24 +178,12 @@ public class PaymentAccountForm {
*/
@SuppressWarnings("unused")
@VisibleForTesting
public PaymentAccount toPaymentAccount(File jsonForm) {
public static PaymentAccount toPaymentAccount(File jsonForm) {
String jsonString = toJsonString(jsonForm);
return toPaymentAccount(jsonString);
}
/**
* De-serialize a PaymentAccount json string into a new PaymentAccount instance.
*
* @param jsonString The json data representing a new payment account form.
* @return A populated PaymentAccount subclass instance.
*/
public PaymentAccount toPaymentAccount(String jsonString) {
Class<? extends PaymentAccount> clazz = getPaymentAccountClassFromJson(jsonString);
Gson gson = gsonBuilder.registerTypeAdapter(clazz, new PaymentAccountTypeAdapter(clazz)).create();
return gson.fromJson(jsonString, clazz);
}
public String toJsonString(File jsonFile) {
public static String toJsonString(File jsonFile) {
try {
checkNotNull(jsonFile, "json file cannot be null");
return new String(Files.readAllBytes(Paths.get(jsonFile.getAbsolutePath())));
@ -203,7 +196,7 @@ public class PaymentAccountForm {
}
@VisibleForTesting
public URI getClickableURI(File jsonFile) {
public static URI getClickableURI(File jsonFile) {
try {
return new URI("file",
"",
@ -237,14 +230,20 @@ public class PaymentAccountForm {
return file;
}
private Class<? extends PaymentAccount> getPaymentAccountClassFromJson(String json) {
// -------------------------------- HELPERS -------------------------------
private static String toCamelCase(String underscore) {
return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, underscore);
}
private static Class<? extends PaymentAccount> getPaymentAccountClassFromJson(String json) {
Map<String, Object> jsonMap = gsonBuilder.create().fromJson(json, (Type) Object.class);
String paymentMethodId = checkNotNull((String) jsonMap.get("paymentMethodId"),
format("cannot not find a paymentMethodId in json string: %s", json));
return getPaymentAccountClass(paymentMethodId);
}
private Class<? extends PaymentAccount> getPaymentAccountClass(String paymentMethodId) {
private static Class<? extends PaymentAccount> getPaymentAccountClass(String paymentMethodId) {
PaymentMethod paymentMethod = getPaymentMethod(paymentMethodId);
return PaymentAccountFactory.getPaymentAccount(paymentMethod).getClass();
}

View file

@ -0,0 +1,170 @@
/*
* 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 bisq.core.api.model;
import bisq.common.proto.ProtoUtil;
import bisq.common.proto.persistable.PersistablePayload;
import bisq.core.locale.Country;
import bisq.core.locale.TradeCurrency;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
@Getter
@Setter
@Immutable
@EqualsAndHashCode
@ToString
public final class PaymentAccountFormField implements PersistablePayload {
public enum FieldId {
ACCEPTED_COUNTRY_CODES,
ACCOUNT_ID,
ACCOUNT_NAME,
ACCOUNT_NR,
ACCOUNT_OWNER,
ACCOUNT_TYPE,
ANSWER,
BANK_ACCOUNT_NAME,
BANK_ACCOUNT_NUMBER,
BANK_ACCOUNT_TYPE,
BANK_ADDRESS,
BANK_BRANCH,
BANK_BRANCH_CODE,
BANK_BRANCH_NAME,
BANK_CODE,
BANK_COUNTRY_CODE,
BANK_ID,
BANK_NAME,
BANK_SWIFT_CODE,
BENEFICIARY_ACCOUNT_NR,
BENEFICIARY_ADDRESS,
BENEFICIARY_CITY,
BENEFICIARY_NAME,
BENEFICIARY_PHONE,
BIC,
BRANCH_ID,
CITY,
CONTACT,
COUNTRY,
EMAIL,
EMAIL_OR_MOBILE_NR,
EXTRA_INFO,
HOLDER_ADDRESS,
HOLDER_EMAIL,
HOLDER_NAME,
HOLDER_TAX_ID,
IBAN,
IFSC,
INTERMEDIARY_ADDRESS,
INTERMEDIARY_BRANCH,
INTERMEDIARY_COUNTRY_CODE,
INTERMEDIARY_NAME,
INTERMEDIARY_SWIFT_CODE,
MOBILE_NR,
NATIONAL_ACCOUNT_ID,
PAYID,
PIX_KEY,
POSTAL_ADDRESS,
PROMPT_PAY_ID,
QUESTION,
REQUIREMENTS,
SALT,
SORT_CODE,
SPECIAL_INSTRUCTIONS,
STATE,
TRADE_CURRENCIES,
USER_NAME,
VIRTUAL_PAYMENT_ADDRESS;
public static PaymentAccountFormField.FieldId fromProto(protobuf.PaymentAccountFormField.FieldId fieldId) {
return ProtoUtil.enumFromProto(PaymentAccountFormField.FieldId.class, fieldId.name());
}
public static protobuf.PaymentAccountFormField.FieldId toProtoMessage(PaymentAccountFormField.FieldId fieldId) {
return protobuf.PaymentAccountFormField.FieldId.valueOf(fieldId.name());
}
}
public enum Component {
TEXT,
SELECT_ONE,
SELECT_MULTIPLE;
public static PaymentAccountFormField.Component fromProto(protobuf.PaymentAccountFormField.Component component) {
return ProtoUtil.enumFromProto(PaymentAccountFormField.Component.class, component.name());
}
public static protobuf.PaymentAccountFormField.Component toProtoMessage(PaymentAccountFormField.Component component) {
return protobuf.PaymentAccountFormField.Component.valueOf(component.name());
}
}
private FieldId id;
private Component component;
@Nullable
private String type;
private String label;
private String value;
private int minLength;
private int maxLength;
private List<TradeCurrency> supportedCurrencies;
private List<Country> supportedCountries;
private List<Country> supportedSepaEuroCountries;
private List<Country> supportedSepaNonEuroCountries;
public PaymentAccountFormField(FieldId id) {
this.id = id;
}
@Override
public protobuf.PaymentAccountFormField toProtoMessage() {
protobuf.PaymentAccountFormField.Builder builder = protobuf.PaymentAccountFormField.newBuilder()
.setId(PaymentAccountFormField.FieldId.toProtoMessage(id))
.setComponent(PaymentAccountFormField.Component.toProtoMessage(component))
.setMinLength(minLength)
.setMaxLength(maxLength);
Optional.ofNullable(type).ifPresent(builder::setType);
Optional.ofNullable(label).ifPresent(builder::setLabel);
Optional.ofNullable(value).ifPresent(builder::setValue);
Optional.ofNullable(supportedCurrencies).ifPresent(e -> builder.addAllSupportedCurrencies(ProtoUtil.collectionToProto(supportedCurrencies, protobuf.TradeCurrency.class)));
Optional.ofNullable(supportedCountries).ifPresent(e -> builder.addAllSupportedCountries(ProtoUtil.collectionToProto(supportedCountries, protobuf.Country.class)));
Optional.ofNullable(supportedSepaEuroCountries).ifPresent(e -> builder.addAllSupportedSepaEuroCountries(ProtoUtil.collectionToProto(supportedSepaEuroCountries, protobuf.Country.class)));
Optional.ofNullable(supportedSepaNonEuroCountries).ifPresent(e -> builder.addAllSupportedSepaNonEuroCountries(ProtoUtil.collectionToProto(supportedSepaNonEuroCountries, protobuf.Country.class)));
return builder.build();
}
public static PaymentAccountFormField fromProto(protobuf.PaymentAccountFormField proto) {
PaymentAccountFormField formField = new PaymentAccountFormField(FieldId.fromProto(proto.getId()));
formField.type = proto.getType();
formField.label = proto.getLabel();
formField.value = proto.getValue();
formField.minLength = proto.getMinLength();
formField.maxLength = proto.getMaxLength();
formField.supportedCountries = proto.getSupportedCountriesList().isEmpty() ? null : proto.getSupportedCountriesList().stream().map(Country::fromProto).collect(Collectors.toList());
formField.supportedSepaEuroCountries = proto.getSupportedSepaEuroCountriesList().isEmpty() ? null : proto.getSupportedSepaEuroCountriesList().stream().map(Country::fromProto).collect(Collectors.toList());
formField.supportedSepaNonEuroCountries = proto.getSupportedSepaNonEuroCountriesList().isEmpty() ? null : proto.getSupportedSepaNonEuroCountriesList().stream().map(Country::fromProto).collect(Collectors.toList());
return formField;
}
}

View file

@ -19,6 +19,7 @@ package bisq.core.api.model;
import bisq.core.locale.Country;
import bisq.core.locale.CountryUtil;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.Res;
import bisq.core.locale.TradeCurrency;
@ -39,7 +40,6 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
import java.lang.reflect.Constructor;
@ -59,10 +59,8 @@ import static bisq.core.payment.payload.PaymentMethod.MONEY_GRAM_ID;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.lang.String.format;
import static java.util.Arrays.stream;
import static java.util.Collections.singletonList;
import static java.util.Collections.unmodifiableMap;
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang3.StringUtils.capitalize;
@Slf4j
@ -222,6 +220,10 @@ class PaymentAccountTypeAdapter extends TypeAdapter<PaymentAccount> {
if (didReadTradeCurrenciesField(in, account, currentFieldName))
continue;
// The acceptedCountryCodes field has no setter.
if (didReadAcceptedCountryCodes(in, account, currentFieldName))
continue;
// The selectedTradeCurrency field is common to all payment account types,
// but is @Nullable, and may not need to be explicitly defined by user.
if (didReadSelectedTradeCurrencyField(in, account, currentFieldName))
@ -339,15 +341,15 @@ class PaymentAccountTypeAdapter extends TypeAdapter<PaymentAccount> {
}
}
private final Predicate<String> isCommaDelimitedCurrencyList = (s) -> s != null && s.contains(",");
private final Function<String, List<String>> commaDelimitedCodesToList = (s) -> {
if (isCommaDelimitedCurrencyList.test(s))
return stream(s.split(",")).map(a -> a.trim().toUpperCase()).collect(toList());
else if (s != null && !s.isEmpty())
return singletonList(s.trim().toUpperCase());
else
return new ArrayList<>();
};
private boolean didReadAcceptedCountryCodes(JsonReader in,
PaymentAccount account,
String fieldName) {
if (!fieldName.equals("acceptedCountryCodes")) return false;
String fieldValue = nextStringOrNull(in);
List<String> countryCodes = PaymentAccount.commaDelimitedCodesToList.apply(fieldValue);
((CountryBasedPaymentAccount) account).setAcceptedCountries(CountryUtil.getCountries(countryCodes));
return true;
}
private boolean didReadTradeCurrenciesField(JsonReader in,
PaymentAccount account,
@ -359,7 +361,7 @@ class PaymentAccountTypeAdapter extends TypeAdapter<PaymentAccount> {
// no setter, so we add currencies to the List here if the payment account
// supports multiple trade currencies.
String fieldValue = nextStringOrNull(in);
List<String> currencyCodes = commaDelimitedCodesToList.apply(fieldValue);
List<String> currencyCodes = PaymentAccount.commaDelimitedCodesToList.apply(fieldValue);
Optional<List<TradeCurrency>> tradeCurrencies = getReconciledTradeCurrencies(currencyCodes, account);
if (tradeCurrencies.isPresent()) {
for (TradeCurrency tradeCurrency : tradeCurrencies.get()) {

View file

@ -21,6 +21,7 @@ import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
@ -35,6 +36,26 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class CountryUtil {
public static List<String> getCountryCodes(List<Country> countries) {
return countries.stream().map(country -> country.code).collect(Collectors.toList());
}
public static List<Country> getCountries(List<String> codes) {
List<Country> countries = new ArrayList<Country>();
for (String code : codes) {
Locale locale = new Locale(LanguageUtil.getDefaultLanguage(), code, "");
final String countryCode = locale.getCountry();
String regionCode = getRegionCode(countryCode);
final Region region = new Region(regionCode, getRegionName(regionCode));
Country country = new Country(countryCode, locale.getDisplayCountry(), region);
if (countryCode.equals("XK"))
country = new Country(countryCode, getNameByCode(countryCode), region);
countries.add(country);
}
return countries;
}
public static List<Country> getAllSepaEuroCountries() {
List<Country> list = new ArrayList<>();
String[] codes = {"AT", "BE", "CY", "DE", "EE", "FI", "FR", "GR", "IE",
@ -72,16 +93,7 @@ public class CountryUtil {
}
private static void populateCountryListByCodes(List<Country> list, String[] codes) {
for (String code : codes) {
Locale locale = new Locale(LanguageUtil.getDefaultLanguage(), code, "");
final String countryCode = locale.getCountry();
String regionCode = getRegionCode(countryCode);
final Region region = new Region(regionCode, getRegionName(regionCode));
Country country = new Country(countryCode, locale.getDisplayCountry(), region);
if (countryCode.equals("XK"))
country = new Country(countryCode, getNameByCode(countryCode), region);
list.add(country);
}
list.addAll(getCountries(Arrays.asList(codes)));
}
public static boolean containsAllSepaEuroCountries(List<String> countryCodesToCompare) {

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.AchTransferAccountPayload;
@ -57,14 +58,17 @@ public final class AchTransferAccount extends CountryBasedPaymentAccount impleme
return (AchTransferAccountPayload) paymentAccountPayload;
}
@Override
public String getMessageForBuyer() {
return "payment.achTransfer.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.achTransfer.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.achTransfer.info.account";
}
@ -73,4 +77,9 @@ public final class AchTransferAccount extends CountryBasedPaymentAccount impleme
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.AdvancedCashAccountPayload;
@ -57,6 +58,12 @@ public final class AdvancedCashAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@NotNull
@Override
public List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setAccountNr(String accountNr) {
((AdvancedCashAccountPayload) paymentAccountPayload).setAccountNr(accountNr);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.AliPayAccountPayload;
@ -48,6 +49,11 @@ public final class AliPayAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setAccountNr(String accountNr) {
((AliPayAccountPayload) paymentAccountPayload).setAccountNr(accountNr);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.Country;
import bisq.core.locale.CountryUtil;
import bisq.core.locale.FiatCurrency;
@ -59,12 +60,16 @@ public final class AmazonGiftCardAccount extends PaymentAccount {
return new AmazonGiftCardAccountPayload(paymentMethod.getId(), id);
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public String getEmailOrMobileNr() {
return getAmazonGiftCardAccountPayload().getEmailOrMobileNr();
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.AustraliaPayidAccountPayload;
@ -46,6 +47,11 @@ public final class AustraliaPayidAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public String getPayid() {
return ((AustraliaPayidAccountPayload) paymentAccountPayload).getPayid();
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.BizumAccountPayload;
@ -50,14 +51,17 @@ public final class BizumAccount extends CountryBasedPaymentAccount {
return ((BizumAccountPayload) paymentAccountPayload).getMobileNr();
}
@Override
public String getMessageForBuyer() {
return "payment.bizum.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.bizum.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.bizum.info.account";
}
@ -66,4 +70,9 @@ public final class BizumAccount extends CountryBasedPaymentAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.CapitualAccountPayload;
@ -55,6 +56,12 @@ public final class CapitualAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@NotNull
@Override
public List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setAccountNr(String accountNr) {
((CapitualAccountPayload) paymentAccountPayload).setAccountNr(accountNr);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.CashAppAccountPayload;
@ -51,6 +52,11 @@ public final class CashAppAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setCashTag(String cashTag) {
((CashAppAccountPayload) paymentAccountPayload).setCashTag(cashTag);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.CashByMailAccountPayload;
@ -45,6 +46,11 @@ public final class CashByMailAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setPostalAddress(String postalAddress) {
((CashByMailAccountPayload) paymentAccountPayload).setPostalAddress(postalAddress);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.CashDepositAccountPayload;
@ -47,6 +48,11 @@ public final class CashDepositAccount extends CountryBasedPaymentAccount impleme
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
@Override
public String getBankId() {
return ((CashDepositAccountPayload) paymentAccountPayload).getBankId();

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.CelPayAccountPayload;
@ -58,21 +59,28 @@ public final class CelPayAccount extends PaymentAccount {
return ((CelPayAccountPayload) paymentAccountPayload).getEmail();
}
@Override
public String getMessageForBuyer() {
return "payment.celpay.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.celpay.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.celpay.info.account";
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.ChaseQuickPayAccountPayload;
@ -51,6 +52,11 @@ public final class ChaseQuickPayAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setEmail(String email) {
((ChaseQuickPayAccountPayload) paymentAccountPayload).setEmail(email);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.ClearXchangeAccountPayload;
@ -38,6 +39,13 @@ public final class ClearXchangeAccount extends PaymentAccount {
setSingleTradeCurrency(SUPPORTED_CURRENCIES.get(0));
}
private static final List<PaymentAccountFormField.FieldId> INPUT_FIELD_IDS = List.of(
PaymentAccountFormField.FieldId.ACCOUNT_NAME,
PaymentAccountFormField.FieldId.HOLDER_NAME,
PaymentAccountFormField.FieldId.EMAIL_OR_MOBILE_NR,
PaymentAccountFormField.FieldId.SALT
);
@Override
protected PaymentAccountPayload createPayload() {
return new ClearXchangeAccountPayload(paymentMethod.getId(), id);
@ -48,6 +56,11 @@ public final class ClearXchangeAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
return INPUT_FIELD_IDS;
}
public void setEmailOrMobileNr(String mobileNr) {
((ClearXchangeAccountPayload) paymentAccountPayload).setEmailOrMobileNr(mobileNr);
}

View file

@ -21,9 +21,9 @@ import bisq.core.locale.Country;
import bisq.core.locale.CountryUtil;
import bisq.core.payment.payload.CountryBasedPaymentAccountPayload;
import bisq.core.payment.payload.PaymentMethod;
import java.util.List;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
@ -32,6 +32,8 @@ import javax.annotation.Nullable;
public abstract class CountryBasedPaymentAccount extends PaymentAccount {
@Nullable
protected Country country;
@Nullable
protected List<Country> acceptedCountries;
///////////////////////////////////////////////////////////////////////////////////////////
@ -61,4 +63,23 @@ public abstract class CountryBasedPaymentAccount extends PaymentAccount {
this.country = country;
((CountryBasedPaymentAccountPayload) paymentAccountPayload).setCountryCode(country.code);
}
@Nullable
public List<Country> getAcceptedCountries() {
if (acceptedCountries == null) {
final List<String> acceptedCountryCodes = ((CountryBasedPaymentAccountPayload) paymentAccountPayload).getAcceptedCountryCodes();
acceptedCountries = CountryUtil.getCountries(acceptedCountryCodes);
}
return acceptedCountries;
}
public void setAcceptedCountries(List<Country> acceptedCountries) {
this.acceptedCountries = acceptedCountries;
((CountryBasedPaymentAccountPayload) paymentAccountPayload).setAcceptedCountryCodes(CountryUtil.getCountryCodes(acceptedCountries));
}
@Nullable
public List<Country> getSupportedCountries() {
return null; // support all countries by default
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.CryptoCurrencyAccountPayload;
@ -47,4 +48,9 @@ public final class CryptoCurrencyAccount extends AssetAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.BankAccountPayload;
@ -57,14 +58,17 @@ public final class DomesticWireTransferAccount extends CountryBasedPaymentAccoun
return (DomesticWireTransferAccountPayload) paymentAccountPayload;
}
@Override
public String getMessageForBuyer() {
return "payment.domesticWire.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.domesticWire.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.domesticWire.info.account";
}
@ -73,4 +77,9 @@ public final class DomesticWireTransferAccount extends CountryBasedPaymentAccoun
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -16,15 +16,15 @@
*/
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.F2FAccountPayload;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.payment.payload.PaymentMethod;
import java.util.List;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
@ -33,6 +33,15 @@ public final class F2FAccount extends CountryBasedPaymentAccount {
public static final List<TradeCurrency> SUPPORTED_CURRENCIES = CurrencyUtil.getAllFiatCurrencies();
private static final List<PaymentAccountFormField.FieldId> INPUT_FIELD_IDS = List.of(
PaymentAccountFormField.FieldId.ACCOUNT_NAME,
PaymentAccountFormField.FieldId.COUNTRY,
PaymentAccountFormField.FieldId.CONTACT, // TODO: contact is not used anywhere?
PaymentAccountFormField.FieldId.CITY,
PaymentAccountFormField.FieldId.EXTRA_INFO,
PaymentAccountFormField.FieldId.SALT
);
public F2FAccount() {
super(PaymentMethod.F2F);
}
@ -47,6 +56,11 @@ public final class F2FAccount extends CountryBasedPaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
return INPUT_FIELD_IDS;
}
public void setContact(String contact) {
((F2FAccountPayload) paymentAccountPayload).setContact(contact);
}
@ -70,4 +84,13 @@ public final class F2FAccount extends CountryBasedPaymentAccount {
public String getExtraInfo() {
return ((F2FAccountPayload) paymentAccountPayload).getExtraInfo();
}
@Override
protected PaymentAccountFormField getEmptyFormField(PaymentAccountFormField.FieldId fieldId) {
var field = super.getEmptyFormField(fieldId);
if (field.getId() == PaymentAccountFormField.FieldId.CITY) field.setLabel(Res.get("payment.f2f.city"));
if (field.getId() == PaymentAccountFormField.FieldId.CONTACT) field.setLabel(Res.get("payment.f2f.contact"));
if (field.getId() == PaymentAccountFormField.FieldId.EXTRA_INFO) field.setLabel(Res.get("payment.shared.extraInfo.prompt"));
return field;
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.FasterPaymentsAccountPayload;
@ -48,6 +49,11 @@ public final class FasterPaymentsAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setHolderName(String value) {
((FasterPaymentsAccountPayload) paymentAccountPayload).setHolderName(value);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.HalCashAccountPayload;
@ -48,6 +49,11 @@ public final class HalCashAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setMobileNr(String mobileNr) {
((HalCashAccountPayload) paymentAccountPayload).setMobileNr(mobileNr);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentMethod;
@ -37,4 +38,9 @@ abstract public class IfscBasedAccount extends CountryBasedPaymentAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.ImpsAccountPayload;
@ -42,14 +43,17 @@ public final class ImpsAccount extends CountryBasedPaymentAccount {
return new ImpsAccountPayload(paymentMethod.getId(), id);
}
@Override
public String getMessageForBuyer() {
return "payment.imps.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.imps.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.imps.info.account";
}
@ -58,4 +62,9 @@ public final class ImpsAccount extends CountryBasedPaymentAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.InstantCryptoCurrencyPayload;
@ -47,4 +48,9 @@ public final class InstantCryptoCurrencyAccount extends AssetAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.InteracETransferAccountPayload;
@ -44,12 +45,16 @@ public final class InteracETransferAccount extends PaymentAccount {
return new InteracETransferAccountPayload(paymentMethod.getId(), id);
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setEmail(String email) {
((InteracETransferAccountPayload) paymentAccountPayload).setEmail(email);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.JapanBankAccountPayload;
@ -46,6 +47,11 @@ public final class JapanBankAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
// bank code
public String getBankCode() {
return ((JapanBankAccountPayload) paymentAccountPayload).getBankCode();

View file

@ -0,0 +1,885 @@
/*
* 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 bisq.core.payment;
import bisq.core.user.Preferences;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/*
Japan's National Banking Association assigns 4 digit codes to all
Financial Institutions, so we use that as the primary "Bank ID",
add the English names for the top ~30 major international banks,
and remove local farmers agricultural cooperative associations
to keep the list to a reasonable size. Please update annually.
Source: Zengin Net list of Financial Institutions
Last Updated: July 16, 2019
URL: https://www.zengin-net.jp/company/member/
PDF: https://www.zengin-net.jp/company/pdf/member1.pdf
PDF: https://www.zengin-net.jp/company/pdf/member2.pdf
Source: Bank of Japan list of Financial Institutions
Last Updated: July 16, 2019
URL: https://www5.boj.or.jp/bojnet/codenew/mokujinew.htm
File: code1_20190716.xlsx
Excel sheet: 金融機関等コード一覧
*/
public class JapanBankData {
private static String userLanguage;
@Inject
JapanBankData(Preferences preferences) {
userLanguage = preferences.getUserLanguage();
}
/*
Returns the main list of ~500 banks in Japan with bank codes,
but since 90%+ of people will be using one of ~30 major banks,
we hard-code those at the top for easier pull-down selection,
and add their English names in parenthesis for foreigners.
*/
public static List<String> prettyPrintBankList() // {{{
{
List<String> prettyList = new ArrayList<>();
// add mega banks at the top
for (Map.Entry<String, String> bank : megaBanksEnglish.entrySet()) {
String bankId = bank.getKey();
String bankNameEn = bank.getValue();
String bankNameJa = majorBanksJapanese.get(bankId);
if (bankNameJa == null) bankNameJa = minorBanksJapanese.get(bankId);
prettyList.add(prettyPrintMajorBank(bankId, bankNameJa, bankNameEn));
}
// append the major banks next
for (Map.Entry<String, String> bank : majorBanksJapanese.entrySet()) {
String bankId = bank.getKey();
String bankNameJa = bank.getValue();
// avoid duplicates
if (megaBanksEnglish.get(bankId) != null) continue;
prettyList.add(prettyPrintBank(bankId, bankNameJa));
}
// append the minor local banks last
for (Map.Entry<String, String> bank : minorBanksJapanese.entrySet()) {
String bankId = bank.getKey();
String bankNameJa = bank.getValue();
prettyList.add(prettyPrintBank(bankId, bankNameJa));
}
return prettyList;
} // }}}
// Pretty print major banks like this: (0001) みずほ (Mizuho Bank)
private static String prettyPrintMajorBank(String bankId, String bankNameJa, String bankNameEn) // {{{
{
return ID_OPEN + bankId + ID_CLOSE + SPACE +
JA_OPEN + bankNameJa + JA_CLOSE + SPACE +
EN_OPEN + bankNameEn + EN_CLOSE;
} // }}}
// Pretty print other banks like this: (9524) みずほ証券
private static String prettyPrintBank(String bankId, String bankName) // {{{
{
return ID_OPEN + bankId + ID_CLOSE + SPACE +
JA_OPEN + bankName + JA_CLOSE;
} // }}}
// top 30 mega banks with english
private static final Map<String, String> megaBanksEnglish = ImmutableMap.<String, String>builder()
// {{{ japan post office
.put("9900", "Japan Post Bank Yucho")
// }}}
// {{{ japan mega-banks
.put("0001", "Mizuho Bank")
.put("0005", "Mitsubishi UFJ Bank (MUFG)")
.put("0009", "Sumitomo Mitsui Banking Corporation (SMBC)")
.put("0010", "Resona Bank")
// }}}
// {{{ major online banks
.put("0033", "Japan Net Bank")
.put("0034", "Seven Bank (7-11)")
.put("0035", "Sony Bank")
.put("0036", "Rakuten Bank")
.put("0038", "SBI Sumishin Net Bank")
.put("0039", "Jibun Bank")
.put("0040", "Aeon Bank")
.put("0042", "Lawson Bank")
// }}}
// {{{ major trust banks, etc.
.put("0150", "Suruga Bank")
.put("0288", "Mitsubishi UFJ Trust Bank")
.put("0289", "Mizuho Trust Bank")
.put("0294", "Sumitomo Trust Bank")
.put("0300", "SMBC Trust Bank (PRESTIA)")
.put("0304", "Nomura Trust Bank")
.put("0307", "Orix Trust Bank")
.put("0310", "GMO Aozora Net Bank")
.put("0321", "Japan Securities Trust Bank")
.put("0397", "Shinsei Bank")
.put("0398", "Aozora Bank")
.put("0402", "JP Morgan Chase Bank")
.put("0442", "BNY Mellon")
.put("0458", "DBS Bank")
.put("0472", "SBJ Shinhan Bank Japan")
// }}}
.build();
// major ~200 banks
private static final Map<String, String> majorBanksJapanese = ImmutableMap.<String, String>builder()
// {{{ ゆうちょ銀行 (9900)
.put("9900", "ゆうちょ銀行")
// }}}
// {{{ 都市銀行 (0001 ~ 0029)
.put("0001", "みずほ銀行")
.put("0005", "三菱UFJ銀行")
.put("0009", "三井住友銀行")
.put("0010", "りそな銀行")
.put("0017", "埼玉りそな銀行")
// }}}
// {{{ ネット専業銀行等 (0030 ~ 0049)
.put("0033", "ジャパンネット銀行")
.put("0034", "セブン銀行")
.put("0035", "ソニー銀行")
.put("0036", "楽天銀行")
.put("0038", "住信SBIネット銀行")
.put("0039", "じぶん銀行")
.put("0040", "イオン銀行")
.put("0041", "大和ネクスト銀行")
.put("0042", "ローソン銀行")
// }}}
// {{{ 協会 (0050 ~ 0099)
.put("0051", "全銀協")
.put("0052", "横浜銀行協会")
.put("0053", "釧路銀行協会")
.put("0054", "札幌銀行協会")
.put("0056", "函館銀行協会")
.put("0057", "青森銀行協会")
.put("0058", "秋田銀行協会")
.put("0059", "宮城銀行協会")
.put("0060", "福島銀行協会")
.put("0061", "群馬銀行協会")
.put("0062", "新潟銀行協会")
.put("0063", "石川銀行協会")
.put("0064", "山梨銀行協会")
.put("0065", "長野銀行協会")
.put("0066", "静岡銀行協会")
.put("0067", "名古屋銀行協会")
.put("0068", "京都銀行協会")
.put("0069", "大阪銀行協会")
.put("0070", "神戸銀行協会")
.put("0071", "岡山銀行協会")
.put("0072", "広島銀行協会")
.put("0073", "島根銀行協会")
.put("0074", "山口銀行協会")
.put("0075", "香川銀行協会")
.put("0076", "愛媛銀行協会")
.put("0077", "高知銀行協会")
.put("0078", "北九州銀行協会")
.put("0079", "福岡銀行協会")
.put("0080", "大分銀行協会")
.put("0081", "長崎銀行協会")
.put("0082", "熊本銀行協会")
.put("0083", "鹿児島銀行協会")
.put("0084", "沖縄銀行協会")
.put("0090", "全銀ネット")
.put("0095", "")
// }}}
// {{{ 地方銀行 (0116 ~ 0190)
.put("0116", "北海道銀行")
.put("0117", "青森銀行")
.put("0118", "みちのく銀行")
.put("0119", "秋田銀行")
.put("0120", "北都銀行")
.put("0121", "荘内銀行")
.put("0122", "山形銀行")
.put("0123", "岩手銀行")
.put("0124", "東北銀行")
.put("0125", "七十七銀行")
.put("0126", "東邦銀行")
.put("0128", "群馬銀行")
.put("0129", "足利銀行")
.put("0130", "常陽銀行")
.put("0131", "筑波銀行")
.put("0133", "武蔵野銀行")
.put("0134", "千葉銀行")
.put("0135", "千葉興業銀行")
.put("0137", "きらぼし銀行")
.put("0138", "横浜銀行")
.put("0140", "第四銀行")
.put("0141", "北越銀行")
.put("0142", "山梨中央銀行")
.put("0143", "八十二銀行")
.put("0144", "北陸銀行")
.put("0145", "富山銀行")
.put("0146", "北國銀行")
.put("0147", "福井銀行")
.put("0149", "静岡銀行")
.put("0150", "スルガ銀行")
.put("0151", "清水銀行")
.put("0152", "大垣共立銀行")
.put("0153", "十六銀行")
.put("0154", "三重銀行")
.put("0155", "百五銀行")
.put("0157", "滋賀銀行")
.put("0158", "京都銀行")
.put("0159", "関西みらい銀行")
.put("0161", "池田泉州銀行")
.put("0162", "南都銀行")
.put("0163", "紀陽銀行")
.put("0164", "但馬銀行")
.put("0166", "鳥取銀行")
.put("0167", "山陰合同銀行")
.put("0168", "中国銀行")
.put("0169", "広島銀行")
.put("0170", "山口銀行")
.put("0172", "阿波銀行")
.put("0173", "百十四銀行")
.put("0174", "伊予銀行")
.put("0175", "四国銀行")
.put("0177", "福岡銀行")
.put("0178", "筑邦銀行")
.put("0179", "佐賀銀行")
.put("0180", "十八銀行")
.put("0181", "親和銀行")
.put("0182", "肥後銀行")
.put("0183", "大分銀行")
.put("0184", "宮崎銀行")
.put("0185", "鹿児島銀行")
.put("0187", "琉球銀行")
.put("0188", "沖縄銀行")
.put("0190", "西日本シティ銀行")
.put("0191", "北九州銀行")
// }}}
// {{{ 信託銀行 (0288 ~ 0326)
.put("0288", "三菱UFJ信託銀行")
.put("0289", "みずほ信託銀行")
.put("0294", "三井住友信託銀行")
.put("0295", "BNYM信託")
.put("0297", "日本マスタートラスト信託銀行")
.put("0299", "ステート信託")
.put("0300", "SMBC信託銀行 プレスティア")
.put("0304", "野村信託銀行")
.put("0307", "オリックス銀行")
.put("0310", "GMOあおぞらネット銀行")
.put("0311", "農中信託")
.put("0320", "新生信託")
.put("0321", "日証金信託")
.put("0324", "日本トラスティサービス信託銀行")
.put("0325", "資産管理サービス信託銀行")
// }}}
// {{{ 旧長期信用銀行 (0397 ~ 0398)
.put("0397", "新生銀行")
.put("0398", "あおぞら銀行")
// }}}
// {{{ foreign banks (0400 ~ 0497)
.put("0401", "シティバンク、エヌ・エイ 銀行")
.put("0402", "JPモルガン・チェース銀行")
.put("0403", "アメリカ銀行")
.put("0411", "香港上海銀行")
.put("0413", "スタンチヤート")
.put("0414", "バークレイズ")
.put("0421", "アグリコル")
.put("0423", "ハナ")
.put("0424", "印度")
.put("0425", "兆豐國際商銀")
.put("0426", "バンコツク")
.put("0429", "バンクネガラ")
.put("0430", "ドイツ銀行")
.put("0432", "ブラジル")
.put("0438", "ユーオバシーズ")
.put("0439", "ユービーエス")
.put("0442", "BNYメロン")
.put("0443", "ビー・エヌ・ピー・パリバ銀行")
.put("0444", "チヤイニーズ")
.put("0445", "ソシエテ")
.put("0456", "ユバフ")
.put("0458", "")
.put("0459", "パキスタン")
.put("0460", "クレデイスイス")
.put("0461", "コメルツ銀行")
.put("0463", "ウニクレデイト")
.put("0468", "インドステイト")
.put("0471", "カナダロイヤル")
.put("0472", "SBJ銀行")
.put("0477", "ウリイ")
.put("0482", "アイエヌジー")
.put("0484", "ナツトオース")
.put("0485", "アンズバンク")
.put("0487", "コモンウエルス")
.put("0489", "バンクチヤイナ")
.put("0495", "ステストリート")
.put("0498", "中小企業")
// }}}
// {{{ 第二地方銀行 (0501 ~ 0597)
.put("0501", "北洋銀行")
.put("0508", "きらやか銀行")
.put("0509", "北日本銀行")
.put("0512", "仙台銀行")
.put("0513", "福島銀行")
.put("0514", "大東銀行")
.put("0516", "東和銀行")
.put("0517", "栃木銀行")
.put("0522", "京葉銀行")
.put("0525", "東日本銀行")
.put("0526", "東京スター銀行")
.put("0530", "神奈川銀行")
.put("0532", "大光銀行")
.put("0533", "長野銀行")
.put("0534", "富山第一銀行")
.put("0537", "福邦銀行")
.put("0538", "静岡中央銀行")
.put("0542", "愛知銀行")
.put("0543", "名古屋銀行")
.put("0544", "中京銀行")
.put("0546", "第三銀行")
.put("0555", "大正銀行")
.put("0562", "みなと銀行")
.put("0565", "島根銀行")
.put("0566", "トマト銀行")
.put("0569", "もみじ銀行")
.put("0570", "西京銀行")
.put("0572", "徳島銀行")
.put("0573", "香川銀行")
.put("0576", "愛媛銀行")
.put("0578", "高知銀行")
.put("0582", "福岡中央銀行")
.put("0583", "佐賀共栄銀行")
.put("0585", "長崎銀行")
.put("0587", "熊本銀行")
.put("0590", "豊和銀行")
.put("0591", "宮崎太陽銀行")
.put("0594", "南日本銀行")
.put("0596", "沖縄海邦銀行")
// }}}
// {{{ more foreign banks (0600 ~ 0999)
.put("0603", "韓国産業")
.put("0607", "彰化商業")
.put("0608", "ウエルズフアゴ")
.put("0611", "第一商業")
.put("0612", "台湾")
.put("0615", "交通")
.put("0616", "メトロポリタン")
.put("0617", "フイリピン")
.put("0619", "中国工商")
.put("0621", "中國信託商業")
.put("0623", "インテーザ")
.put("0624", "國民")
.put("0625", "中国建設")
.put("0626", "イタウウニ")
.put("0627", "")
.put("0630", "中国農業")
.put("0631", "台新")
.put("0632", "玉山")
.put("0633", "台湾企銀")
.put("0808", "ドイツ証券")
.put("0813", "ソシエテ証券")
.put("0821", "ビーピー証券")
.put("0822", "バークレイ証券")
.put("0831", "アグリコル証券")
.put("0832", "ジエイピー証券")
.put("0842", "ゴルドマン証券")
.put("0845", "ナツトウエ証券")
.put("0900", "日本相互証券")
.put("0905", "東京金融取引所")
.put("0909", "日本クリア機構")
.put("0910", "ほふりクリア")
.put("0964", "しんきん証券")
.put("0966", "HSBC証券")
.put("0968", "セント東短証券")
.put("0971", "UBS証券")
.put("0972", "メリル日本証券")
// }}}
.build();
// minor ~280 lesser known banks
private static final Map<String, String> minorBanksJapanese = ImmutableMap.<String, String>builder()
// {{{ 信用金庫 (1001 ~ 1996)
.put("1000", "信金中央金庫")
.put("1001", "北海道信金")
.put("1003", "室蘭信金")
.put("1004", "空知信金")
.put("1006", "苫小牧信金")
.put("1008", "北門信金")
.put("1009", "伊達信金")
.put("1010", "北空知信金")
.put("1011", "日高信金")
.put("1013", "渡島信金")
.put("1014", "道南うみ街信金")
.put("1020", "旭川信金")
.put("1021", "稚内信金")
.put("1022", "留萌信金")
.put("1024", "北星信金")
.put("1026", "帯広信金")
.put("1027", "釧路信金")
.put("1028", "大地みらい信金")
.put("1030", "北見信金")
.put("1031", "網走信金")
.put("1033", "遠軽信金")
.put("1104", "東奥信金")
.put("1105", "青い森信金")
.put("1120", "秋田信金")
.put("1123", "羽後信金")
.put("1140", "山形信金")
.put("1141", "米沢信金")
.put("1142", "鶴岡信金")
.put("1143", "新庄信金")
.put("1150", "盛岡信金")
.put("1152", "宮古信金")
.put("1153", "一関信金")
.put("1154", "北上信金")
.put("1155", "花巻信金")
.put("1156", "水沢信金")
.put("1170", "杜の都信金")
.put("1171", "宮城第一信金")
.put("1172", "石巻信金")
.put("1174", "仙南信金")
.put("1181", "会津信金")
.put("1182", "郡山信金")
.put("1184", "白河信金")
.put("1185", "須賀川信金")
.put("1186", "ひまわり信金")
.put("1188", "あぶくま信金")
.put("1189", "二本松信金")
.put("1190", "福島信金")
.put("1203", "高崎信金")
.put("1204", "桐生信金")
.put("1206", "アイオー信金")
.put("1208", "利根郡信金")
.put("1209", "館林信金")
.put("1210", "北群馬信金")
.put("1211", "しののめ信金")
.put("1221", "足利小山信金")
.put("1222", "栃木信金")
.put("1223", "鹿沼相互信金")
.put("1224", "佐野信金")
.put("1225", "大田原信金")
.put("1227", "烏山信金")
.put("1240", "水戸信金")
.put("1242", "結城信金")
.put("1250", "埼玉県信金")
.put("1251", "川口信金")
.put("1252", "青木信金")
.put("1253", "飯能信金")
.put("1260", "千葉信金")
.put("1261", "銚子信金")
.put("1262", "東京ベイ信金")
.put("1264", "館山信金")
.put("1267", "佐原信金")
.put("1280", "横浜信金")
.put("1281", "かながわ信金")
.put("1282", "湘南信金")
.put("1283", "川崎信金")
.put("1286", "平塚信金")
.put("1288", "さがみ信金")
.put("1289", "中栄信金")
.put("1290", "中南信金")
.put("1303", "朝日信金")
.put("1305", "興産信金")
.put("1310", "さわやか信金")
.put("1311", "東京シテイ信金")
.put("1319", "芝信金")
.put("1320", "東京東信金")
.put("1321", "東栄信金")
.put("1323", "亀有信金")
.put("1326", "小松川信金")
.put("1327", "足立成和信金")
.put("1333", "東京三協信金")
.put("1336", "西京信金")
.put("1341", "西武信金")
.put("1344", "城南信金")
.put("1345", "東京)昭和信金")
.put("1346", "目黒信金")
.put("1348", "世田谷信金")
.put("1349", "東京信金")
.put("1351", "城北信金")
.put("1352", "滝野川信金")
.put("1356", "巣鴨信金")
.put("1358", "青梅信金")
.put("1360", "多摩信金")
.put("1370", "新潟信金")
.put("1371", "長岡信金")
.put("1373", "三条信金")
.put("1374", "新発田信金")
.put("1375", "柏崎信金")
.put("1376", "上越信金")
.put("1377", "新井信金")
.put("1379", "村上信金")
.put("1380", "加茂信金")
.put("1385", "甲府信金")
.put("1386", "山梨信金")
.put("1390", "長野信金")
.put("1391", "松本信金")
.put("1392", "上田信金")
.put("1393", "諏訪信金")
.put("1394", "飯田信金")
.put("1396", "アルプス信金")
.put("1401", "富山信金")
.put("1402", "高岡信金")
.put("1405", "にいかわ信金")
.put("1406", "氷見伏木信金")
.put("1412", "砺波信金")
.put("1413", "石動信金")
.put("1440", "金沢信金")
.put("1442", "のと共栄信金")
.put("1444", "北陸信金")
.put("1445", "鶴来信金")
.put("1448", "興能信金")
.put("1470", "福井信金")
.put("1471", "敦賀信金")
.put("1473", "小浜信金")
.put("1475", "越前信金")
.put("1501", "しず焼津信金")
.put("1502", "静清信金")
.put("1503", "浜松磐田信金")
.put("1505", "沼津信金")
.put("1506", "三島信金")
.put("1507", "富士宮信金")
.put("1513", "島田掛川信金")
.put("1515", "静岡)富士信金")
.put("1517", "遠州信金")
.put("1530", "岐阜信金")
.put("1531", "大垣西濃信金")
.put("1532", "高山信金")
.put("1533", "東濃信金")
.put("1534", "関信金")
.put("1538", "八幡信金")
.put("1550", "愛知信金")
.put("1551", "豊橋信金")
.put("1552", "岡崎信金")
.put("1553", "いちい信金")
.put("1554", "瀬戸信金")
.put("1555", "半田信金")
.put("1556", "知多信金")
.put("1557", "豊川信金")
.put("1559", "豊田信金")
.put("1560", "碧海信金")
.put("1561", "西尾信金")
.put("1562", "蒲郡信金")
.put("1563", "尾西信金")
.put("1565", "中日信金")
.put("1566", "東春信金")
.put("1580", "津信金")
.put("1581", "北伊勢上野信金")
.put("1583", "桑名三重信金")
.put("1585", "紀北信金")
.put("1602", "滋賀中央信金")
.put("1603", "長浜信金")
.put("1604", "湖東信金")
.put("1610", "京都信金")
.put("1611", "京都中央信金")
.put("1620", "京都北都信金")
.put("1630", "大阪信金")
.put("1633", "大阪厚生信金")
.put("1635", "大阪シテイ信金")
.put("1636", "大阪商工信金")
.put("1643", "永和信金")
.put("1645", "北おおさか信金")
.put("1656", "枚方信金")
.put("1666", "奈良信金")
.put("1667", "大和信金")
.put("1668", "奈良中央信金")
.put("1671", "新宮信金")
.put("1674", "きのくに信金")
.put("1680", "神戸信金")
.put("1685", "姫路信金")
.put("1686", "播州信金")
.put("1687", "兵庫信金")
.put("1688", "尼崎信金")
.put("1689", "日新信金")
.put("1691", "淡路信金")
.put("1692", "但馬信金")
.put("1694", "西兵庫信金")
.put("1695", "中兵庫信金")
.put("1696", "但陽信金")
.put("1701", "鳥取信金")
.put("1702", "米子信金")
.put("1703", "倉吉信金")
.put("1710", "しまね信金")
.put("1711", "日本海信金")
.put("1712", "島根中央信金")
.put("1732", "おかやま信金")
.put("1734", "水島信金")
.put("1735", "津山信金")
.put("1738", "玉島信金")
.put("1740", "備北信金")
.put("1741", "吉備信金")
.put("1742", "日生信金")
.put("1743", "備前信金")
.put("1750", "広島信金")
.put("1752", "呉信金")
.put("1756", "しまなみ信金")
.put("1758", "広島みどり信金")
.put("1780", "萩山口信金")
.put("1781", "西中国信金")
.put("1789", "東山口信金")
.put("1801", "徳島信金")
.put("1803", "阿南信金")
.put("1830", "高松信金")
.put("1833", "観音寺信金")
.put("1860", "愛媛信金")
.put("1862", "宇和島信金")
.put("1864", "東予信金")
.put("1866", "川之江信金")
.put("1880", "幡多信金")
.put("1881", "高知信金")
.put("1901", "福岡信金")
.put("1903", "福岡ひびき信金")
.put("1908", "大牟田柳川信金")
.put("1909", "筑後信金")
.put("1910", "飯塚信金")
.put("1917", "大川信金")
.put("1920", "遠賀信金")
.put("1930", "唐津信金")
.put("1931", "佐賀信金")
.put("1933", "九州ひぜん信金")
.put("1942", "たちばな信金")
.put("1951", "熊本信金")
.put("1952", "熊本第一信金")
.put("1954", "熊本中央信金")
.put("1960", "大分信金")
.put("1962", "大分みらい信金")
.put("1980", "宮崎都城信金")
.put("1985", "高鍋信金")
.put("1990", "鹿児島信金")
.put("1991", "鹿児島相互信金")
.put("1993", "奄美大島信金")
.put("1996", "コザ信金")
// }}}
// {{{ 信用組合 (2011 ~ 2895)
.put("2004", "商工組合中央金庫")
.put("2010", "全国信用協同組合連合会")
.put("2213", "整理回収機構")
// }}}
// {{{ 労働金庫 (2951 ~ 2997)
.put("2950", "労働金庫連合会")
// }}}
// {{{ 農林中央金庫 (3000)
.put("3000", "農林中央金庫")
// }}}
// {{{ 信用農業協同組合連合会 (3001 ~ 3046)
.put("3001", "北海道信用農業協同組合連合会")
.put("3003", "岩手県信用農業協同組合連合会")
.put("3008", "茨城県信用農業協同組合連合会")
.put("3011", "埼玉県信用農業協同組合連合会")
.put("3013", "東京都信用農業協同組合連合会")
.put("3014", "神奈川県信用農業協同組合連合会")
.put("3015", "山梨県信用農業協同組合連合会")
.put("3016", "長野県信用農業協同組合連合会")
.put("3017", "新潟県信用農業協同組合連合会")
.put("3019", "石川県信用農業協同組合連合会")
.put("3020", "岐阜県信用農業協同組合連合会")
.put("3021", "静岡県信用農業協同組合連合会")
.put("3022", "愛知県信用農業協同組合連合会")
.put("3023", "三重県信用農業協同組合連合会")
.put("3024", "福井県信用農業協同組合連合会")
.put("3025", "滋賀県信用農業協同組合連合会")
.put("3026", "京都府信用農業協同組合連合会")
.put("3027", "大阪府信用農業協同組合連合会")
.put("3028", "兵庫県信用農業協同組合連合会")
.put("3030", "和歌山県信用農業協同組合連合会")
.put("3031", "鳥取県信用農業協同組合連合会")
.put("3034", "広島県信用農業協同組合連合会")
.put("3035", "山口県信用農業協同組合連合会")
.put("3036", "徳島県信用農業協同組合連合会")
.put("3037", "香川県信用農業協同組合連合会")
.put("3038", "愛媛県信用農業協同組合連合会")
.put("3039", "高知県信用農業協同組合連合会")
.put("3040", "福岡県信用農業協同組合連合会")
.put("3041", "佐賀県信用農業協同組合連合会")
.put("3044", "大分県信用農業協同組合連合会")
.put("3045", "宮崎県信用農業協同組合連合会")
.put("3046", "鹿児島県信用農業協同組合連合会")
// }}}
// {{{ "JA Bank" agricultural cooperative associations (3056 ~ 9375)
// REMOVED: the farmers should use a real bank if they want to sell bitcoin
// }}}
// {{{ 信用漁業協同組合連合会 (9450 ~ 9496)
.put("9450", "北海道信用漁業協同組合連合会")
.put("9451", "青森県信用漁業協同組合連合会")
.put("9452", "岩手県信用漁業協同組合連合会")
.put("9453", "宮城県漁業協同組合")
.put("9456", "福島県信用漁業協同組合連合会")
.put("9457", "茨城県信用漁業協同組合連合会")
.put("9461", "千葉県信用漁業協同組合連合会")
.put("9462", "東京都信用漁業協同組合連合会")
.put("9466", "新潟県信用漁業協同組合連合会")
.put("9467", "富山県信用漁業協同組合連合会")
.put("9468", "石川県信用漁業協同組合連合会")
.put("9470", "静岡県信用漁業協同組合連合会")
.put("9471", "愛知県信用漁業協同組合連合会")
.put("9472", "三重県信用漁業協同組合連合会")
.put("9473", "福井県信用漁業協同組合連合会")
.put("9475", "京都府信用漁業協同組合連合会")
.put("9477", "なぎさ信用漁業協同組合連合会")
.put("9480", "鳥取県信用漁業協同組合連合会")
.put("9481", "JFしまね漁業協同組合")
.put("9483", "広島県信用漁業協同組合連合会")
.put("9484", "山口県漁業協同組合")
.put("9485", "徳島県信用漁業協同組合連合会")
.put("9486", "香川県信用漁業協同組合連合会")
.put("9487", "愛媛県信用漁業協同組合連合会")
.put("9488", "高知県信用漁業協同組合連合会")
.put("9489", "福岡県信用漁業協同組合連合会")
.put("9490", "佐賀県信用漁業協同組合連合会")
.put("9491", "長崎県信用漁業協同組合連合会")
.put("9493", "大分県漁業協同組合")
.put("9494", "宮崎県信用漁業協同組合連合会")
.put("9495", "鹿児島県信用漁業協同組合連合会")
.put("9496", "沖縄県信用漁業協同組合連合会")
// }}}
// {{{ securities firms
.put("9500", "東京短資")
.put("9501", "セントラル短資")
.put("9507", "上田八木短資")
.put("9510", "日本証券金融")
.put("9520", "野村証券")
.put("9521", "日興証券")
.put("9523", "大和証券")
.put("9524", "みずほ証券")
.put("9528", "岡三証券")
.put("9530", "岩井コスモ証券")
.put("9532", "三菱UFJ証券")
.put("9534", "丸三証券")
.put("9535", "東洋証券")
.put("9537", "水戸証券")
.put("9539", "東海東京証券")
.put("9542", "むさし証券")
.put("9545", "いちよし証券")
.put("9573", "極東証券")
.put("9574", "立花証券")
.put("9579", "光世証券")
.put("9584", "ちばぎん証券")
.put("9589", "シテイ証券")
.put("9594", "CS証券")
.put("9595", "スタンレー証券")
.put("9930", "日本政策投資")
.put("9932", "政策金融公庫")
.put("9933", "国際協力")
.put("9945", "預金保険機構")
// }}}
.build();
private final static String ID_OPEN = "";
private final static String ID_CLOSE = "";
private final static String JA_OPEN = "";
private final static String JA_CLOSE = "";
private final static String EN_OPEN = "";
private final static String EN_CLOSE = "";
public final static String SPACE = " ";
// don't localize these strings into all languages,
// all we want is either Japanese or English here.
public static String getString(String id) {
boolean ja = userLanguage.equals("ja");
switch (id) {
case "bank":
if (ja) return "銀行名 ・金融機関名";
return "Bank or Financial Institution";
case "bank.select":
if (ja) return "金融機関 ・銀行検索 (名称入力検索)";
return "Search for Bank or Financial Institution";
case "bank.code":
if (ja) return "銀行コード";
return "Zengin Bank Code";
case "bank.name":
if (ja) return "金融機関名 ・銀行名";
return "Financial Institution / Bank Name";
case "branch":
if (ja) return "支店名";
return "Bank Branch";
case "branch.code":
if (ja) return "支店コード";
return "Zengin Branch Code";
case "branch.code.validation.error":
if (ja) return "入力は3桁の支店コードでなければなりません";
return "Input must be a 3 digit branch code";
case "branch.name":
if (ja) return "支店名";
return "Bank Branch Name";
case "account":
if (ja) return "銀行口座";
return "Bank Account";
case "account.type":
if (ja) return "口座科目";
return "Bank Account Type";
case "account.type.select":
if (ja) return "口座科目";
return "Select Account Type";
// displayed while creating account
case "account.type.futsu":
if (ja) return "普通";
return "FUTSUU (ordinary) account";
case "account.type.touza":
if (ja) return "当座";
return "TOUZA (checking) account";
case "account.type.chochiku":
if (ja) return "貯金";
return "CHOCHIKU (special) account";
// used when saving account info
case "account.type.futsu.ja":
return "普通";
case "account.type.touza.ja":
return "当座";
case "account.type.chochiku.ja":
return "貯金";
case "account.number":
if (ja) return "口座番号";
return "Bank Account Number";
case "account.number.validation.error":
if (ja) return "入力は4〜8桁の口座番号でなければなりません";
return "Input must be 4 ~ 8 digit account number";
case "account.name":
if (ja) return "口座名義";
return "Bank Account Name";
// for japanese-only input fields
case "japanese.validation.error":
if (ja) return "入力は漢字、ひらがな、またはカタカナでなければなりません";
return "Input must be Kanji, Hiragana, or Katakana";
case "japanese.validation.regex":
// epic regex to only match Japanese input
return "[" + // match any of these characters:
// "-" + // full-width alphabet
// "-" + // full-width numerals
"一-龯" + // common Japanese kanji (0x4e00 ~ 0x9faf)
"" + // kanji iteration mark (0x3005)
"" + // kanji number zero (0x3007)
"ぁ-ゞ" + // hiragana (0x3041 ~ 0x309e)
"ァ-・" + // full-width katakana (0x30a1 ~ 0x30fb)
"ァ-ン゙゚" + // half-width katakana
"ヽヾ゛゜ー" + // 0x30fd, 0x30fe, 0x309b, 0x309c, 0x30fc
" " + // full-width space
" " + // half-width space
"]+"; // for any length
}
return "null";
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.MoneseAccountPayload;
@ -63,14 +64,17 @@ public final class MoneseAccount extends PaymentAccount {
return ((MoneseAccountPayload) paymentAccountPayload).getMobileNr();
}
@Override
public String getMessageForBuyer() {
return "payment.monese.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.monese.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.monese.info.account";
}
@ -79,4 +83,9 @@ public final class MoneseAccount extends PaymentAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.MoneyBeamAccountPayload;
@ -49,6 +50,11 @@ public final class MoneyBeamAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setAccountId(String accountId) {
((MoneyBeamAccountPayload) paymentAccountPayload).setAccountId(accountId);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.Country;
import bisq.core.locale.CountryUtil;
import bisq.core.locale.FiatCurrency;
@ -100,12 +101,16 @@ public final class MoneyGramAccount extends PaymentAccount {
return new MoneyGramAccountPayload(paymentMethod.getId(), id);
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
@Nullable
public Country getCountry() {
if (country == null) {

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.BankAccountPayload;
@ -48,6 +49,11 @@ public final class NationalBankAccount extends CountryBasedPaymentAccount implem
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
@Override
public String getBankId() {
return ((BankAccountPayload) paymentAccountPayload).getBankId();

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.NequiAccountPayload;
@ -50,14 +51,17 @@ public final class NequiAccount extends CountryBasedPaymentAccount {
return ((NequiAccountPayload) paymentAccountPayload).getMobileNr();
}
@Override
public String getMessageForBuyer() {
return "payment.nequi.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.nequi.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.nequi.info.account";
}
@ -66,4 +70,9 @@ public final class NequiAccount extends CountryBasedPaymentAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.OKPayAccountPayload;
@ -71,12 +72,16 @@ public final class OKPayAccount extends PaymentAccount {
return new OKPayAccountPayload(paymentMethod.getId(), id);
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setAccountNr(String accountNr) {
((OKPayAccountPayload) paymentAccountPayload).setAccountNr(accountNr);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaxumAccountPayload;
@ -63,12 +64,16 @@ public final class PaxumAccount extends PaymentAccount {
return new PaxumAccountPayload(paymentMethod.getId(), id);
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setEmail(String accountId) {
((PaxumAccountPayload) paymentAccountPayload).setEmail(accountId);
}

View file

@ -17,11 +17,22 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountForm;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.Country;
import bisq.core.locale.CountryUtil;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.payment.payload.PaymentMethod;
import bisq.core.payment.validation.BICValidator;
import bisq.core.payment.validation.EmailOrMobileNrValidator;
import bisq.core.payment.validation.EmailValidator;
import bisq.core.payment.validation.IBANValidator;
import bisq.core.payment.validation.LengthValidator;
import bisq.core.proto.CoreProtoResolver;
import bisq.core.util.validation.InputValidator.ValidationResult;
import bisq.common.proto.ProtoUtil;
import bisq.common.proto.persistable.PersistablePayload;
import bisq.common.util.Utilities;
@ -31,6 +42,8 @@ import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import lombok.EqualsAndHashCode;
@ -44,6 +57,9 @@ import javax.annotation.Nullable;
import static bisq.core.payment.payload.PaymentMethod.TRANSFERWISE_ID;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.util.Arrays.stream;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;
@EqualsAndHashCode
@ToString
@ -265,4 +281,394 @@ public abstract class PaymentAccount implements PersistablePayload {
@NonNull
public abstract List<TradeCurrency> getSupportedCurrencies();
// ------------------------- PAYMENT ACCOUNT FORM -------------------------
@NonNull
public abstract List<PaymentAccountFormField.FieldId> getInputFieldIds();
public PaymentAccountForm toForm() {
PaymentAccountForm form = new PaymentAccountForm(PaymentAccountForm.FormId.valueOf(paymentMethod.getId()));
for (PaymentAccountFormField.FieldId fieldId : getInputFieldIds()) {
PaymentAccountFormField field = getEmptyFormField(fieldId);
form.getFields().add(field);
}
return form;
}
public void validateFormField(PaymentAccountForm form, PaymentAccountFormField.FieldId fieldId, String value) {
switch (fieldId) {
case ACCEPTED_COUNTRY_CODES: {
List<String> countryCodes = PaymentAccount.commaDelimitedCodesToList.apply(value);
List<String> supportedCountryCodes = CountryUtil.getCountryCodes(((CountryBasedPaymentAccount) this).getSupportedCountries());
for (String countryCode : countryCodes) {
if (!supportedCountryCodes.contains(countryCode)) throw new IllegalArgumentException("Country is not supported by " + getPaymentMethod().getId() + ": " + value);
}
break;
}
case ACCOUNT_ID:
throw new IllegalArgumentException("Not implemented");
case ACCOUNT_NAME:
processValidationResult(new LengthValidator(2, 100).validate(value));
break;
case ACCOUNT_NR:
throw new IllegalArgumentException("Not implemented");
case ACCOUNT_OWNER:
throw new IllegalArgumentException("Not implemented");
case ACCOUNT_TYPE:
throw new IllegalArgumentException("Not implemented");
case ANSWER:
throw new IllegalArgumentException("Not implemented");
case BANK_ACCOUNT_NAME:
throw new IllegalArgumentException("Not implemented");
case BANK_ACCOUNT_NUMBER:
throw new IllegalArgumentException("Not implemented");
case BANK_ACCOUNT_TYPE:
throw new IllegalArgumentException("Not implemented");
case BANK_ADDRESS:
case INTERMEDIARY_ADDRESS:
processValidationResult(new LengthValidator(1, 100).validate(value));
break;
case BANK_BRANCH:
case INTERMEDIARY_BRANCH:
processValidationResult(new LengthValidator(2, 34).validate(value));
break;
case BANK_BRANCH_CODE:
throw new IllegalArgumentException("Not implemented");
case BANK_BRANCH_NAME:
throw new IllegalArgumentException("Not implemented");
case BANK_CODE:
throw new IllegalArgumentException("Not implemented");
case BANK_COUNTRY_CODE:
if (!CountryUtil.findCountryByCode(value).isPresent()) throw new IllegalArgumentException("Invalid country code: " + value);
break;
case BANK_ID:
throw new IllegalArgumentException("Not implemented");
case BANK_NAME:
case INTERMEDIARY_NAME:
processValidationResult(new LengthValidator(2, 34).validate(value));
break;
case BANK_SWIFT_CODE:
case INTERMEDIARY_SWIFT_CODE:
processValidationResult(new LengthValidator(11, 11).validate(value));
break;
case BENEFICIARY_ACCOUNT_NR:
processValidationResult(new LengthValidator(2, 40).validate(value));
break;
case BENEFICIARY_ADDRESS:
processValidationResult(new LengthValidator(1, 100).validate(value));
break;
case BENEFICIARY_CITY:
processValidationResult(new LengthValidator(2, 34).validate(value));
break;
case BENEFICIARY_NAME:
processValidationResult(new LengthValidator(2, 34).validate(value));
break;
case BENEFICIARY_PHONE:
processValidationResult(new LengthValidator(2, 34).validate(value));
break;
case BIC:
processValidationResult(new BICValidator().validate(value));
break;
case BRANCH_ID:
throw new IllegalArgumentException("Not implemented");
case CITY:
processValidationResult(new LengthValidator(2, 34).validate(value));
break;
case CONTACT:
checkNotEmpty(value);
break;
case COUNTRY:
List<Country> supportedCountries = ((CountryBasedPaymentAccount) this).getSupportedCountries();
if (supportedCountries == null || supportedCountries.isEmpty()) {
if (!CountryUtil.findCountryByCode(value).isPresent()) throw new IllegalArgumentException("Invalid country code: " + value);
} else {
System.out.println("BUT WE SUPPORT THESE COUNTRIES!");
System.out.println(supportedCountries);
List<String> supportedCountryCodes = CountryUtil.getCountryCodes(supportedCountries);
if (!supportedCountryCodes.contains(value)) throw new IllegalArgumentException("Country is not supported by " + getPaymentMethod().getId() + ": " + value);
}
break;
case EMAIL:
checkNotEmpty(value);
processValidationResult(new EmailValidator().validate(value));
break;
case EMAIL_OR_MOBILE_NR:
checkNotEmpty(value);
processValidationResult(new EmailOrMobileNrValidator().validate(value));
break;
case EXTRA_INFO:
break;
case HOLDER_ADDRESS:
throw new IllegalArgumentException("Not implemented");
case HOLDER_EMAIL:
throw new IllegalArgumentException("Not implemented");
case HOLDER_NAME:
processValidationResult(new LengthValidator(2, 100).validate(value));
break;
case HOLDER_TAX_ID:
throw new IllegalArgumentException("Not implemented");
case IBAN:
processValidationResult(new IBANValidator().validate(value));
break;
case IFSC:
throw new IllegalArgumentException("Not implemented");
case INTERMEDIARY_COUNTRY_CODE:
if (!CountryUtil.findCountryByCode(value).isPresent()) throw new IllegalArgumentException("Invalid country code: " + value); // TODO: value must be within supported countries unless all countries supported
break;
case MOBILE_NR:
throw new IllegalArgumentException("Not implemented");
case NATIONAL_ACCOUNT_ID:
throw new IllegalArgumentException("Not implemented");
case PAYID:
throw new IllegalArgumentException("Not implemented");
case PIX_KEY:
throw new IllegalArgumentException("Not implemented");
case POSTAL_ADDRESS:
throw new IllegalArgumentException("Not implemented");
case PROMPT_PAY_ID:
throw new IllegalArgumentException("Not implemented");
case QUESTION:
throw new IllegalArgumentException("Not implemented");
case REQUIREMENTS:
throw new IllegalArgumentException("Not implemented");
case SALT:
if (!value.equals("")) throw new IllegalArgumentException("Salt must be empty");
break;
case SORT_CODE:
throw new IllegalArgumentException("Not implemented");
case SPECIAL_INSTRUCTIONS:
break;
case STATE:
throw new IllegalArgumentException("Not implemented");
case TRADE_CURRENCIES:
checkNotEmpty(value);
List<String> currencyCodes = commaDelimitedCodesToList.apply(value);
Optional<List<TradeCurrency>> tradeCurrencies = CurrencyUtil.getTradeCurrenciesInList(currencyCodes, getSupportedCurrencies());
if (!tradeCurrencies.isPresent()) throw new IllegalArgumentException("No trade currencies were found in the " + getPaymentMethod().getDisplayString() + " account form");
break;
case USER_NAME:
checkNotEmpty(value);
processValidationResult(new LengthValidator(3, 100).validate(value));
break;
case VIRTUAL_PAYMENT_ADDRESS:
throw new IllegalArgumentException("Not implemented");
default:
throw new RuntimeException("Unhandled form field: " + fieldId);
}
}
protected void checkNotEmpty(String input) {
if (input == null || "".equals(input)) throw new IllegalArgumentException("Field must not be empty");
}
protected void processValidationResult(ValidationResult result) {
if (!result.isValid) throw new IllegalArgumentException(result.errorMessage);
}
protected PaymentAccountFormField getEmptyFormField(PaymentAccountFormField.FieldId fieldId) {
PaymentAccountFormField field = new PaymentAccountFormField(fieldId);
switch (fieldId) {
case ACCEPTED_COUNTRY_CODES:
field.setComponent(PaymentAccountFormField.Component.SELECT_MULTIPLE);
field.setLabel("Accepted country codes");
field.setSupportedCountries(((CountryBasedPaymentAccount) this).getSupportedCountries());
break;
case ACCOUNT_ID:
throw new IllegalArgumentException("Not implemented");
case ACCOUNT_NAME:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Account name"); // TODO: pull all labels from language file
field.setMinLength(3);
field.setMaxLength(100);
break;
case ACCOUNT_NR:
throw new IllegalArgumentException("Not implemented");
case ACCOUNT_OWNER:
throw new IllegalArgumentException("Not implemented");
case ACCOUNT_TYPE:
throw new IllegalArgumentException("Not implemented");
case ANSWER:
throw new IllegalArgumentException("Not implemented");
case BANK_ACCOUNT_NAME:
throw new IllegalArgumentException("Not implemented");
case BANK_ACCOUNT_NUMBER:
throw new IllegalArgumentException("Not implemented");
case BANK_ACCOUNT_TYPE:
throw new IllegalArgumentException("Not implemented");
case BANK_ADDRESS:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Receiving Bank address");
break;
case BANK_BRANCH:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Receiving Bank branch");
break;
case BANK_BRANCH_CODE:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Receiving Bank SWIFT code"); // TODO: only used for swift?
break;
case BANK_BRANCH_NAME:
throw new IllegalArgumentException("Not implemented");
case BANK_CODE:
throw new IllegalArgumentException("Not implemented");
case BANK_COUNTRY_CODE:
field.setComponent(PaymentAccountFormField.Component.SELECT_ONE);
field.setLabel("Country of bank");
break;
case BANK_ID:
throw new IllegalArgumentException("Not implemented");
case BANK_NAME:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Receiving Bank name");
break;
case BANK_SWIFT_CODE:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Receiving Bank SWIFT Code");
break;
case BENEFICIARY_ACCOUNT_NR:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Account No. (or IBAN)");
break;
case BENEFICIARY_ADDRESS:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Beneficiary address");
break;
case BENEFICIARY_CITY:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Beneficiary city");
break;
case BENEFICIARY_NAME:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Account owner full name");
break;
case BENEFICIARY_PHONE:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Beneficiary phone number");
break;
case BIC:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("BIC");
break;
case BRANCH_ID:
throw new IllegalArgumentException("Not implemented");
case CITY:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel(Res.get("Contact"));
case CONTACT:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("City");
case COUNTRY:
field.setComponent(PaymentAccountFormField.Component.SELECT_ONE);
field.setLabel("Country");
field.setSupportedCountries(((CountryBasedPaymentAccount) this).getSupportedCountries());
break;
case EMAIL:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setType("email");
field.setLabel("Email");
break;
case EMAIL_OR_MOBILE_NR:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Email or mobile number");
break;
case EXTRA_INFO:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Optional additional information");
break;
case HOLDER_ADDRESS:
throw new IllegalArgumentException("Not implemented");
case HOLDER_EMAIL:
throw new IllegalArgumentException("Not implemented");
case HOLDER_NAME:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Account owner full name");
field.setMinLength(2);
field.setMaxLength(100);
break;
case HOLDER_TAX_ID:
throw new IllegalArgumentException("Not implemented");
case IBAN:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("IBAN");
break;
case IFSC:
throw new IllegalArgumentException("Not implemented");
case INTERMEDIARY_ADDRESS:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Intermediary Bank address");
break;
case INTERMEDIARY_BRANCH:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Intermediary Bank branch");
break;
case INTERMEDIARY_COUNTRY_CODE:
field.setComponent(PaymentAccountFormField.Component.SELECT_ONE);
field.setLabel("Intermediary Bank country");
break;
case INTERMEDIARY_NAME:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Intermediary Bank name");
break;
case INTERMEDIARY_SWIFT_CODE:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Intermediary Bank SWIFT Code"); // TODO: swift only?
break;
case MOBILE_NR:
throw new IllegalArgumentException("Not implemented");
case NATIONAL_ACCOUNT_ID:
throw new IllegalArgumentException("Not implemented");
case PAYID:
throw new IllegalArgumentException("Not implemented");
case PIX_KEY:
throw new IllegalArgumentException("Not implemented");
case POSTAL_ADDRESS:
throw new IllegalArgumentException("Not implemented");
case PROMPT_PAY_ID:
throw new IllegalArgumentException("Not implemented");
case QUESTION:
throw new IllegalArgumentException("Not implemented");
case REQUIREMENTS:
throw new IllegalArgumentException("Not implemented");
case SALT:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Salt");
break;
case SORT_CODE:
throw new IllegalArgumentException("Not implemented");
case SPECIAL_INSTRUCTIONS:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("Special instructions");
break;
case STATE:
throw new IllegalArgumentException("Not implemented");
case TRADE_CURRENCIES:
field.setComponent(PaymentAccountFormField.Component.SELECT_MULTIPLE);
field.setLabel("Supported currencies");
field.setSupportedCurrencies(getSupportedCurrencies());
break;
case USER_NAME:
field.setComponent(PaymentAccountFormField.Component.TEXT);
field.setLabel("User name");
field.setMinLength(3);
field.setMaxLength(100);
break;
case VIRTUAL_PAYMENT_ADDRESS:
throw new IllegalArgumentException("Not implemented");
default:
throw new RuntimeException("Unhandled form field: " + field);
}
if ("".equals(field.getValue())) field.setValue("");
return field;
}
private static final Predicate<String> isCommaDelimitedCurrencyList = (s) -> s != null && s.contains(",");
public static final Function<String, List<String>> commaDelimitedCodesToList = (s) -> {
if (isCommaDelimitedCurrencyList.test(s))
return stream(s.split(",")).map(a -> a.trim().toUpperCase()).collect(toList());
else if (s != null && !s.isEmpty())
return singletonList(s.trim().toUpperCase());
else
return new ArrayList<>();
};
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -77,12 +78,16 @@ public final class PayseraAccount extends PaymentAccount {
return new PayseraAccountPayload(paymentMethod.getId(), id);
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setEmail(String accountId) {
((PayseraAccountPayload) paymentAccountPayload).setEmail(accountId);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -48,6 +49,11 @@ public final class PerfectMoneyAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setAccountNr(String accountNr) {
((PerfectMoneyAccountPayload) paymentAccountPayload).setAccountNr(accountNr);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -50,14 +51,17 @@ public final class PixAccount extends CountryBasedPaymentAccount {
return ((PixAccountPayload) paymentAccountPayload).getPixKey();
}
@Override
public String getMessageForBuyer() {
return "payment.pix.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.pix.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.pix.info.account";
}
@ -66,4 +70,9 @@ public final class PixAccount extends CountryBasedPaymentAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -49,6 +50,11 @@ public final class PopmoneyAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setAccountId(String accountId) {
((PopmoneyAccountPayload) paymentAccountPayload).setAccountId(accountId);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -48,6 +49,11 @@ public final class PromptPayAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setPromptPayId(String promptPayId) {
((PromptPayAccountPayload) paymentAccountPayload).setPromptPayId(promptPayId);
}

View file

@ -17,20 +17,27 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.payment.payload.PaymentMethod;
import bisq.core.payment.payload.RevolutAccountPayload;
import java.util.List;
import java.util.stream.Collectors;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
@EqualsAndHashCode(callSuper = true)
public final class RevolutAccount extends PaymentAccount {
private static final List<PaymentAccountFormField.FieldId> INPUT_FIELD_IDS = List.of(
PaymentAccountFormField.FieldId.USER_NAME,
PaymentAccountFormField.FieldId.TRADE_CURRENCIES,
PaymentAccountFormField.FieldId.ACCOUNT_NAME,
PaymentAccountFormField.FieldId.SALT
);
// https://www.revolut.com/help/getting-started/exchanging-currencies/what-fiat-currencies-are-supported-for-holding-and-exchange
public static final List<TradeCurrency> SUPPORTED_CURRENCIES = List.of(
new FiatCurrency("AED"),
@ -108,8 +115,20 @@ public final class RevolutAccount extends PaymentAccount {
revolutAccountPayload().maybeApplyUserNameToAccountId();
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
return INPUT_FIELD_IDS;
}
@Override
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
protected PaymentAccountFormField getEmptyFormField(PaymentAccountFormField.FieldId fieldId) {
var field = super.getEmptyFormField(fieldId);
if (field.getId() == PaymentAccountFormField.FieldId.TRADE_CURRENCIES) field.setValue(String.join(",", getSupportedCurrencies().stream().map(TradeCurrency::getCode).collect(Collectors.toList())));
return field;
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.BankAccountPayload;
@ -48,6 +49,11 @@ public final class SameBankAccount extends CountryBasedPaymentAccount implements
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
@Override
public String getBankId() {
return ((BankAccountPayload) paymentAccountPayload).getBankId();

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -58,14 +59,17 @@ public final class SatispayAccount extends CountryBasedPaymentAccount {
return ((SatispayAccountPayload) paymentAccountPayload).getMobileNr();
}
@Override
public String getMessageForBuyer() {
return "payment.satispay.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.satispay.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.satispay.info.account";
}
@ -74,4 +78,9 @@ public final class SatispayAccount extends CountryBasedPaymentAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,15 +17,18 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountForm;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.Country;
import bisq.core.locale.CountryUtil;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.payment.payload.PaymentMethod;
import bisq.core.payment.payload.SepaAccountPayload;
import bisq.core.payment.validation.SepaIBANValidator;
import java.util.List;
import javax.annotation.Nullable;
import lombok.EqualsAndHashCode;
import org.jetbrains.annotations.NotNull;
@ -33,6 +36,16 @@ import org.jetbrains.annotations.NotNull;
@EqualsAndHashCode(callSuper = true)
public final class SepaAccount extends CountryBasedPaymentAccount implements BankAccount {
private static final List<PaymentAccountFormField.FieldId> INPUT_FIELD_IDS = List.of(
PaymentAccountFormField.FieldId.ACCOUNT_NAME,
PaymentAccountFormField.FieldId.HOLDER_NAME,
PaymentAccountFormField.FieldId.IBAN,
PaymentAccountFormField.FieldId.BIC,
PaymentAccountFormField.FieldId.COUNTRY,
PaymentAccountFormField.FieldId.ACCEPTED_COUNTRY_CODES,
PaymentAccountFormField.FieldId.SALT
);
public static final List<TradeCurrency> SUPPORTED_CURRENCIES = List.of(new FiatCurrency("EUR"));
public SepaAccount() {
@ -78,6 +91,10 @@ public final class SepaAccount extends CountryBasedPaymentAccount implements Ban
public List<String> getAcceptedCountryCodes() {
return ((SepaAccountPayload) paymentAccountPayload).getAcceptedCountryCodes();
}
public void setAcceptedCountryCodes(List<String> acceptedCountryCodes) {
((SepaAccountPayload) paymentAccountPayload).setAcceptedCountryCodes(acceptedCountryCodes);
}
public void addAcceptedCountry(String countryCode) {
((SepaAccountPayload) paymentAccountPayload).addAcceptedCountry(countryCode);
@ -99,9 +116,44 @@ public final class SepaAccount extends CountryBasedPaymentAccount implements Ban
((SepaAccountPayload) paymentAccountPayload).revertChanges();
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
return INPUT_FIELD_IDS;
}
@Override
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
@Nullable
public List<Country> getSupportedCountries() {
return CountryUtil.getAllSepaCountries();
}
@Override
public void validateFormField(PaymentAccountForm form, PaymentAccountFormField.FieldId fieldId, String value) {
switch (fieldId) {
case IBAN:
processValidationResult(new SepaIBANValidator().validate(value));
break;
default:
super.validateFormField(form, fieldId, value);
}
}
@Override
protected PaymentAccountFormField getEmptyFormField(PaymentAccountFormField.FieldId fieldId) {
var field = super.getEmptyFormField(fieldId);
switch (fieldId) {
case ACCEPTED_COUNTRY_CODES:
field.setSupportedSepaEuroCountries(CountryUtil.getAllSepaEuroCountries());
field.setSupportedSepaNonEuroCountries(CountryUtil.getAllSepaNonEuroCountries());
break;
default:
// no action
}
return field;
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CountryUtil;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
@ -99,9 +100,13 @@ public final class SepaInstantAccount extends CountryBasedPaymentAccount impleme
((SepaInstantAccountPayload) paymentAccountPayload).revertChanges();
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -48,6 +49,11 @@ public final class SpecificBanksAccount extends CountryBasedPaymentAccount imple
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
// TODO change to List
public ArrayList<String> getAcceptedBanks() {
return ((SpecificBanksAccountPayload) paymentAccountPayload).getAcceptedBanks();

View file

@ -17,14 +17,16 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.Country;
import bisq.core.locale.CountryUtil;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.payment.payload.PaymentMethod;
import bisq.core.payment.payload.StrikeAccountPayload;
import java.util.List;
import javax.annotation.Nullable;
import lombok.EqualsAndHashCode;
import org.jetbrains.annotations.NotNull;
@ -33,6 +35,14 @@ import org.jetbrains.annotations.NotNull;
public final class StrikeAccount extends CountryBasedPaymentAccount {
public static final List<TradeCurrency> SUPPORTED_CURRENCIES = List.of(new FiatCurrency("USD"));
public static final List<Country> SUPPORTED_COUNTRIES = CountryUtil.getCountries(List.of("US"));
private static final List<PaymentAccountFormField.FieldId> INPUT_FIELD_IDS = List.of(
PaymentAccountFormField.FieldId.ACCOUNT_NAME,
PaymentAccountFormField.FieldId.COUNTRY,
PaymentAccountFormField.FieldId.HOLDER_NAME,
PaymentAccountFormField.FieldId.SALT
);
public StrikeAccount() {
super(PaymentMethod.STRIKE);
@ -53,21 +63,35 @@ public final class StrikeAccount extends CountryBasedPaymentAccount {
return ((StrikeAccountPayload) paymentAccountPayload).getHolderName();
}
@Override
public String getMessageForBuyer() {
return "payment.strike.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.strike.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.strike.info.account";
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
@Nullable
public @NotNull List<Country> getSupportedCountries() {
System.out.println("STIKE RETURNING SUPPORTED COUNTRIES: " + SUPPORTED_COUNTRIES);
return SUPPORTED_COUNTRIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
return INPUT_FIELD_IDS;
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
import bisq.core.payment.payload.PaymentMethod;
@ -36,6 +37,27 @@ public final class SwiftAccount extends PaymentAccount {
public static final List<TradeCurrency> SUPPORTED_CURRENCIES = new ArrayList<>(getAllSortedFiatCurrencies(comparing(TradeCurrency::getCode)));
private static final List<PaymentAccountFormField.FieldId> INPUT_FIELD_IDS = List.of(
PaymentAccountFormField.FieldId.ACCOUNT_NAME,
PaymentAccountFormField.FieldId.BANK_SWIFT_CODE,
PaymentAccountFormField.FieldId.BANK_COUNTRY_CODE,
PaymentAccountFormField.FieldId.BANK_NAME,
PaymentAccountFormField.FieldId.BANK_BRANCH,
PaymentAccountFormField.FieldId.BANK_ADDRESS,
PaymentAccountFormField.FieldId.INTERMEDIARY_SWIFT_CODE,
PaymentAccountFormField.FieldId.INTERMEDIARY_COUNTRY_CODE,
PaymentAccountFormField.FieldId.INTERMEDIARY_NAME,
PaymentAccountFormField.FieldId.INTERMEDIARY_BRANCH,
PaymentAccountFormField.FieldId.INTERMEDIARY_ADDRESS,
PaymentAccountFormField.FieldId.BENEFICIARY_NAME,
PaymentAccountFormField.FieldId.BENEFICIARY_ACCOUNT_NR,
PaymentAccountFormField.FieldId.BENEFICIARY_ADDRESS,
PaymentAccountFormField.FieldId.BENEFICIARY_CITY,
PaymentAccountFormField.FieldId.BENEFICIARY_PHONE,
PaymentAccountFormField.FieldId.SPECIAL_INSTRUCTIONS,
PaymentAccountFormField.FieldId.SALT
);
public SwiftAccount() {
super(PaymentMethod.SWIFT);
tradeCurrencies.addAll(SUPPORTED_CURRENCIES);
@ -50,14 +72,17 @@ public final class SwiftAccount extends PaymentAccount {
return ((SwiftAccountPayload) this.paymentAccountPayload);
}
@Override
public String getMessageForBuyer() {
return "payment.swift.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.swift.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.swift.info.account";
}
@ -66,4 +91,9 @@ public final class SwiftAccount extends PaymentAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
return INPUT_FIELD_IDS;
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -48,6 +49,11 @@ public final class SwishAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setMobileNr(String mobileNr) {
((SwishAccountPayload) paymentAccountPayload).setMobileNr(mobileNr);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -53,21 +54,28 @@ public final class TikkieAccount extends CountryBasedPaymentAccount {
return ((TikkieAccountPayload) paymentAccountPayload).getIban();
}
@Override
public String getMessageForBuyer() {
return "payment.tikkie.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.tikkie.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.tikkie.info.account";
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -24,14 +25,20 @@ import bisq.core.payment.payload.PaymentMethod;
import bisq.core.payment.payload.TransferwiseAccountPayload;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
import org.jetbrains.annotations.NotNull;
import lombok.NonNull;
@EqualsAndHashCode(callSuper = true)
public final class TransferwiseAccount extends PaymentAccount {
private static final List<PaymentAccountFormField.FieldId> INPUT_FIELD_IDS = List.of(
PaymentAccountFormField.FieldId.EMAIL,
PaymentAccountFormField.FieldId.TRADE_CURRENCIES,
PaymentAccountFormField.FieldId.ACCOUNT_NAME,
PaymentAccountFormField.FieldId.SALT
);
// https://github.com/bisq-network/proposals/issues/243
public static final List<TradeCurrency> SUPPORTED_CURRENCIES = List.of(
new FiatCurrency("AED"),
@ -87,9 +94,13 @@ public final class TransferwiseAccount extends PaymentAccount {
return new TransferwiseAccountPayload(paymentMethod.getId(), id);
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
return INPUT_FIELD_IDS;
}
@Override
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@ -100,4 +111,11 @@ public final class TransferwiseAccount extends PaymentAccount {
public String getEmail() {
return ((TransferwiseAccountPayload) paymentAccountPayload).getEmail();
}
@Override
protected PaymentAccountFormField getEmptyFormField(PaymentAccountFormField.FieldId fieldId) {
var field = super.getEmptyFormField(fieldId);
if (field.getId() == PaymentAccountFormField.FieldId.TRADE_CURRENCIES) field.setLabel("Currencies for receiving funds");
return field;
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -69,21 +70,28 @@ public final class TransferwiseUsdAccount extends CountryBasedPaymentAccount {
return ((TransferwiseUsdAccountPayload) paymentAccountPayload).getBeneficiaryAddress();
}
@Override
public String getMessageForBuyer() {
return "payment.transferwiseUsd.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.transferwiseUsd.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.transferwiseUsd.info.account";
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -48,6 +49,11 @@ public final class USPostalMoneyOrderAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setPostalAddress(String postalAddress) {
((USPostalMoneyOrderAccountPayload) paymentAccountPayload).setPostalAddress(postalAddress);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -70,12 +71,16 @@ public final class UpholdAccount extends PaymentAccount {
return new UpholdAccountPayload(paymentMethod.getId(), id);
}
@NotNull
@Override
public List<TradeCurrency> getSupportedCurrencies() {
public @NotNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NotNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setAccountId(String accountId) {
((UpholdAccountPayload) paymentAccountPayload).setAccountId(accountId);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -51,6 +52,11 @@ public final class VenmoAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setVenmoUserName(String venmoUserName) {
((VenmoAccountPayload) paymentAccountPayload).setVenmoUserName(venmoUserName);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -57,14 +58,17 @@ public final class VerseAccount extends PaymentAccount {
return ((VerseAccountPayload) paymentAccountPayload).getHolderName();
}
@Override
public String getMessageForBuyer() {
return "payment.verse.info.buyer";
}
@Override
public String getMessageForSeller() {
return "payment.verse.info.seller";
}
@Override
public String getMessageForAccountCreation() {
return "payment.verse.info.account";
}
@ -73,4 +77,9 @@ public final class VerseAccount extends PaymentAccount {
public @NonNull List<TradeCurrency> getSupportedCurrencies() {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.FiatCurrency;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -48,6 +49,11 @@ public final class WeChatPayAccount extends PaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public void setAccountNr(String accountNr) {
((WeChatPayAccountPayload) paymentAccountPayload).setAccountNr(accountNr);
}

View file

@ -17,6 +17,7 @@
package bisq.core.payment;
import bisq.core.api.model.PaymentAccountFormField;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.TradeCurrency;
import bisq.core.payment.payload.PaymentAccountPayload;
@ -45,6 +46,11 @@ public final class WesternUnionAccount extends CountryBasedPaymentAccount {
return SUPPORTED_CURRENCIES;
}
@Override
public @NonNull List<PaymentAccountFormField.FieldId> getInputFieldIds() {
throw new RuntimeException("Not implemented");
}
public String getEmail() {
return ((WesternUnionAccountPayload) paymentAccountPayload).getEmail();
}

View file

@ -20,8 +20,9 @@ package bisq.core.payment.payload;
import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -50,6 +51,7 @@ public final class AchTransferAccountPayload extends BankAccountPayload {
private AchTransferAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String bankName,
String branchId,
@ -61,6 +63,7 @@ public final class AchTransferAccountPayload extends BankAccountPayload {
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
holderName,
bankName,
branchId,
@ -98,6 +101,7 @@ public final class AchTransferAccountPayload extends BankAccountPayload {
return new AchTransferAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
bankAccountPayloadPB.getHolderName(),
bankAccountPayloadPB.getBankName().isEmpty() ? null : bankAccountPayloadPB.getBankName(),
bankAccountPayloadPB.getBranchId().isEmpty() ? null : bankAccountPayloadPB.getBranchId(),

View file

@ -22,7 +22,7 @@ import bisq.core.locale.CountryUtil;
import bisq.core.locale.Res;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@ -63,6 +63,7 @@ public abstract class BankAccountPayload extends CountryBasedPaymentAccountPaylo
protected BankAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
@Nullable String bankName,
@Nullable String branchId,
@ -76,6 +77,7 @@ public abstract class BankAccountPayload extends CountryBasedPaymentAccountPaylo
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -47,12 +48,14 @@ public final class BizumAccountPayload extends CountryBasedPaymentAccountPayload
private BizumAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String mobileNr,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -77,6 +80,7 @@ public final class BizumAccountPayload extends CountryBasedPaymentAccountPayload
return new BizumAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
paytmAccountPayloadPB.getMobileNr(),
proto.getMaxTradePeriod(),
new HashMap<>(proto.getExcludeFromJsonDataMap()));

View file

@ -22,8 +22,9 @@ import bisq.core.locale.CountryUtil;
import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@ -58,6 +59,7 @@ public class CashDepositAccountPayload extends BankAccountPayload {
private CashDepositAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
@Nullable String holderEmail,
@Nullable String bankName,
@ -73,6 +75,7 @@ public class CashDepositAccountPayload extends BankAccountPayload {
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
holderName,
bankName,
branchId,
@ -117,6 +120,7 @@ public class CashDepositAccountPayload extends BankAccountPayload {
return new CashDepositAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
cashDepositAccountPayload.getHolderName(),
cashDepositAccountPayload.getHolderEmail().isEmpty() ? null : cashDepositAccountPayload.getHolderEmail(),
cashDepositAccountPayload.getBankName().isEmpty() ? null : cashDepositAccountPayload.getBankName(),

View file

@ -20,7 +20,8 @@ package bisq.core.payment.payload;
import org.apache.commons.lang3.ArrayUtils;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -36,6 +37,7 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public abstract class CountryBasedPaymentAccountPayload extends PaymentAccountPayload {
protected String countryCode = "";
protected List<String> acceptedCountryCodes = new ArrayList<String>();
CountryBasedPaymentAccountPayload(String paymentMethodName, String id) {
super(paymentMethodName, id);
@ -44,6 +46,7 @@ public abstract class CountryBasedPaymentAccountPayload extends PaymentAccountPa
protected CountryBasedPaymentAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethodName,
@ -52,18 +55,22 @@ public abstract class CountryBasedPaymentAccountPayload extends PaymentAccountPa
excludeFromJsonDataMap);
this.countryCode = countryCode;
this.acceptedCountryCodes = acceptedCountryCodes;
}
@Override
protected protobuf.PaymentAccountPayload.Builder getPaymentAccountPayloadBuilder() {
protobuf.CountryBasedPaymentAccountPayload.Builder builder = protobuf.CountryBasedPaymentAccountPayload.newBuilder()
.setCountryCode(countryCode);
.setCountryCode(countryCode)
.addAllAcceptedCountryCodes(acceptedCountryCodes);
return super.getPaymentAccountPayloadBuilder()
.setCountryBasedPaymentAccountPayload(builder);
}
@Override
public abstract String getPaymentDetails();
@Override
public abstract String getPaymentDetailsForTradePopup();
@Override

View file

@ -18,11 +18,13 @@
package bisq.core.payment.payload;
import bisq.core.locale.BankUtil;
import bisq.core.locale.Country;
import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -51,6 +53,7 @@ public final class DomesticWireTransferAccountPayload extends BankAccountPayload
private DomesticWireTransferAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String bankName,
String branchId,
@ -61,6 +64,7 @@ public final class DomesticWireTransferAccountPayload extends BankAccountPayload
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
holderName,
bankName,
branchId,
@ -98,6 +102,7 @@ public final class DomesticWireTransferAccountPayload extends BankAccountPayload
return new DomesticWireTransferAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
bankAccountPayloadPB.getHolderName(),
bankAccountPayloadPB.getBankName().isEmpty() ? null : bankAccountPayloadPB.getBankName(),
bankAccountPayloadPB.getBranchId().isEmpty() ? null : bankAccountPayloadPB.getBranchId(),

View file

@ -24,8 +24,9 @@ import com.google.protobuf.Message;
import org.apache.commons.lang3.ArrayUtils;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -56,6 +57,7 @@ public final class F2FAccountPayload extends CountryBasedPaymentAccountPayload {
private F2FAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String contact,
String city,
String extraInfo,
@ -64,6 +66,7 @@ public final class F2FAccountPayload extends CountryBasedPaymentAccountPayload {
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
this.contact = contact;
@ -91,6 +94,7 @@ public final class F2FAccountPayload extends CountryBasedPaymentAccountPayload {
return new F2FAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
f2fAccountPayloadPB.getContact(),
f2fAccountPayloadPB.getCity(),
f2fAccountPayloadPB.getExtraInfo(),

View file

@ -6,7 +6,7 @@ import bisq.core.locale.CountryUtil;
import bisq.core.locale.Res;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@ -37,6 +37,7 @@ public abstract class IfscBasedAccountPayload extends CountryBasedPaymentAccount
protected IfscBasedAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String accountNr,
String ifsc,
@ -45,6 +46,7 @@ public abstract class IfscBasedAccountPayload extends CountryBasedPaymentAccount
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -46,6 +47,7 @@ public final class ImpsAccountPayload extends IfscBasedAccountPayload {
private ImpsAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String accountNr,
String ifsc,
@ -54,6 +56,7 @@ public final class ImpsAccountPayload extends IfscBasedAccountPayload {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
holderName,
accountNr,
ifsc,
@ -83,6 +86,7 @@ public final class ImpsAccountPayload extends IfscBasedAccountPayload {
return new ImpsAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
ifscBasedAccountPayloadPB.getHolderName(),
ifscBasedAccountPayloadPB.getAccountNr(),
ifscBasedAccountPayloadPB.getIfsc(),

View file

@ -20,8 +20,9 @@ package bisq.core.payment.payload;
import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -45,6 +46,7 @@ public final class NationalBankAccountPayload extends BankAccountPayload {
private NationalBankAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String bankName,
String branchId,
@ -58,6 +60,7 @@ public final class NationalBankAccountPayload extends BankAccountPayload {
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
holderName,
bankName,
branchId,
@ -92,6 +95,7 @@ public final class NationalBankAccountPayload extends BankAccountPayload {
return new NationalBankAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
bankAccountPayloadPB.getHolderName(),
bankAccountPayloadPB.getBankName().isEmpty() ? null : bankAccountPayloadPB.getBankName(),
bankAccountPayloadPB.getBranchId().isEmpty() ? null : bankAccountPayloadPB.getBranchId(),

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -46,6 +47,7 @@ public final class NeftAccountPayload extends IfscBasedAccountPayload {
private NeftAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String accountNr,
String ifsc,
@ -54,6 +56,7 @@ public final class NeftAccountPayload extends IfscBasedAccountPayload {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
holderName,
accountNr,
ifsc,
@ -83,6 +86,7 @@ public final class NeftAccountPayload extends IfscBasedAccountPayload {
return new NeftAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
ifscBasedAccountPayloadPB.getHolderName(),
ifscBasedAccountPayloadPB.getAccountNr(),
ifscBasedAccountPayloadPB.getIfsc(),

View file

@ -17,13 +17,15 @@
package bisq.core.payment.payload;
import bisq.core.locale.Country;
import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -47,12 +49,14 @@ public final class NequiAccountPayload extends CountryBasedPaymentAccountPayload
private NequiAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String mobileNr,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -77,6 +81,7 @@ public final class NequiAccountPayload extends CountryBasedPaymentAccountPayload
return new NequiAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
paytmAccountPayloadPB.getMobileNr(),
proto.getMaxTradePeriod(),
new HashMap<>(proto.getExcludeFromJsonDataMap()));

View file

@ -245,7 +245,7 @@ public final class PaymentMethod implements PersistablePayload, Comparable<Payme
// The limit and duration assignment must not be changed as that could break old offers (if amount would be higher
// than new trade limit) and violate the maker expectation when he created the offer (duration).
@Getter
private final static List<PaymentMethod> paymentMethods = new ArrayList<>(Arrays.asList(
public final static List<PaymentMethod> paymentMethods = new ArrayList<>(Arrays.asList(
// EUR
HAL_CASH = new PaymentMethod(HAL_CASH_ID, DAY, DEFAULT_TRADE_LIMIT_LOW_RISK, getAssetCodes(HalCashAccount.SUPPORTED_CURRENCIES)),
SEPA = new PaymentMethod(SEPA_ID, 6 * DAY, DEFAULT_TRADE_LIMIT_HIGH_RISK, getAssetCodes(SepaAccount.SUPPORTED_CURRENCIES)),
@ -325,6 +325,19 @@ public final class PaymentMethod implements PersistablePayload, Comparable<Payme
BLOCK_CHAINS_INSTANT = new PaymentMethod(BLOCK_CHAINS_INSTANT_ID, TimeUnit.HOURS.toMillis(1), DEFAULT_TRADE_LIMIT_VERY_LOW_RISK, Arrays.asList())
));
// TODO: delete this override method, which overrides the paymentMethods variable, when all payment methods supported using structured form api, and make paymentMethods private
public static final List<PaymentMethod> getPaymentMethods() {
List<String> paymentMethodIds = List.of(
REVOLUT_ID,
SEPA_ID,
TRANSFERWISE_ID,
CLEAR_X_CHANGE_ID,
SWIFT_ID,
F2F_ID,
STRIKE_ID);
return paymentMethods.stream().filter(paymentMethod -> paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList());
}
private static List<String> getAssetCodes(List<TradeCurrency> tradeCurrencies) {
return tradeCurrencies.stream().map(TradeCurrency::getCode).collect(Collectors.toList());
}

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -47,12 +48,14 @@ public final class PaytmAccountPayload extends CountryBasedPaymentAccountPayload
private PaytmAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String emailOrMobileNr,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -77,6 +80,7 @@ public final class PaytmAccountPayload extends CountryBasedPaymentAccountPayload
return new PaytmAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
paytmAccountPayloadPB.getEmailOrMobileNr(),
proto.getMaxTradePeriod(),
new HashMap<>(proto.getExcludeFromJsonDataMap()));

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -47,12 +48,14 @@ public final class PixAccountPayload extends CountryBasedPaymentAccountPayload {
private PixAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String pixKey,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -77,6 +80,7 @@ public final class PixAccountPayload extends CountryBasedPaymentAccountPayload {
return new PixAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
paytmAccountPayloadPB.getPixKey(),
proto.getMaxTradePeriod(),
new HashMap<>(proto.getExcludeFromJsonDataMap()));

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -46,6 +47,7 @@ public final class RtgsAccountPayload extends IfscBasedAccountPayload {
private RtgsAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String accountNr,
String ifsc,
@ -54,6 +56,7 @@ public final class RtgsAccountPayload extends IfscBasedAccountPayload {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
holderName,
accountNr,
ifsc,
@ -83,6 +86,7 @@ public final class RtgsAccountPayload extends IfscBasedAccountPayload {
return new RtgsAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
ifscBasedAccountPayloadPB.getHolderName(),
ifscBasedAccountPayloadPB.getAccountNr(),
ifscBasedAccountPayloadPB.getIfsc(),

View file

@ -20,8 +20,9 @@ package bisq.core.payment.payload;
import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -45,6 +46,7 @@ public final class SameBankAccountPayload extends BankAccountPayload {
private SameBankAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String bankName,
String branchId,
@ -58,6 +60,7 @@ public final class SameBankAccountPayload extends BankAccountPayload {
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
holderName,
bankName,
branchId,
@ -92,6 +95,7 @@ public final class SameBankAccountPayload extends BankAccountPayload {
return new SameBankAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
bankAccountPayload.getHolderName(),
bankAccountPayload.getBankName().isEmpty() ? null : bankAccountPayload.getBankName(),
bankAccountPayload.getBranchId().isEmpty() ? null : bankAccountPayload.getBranchId(),

View file

@ -17,13 +17,15 @@
package bisq.core.payment.payload;
import bisq.core.locale.Country;
import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -48,6 +50,7 @@ public final class SatispayAccountPayload extends CountryBasedPaymentAccountPayl
private SatispayAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String mobileNr,
long maxTradePeriod,
@ -55,6 +58,7 @@ public final class SatispayAccountPayload extends CountryBasedPaymentAccountPayl
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -81,6 +85,7 @@ public final class SatispayAccountPayload extends CountryBasedPaymentAccountPayl
return new SatispayAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
accountPayloadPB.getHolderName(),
accountPayloadPB.getMobileNr(),
proto.getMaxTradePeriod(),

View file

@ -53,7 +53,6 @@ public final class SepaAccountPayload extends CountryBasedPaymentAccountPayload
private String email = ""; // not used anymore but need to keep it for backward compatibility, must not be null but empty string, otherwise hash check fails for contract
// Don't use a set here as we need a deterministic ordering, otherwise the contract hash does not match
private final List<String> acceptedCountryCodes;
private final List<String> persistedAcceptedCountryCodes = new ArrayList<>();
public SepaAccountPayload(String paymentMethod, String id, List<Country> acceptedCountries) {
@ -73,16 +72,17 @@ public final class SepaAccountPayload extends CountryBasedPaymentAccountPayload
private SepaAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String iban,
String bic,
String email,
List<String> acceptedCountryCodes,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -101,8 +101,7 @@ public final class SepaAccountPayload extends CountryBasedPaymentAccountPayload
.setHolderName(holderName)
.setIban(iban)
.setBic(bic)
.setEmail(email)
.addAllAcceptedCountryCodes(acceptedCountryCodes);
.setEmail(email);
final protobuf.CountryBasedPaymentAccountPayload.Builder countryBasedPaymentAccountPayload = getPaymentAccountPayloadBuilder()
.getCountryBasedPaymentAccountPayloadBuilder()
.setSepaAccountPayload(builder);
@ -117,11 +116,11 @@ public final class SepaAccountPayload extends CountryBasedPaymentAccountPayload
return new SepaAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
sepaAccountPayloadPB.getHolderName(),
sepaAccountPayloadPB.getIban(),
sepaAccountPayloadPB.getBic(),
sepaAccountPayloadPB.getEmail(),
new ArrayList<>(sepaAccountPayloadPB.getAcceptedCountryCodesList()),
proto.getMaxTradePeriod(),
new HashMap<>(proto.getExcludeFromJsonDataMap()));
}
@ -131,6 +130,12 @@ public final class SepaAccountPayload extends CountryBasedPaymentAccountPayload
// API
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public void setAcceptedCountryCodes(List<String> acceptedCountryCodes) {
this.acceptedCountryCodes.clear();
for (String countryCode : acceptedCountryCodes) this.acceptedCountryCodes.add(countryCode);
}
public void addAcceptedCountry(String countryCode) {
if (!acceptedCountryCodes.contains(countryCode))
acceptedCountryCodes.add(countryCode);

View file

@ -52,7 +52,6 @@ public final class SepaInstantAccountPayload extends CountryBasedPaymentAccountP
private String bic = "";
// Don't use a set here as we need a deterministic ordering, otherwise the contract hash does not match
private final List<String> acceptedCountryCodes;
private final List<String> persistedAcceptedCountryCodes = new ArrayList<>();
public SepaInstantAccountPayload(String paymentMethod, String id, List<Country> acceptedCountries) {
@ -72,22 +71,22 @@ public final class SepaInstantAccountPayload extends CountryBasedPaymentAccountP
private SepaInstantAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String iban,
String bic,
List<String> acceptedCountryCodes,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
this.holderName = holderName;
this.iban = iban;
this.bic = bic;
this.acceptedCountryCodes = acceptedCountryCodes;
persistedAcceptedCountryCodes.addAll(acceptedCountryCodes);
}
@ -97,8 +96,7 @@ public final class SepaInstantAccountPayload extends CountryBasedPaymentAccountP
protobuf.SepaInstantAccountPayload.newBuilder()
.setHolderName(holderName)
.setIban(iban)
.setBic(bic)
.addAllAcceptedCountryCodes(acceptedCountryCodes);
.setBic(bic);
final protobuf.CountryBasedPaymentAccountPayload.Builder countryBasedPaymentAccountPayload = getPaymentAccountPayloadBuilder()
.getCountryBasedPaymentAccountPayloadBuilder()
.setSepaInstantAccountPayload(builder);
@ -113,10 +111,10 @@ public final class SepaInstantAccountPayload extends CountryBasedPaymentAccountP
return new SepaInstantAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
sepaInstantAccountPayloadPB.getHolderName(),
sepaInstantAccountPayloadPB.getIban(),
sepaInstantAccountPayloadPB.getBic(),
new ArrayList<>(sepaInstantAccountPayloadPB.getAcceptedCountryCodesList()),
proto.getMaxTradePeriod(),
new HashMap<>(proto.getExcludeFromJsonDataMap()));
}

View file

@ -25,6 +25,7 @@ import com.google.common.base.Joiner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -52,6 +53,7 @@ public final class SpecificBanksAccountPayload extends BankAccountPayload {
private SpecificBanksAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String bankName,
String branchId,
@ -66,6 +68,7 @@ public final class SpecificBanksAccountPayload extends BankAccountPayload {
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
holderName,
bankName,
branchId,
@ -106,6 +109,7 @@ public final class SpecificBanksAccountPayload extends BankAccountPayload {
return new SpecificBanksAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
bankAccountPayload.getHolderName(),
bankAccountPayload.getBankName().isEmpty() ? null : bankAccountPayload.getBankName(),
bankAccountPayload.getBranchId().isEmpty() ? null : bankAccountPayload.getBranchId(),

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -47,12 +48,14 @@ public final class StrikeAccountPayload extends CountryBasedPaymentAccountPayloa
private StrikeAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -77,6 +80,7 @@ public final class StrikeAccountPayload extends CountryBasedPaymentAccountPayloa
return new StrikeAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
accountPayloadPB.getHolderName(),
proto.getMaxTradePeriod(),
new HashMap<>(proto.getExcludeFromJsonDataMap()));

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -47,12 +48,14 @@ public final class TikkieAccountPayload extends CountryBasedPaymentAccountPayloa
private TikkieAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String iban,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -77,6 +80,7 @@ public final class TikkieAccountPayload extends CountryBasedPaymentAccountPayloa
return new TikkieAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
accountPayloadPB.getIban(),
proto.getMaxTradePeriod(),
new HashMap<>(proto.getExcludeFromJsonDataMap()));

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -49,6 +50,7 @@ public final class TransferwiseUsdAccountPayload extends CountryBasedPaymentAcco
private TransferwiseUsdAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String email,
String holderName,
String beneficiaryAddress,
@ -57,6 +59,7 @@ public final class TransferwiseUsdAccountPayload extends CountryBasedPaymentAcco
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -85,6 +88,7 @@ public final class TransferwiseUsdAccountPayload extends CountryBasedPaymentAcco
return new TransferwiseUsdAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
accountPayloadPB.getEmail(),
accountPayloadPB.getHolderName(),
accountPayloadPB.getBeneficiaryAddress(),

View file

@ -22,8 +22,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -47,12 +48,14 @@ public final class UpiAccountPayload extends CountryBasedPaymentAccountPayload {
private UpiAccountPayload(String paymentMethod,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String virtualPaymentAddress,
long maxTradePeriod,
Map<String, String> excludeFromJsonDataMap) {
super(paymentMethod,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
@ -77,6 +80,7 @@ public final class UpiAccountPayload extends CountryBasedPaymentAccountPayload {
return new UpiAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
upiAccountPayloadPB.getVirtualPaymentAddress(),
proto.getMaxTradePeriod(),
new HashMap<>(proto.getExcludeFromJsonDataMap()));

View file

@ -24,8 +24,9 @@ import bisq.core.locale.Res;
import com.google.protobuf.Message;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.EqualsAndHashCode;
@ -57,6 +58,7 @@ public class WesternUnionAccountPayload extends CountryBasedPaymentAccountPayloa
private WesternUnionAccountPayload(String paymentMethodName,
String id,
String countryCode,
List<String> acceptedCountryCodes,
String holderName,
String city,
String state,
@ -66,6 +68,7 @@ public class WesternUnionAccountPayload extends CountryBasedPaymentAccountPayloa
super(paymentMethodName,
id,
countryCode,
acceptedCountryCodes,
maxTradePeriod,
excludeFromJsonDataMap);
this.holderName = holderName;
@ -97,6 +100,7 @@ public class WesternUnionAccountPayload extends CountryBasedPaymentAccountPayloa
return new WesternUnionAccountPayload(proto.getPaymentMethodId(),
proto.getId(),
countryBasedPaymentAccountPayload.getCountryCode(),
new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()),
westernUnionAccountPayload.getHolderName(),
westernUnionAccountPayload.getCity(),
westernUnionAccountPayload.getState(),

View file

@ -0,0 +1,136 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.locale.BankUtil;
import bisq.core.locale.Res;
import org.apache.commons.lang3.StringUtils;
public final class AccountNrValidator extends BankValidator {
public AccountNrValidator(String countryCode) {
super(countryCode);
}
@Override
public ValidationResult validate(String input) {
int length;
String input2;
switch (countryCode) {
case "GB":
length = 8;
if (isNumberWithFixedLength(input, length))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.accountNr", length));
case "US":
if (isNumberInRange(input, 4, 17))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.accountNr", "4 - 17"));
case "BR":
if (isStringInRange(input, 1, 20))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.accountNrChars", "1 - 20"));
case "NZ":
input2 = input != null ? input.replaceAll("-", "") : null;
if (isNumberInRange(input2, 15, 16))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.accountNrFormat", "03-1587-0050000-00"));
case "AU":
if (isNumberInRange(input, 4, 10))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.accountNr", "4 - 10"));
case "CA":
if (isNumberInRange(input, 7, 12))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.accountNr", "7 - 12"));
case "MX":
length = 18;
if (isNumberWithFixedLength(input, length))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
case "HK":
input2 = input != null ? input.replaceAll("-", "") : null;
if (isNumberInRange(input2, 9, 12))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.accountNrFormat", "005-231289-112"));
case "NO":
if (input != null) {
length = 11;
// Provided by sturles:
// https://github.com/bisq-network/exchange/pull/707
// https://no.wikipedia.org/wiki/MOD11#Implementasjoner_i_forskjellige_programmeringspr.C3.A5k
// https://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits6
// 11 digits, last digit is checksum. Checksum algoritm is
// MOD11 with weights 2,3,4,5,6,7,2,3,4,5 right to left.
// First remove whitespace and periods. Normal formatting is:
// 1234.56.78903
input2 = StringUtils.remove(input, " ");
input2 = StringUtils.remove(input2, ".");
// 11 digits, numbers only
if (input2.length() != length || !StringUtils.isNumeric(input2))
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
int lastDigit = Character.getNumericValue(input2.charAt(input2.length() - 1));
if (getMod11ControlDigit(input2) != lastDigit)
return new ValidationResult(false, "Kontonummer har feil sjekksum"); // not translated
else
return super.validate(input);
} else {
return super.validate(null);
}
default:
return super.validate(input);
}
}
private int getMod11ControlDigit(String accountNrString) {
int sumForMod = 0;
int controlNumber = 2;
char[] accountNr = accountNrString.toCharArray();
for (int i = accountNr.length - 2; i >= 0; i--) {
sumForMod += (Character.getNumericValue(accountNr[i]) * controlNumber);
controlNumber++;
if (controlNumber > 7) {
controlNumber = 2;
}
}
int calculus = (11 - sumForMod % 11);
if (calculus == 11) {
return 0;
} else {
return calculus;
}
}
private String getLabel() {
String label = BankUtil.getAccountNrLabel(countryCode);
return label.substring(0, label.length() - 1);
}
}

View file

@ -0,0 +1,37 @@
package bisq.core.payment.validation;
import bisq.core.locale.Res;
import bisq.core.util.validation.InputValidator;
import bisq.core.util.validation.RegexValidator;
import javax.inject.Inject;
public class AdvancedCashValidator extends InputValidator {
private EmailValidator emailValidator;
private RegexValidator regexValidator;
@Inject
public AdvancedCashValidator(EmailValidator emailValidator, RegexValidator regexValidator) {
this.emailValidator = emailValidator;
regexValidator.setPattern("[A-Za-z]{1}\\d{12}");
regexValidator.setErrorMessage(Res.get("validation.advancedCash.invalidFormat"));
this.regexValidator = regexValidator;
}
@Override
public ValidationResult validate(String input) {
ValidationResult result = super.validate(input);
if (!result.isValid)
return result;
result = emailValidator.validate(input);
if (!result.isValid)
result = regexValidator.validate(input);
return result;
}
}

View file

@ -0,0 +1,37 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.util.validation.InputValidator;
public final class AliPayValidator extends InputValidator {
///////////////////////////////////////////////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public ValidationResult validate(String input) {
// TODO
return super.validate(input);
}
///////////////////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////////////////
}

View file

@ -0,0 +1,51 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.util.validation.InputValidator;
import bisq.core.util.validation.RegexValidator;
import javax.inject.Inject;
public final class AustraliaPayidAccountNameValidator extends InputValidator {
@Override
public ValidationResult validate(String input) {
ValidationResult result = super.validate(input);
if (result.isValid)
result = lengthValidator.validate(input);
if (result.isValid)
result = regexValidator.validate(input);
return result;
}
private final LengthValidator lengthValidator;
private final RegexValidator regexValidator;
@Inject
public AustraliaPayidAccountNameValidator(LengthValidator lengthValidator, RegexValidator regexValidator) {
lengthValidator.setMinLength(1);
lengthValidator.setMaxLength(40);
this.lengthValidator = lengthValidator;
this.regexValidator = regexValidator;
}
}

View file

@ -0,0 +1,56 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.util.validation.InputValidator;
public final class AustraliaPayidValidator extends InputValidator {
private final EmailValidator emailValidator;
///////////////////////////////////////////////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////////////////////////////////////////////
public AustraliaPayidValidator() {
emailValidator = new EmailValidator();
}
@Override
public ValidationResult validate(String input) {
ValidationResult result = validateIfNotEmpty(input);
if (!result.isValid) {
return result;
} else {
ValidationResult emailResult = emailValidator.validate(input);
if (emailResult.isValid)
return emailResult;
else
return validatePhoneNumber(input);
}
}
///////////////////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////////////////
// TODO not impl yet -> see InteracETransferValidator
private ValidationResult validatePhoneNumber(String input) {
return super.validate(input);
}
}

View file

@ -0,0 +1,91 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.locale.Res;
import bisq.core.util.validation.InputValidator;
import java.util.Locale;
/*
* BIC information taken from German wikipedia (2017-01-30)
*
* length 8 or 11 characters
* General format: BBBB CC LL (bbb)
* with B - Bank code
* C - Country code
* L - Location code
* b - branch code (if applicable)
*
* B and C must be letters
* first L cannot be 0 or 1, second L cannot be O (upper case 'o')
* bbb cannot begin with X, unless it is XXX
*/
// TODO Special letters like ä, å, ... are not detected as invalid
public final class BICValidator extends InputValidator {
///////////////////////////////////////////////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////////////////////////////////////////////
@Override
public ValidationResult validate(String input) {
// TODO Add validation for primary and secondary IDs according to the selected type
// IBAN max 34 chars
// bic: 8 or 11 chars
// check ensure length 8 or 11
if (!isStringWithFixedLength(input, 8) && !isStringWithFixedLength(input, 11))
return new ValidationResult(false, Res.get("validation.bic.invalidLength"));
input = input.toUpperCase(Locale.ROOT);
// ensure Bank and Country code to be letters only
for (int k = 0; k < 6; k++) {
if (!Character.isLetter(input.charAt(k)))
return new ValidationResult(false, Res.get("validation.bic.letters"));
}
// ensure location code starts not with 0 or 1 and ends not with O
char ch = input.charAt(6);
if (ch == '0' || ch == '1' || input.charAt(7) == 'O')
return new ValidationResult(false, Res.get("validation.bic.invalidLocationCode"));
if (input.startsWith("REVO"))
return new ValidationResult(false, Res.get("validation.bic.sepaRevolutBic"));
// check complete for 8 char BIC
if (input.length() == 8)
return new ValidationResult(true);
// ensure branch code does not start with X unless it is XXX
if (input.charAt(8) == 'X')
if (input.charAt(9) != 'X' || input.charAt(10) != 'X')
return new ValidationResult(false, Res.get("validation.bic.invalidBranchCode"));
return new ValidationResult(true);
}
///////////////////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////////////////
}

View file

@ -0,0 +1,55 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.locale.BankUtil;
import bisq.core.locale.Res;
public final class BankIdValidator extends BankValidator {
public BankIdValidator(String countryCode) {
super(countryCode);
}
@Override
public ValidationResult validate(String input) {
int length;
switch (countryCode) {
case "CA":
length = 3;
if (isNumberWithFixedLength(input, length))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.bankIdNumber", getLabel(), length));
case "HK":
length = 3;
if (isNumberWithFixedLength(input, length))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.bankIdNumber", getLabel(), length));
default:
return super.validate(input);
}
}
private String getLabel() {
String label = BankUtil.getBankIdLabel(countryCode);
return label.substring(0, label.length() - 1);
}
}

View file

@ -0,0 +1,34 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.util.validation.InputValidator;
public abstract class BankValidator extends InputValidator {
protected String countryCode = "";
public BankValidator() {
super();
}
public BankValidator(String countryCode) {
this.countryCode = countryCode;
}
}

View file

@ -0,0 +1,78 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.locale.BankUtil;
import bisq.core.locale.Res;
public final class BranchIdValidator extends BankValidator {
public BranchIdValidator(String countryCode) {
super(countryCode);
}
@Override
public ValidationResult validate(String input) {
int length;
switch (countryCode) {
case "GB":
length = 6;
if (isNumberWithFixedLength(input, length))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
case "US":
length = 9;
if (isNumberWithFixedLength(input, length))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
case "BR":
if (isStringInRange(input, 2, 6))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.sortCodeChars", getLabel(), "2 - 6"));
case "AU":
length = 6;
if (isNumberWithFixedLength(input, length))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.sortCodeChars", getLabel(), length));
case "CA":
length = 5;
if (isNumberWithFixedLength(input, length))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
case "AR":
length = 4;
if(isNumberWithFixedLength(input, length))
return super.validate(input);
else
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
default:
return super.validate(input);
}
}
private String getLabel() {
return BankUtil.getBranchIdLabel(countryCode);
}
}

View file

@ -0,0 +1,144 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.btc.wallet.Restrictions;
import bisq.core.locale.Res;
import bisq.core.util.FormattingUtils;
import bisq.core.util.coin.CoinFormatter;
import bisq.core.util.validation.NumberValidator;
import org.bitcoinj.core.Coin;
import javax.inject.Inject;
import javax.inject.Named;
import java.math.BigDecimal;
import lombok.Getter;
import lombok.Setter;
import javax.annotation.Nullable;
public class BtcValidator extends NumberValidator {
protected final CoinFormatter formatter;
@Nullable
@Setter
protected Coin minValue;
@Nullable
@Setter
protected Coin maxValue;
@Nullable
@Setter
@Getter
protected Coin maxTradeLimit;
@Inject
public BtcValidator(@Named(FormattingUtils.BTC_FORMATTER_KEY) CoinFormatter formatter) {
this.formatter = formatter;
}
@Override
public ValidationResult validate(String input) {
ValidationResult result = validateIfNotEmpty(input);
if (result.isValid) {
input = cleanInput(input);
result = validateIfNumber(input);
}
if (result.isValid) {
result = result.andValidation(input,
this::validateIfNotZero,
this::validateIfNotNegative,
this::validateIfNotFractionalBtcValue,
this::validateIfNotExceedsMaxTradeLimit,
this::validateIfNotExceedsMaxBtcValue,
this::validateIfNotUnderMinValue,
this::validateIfAboveDust);
}
return result;
}
protected ValidationResult validateIfAboveDust(String input) {
try {
final Coin coin = Coin.parseCoin(input);
if (Restrictions.isAboveDust(coin))
return new ValidationResult(true);
else
return new ValidationResult(false, Res.get("validation.amountBelowDust",
formatter.formatCoinWithCode(Restrictions.getMinNonDustOutput())));
} catch (Throwable t) {
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
}
}
protected ValidationResult validateIfNotFractionalBtcValue(String input) {
try {
BigDecimal bd = new BigDecimal(input);
final BigDecimal satoshis = bd.movePointRight(8);
if (satoshis.scale() > 0)
return new ValidationResult(false, Res.get("validation.btc.fraction"));
else
return new ValidationResult(true);
} catch (Throwable t) {
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
}
}
protected ValidationResult validateIfNotExceedsMaxBtcValue(String input) {
try {
final Coin coin = Coin.parseCoin(input);
if (maxValue != null && coin.compareTo(maxValue) > 0)
return new ValidationResult(false, Res.get("validation.btc.toLarge", formatter.formatCoinWithCode(maxValue)));
else
return new ValidationResult(true);
} catch (Throwable t) {
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
}
}
protected ValidationResult validateIfNotExceedsMaxTradeLimit(String input) {
try {
final Coin coin = Coin.parseCoin(input);
if (maxTradeLimit != null && coin.compareTo(maxTradeLimit) > 0)
return new ValidationResult(false, Res.get("validation.btc.exceedsMaxTradeLimit", formatter.formatCoinWithCode(maxTradeLimit)));
else
return new ValidationResult(true);
} catch (Throwable t) {
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
}
}
protected ValidationResult validateIfNotUnderMinValue(String input) {
try {
final Coin coin = Coin.parseCoin(input);
if (minValue != null && coin.compareTo(minValue) < 0)
return new ValidationResult(false, Res.get("validation.btc.toSmall", formatter.formatCoinWithCode(minValue)));
else
return new ValidationResult(true);
} catch (Throwable t) {
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
}
}
}

View file

@ -0,0 +1,24 @@
package bisq.core.payment.validation;
import bisq.core.locale.Res;
import bisq.core.util.validation.InputValidator;
import bisq.core.util.validation.RegexValidator;
import javax.inject.Inject;
public class CapitualValidator extends InputValidator {
private final RegexValidator regexValidator;
@Inject
public CapitualValidator(RegexValidator regexValidator) {
regexValidator.setPattern("CAP-[A-Za-z0-9]{6}");
regexValidator.setErrorMessage(Res.get("validation.capitual.invalidFormat"));
this.regexValidator = regexValidator;
}
@Override
public ValidationResult validate(String input) {
return regexValidator.validate(input);
}
}

View file

@ -0,0 +1,40 @@
/*
* 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 bisq.core.payment.validation;
import bisq.core.util.validation.InputValidator;
public final class ChaseQuickPayValidator extends InputValidator {
private final EmailValidator emailValidator;
///////////////////////////////////////////////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////////////////////////////////////////////
public ChaseQuickPayValidator() {
super();
emailValidator = new EmailValidator();
}
@Override
public ValidationResult validate(String input) {
return emailValidator.validate(input);
}
}

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