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

@ -115,9 +115,6 @@ public class AbstractPaymentAccountTest extends MethodTest {
static final Map<String, Object> COMPLETED_FORM_MAP = new HashMap<>();
// A payment account serializer / deserializer.
static final PaymentAccountForm PAYMENT_ACCOUNT_FORM = new PaymentAccountForm();
@BeforeEach
public void setup() {
Res.setup();
@ -134,7 +131,7 @@ public class AbstractPaymentAccountTest extends MethodTest {
// File emptyForm = PAYMENT_ACCOUNT_FORM.getPaymentAccountForm(paymentMethodId);
log.debug("{} Empty form saved to {}",
testName(testInfo),
PAYMENT_ACCOUNT_FORM.getClickableURI(emptyForm));
PaymentAccountForm.getClickableURI(emptyForm));
emptyForm.deleteOnExit();
return emptyForm;
}
@ -142,7 +139,7 @@ public class AbstractPaymentAccountTest extends MethodTest {
protected final void verifyEmptyForm(File jsonForm, String paymentMethodId, String... fields) {
@SuppressWarnings("unchecked")
Map<String, Object> emptyForm = (Map<String, Object>) GSON.fromJson(
PAYMENT_ACCOUNT_FORM.toJsonString(jsonForm),
PaymentAccountForm.toJsonString(jsonForm),
Object.class);
assertNotNull(emptyForm);
@ -201,14 +198,14 @@ public class AbstractPaymentAccountTest extends MethodTest {
protected final String getCompletedFormAsJsonString(List<String> comments) {
File completedForm = fillPaymentAccountForm(comments);
String jsonString = PAYMENT_ACCOUNT_FORM.toJsonString(completedForm);
String jsonString = PaymentAccountForm.toJsonString(completedForm);
log.debug("Completed form: {}", jsonString);
return jsonString;
}
protected final String getCompletedFormAsJsonString() {
File completedForm = fillPaymentAccountForm(PROPERTY_VALUE_JSON_COMMENTS);
String jsonString = PAYMENT_ACCOUNT_FORM.toJsonString(completedForm);
String jsonString = PaymentAccountForm.toJsonString(completedForm);
log.debug("Completed form: {}", jsonString);
return jsonString;
}

View File

@ -36,11 +36,12 @@ import static org.apache.commons.lang3.StringUtils.capitalize;
import bisq.cli.GrpcClient;
import bisq.core.api.model.PaymentAccountForm;
/**
* Convenience GrpcClient wrapper for bots using gRPC services.
*/
@SuppressWarnings({"JavaDoc", "unused"})
@SuppressWarnings({"unused"})
@Slf4j
public class BotClient {

View File

@ -58,10 +58,9 @@ public class BotPaymentAccountGenerator {
}
private Map<String, Object> getPaymentAccountFormMap(String paymentMethodId) {
PaymentAccountForm paymentAccountForm = new PaymentAccountForm();
File jsonFormTemplate = paymentAccountForm.getPaymentAccountForm(paymentMethodId);
File jsonFormTemplate = PaymentAccountForm.getPaymentAccountForm(paymentMethodId);
jsonFormTemplate.deleteOnExit();
String jsonString = paymentAccountForm.toJsonString(jsonFormTemplate);
String jsonString = PaymentAccountForm.toJsonString(jsonFormTemplate);
//noinspection unchecked
return (Map<String, Object>) gson.fromJson(jsonString, Object.class);
}

View File

@ -31,6 +31,7 @@ import bisq.proto.grpc.TxFeeRateInfo;
import bisq.proto.grpc.TxInfo;
import protobuf.PaymentAccount;
import protobuf.PaymentAccountForm;
import protobuf.PaymentMethod;
import java.util.List;

View File

@ -20,11 +20,13 @@ package bisq.cli.request;
import bisq.proto.grpc.CreateCryptoCurrencyPaymentAccountRequest;
import bisq.proto.grpc.CreatePaymentAccountRequest;
import bisq.proto.grpc.GetCryptoCurrencyPaymentMethodsRequest;
import bisq.proto.grpc.GetPaymentAccountFormAsJsonRequest;
import bisq.proto.grpc.GetPaymentAccountFormRequest;
import bisq.proto.grpc.GetPaymentAccountsRequest;
import bisq.proto.grpc.GetPaymentMethodsRequest;
import protobuf.PaymentAccount;
import protobuf.PaymentAccountForm;
import protobuf.PaymentMethod;
import java.util.List;
@ -49,15 +51,15 @@ public class PaymentAccountsServiceRequest {
}
public String getPaymentAcctFormAsJson(String paymentMethodId) {
var request = GetPaymentAccountFormRequest.newBuilder()
var request = GetPaymentAccountFormAsJsonRequest.newBuilder()
.setPaymentMethodId(paymentMethodId)
.build();
return grpcStubs.paymentAccountsService.getPaymentAccountForm(request).getPaymentAccountFormJson();
return grpcStubs.paymentAccountsService.getPaymentAccountFormAsJson(request).getPaymentAccountFormAsJson();
}
public PaymentAccount createPaymentAccount(String json) {
var request = CreatePaymentAccountRequest.newBuilder()
.setPaymentAccountForm(json)
.setPaymentAccountFormAsJson(json)
.build();
return grpcStubs.paymentAccountsService.createPaymentAccount(request).getPaymentAccount();
}

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

@ -15,12 +15,11 @@
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.desktop.components.paymentmethods.data;
import bisq.desktop.util.GUIUtil;
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;
@ -46,6 +45,14 @@ import java.util.Map;
*/
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,
@ -785,7 +792,7 @@ public class JapanBankData {
// 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 = GUIUtil.getUserLanguage().equals("ja");
boolean ja = userLanguage.equals("ja");
switch (id) {
case "bank":

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

@ -15,7 +15,7 @@
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.desktop.util.validation;
package bisq.core.payment.validation;
import bisq.core.locale.BankUtil;
import bisq.core.locale.Res;

View File

@ -1,4 +1,4 @@
package bisq.desktop.util.validation;
package bisq.core.payment.validation;
import bisq.core.locale.Res;
import bisq.core.util.validation.InputValidator;

View File

@ -15,7 +15,7 @@
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.desktop.util.validation;
package bisq.core.payment.validation;
import bisq.core.util.validation.InputValidator;

View File

@ -16,7 +16,7 @@
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.desktop.util.validation;
package bisq.core.payment.validation;
import bisq.core.util.validation.InputValidator;
import bisq.core.util.validation.RegexValidator;

View File

@ -15,7 +15,7 @@
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.desktop.util.validation;
package bisq.core.payment.validation;
import bisq.core.util.validation.InputValidator;

View File

@ -15,7 +15,7 @@
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.desktop.util.validation;
package bisq.core.payment.validation;
import bisq.core.locale.Res;
import bisq.core.util.validation.InputValidator;

View File

@ -15,7 +15,7 @@
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
*/
package bisq.desktop.util.validation;
package bisq.core.payment.validation;
import bisq.core.locale.BankUtil;
import bisq.core.locale.Res;

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