mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-05-20 23:40:48 -04:00
refactor payment account form api to support structured, dynamic forms
This commit is contained in:
parent
341ae2bef0
commit
faeb9ca8db
203 changed files with 1844 additions and 509 deletions
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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()) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
885
core/src/main/java/bisq/core/payment/JapanBankData.java
Normal file
885
core/src/main/java/bisq/core/payment/JapanBankData.java
Normal file
|
@ -0,0 +1,885 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment;
|
||||
|
||||
import bisq.core.user.Preferences;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.inject.Inject;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/*
|
||||
Japan's National Banking Association assigns 4 digit codes to all
|
||||
Financial Institutions, so we use that as the primary "Bank ID",
|
||||
add the English names for the top ~30 major international banks,
|
||||
and remove local farmers agricultural cooperative associations
|
||||
to keep the list to a reasonable size. Please update annually.
|
||||
|
||||
Source: Zengin Net list of Financial Institutions
|
||||
Last Updated: July 16, 2019
|
||||
URL: https://www.zengin-net.jp/company/member/
|
||||
PDF: https://www.zengin-net.jp/company/pdf/member1.pdf
|
||||
PDF: https://www.zengin-net.jp/company/pdf/member2.pdf
|
||||
|
||||
Source: Bank of Japan list of Financial Institutions
|
||||
Last Updated: July 16, 2019
|
||||
URL: https://www5.boj.or.jp/bojnet/codenew/mokujinew.htm
|
||||
File: code1_20190716.xlsx
|
||||
Excel sheet: 金融機関等コード一覧
|
||||
*/
|
||||
|
||||
public class JapanBankData {
|
||||
|
||||
private static String userLanguage;
|
||||
|
||||
@Inject
|
||||
JapanBankData(Preferences preferences) {
|
||||
userLanguage = preferences.getUserLanguage();
|
||||
}
|
||||
|
||||
/*
|
||||
Returns the main list of ~500 banks in Japan with bank codes,
|
||||
but since 90%+ of people will be using one of ~30 major banks,
|
||||
we hard-code those at the top for easier pull-down selection,
|
||||
and add their English names in parenthesis for foreigners.
|
||||
*/
|
||||
public static List<String> prettyPrintBankList() // {{{
|
||||
{
|
||||
List<String> prettyList = new ArrayList<>();
|
||||
|
||||
// add mega banks at the top
|
||||
for (Map.Entry<String, String> bank : megaBanksEnglish.entrySet()) {
|
||||
String bankId = bank.getKey();
|
||||
String bankNameEn = bank.getValue();
|
||||
String bankNameJa = majorBanksJapanese.get(bankId);
|
||||
if (bankNameJa == null) bankNameJa = minorBanksJapanese.get(bankId);
|
||||
prettyList.add(prettyPrintMajorBank(bankId, bankNameJa, bankNameEn));
|
||||
}
|
||||
|
||||
// append the major banks next
|
||||
for (Map.Entry<String, String> bank : majorBanksJapanese.entrySet()) {
|
||||
String bankId = bank.getKey();
|
||||
String bankNameJa = bank.getValue();
|
||||
// avoid duplicates
|
||||
if (megaBanksEnglish.get(bankId) != null) continue;
|
||||
prettyList.add(prettyPrintBank(bankId, bankNameJa));
|
||||
}
|
||||
|
||||
// append the minor local banks last
|
||||
for (Map.Entry<String, String> bank : minorBanksJapanese.entrySet()) {
|
||||
String bankId = bank.getKey();
|
||||
String bankNameJa = bank.getValue();
|
||||
prettyList.add(prettyPrintBank(bankId, bankNameJa));
|
||||
}
|
||||
|
||||
return prettyList;
|
||||
} // }}}
|
||||
|
||||
// Pretty print major banks like this: (0001) みずほ (Mizuho Bank)
|
||||
private static String prettyPrintMajorBank(String bankId, String bankNameJa, String bankNameEn) // {{{
|
||||
{
|
||||
return ID_OPEN + bankId + ID_CLOSE + SPACE +
|
||||
JA_OPEN + bankNameJa + JA_CLOSE + SPACE +
|
||||
EN_OPEN + bankNameEn + EN_CLOSE;
|
||||
} // }}}
|
||||
|
||||
// Pretty print other banks like this: (9524) みずほ証券
|
||||
private static String prettyPrintBank(String bankId, String bankName) // {{{
|
||||
{
|
||||
return ID_OPEN + bankId + ID_CLOSE + SPACE +
|
||||
JA_OPEN + bankName + JA_CLOSE;
|
||||
} // }}}
|
||||
|
||||
// top 30 mega banks with english
|
||||
private static final Map<String, String> megaBanksEnglish = ImmutableMap.<String, String>builder()
|
||||
// {{{ japan post office
|
||||
.put("9900", "Japan Post Bank Yucho")
|
||||
// }}}
|
||||
// {{{ japan mega-banks
|
||||
.put("0001", "Mizuho Bank")
|
||||
.put("0005", "Mitsubishi UFJ Bank (MUFG)")
|
||||
.put("0009", "Sumitomo Mitsui Banking Corporation (SMBC)")
|
||||
.put("0010", "Resona Bank")
|
||||
// }}}
|
||||
// {{{ major online banks
|
||||
.put("0033", "Japan Net Bank")
|
||||
.put("0034", "Seven Bank (7-11)")
|
||||
.put("0035", "Sony Bank")
|
||||
.put("0036", "Rakuten Bank")
|
||||
.put("0038", "SBI Sumishin Net Bank")
|
||||
.put("0039", "Jibun Bank")
|
||||
.put("0040", "Aeon Bank")
|
||||
.put("0042", "Lawson Bank")
|
||||
// }}}
|
||||
// {{{ major trust banks, etc.
|
||||
.put("0150", "Suruga Bank")
|
||||
.put("0288", "Mitsubishi UFJ Trust Bank")
|
||||
.put("0289", "Mizuho Trust Bank")
|
||||
.put("0294", "Sumitomo Trust Bank")
|
||||
.put("0300", "SMBC Trust Bank (PRESTIA)")
|
||||
.put("0304", "Nomura Trust Bank")
|
||||
.put("0307", "Orix Trust Bank")
|
||||
.put("0310", "GMO Aozora Net Bank")
|
||||
.put("0321", "Japan Securities Trust Bank")
|
||||
.put("0397", "Shinsei Bank")
|
||||
.put("0398", "Aozora Bank")
|
||||
.put("0402", "JP Morgan Chase Bank")
|
||||
.put("0442", "BNY Mellon")
|
||||
.put("0458", "DBS Bank")
|
||||
.put("0472", "SBJ Shinhan Bank Japan")
|
||||
// }}}
|
||||
.build();
|
||||
|
||||
// major ~200 banks
|
||||
private static final Map<String, String> majorBanksJapanese = ImmutableMap.<String, String>builder()
|
||||
// {{{ ゆうちょ銀行 (9900)
|
||||
.put("9900", "ゆうちょ銀行")
|
||||
// }}}
|
||||
// {{{ 都市銀行 (0001 ~ 0029)
|
||||
.put("0001", "みずほ銀行")
|
||||
.put("0005", "三菱UFJ銀行")
|
||||
.put("0009", "三井住友銀行")
|
||||
.put("0010", "りそな銀行")
|
||||
.put("0017", "埼玉りそな銀行")
|
||||
// }}}
|
||||
// {{{ ネット専業銀行等 (0030 ~ 0049)
|
||||
.put("0033", "ジャパンネット銀行")
|
||||
.put("0034", "セブン銀行")
|
||||
.put("0035", "ソニー銀行")
|
||||
.put("0036", "楽天銀行")
|
||||
.put("0038", "住信SBIネット銀行")
|
||||
.put("0039", "じぶん銀行")
|
||||
.put("0040", "イオン銀行")
|
||||
.put("0041", "大和ネクスト銀行")
|
||||
.put("0042", "ローソン銀行")
|
||||
// }}}
|
||||
// {{{ 協会 (0050 ~ 0099)
|
||||
.put("0051", "全銀協")
|
||||
.put("0052", "横浜銀行協会")
|
||||
.put("0053", "釧路銀行協会")
|
||||
.put("0054", "札幌銀行協会")
|
||||
.put("0056", "函館銀行協会")
|
||||
.put("0057", "青森銀行協会")
|
||||
.put("0058", "秋田銀行協会")
|
||||
.put("0059", "宮城銀行協会")
|
||||
.put("0060", "福島銀行協会")
|
||||
.put("0061", "群馬銀行協会")
|
||||
.put("0062", "新潟銀行協会")
|
||||
.put("0063", "石川銀行協会")
|
||||
.put("0064", "山梨銀行協会")
|
||||
.put("0065", "長野銀行協会")
|
||||
.put("0066", "静岡銀行協会")
|
||||
.put("0067", "名古屋銀行協会")
|
||||
.put("0068", "京都銀行協会")
|
||||
.put("0069", "大阪銀行協会")
|
||||
.put("0070", "神戸銀行協会")
|
||||
.put("0071", "岡山銀行協会")
|
||||
.put("0072", "広島銀行協会")
|
||||
.put("0073", "島根銀行協会")
|
||||
.put("0074", "山口銀行協会")
|
||||
.put("0075", "香川銀行協会")
|
||||
.put("0076", "愛媛銀行協会")
|
||||
.put("0077", "高知銀行協会")
|
||||
.put("0078", "北九州銀行協会")
|
||||
.put("0079", "福岡銀行協会")
|
||||
.put("0080", "大分銀行協会")
|
||||
.put("0081", "長崎銀行協会")
|
||||
.put("0082", "熊本銀行協会")
|
||||
.put("0083", "鹿児島銀行協会")
|
||||
.put("0084", "沖縄銀行協会")
|
||||
.put("0090", "全銀ネット")
|
||||
.put("0095", "CLSBANK")
|
||||
// }}}
|
||||
// {{{ 地方銀行 (0116 ~ 0190)
|
||||
.put("0116", "北海道銀行")
|
||||
.put("0117", "青森銀行")
|
||||
.put("0118", "みちのく銀行")
|
||||
.put("0119", "秋田銀行")
|
||||
.put("0120", "北都銀行")
|
||||
.put("0121", "荘内銀行")
|
||||
.put("0122", "山形銀行")
|
||||
.put("0123", "岩手銀行")
|
||||
.put("0124", "東北銀行")
|
||||
.put("0125", "七十七銀行")
|
||||
.put("0126", "東邦銀行")
|
||||
.put("0128", "群馬銀行")
|
||||
.put("0129", "足利銀行")
|
||||
.put("0130", "常陽銀行")
|
||||
.put("0131", "筑波銀行")
|
||||
.put("0133", "武蔵野銀行")
|
||||
.put("0134", "千葉銀行")
|
||||
.put("0135", "千葉興業銀行")
|
||||
.put("0137", "きらぼし銀行")
|
||||
.put("0138", "横浜銀行")
|
||||
.put("0140", "第四銀行")
|
||||
.put("0141", "北越銀行")
|
||||
.put("0142", "山梨中央銀行")
|
||||
.put("0143", "八十二銀行")
|
||||
.put("0144", "北陸銀行")
|
||||
.put("0145", "富山銀行")
|
||||
.put("0146", "北國銀行")
|
||||
.put("0147", "福井銀行")
|
||||
.put("0149", "静岡銀行")
|
||||
.put("0150", "スルガ銀行")
|
||||
.put("0151", "清水銀行")
|
||||
.put("0152", "大垣共立銀行")
|
||||
.put("0153", "十六銀行")
|
||||
.put("0154", "三重銀行")
|
||||
.put("0155", "百五銀行")
|
||||
.put("0157", "滋賀銀行")
|
||||
.put("0158", "京都銀行")
|
||||
.put("0159", "関西みらい銀行")
|
||||
.put("0161", "池田泉州銀行")
|
||||
.put("0162", "南都銀行")
|
||||
.put("0163", "紀陽銀行")
|
||||
.put("0164", "但馬銀行")
|
||||
.put("0166", "鳥取銀行")
|
||||
.put("0167", "山陰合同銀行")
|
||||
.put("0168", "中国銀行")
|
||||
.put("0169", "広島銀行")
|
||||
.put("0170", "山口銀行")
|
||||
.put("0172", "阿波銀行")
|
||||
.put("0173", "百十四銀行")
|
||||
.put("0174", "伊予銀行")
|
||||
.put("0175", "四国銀行")
|
||||
.put("0177", "福岡銀行")
|
||||
.put("0178", "筑邦銀行")
|
||||
.put("0179", "佐賀銀行")
|
||||
.put("0180", "十八銀行")
|
||||
.put("0181", "親和銀行")
|
||||
.put("0182", "肥後銀行")
|
||||
.put("0183", "大分銀行")
|
||||
.put("0184", "宮崎銀行")
|
||||
.put("0185", "鹿児島銀行")
|
||||
.put("0187", "琉球銀行")
|
||||
.put("0188", "沖縄銀行")
|
||||
.put("0190", "西日本シティ銀行")
|
||||
.put("0191", "北九州銀行")
|
||||
// }}}
|
||||
// {{{ 信託銀行 (0288 ~ 0326)
|
||||
.put("0288", "三菱UFJ信託銀行")
|
||||
.put("0289", "みずほ信託銀行")
|
||||
.put("0294", "三井住友信託銀行")
|
||||
.put("0295", "BNYM信託")
|
||||
.put("0297", "日本マスタートラスト信託銀行")
|
||||
.put("0299", "ステート信託")
|
||||
.put("0300", "SMBC信託銀行 プレスティア")
|
||||
.put("0304", "野村信託銀行")
|
||||
.put("0307", "オリックス銀行")
|
||||
.put("0310", "GMOあおぞらネット銀行")
|
||||
.put("0311", "農中信託")
|
||||
.put("0320", "新生信託")
|
||||
.put("0321", "日証金信託")
|
||||
.put("0324", "日本トラスティサービス信託銀行")
|
||||
.put("0325", "資産管理サービス信託銀行")
|
||||
// }}}
|
||||
// {{{ 旧長期信用銀行 (0397 ~ 0398)
|
||||
.put("0397", "新生銀行")
|
||||
.put("0398", "あおぞら銀行")
|
||||
// }}}
|
||||
// {{{ foreign banks (0400 ~ 0497)
|
||||
.put("0401", "シティバンク、エヌ・エイ 銀行")
|
||||
.put("0402", "JPモルガン・チェース銀行")
|
||||
.put("0403", "アメリカ銀行")
|
||||
.put("0411", "香港上海銀行")
|
||||
.put("0413", "スタンチヤート")
|
||||
.put("0414", "バークレイズ")
|
||||
.put("0421", "アグリコル")
|
||||
.put("0423", "ハナ")
|
||||
.put("0424", "印度")
|
||||
.put("0425", "兆豐國際商銀")
|
||||
.put("0426", "バンコツク")
|
||||
.put("0429", "バンクネガラ")
|
||||
.put("0430", "ドイツ銀行")
|
||||
.put("0432", "ブラジル")
|
||||
.put("0438", "ユーオバシーズ")
|
||||
.put("0439", "ユービーエス")
|
||||
.put("0442", "BNYメロン")
|
||||
.put("0443", "ビー・エヌ・ピー・パリバ銀行")
|
||||
.put("0444", "チヤイニーズ")
|
||||
.put("0445", "ソシエテ")
|
||||
.put("0456", "ユバフ")
|
||||
.put("0458", "DBS")
|
||||
.put("0459", "パキスタン")
|
||||
.put("0460", "クレデイスイス")
|
||||
.put("0461", "コメルツ銀行")
|
||||
.put("0463", "ウニクレデイト")
|
||||
.put("0468", "インドステイト")
|
||||
.put("0471", "カナダロイヤル")
|
||||
.put("0472", "SBJ銀行")
|
||||
.put("0477", "ウリイ")
|
||||
.put("0482", "アイエヌジー")
|
||||
.put("0484", "ナツトオース")
|
||||
.put("0485", "アンズバンク")
|
||||
.put("0487", "コモンウエルス")
|
||||
.put("0489", "バンクチヤイナ")
|
||||
.put("0495", "ステストリート")
|
||||
.put("0498", "中小企業")
|
||||
// }}}
|
||||
// {{{ 第二地方銀行 (0501 ~ 0597)
|
||||
.put("0501", "北洋銀行")
|
||||
.put("0508", "きらやか銀行")
|
||||
.put("0509", "北日本銀行")
|
||||
.put("0512", "仙台銀行")
|
||||
.put("0513", "福島銀行")
|
||||
.put("0514", "大東銀行")
|
||||
.put("0516", "東和銀行")
|
||||
.put("0517", "栃木銀行")
|
||||
.put("0522", "京葉銀行")
|
||||
.put("0525", "東日本銀行")
|
||||
.put("0526", "東京スター銀行")
|
||||
.put("0530", "神奈川銀行")
|
||||
.put("0532", "大光銀行")
|
||||
.put("0533", "長野銀行")
|
||||
.put("0534", "富山第一銀行")
|
||||
.put("0537", "福邦銀行")
|
||||
.put("0538", "静岡中央銀行")
|
||||
.put("0542", "愛知銀行")
|
||||
.put("0543", "名古屋銀行")
|
||||
.put("0544", "中京銀行")
|
||||
.put("0546", "第三銀行")
|
||||
.put("0555", "大正銀行")
|
||||
.put("0562", "みなと銀行")
|
||||
.put("0565", "島根銀行")
|
||||
.put("0566", "トマト銀行")
|
||||
.put("0569", "もみじ銀行")
|
||||
.put("0570", "西京銀行")
|
||||
.put("0572", "徳島銀行")
|
||||
.put("0573", "香川銀行")
|
||||
.put("0576", "愛媛銀行")
|
||||
.put("0578", "高知銀行")
|
||||
.put("0582", "福岡中央銀行")
|
||||
.put("0583", "佐賀共栄銀行")
|
||||
.put("0585", "長崎銀行")
|
||||
.put("0587", "熊本銀行")
|
||||
.put("0590", "豊和銀行")
|
||||
.put("0591", "宮崎太陽銀行")
|
||||
.put("0594", "南日本銀行")
|
||||
.put("0596", "沖縄海邦銀行")
|
||||
// }}}
|
||||
// {{{ more foreign banks (0600 ~ 0999)
|
||||
.put("0603", "韓国産業")
|
||||
.put("0607", "彰化商業")
|
||||
.put("0608", "ウエルズフアゴ")
|
||||
.put("0611", "第一商業")
|
||||
.put("0612", "台湾")
|
||||
.put("0615", "交通")
|
||||
.put("0616", "メトロポリタン")
|
||||
.put("0617", "フイリピン")
|
||||
.put("0619", "中国工商")
|
||||
.put("0621", "中國信託商業")
|
||||
.put("0623", "インテーザ")
|
||||
.put("0624", "國民")
|
||||
.put("0625", "中国建設")
|
||||
.put("0626", "イタウウニ")
|
||||
.put("0627", "BBVA")
|
||||
.put("0630", "中国農業")
|
||||
.put("0631", "台新")
|
||||
.put("0632", "玉山")
|
||||
.put("0633", "台湾企銀")
|
||||
.put("0808", "ドイツ証券")
|
||||
.put("0813", "ソシエテ証券")
|
||||
.put("0821", "ビーピー証券")
|
||||
.put("0822", "バークレイ証券")
|
||||
.put("0831", "アグリコル証券")
|
||||
.put("0832", "ジエイピー証券")
|
||||
.put("0842", "ゴルドマン証券")
|
||||
.put("0845", "ナツトウエ証券")
|
||||
.put("0900", "日本相互証券")
|
||||
.put("0905", "東京金融取引所")
|
||||
.put("0909", "日本クリア機構")
|
||||
.put("0910", "ほふりクリア")
|
||||
.put("0964", "しんきん証券")
|
||||
.put("0966", "HSBC証券")
|
||||
.put("0968", "セント東短証券")
|
||||
.put("0971", "UBS証券")
|
||||
.put("0972", "メリル日本証券")
|
||||
// }}}
|
||||
.build();
|
||||
|
||||
// minor ~280 lesser known banks
|
||||
private static final Map<String, String> minorBanksJapanese = ImmutableMap.<String, String>builder()
|
||||
// {{{ 信用金庫 (1001 ~ 1996)
|
||||
.put("1000", "信金中央金庫")
|
||||
.put("1001", "北海道信金")
|
||||
.put("1003", "室蘭信金")
|
||||
.put("1004", "空知信金")
|
||||
.put("1006", "苫小牧信金")
|
||||
.put("1008", "北門信金")
|
||||
.put("1009", "伊達信金")
|
||||
.put("1010", "北空知信金")
|
||||
.put("1011", "日高信金")
|
||||
.put("1013", "渡島信金")
|
||||
.put("1014", "道南うみ街信金")
|
||||
.put("1020", "旭川信金")
|
||||
.put("1021", "稚内信金")
|
||||
.put("1022", "留萌信金")
|
||||
.put("1024", "北星信金")
|
||||
.put("1026", "帯広信金")
|
||||
.put("1027", "釧路信金")
|
||||
.put("1028", "大地みらい信金")
|
||||
.put("1030", "北見信金")
|
||||
.put("1031", "網走信金")
|
||||
.put("1033", "遠軽信金")
|
||||
.put("1104", "東奥信金")
|
||||
.put("1105", "青い森信金")
|
||||
.put("1120", "秋田信金")
|
||||
.put("1123", "羽後信金")
|
||||
.put("1140", "山形信金")
|
||||
.put("1141", "米沢信金")
|
||||
.put("1142", "鶴岡信金")
|
||||
.put("1143", "新庄信金")
|
||||
.put("1150", "盛岡信金")
|
||||
.put("1152", "宮古信金")
|
||||
.put("1153", "一関信金")
|
||||
.put("1154", "北上信金")
|
||||
.put("1155", "花巻信金")
|
||||
.put("1156", "水沢信金")
|
||||
.put("1170", "杜の都信金")
|
||||
.put("1171", "宮城第一信金")
|
||||
.put("1172", "石巻信金")
|
||||
.put("1174", "仙南信金")
|
||||
.put("1181", "会津信金")
|
||||
.put("1182", "郡山信金")
|
||||
.put("1184", "白河信金")
|
||||
.put("1185", "須賀川信金")
|
||||
.put("1186", "ひまわり信金")
|
||||
.put("1188", "あぶくま信金")
|
||||
.put("1189", "二本松信金")
|
||||
.put("1190", "福島信金")
|
||||
.put("1203", "高崎信金")
|
||||
.put("1204", "桐生信金")
|
||||
.put("1206", "アイオー信金")
|
||||
.put("1208", "利根郡信金")
|
||||
.put("1209", "館林信金")
|
||||
.put("1210", "北群馬信金")
|
||||
.put("1211", "しののめ信金")
|
||||
.put("1221", "足利小山信金")
|
||||
.put("1222", "栃木信金")
|
||||
.put("1223", "鹿沼相互信金")
|
||||
.put("1224", "佐野信金")
|
||||
.put("1225", "大田原信金")
|
||||
.put("1227", "烏山信金")
|
||||
.put("1240", "水戸信金")
|
||||
.put("1242", "結城信金")
|
||||
.put("1250", "埼玉県信金")
|
||||
.put("1251", "川口信金")
|
||||
.put("1252", "青木信金")
|
||||
.put("1253", "飯能信金")
|
||||
.put("1260", "千葉信金")
|
||||
.put("1261", "銚子信金")
|
||||
.put("1262", "東京ベイ信金")
|
||||
.put("1264", "館山信金")
|
||||
.put("1267", "佐原信金")
|
||||
.put("1280", "横浜信金")
|
||||
.put("1281", "かながわ信金")
|
||||
.put("1282", "湘南信金")
|
||||
.put("1283", "川崎信金")
|
||||
.put("1286", "平塚信金")
|
||||
.put("1288", "さがみ信金")
|
||||
.put("1289", "中栄信金")
|
||||
.put("1290", "中南信金")
|
||||
.put("1303", "朝日信金")
|
||||
.put("1305", "興産信金")
|
||||
.put("1310", "さわやか信金")
|
||||
.put("1311", "東京シテイ信金")
|
||||
.put("1319", "芝信金")
|
||||
.put("1320", "東京東信金")
|
||||
.put("1321", "東栄信金")
|
||||
.put("1323", "亀有信金")
|
||||
.put("1326", "小松川信金")
|
||||
.put("1327", "足立成和信金")
|
||||
.put("1333", "東京三協信金")
|
||||
.put("1336", "西京信金")
|
||||
.put("1341", "西武信金")
|
||||
.put("1344", "城南信金")
|
||||
.put("1345", "東京)昭和信金")
|
||||
.put("1346", "目黒信金")
|
||||
.put("1348", "世田谷信金")
|
||||
.put("1349", "東京信金")
|
||||
.put("1351", "城北信金")
|
||||
.put("1352", "滝野川信金")
|
||||
.put("1356", "巣鴨信金")
|
||||
.put("1358", "青梅信金")
|
||||
.put("1360", "多摩信金")
|
||||
.put("1370", "新潟信金")
|
||||
.put("1371", "長岡信金")
|
||||
.put("1373", "三条信金")
|
||||
.put("1374", "新発田信金")
|
||||
.put("1375", "柏崎信金")
|
||||
.put("1376", "上越信金")
|
||||
.put("1377", "新井信金")
|
||||
.put("1379", "村上信金")
|
||||
.put("1380", "加茂信金")
|
||||
.put("1385", "甲府信金")
|
||||
.put("1386", "山梨信金")
|
||||
.put("1390", "長野信金")
|
||||
.put("1391", "松本信金")
|
||||
.put("1392", "上田信金")
|
||||
.put("1393", "諏訪信金")
|
||||
.put("1394", "飯田信金")
|
||||
.put("1396", "アルプス信金")
|
||||
.put("1401", "富山信金")
|
||||
.put("1402", "高岡信金")
|
||||
.put("1405", "にいかわ信金")
|
||||
.put("1406", "氷見伏木信金")
|
||||
.put("1412", "砺波信金")
|
||||
.put("1413", "石動信金")
|
||||
.put("1440", "金沢信金")
|
||||
.put("1442", "のと共栄信金")
|
||||
.put("1444", "北陸信金")
|
||||
.put("1445", "鶴来信金")
|
||||
.put("1448", "興能信金")
|
||||
.put("1470", "福井信金")
|
||||
.put("1471", "敦賀信金")
|
||||
.put("1473", "小浜信金")
|
||||
.put("1475", "越前信金")
|
||||
.put("1501", "しず焼津信金")
|
||||
.put("1502", "静清信金")
|
||||
.put("1503", "浜松磐田信金")
|
||||
.put("1505", "沼津信金")
|
||||
.put("1506", "三島信金")
|
||||
.put("1507", "富士宮信金")
|
||||
.put("1513", "島田掛川信金")
|
||||
.put("1515", "静岡)富士信金")
|
||||
.put("1517", "遠州信金")
|
||||
.put("1530", "岐阜信金")
|
||||
.put("1531", "大垣西濃信金")
|
||||
.put("1532", "高山信金")
|
||||
.put("1533", "東濃信金")
|
||||
.put("1534", "関信金")
|
||||
.put("1538", "八幡信金")
|
||||
.put("1550", "愛知信金")
|
||||
.put("1551", "豊橋信金")
|
||||
.put("1552", "岡崎信金")
|
||||
.put("1553", "いちい信金")
|
||||
.put("1554", "瀬戸信金")
|
||||
.put("1555", "半田信金")
|
||||
.put("1556", "知多信金")
|
||||
.put("1557", "豊川信金")
|
||||
.put("1559", "豊田信金")
|
||||
.put("1560", "碧海信金")
|
||||
.put("1561", "西尾信金")
|
||||
.put("1562", "蒲郡信金")
|
||||
.put("1563", "尾西信金")
|
||||
.put("1565", "中日信金")
|
||||
.put("1566", "東春信金")
|
||||
.put("1580", "津信金")
|
||||
.put("1581", "北伊勢上野信金")
|
||||
.put("1583", "桑名三重信金")
|
||||
.put("1585", "紀北信金")
|
||||
.put("1602", "滋賀中央信金")
|
||||
.put("1603", "長浜信金")
|
||||
.put("1604", "湖東信金")
|
||||
.put("1610", "京都信金")
|
||||
.put("1611", "京都中央信金")
|
||||
.put("1620", "京都北都信金")
|
||||
.put("1630", "大阪信金")
|
||||
.put("1633", "大阪厚生信金")
|
||||
.put("1635", "大阪シテイ信金")
|
||||
.put("1636", "大阪商工信金")
|
||||
.put("1643", "永和信金")
|
||||
.put("1645", "北おおさか信金")
|
||||
.put("1656", "枚方信金")
|
||||
.put("1666", "奈良信金")
|
||||
.put("1667", "大和信金")
|
||||
.put("1668", "奈良中央信金")
|
||||
.put("1671", "新宮信金")
|
||||
.put("1674", "きのくに信金")
|
||||
.put("1680", "神戸信金")
|
||||
.put("1685", "姫路信金")
|
||||
.put("1686", "播州信金")
|
||||
.put("1687", "兵庫信金")
|
||||
.put("1688", "尼崎信金")
|
||||
.put("1689", "日新信金")
|
||||
.put("1691", "淡路信金")
|
||||
.put("1692", "但馬信金")
|
||||
.put("1694", "西兵庫信金")
|
||||
.put("1695", "中兵庫信金")
|
||||
.put("1696", "但陽信金")
|
||||
.put("1701", "鳥取信金")
|
||||
.put("1702", "米子信金")
|
||||
.put("1703", "倉吉信金")
|
||||
.put("1710", "しまね信金")
|
||||
.put("1711", "日本海信金")
|
||||
.put("1712", "島根中央信金")
|
||||
.put("1732", "おかやま信金")
|
||||
.put("1734", "水島信金")
|
||||
.put("1735", "津山信金")
|
||||
.put("1738", "玉島信金")
|
||||
.put("1740", "備北信金")
|
||||
.put("1741", "吉備信金")
|
||||
.put("1742", "日生信金")
|
||||
.put("1743", "備前信金")
|
||||
.put("1750", "広島信金")
|
||||
.put("1752", "呉信金")
|
||||
.put("1756", "しまなみ信金")
|
||||
.put("1758", "広島みどり信金")
|
||||
.put("1780", "萩山口信金")
|
||||
.put("1781", "西中国信金")
|
||||
.put("1789", "東山口信金")
|
||||
.put("1801", "徳島信金")
|
||||
.put("1803", "阿南信金")
|
||||
.put("1830", "高松信金")
|
||||
.put("1833", "観音寺信金")
|
||||
.put("1860", "愛媛信金")
|
||||
.put("1862", "宇和島信金")
|
||||
.put("1864", "東予信金")
|
||||
.put("1866", "川之江信金")
|
||||
.put("1880", "幡多信金")
|
||||
.put("1881", "高知信金")
|
||||
.put("1901", "福岡信金")
|
||||
.put("1903", "福岡ひびき信金")
|
||||
.put("1908", "大牟田柳川信金")
|
||||
.put("1909", "筑後信金")
|
||||
.put("1910", "飯塚信金")
|
||||
.put("1917", "大川信金")
|
||||
.put("1920", "遠賀信金")
|
||||
.put("1930", "唐津信金")
|
||||
.put("1931", "佐賀信金")
|
||||
.put("1933", "九州ひぜん信金")
|
||||
.put("1942", "たちばな信金")
|
||||
.put("1951", "熊本信金")
|
||||
.put("1952", "熊本第一信金")
|
||||
.put("1954", "熊本中央信金")
|
||||
.put("1960", "大分信金")
|
||||
.put("1962", "大分みらい信金")
|
||||
.put("1980", "宮崎都城信金")
|
||||
.put("1985", "高鍋信金")
|
||||
.put("1990", "鹿児島信金")
|
||||
.put("1991", "鹿児島相互信金")
|
||||
.put("1993", "奄美大島信金")
|
||||
.put("1996", "コザ信金")
|
||||
// }}}
|
||||
// {{{ 信用組合 (2011 ~ 2895)
|
||||
.put("2004", "商工組合中央金庫")
|
||||
.put("2010", "全国信用協同組合連合会")
|
||||
.put("2213", "整理回収機構")
|
||||
// }}}
|
||||
// {{{ 労働金庫 (2951 ~ 2997)
|
||||
.put("2950", "労働金庫連合会")
|
||||
// }}}
|
||||
// {{{ 農林中央金庫 (3000)
|
||||
.put("3000", "農林中央金庫")
|
||||
// }}}
|
||||
// {{{ 信用農業協同組合連合会 (3001 ~ 3046)
|
||||
.put("3001", "北海道信用農業協同組合連合会")
|
||||
.put("3003", "岩手県信用農業協同組合連合会")
|
||||
.put("3008", "茨城県信用農業協同組合連合会")
|
||||
.put("3011", "埼玉県信用農業協同組合連合会")
|
||||
.put("3013", "東京都信用農業協同組合連合会")
|
||||
.put("3014", "神奈川県信用農業協同組合連合会")
|
||||
.put("3015", "山梨県信用農業協同組合連合会")
|
||||
.put("3016", "長野県信用農業協同組合連合会")
|
||||
.put("3017", "新潟県信用農業協同組合連合会")
|
||||
.put("3019", "石川県信用農業協同組合連合会")
|
||||
.put("3020", "岐阜県信用農業協同組合連合会")
|
||||
.put("3021", "静岡県信用農業協同組合連合会")
|
||||
.put("3022", "愛知県信用農業協同組合連合会")
|
||||
.put("3023", "三重県信用農業協同組合連合会")
|
||||
.put("3024", "福井県信用農業協同組合連合会")
|
||||
.put("3025", "滋賀県信用農業協同組合連合会")
|
||||
.put("3026", "京都府信用農業協同組合連合会")
|
||||
.put("3027", "大阪府信用農業協同組合連合会")
|
||||
.put("3028", "兵庫県信用農業協同組合連合会")
|
||||
.put("3030", "和歌山県信用農業協同組合連合会")
|
||||
.put("3031", "鳥取県信用農業協同組合連合会")
|
||||
.put("3034", "広島県信用農業協同組合連合会")
|
||||
.put("3035", "山口県信用農業協同組合連合会")
|
||||
.put("3036", "徳島県信用農業協同組合連合会")
|
||||
.put("3037", "香川県信用農業協同組合連合会")
|
||||
.put("3038", "愛媛県信用農業協同組合連合会")
|
||||
.put("3039", "高知県信用農業協同組合連合会")
|
||||
.put("3040", "福岡県信用農業協同組合連合会")
|
||||
.put("3041", "佐賀県信用農業協同組合連合会")
|
||||
.put("3044", "大分県信用農業協同組合連合会")
|
||||
.put("3045", "宮崎県信用農業協同組合連合会")
|
||||
.put("3046", "鹿児島県信用農業協同組合連合会")
|
||||
// }}}
|
||||
// {{{ "JA Bank" agricultural cooperative associations (3056 ~ 9375)
|
||||
// REMOVED: the farmers should use a real bank if they want to sell bitcoin
|
||||
// }}}
|
||||
// {{{ 信用漁業協同組合連合会 (9450 ~ 9496)
|
||||
.put("9450", "北海道信用漁業協同組合連合会")
|
||||
.put("9451", "青森県信用漁業協同組合連合会")
|
||||
.put("9452", "岩手県信用漁業協同組合連合会")
|
||||
.put("9453", "宮城県漁業協同組合")
|
||||
.put("9456", "福島県信用漁業協同組合連合会")
|
||||
.put("9457", "茨城県信用漁業協同組合連合会")
|
||||
.put("9461", "千葉県信用漁業協同組合連合会")
|
||||
.put("9462", "東京都信用漁業協同組合連合会")
|
||||
.put("9466", "新潟県信用漁業協同組合連合会")
|
||||
.put("9467", "富山県信用漁業協同組合連合会")
|
||||
.put("9468", "石川県信用漁業協同組合連合会")
|
||||
.put("9470", "静岡県信用漁業協同組合連合会")
|
||||
.put("9471", "愛知県信用漁業協同組合連合会")
|
||||
.put("9472", "三重県信用漁業協同組合連合会")
|
||||
.put("9473", "福井県信用漁業協同組合連合会")
|
||||
.put("9475", "京都府信用漁業協同組合連合会")
|
||||
.put("9477", "なぎさ信用漁業協同組合連合会")
|
||||
.put("9480", "鳥取県信用漁業協同組合連合会")
|
||||
.put("9481", "JFしまね漁業協同組合")
|
||||
.put("9483", "広島県信用漁業協同組合連合会")
|
||||
.put("9484", "山口県漁業協同組合")
|
||||
.put("9485", "徳島県信用漁業協同組合連合会")
|
||||
.put("9486", "香川県信用漁業協同組合連合会")
|
||||
.put("9487", "愛媛県信用漁業協同組合連合会")
|
||||
.put("9488", "高知県信用漁業協同組合連合会")
|
||||
.put("9489", "福岡県信用漁業協同組合連合会")
|
||||
.put("9490", "佐賀県信用漁業協同組合連合会")
|
||||
.put("9491", "長崎県信用漁業協同組合連合会")
|
||||
.put("9493", "大分県漁業協同組合")
|
||||
.put("9494", "宮崎県信用漁業協同組合連合会")
|
||||
.put("9495", "鹿児島県信用漁業協同組合連合会")
|
||||
.put("9496", "沖縄県信用漁業協同組合連合会")
|
||||
// }}}
|
||||
// {{{ securities firms
|
||||
.put("9500", "東京短資")
|
||||
.put("9501", "セントラル短資")
|
||||
.put("9507", "上田八木短資")
|
||||
.put("9510", "日本証券金融")
|
||||
.put("9520", "野村証券")
|
||||
.put("9521", "日興証券")
|
||||
.put("9523", "大和証券")
|
||||
.put("9524", "みずほ証券")
|
||||
.put("9528", "岡三証券")
|
||||
.put("9530", "岩井コスモ証券")
|
||||
.put("9532", "三菱UFJ証券")
|
||||
.put("9534", "丸三証券")
|
||||
.put("9535", "東洋証券")
|
||||
.put("9537", "水戸証券")
|
||||
.put("9539", "東海東京証券")
|
||||
.put("9542", "むさし証券")
|
||||
.put("9545", "いちよし証券")
|
||||
.put("9573", "極東証券")
|
||||
.put("9574", "立花証券")
|
||||
.put("9579", "光世証券")
|
||||
.put("9584", "ちばぎん証券")
|
||||
.put("9589", "シテイ証券")
|
||||
.put("9594", "CS証券")
|
||||
.put("9595", "スタンレー証券")
|
||||
.put("9930", "日本政策投資")
|
||||
.put("9932", "政策金融公庫")
|
||||
.put("9933", "国際協力")
|
||||
.put("9945", "預金保険機構")
|
||||
// }}}
|
||||
.build();
|
||||
|
||||
private final static String ID_OPEN = "";
|
||||
private final static String ID_CLOSE = "";
|
||||
private final static String JA_OPEN = "";
|
||||
private final static String JA_CLOSE = "";
|
||||
private final static String EN_OPEN = "";
|
||||
private final static String EN_CLOSE = "";
|
||||
public final static String SPACE = " ";
|
||||
|
||||
// don't localize these strings into all languages,
|
||||
// all we want is either Japanese or English here.
|
||||
public static String getString(String id) {
|
||||
boolean ja = userLanguage.equals("ja");
|
||||
|
||||
switch (id) {
|
||||
case "bank":
|
||||
if (ja) return "銀行名 ・金融機関名";
|
||||
return "Bank or Financial Institution";
|
||||
case "bank.select":
|
||||
if (ja) return "金融機関 ・銀行検索 (名称入力検索)";
|
||||
return "Search for Bank or Financial Institution";
|
||||
case "bank.code":
|
||||
if (ja) return "銀行コード";
|
||||
return "Zengin Bank Code";
|
||||
case "bank.name":
|
||||
if (ja) return "金融機関名 ・銀行名";
|
||||
return "Financial Institution / Bank Name";
|
||||
|
||||
case "branch":
|
||||
if (ja) return "支店名";
|
||||
return "Bank Branch";
|
||||
case "branch.code":
|
||||
if (ja) return "支店コード";
|
||||
return "Zengin Branch Code";
|
||||
case "branch.code.validation.error":
|
||||
if (ja) return "入力は3桁の支店コードでなければなりません";
|
||||
return "Input must be a 3 digit branch code";
|
||||
case "branch.name":
|
||||
if (ja) return "支店名";
|
||||
return "Bank Branch Name";
|
||||
|
||||
case "account":
|
||||
if (ja) return "銀行口座";
|
||||
return "Bank Account";
|
||||
|
||||
case "account.type":
|
||||
if (ja) return "口座科目";
|
||||
return "Bank Account Type";
|
||||
case "account.type.select":
|
||||
if (ja) return "口座科目";
|
||||
return "Select Account Type";
|
||||
// displayed while creating account
|
||||
case "account.type.futsu":
|
||||
if (ja) return "普通";
|
||||
return "FUTSUU (ordinary) account";
|
||||
case "account.type.touza":
|
||||
if (ja) return "当座";
|
||||
return "TOUZA (checking) account";
|
||||
case "account.type.chochiku":
|
||||
if (ja) return "貯金";
|
||||
return "CHOCHIKU (special) account";
|
||||
// used when saving account info
|
||||
case "account.type.futsu.ja":
|
||||
return "普通";
|
||||
case "account.type.touza.ja":
|
||||
return "当座";
|
||||
case "account.type.chochiku.ja":
|
||||
return "貯金";
|
||||
|
||||
case "account.number":
|
||||
if (ja) return "口座番号";
|
||||
return "Bank Account Number";
|
||||
case "account.number.validation.error":
|
||||
if (ja) return "入力は4〜8桁の口座番号でなければなりません";
|
||||
return "Input must be 4 ~ 8 digit account number";
|
||||
case "account.name":
|
||||
if (ja) return "口座名義";
|
||||
return "Bank Account Name";
|
||||
|
||||
// for japanese-only input fields
|
||||
case "japanese.validation.error":
|
||||
if (ja) return "入力は漢字、ひらがな、またはカタカナでなければなりません";
|
||||
return "Input must be Kanji, Hiragana, or Katakana";
|
||||
case "japanese.validation.regex":
|
||||
// epic regex to only match Japanese input
|
||||
return "[" + // match any of these characters:
|
||||
// "A-z" + // full-width alphabet
|
||||
// "0-9" + // full-width numerals
|
||||
"一-龯" + // common Japanese kanji (0x4e00 ~ 0x9faf)
|
||||
"々" + // kanji iteration mark (0x3005)
|
||||
"〇" + // kanji number zero (0x3007)
|
||||
"ぁ-ゞ" + // hiragana (0x3041 ~ 0x309e)
|
||||
"ァ-・" + // full-width katakana (0x30a1 ~ 0x30fb)
|
||||
"ァ-ン゙゚" + // half-width katakana
|
||||
"ヽヾ゛゜ー" + // 0x30fd, 0x30fe, 0x309b, 0x309c, 0x30fc
|
||||
" " + // full-width space
|
||||
" " + // half-width space
|
||||
"]+"; // for any length
|
||||
}
|
||||
|
||||
return "null";
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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<>();
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -0,0 +1,136 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.locale.BankUtil;
|
||||
import bisq.core.locale.Res;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public final class AccountNrValidator extends BankValidator {
|
||||
public AccountNrValidator(String countryCode) {
|
||||
super(countryCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
int length;
|
||||
String input2;
|
||||
switch (countryCode) {
|
||||
case "GB":
|
||||
length = 8;
|
||||
if (isNumberWithFixedLength(input, length))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.accountNr", length));
|
||||
case "US":
|
||||
if (isNumberInRange(input, 4, 17))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.accountNr", "4 - 17"));
|
||||
case "BR":
|
||||
if (isStringInRange(input, 1, 20))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.accountNrChars", "1 - 20"));
|
||||
case "NZ":
|
||||
input2 = input != null ? input.replaceAll("-", "") : null;
|
||||
if (isNumberInRange(input2, 15, 16))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.accountNrFormat", "03-1587-0050000-00"));
|
||||
case "AU":
|
||||
if (isNumberInRange(input, 4, 10))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.accountNr", "4 - 10"));
|
||||
case "CA":
|
||||
if (isNumberInRange(input, 7, 12))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.accountNr", "7 - 12"));
|
||||
case "MX":
|
||||
length = 18;
|
||||
if (isNumberWithFixedLength(input, length))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
|
||||
case "HK":
|
||||
input2 = input != null ? input.replaceAll("-", "") : null;
|
||||
if (isNumberInRange(input2, 9, 12))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.accountNrFormat", "005-231289-112"));
|
||||
case "NO":
|
||||
if (input != null) {
|
||||
length = 11;
|
||||
// Provided by sturles:
|
||||
// https://github.com/bisq-network/exchange/pull/707
|
||||
|
||||
// https://no.wikipedia.org/wiki/MOD11#Implementasjoner_i_forskjellige_programmeringspr.C3.A5k
|
||||
// https://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits6
|
||||
|
||||
// 11 digits, last digit is checksum. Checksum algoritm is
|
||||
// MOD11 with weights 2,3,4,5,6,7,2,3,4,5 right to left.
|
||||
// First remove whitespace and periods. Normal formatting is:
|
||||
// 1234.56.78903
|
||||
input2 = StringUtils.remove(input, " ");
|
||||
input2 = StringUtils.remove(input2, ".");
|
||||
// 11 digits, numbers only
|
||||
if (input2.length() != length || !StringUtils.isNumeric(input2))
|
||||
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
|
||||
int lastDigit = Character.getNumericValue(input2.charAt(input2.length() - 1));
|
||||
if (getMod11ControlDigit(input2) != lastDigit)
|
||||
return new ValidationResult(false, "Kontonummer har feil sjekksum"); // not translated
|
||||
else
|
||||
return super.validate(input);
|
||||
} else {
|
||||
return super.validate(null);
|
||||
}
|
||||
default:
|
||||
return super.validate(input);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private int getMod11ControlDigit(String accountNrString) {
|
||||
int sumForMod = 0;
|
||||
int controlNumber = 2;
|
||||
char[] accountNr = accountNrString.toCharArray();
|
||||
|
||||
for (int i = accountNr.length - 2; i >= 0; i--) {
|
||||
sumForMod += (Character.getNumericValue(accountNr[i]) * controlNumber);
|
||||
controlNumber++;
|
||||
|
||||
if (controlNumber > 7) {
|
||||
controlNumber = 2;
|
||||
}
|
||||
}
|
||||
int calculus = (11 - sumForMod % 11);
|
||||
if (calculus == 11) {
|
||||
return 0;
|
||||
} else {
|
||||
return calculus;
|
||||
}
|
||||
}
|
||||
|
||||
private String getLabel() {
|
||||
String label = BankUtil.getAccountNrLabel(countryCode);
|
||||
return label.substring(0, label.length() - 1);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.locale.Res;
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
import bisq.core.util.validation.RegexValidator;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class AdvancedCashValidator extends InputValidator {
|
||||
private EmailValidator emailValidator;
|
||||
private RegexValidator regexValidator;
|
||||
|
||||
@Inject
|
||||
public AdvancedCashValidator(EmailValidator emailValidator, RegexValidator regexValidator) {
|
||||
|
||||
this.emailValidator = emailValidator;
|
||||
|
||||
regexValidator.setPattern("[A-Za-z]{1}\\d{12}");
|
||||
regexValidator.setErrorMessage(Res.get("validation.advancedCash.invalidFormat"));
|
||||
this.regexValidator = regexValidator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
ValidationResult result = super.validate(input);
|
||||
|
||||
if (!result.isValid)
|
||||
return result;
|
||||
|
||||
result = emailValidator.validate(input);
|
||||
|
||||
if (!result.isValid)
|
||||
result = regexValidator.validate(input);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
|
||||
public final class AliPayValidator extends InputValidator {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Public methods
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
// TODO
|
||||
return super.validate(input);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Private methods
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
|
||||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
import bisq.core.util.validation.RegexValidator;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public final class AustraliaPayidAccountNameValidator extends InputValidator {
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
ValidationResult result = super.validate(input);
|
||||
|
||||
if (result.isValid)
|
||||
result = lengthValidator.validate(input);
|
||||
if (result.isValid)
|
||||
result = regexValidator.validate(input);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private final LengthValidator lengthValidator;
|
||||
private final RegexValidator regexValidator;
|
||||
|
||||
@Inject
|
||||
public AustraliaPayidAccountNameValidator(LengthValidator lengthValidator, RegexValidator regexValidator) {
|
||||
|
||||
lengthValidator.setMinLength(1);
|
||||
lengthValidator.setMaxLength(40);
|
||||
this.lengthValidator = lengthValidator;
|
||||
|
||||
this.regexValidator = regexValidator;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
|
||||
public final class AustraliaPayidValidator extends InputValidator {
|
||||
|
||||
private final EmailValidator emailValidator;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Public methods
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public AustraliaPayidValidator() {
|
||||
emailValidator = new EmailValidator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
ValidationResult result = validateIfNotEmpty(input);
|
||||
if (!result.isValid) {
|
||||
return result;
|
||||
} else {
|
||||
ValidationResult emailResult = emailValidator.validate(input);
|
||||
if (emailResult.isValid)
|
||||
return emailResult;
|
||||
else
|
||||
return validatePhoneNumber(input);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Private methods
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// TODO not impl yet -> see InteracETransferValidator
|
||||
private ValidationResult validatePhoneNumber(String input) {
|
||||
return super.validate(input);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.locale.Res;
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/*
|
||||
* BIC information taken from German wikipedia (2017-01-30)
|
||||
*
|
||||
* length 8 or 11 characters
|
||||
* General format: BBBB CC LL (bbb)
|
||||
* with B - Bank code
|
||||
* C - Country code
|
||||
* L - Location code
|
||||
* b - branch code (if applicable)
|
||||
*
|
||||
* B and C must be letters
|
||||
* first L cannot be 0 or 1, second L cannot be O (upper case 'o')
|
||||
* bbb cannot begin with X, unless it is XXX
|
||||
*/
|
||||
|
||||
// TODO Special letters like ä, å, ... are not detected as invalid
|
||||
|
||||
public final class BICValidator extends InputValidator {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Public methods
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
// TODO Add validation for primary and secondary IDs according to the selected type
|
||||
|
||||
// IBAN max 34 chars
|
||||
// bic: 8 or 11 chars
|
||||
|
||||
// check ensure length 8 or 11
|
||||
if (!isStringWithFixedLength(input, 8) && !isStringWithFixedLength(input, 11))
|
||||
return new ValidationResult(false, Res.get("validation.bic.invalidLength"));
|
||||
|
||||
input = input.toUpperCase(Locale.ROOT);
|
||||
|
||||
// ensure Bank and Country code to be letters only
|
||||
for (int k = 0; k < 6; k++) {
|
||||
if (!Character.isLetter(input.charAt(k)))
|
||||
return new ValidationResult(false, Res.get("validation.bic.letters"));
|
||||
}
|
||||
|
||||
// ensure location code starts not with 0 or 1 and ends not with O
|
||||
char ch = input.charAt(6);
|
||||
if (ch == '0' || ch == '1' || input.charAt(7) == 'O')
|
||||
return new ValidationResult(false, Res.get("validation.bic.invalidLocationCode"));
|
||||
|
||||
if (input.startsWith("REVO"))
|
||||
return new ValidationResult(false, Res.get("validation.bic.sepaRevolutBic"));
|
||||
|
||||
|
||||
// check complete for 8 char BIC
|
||||
if (input.length() == 8)
|
||||
return new ValidationResult(true);
|
||||
|
||||
// ensure branch code does not start with X unless it is XXX
|
||||
if (input.charAt(8) == 'X')
|
||||
if (input.charAt(9) != 'X' || input.charAt(10) != 'X')
|
||||
return new ValidationResult(false, Res.get("validation.bic.invalidBranchCode"));
|
||||
|
||||
return new ValidationResult(true);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Private methods
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.locale.BankUtil;
|
||||
import bisq.core.locale.Res;
|
||||
|
||||
public final class BankIdValidator extends BankValidator {
|
||||
public BankIdValidator(String countryCode) {
|
||||
super(countryCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
int length;
|
||||
|
||||
switch (countryCode) {
|
||||
case "CA":
|
||||
length = 3;
|
||||
if (isNumberWithFixedLength(input, length))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.bankIdNumber", getLabel(), length));
|
||||
case "HK":
|
||||
length = 3;
|
||||
if (isNumberWithFixedLength(input, length))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.bankIdNumber", getLabel(), length));
|
||||
default:
|
||||
return super.validate(input);
|
||||
}
|
||||
}
|
||||
|
||||
private String getLabel() {
|
||||
String label = BankUtil.getBankIdLabel(countryCode);
|
||||
return label.substring(0, label.length() - 1);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
|
||||
public abstract class BankValidator extends InputValidator {
|
||||
protected String countryCode = "";
|
||||
|
||||
public BankValidator() {
|
||||
super();
|
||||
}
|
||||
|
||||
public BankValidator(String countryCode) {
|
||||
this.countryCode = countryCode;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.locale.BankUtil;
|
||||
import bisq.core.locale.Res;
|
||||
|
||||
public final class BranchIdValidator extends BankValidator {
|
||||
|
||||
public BranchIdValidator(String countryCode) {
|
||||
super(countryCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
int length;
|
||||
switch (countryCode) {
|
||||
case "GB":
|
||||
length = 6;
|
||||
if (isNumberWithFixedLength(input, length))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
|
||||
case "US":
|
||||
length = 9;
|
||||
if (isNumberWithFixedLength(input, length))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
|
||||
case "BR":
|
||||
if (isStringInRange(input, 2, 6))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.sortCodeChars", getLabel(), "2 - 6"));
|
||||
case "AU":
|
||||
length = 6;
|
||||
if (isNumberWithFixedLength(input, length))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.sortCodeChars", getLabel(), length));
|
||||
case "CA":
|
||||
length = 5;
|
||||
if (isNumberWithFixedLength(input, length))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
|
||||
case "AR":
|
||||
length = 4;
|
||||
if(isNumberWithFixedLength(input, length))
|
||||
return super.validate(input);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.sortCodeNumber", getLabel(), length));
|
||||
default:
|
||||
return super.validate(input);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String getLabel() {
|
||||
return BankUtil.getBranchIdLabel(countryCode);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.btc.wallet.Restrictions;
|
||||
import bisq.core.locale.Res;
|
||||
import bisq.core.util.FormattingUtils;
|
||||
import bisq.core.util.coin.CoinFormatter;
|
||||
import bisq.core.util.validation.NumberValidator;
|
||||
|
||||
import org.bitcoinj.core.Coin;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class BtcValidator extends NumberValidator {
|
||||
|
||||
protected final CoinFormatter formatter;
|
||||
|
||||
@Nullable
|
||||
@Setter
|
||||
protected Coin minValue;
|
||||
|
||||
@Nullable
|
||||
@Setter
|
||||
protected Coin maxValue;
|
||||
|
||||
@Nullable
|
||||
@Setter
|
||||
@Getter
|
||||
protected Coin maxTradeLimit;
|
||||
|
||||
@Inject
|
||||
public BtcValidator(@Named(FormattingUtils.BTC_FORMATTER_KEY) CoinFormatter formatter) {
|
||||
this.formatter = formatter;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
ValidationResult result = validateIfNotEmpty(input);
|
||||
if (result.isValid) {
|
||||
input = cleanInput(input);
|
||||
result = validateIfNumber(input);
|
||||
}
|
||||
|
||||
if (result.isValid) {
|
||||
result = result.andValidation(input,
|
||||
this::validateIfNotZero,
|
||||
this::validateIfNotNegative,
|
||||
this::validateIfNotFractionalBtcValue,
|
||||
this::validateIfNotExceedsMaxTradeLimit,
|
||||
this::validateIfNotExceedsMaxBtcValue,
|
||||
this::validateIfNotUnderMinValue,
|
||||
this::validateIfAboveDust);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
protected ValidationResult validateIfAboveDust(String input) {
|
||||
try {
|
||||
final Coin coin = Coin.parseCoin(input);
|
||||
if (Restrictions.isAboveDust(coin))
|
||||
return new ValidationResult(true);
|
||||
else
|
||||
return new ValidationResult(false, Res.get("validation.amountBelowDust",
|
||||
formatter.formatCoinWithCode(Restrictions.getMinNonDustOutput())));
|
||||
} catch (Throwable t) {
|
||||
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
protected ValidationResult validateIfNotFractionalBtcValue(String input) {
|
||||
try {
|
||||
BigDecimal bd = new BigDecimal(input);
|
||||
final BigDecimal satoshis = bd.movePointRight(8);
|
||||
if (satoshis.scale() > 0)
|
||||
return new ValidationResult(false, Res.get("validation.btc.fraction"));
|
||||
else
|
||||
return new ValidationResult(true);
|
||||
} catch (Throwable t) {
|
||||
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
protected ValidationResult validateIfNotExceedsMaxBtcValue(String input) {
|
||||
try {
|
||||
final Coin coin = Coin.parseCoin(input);
|
||||
if (maxValue != null && coin.compareTo(maxValue) > 0)
|
||||
return new ValidationResult(false, Res.get("validation.btc.toLarge", formatter.formatCoinWithCode(maxValue)));
|
||||
else
|
||||
return new ValidationResult(true);
|
||||
} catch (Throwable t) {
|
||||
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
protected ValidationResult validateIfNotExceedsMaxTradeLimit(String input) {
|
||||
try {
|
||||
final Coin coin = Coin.parseCoin(input);
|
||||
if (maxTradeLimit != null && coin.compareTo(maxTradeLimit) > 0)
|
||||
return new ValidationResult(false, Res.get("validation.btc.exceedsMaxTradeLimit", formatter.formatCoinWithCode(maxTradeLimit)));
|
||||
else
|
||||
return new ValidationResult(true);
|
||||
} catch (Throwable t) {
|
||||
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
protected ValidationResult validateIfNotUnderMinValue(String input) {
|
||||
try {
|
||||
final Coin coin = Coin.parseCoin(input);
|
||||
if (minValue != null && coin.compareTo(minValue) < 0)
|
||||
return new ValidationResult(false, Res.get("validation.btc.toSmall", formatter.formatCoinWithCode(minValue)));
|
||||
else
|
||||
return new ValidationResult(true);
|
||||
} catch (Throwable t) {
|
||||
return new ValidationResult(false, Res.get("validation.invalidInput", t.getMessage()));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.locale.Res;
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
import bisq.core.util.validation.RegexValidator;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
public class CapitualValidator extends InputValidator {
|
||||
private final RegexValidator regexValidator;
|
||||
|
||||
@Inject
|
||||
public CapitualValidator(RegexValidator regexValidator) {
|
||||
regexValidator.setPattern("CAP-[A-Za-z0-9]{6}");
|
||||
regexValidator.setErrorMessage(Res.get("validation.capitual.invalidFormat"));
|
||||
this.regexValidator = regexValidator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
|
||||
return regexValidator.validate(input);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* This file is part of Haveno.
|
||||
*
|
||||
* Haveno is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Haveno is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Haveno. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.core.payment.validation;
|
||||
|
||||
import bisq.core.util.validation.InputValidator;
|
||||
|
||||
public final class ChaseQuickPayValidator extends InputValidator {
|
||||
|
||||
private final EmailValidator emailValidator;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Public methods
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public ChaseQuickPayValidator() {
|
||||
super();
|
||||
emailValidator = new EmailValidator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ValidationResult validate(String input) {
|
||||
return emailValidator.validate(input);
|
||||
}
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue