From 9a5893b5d53a1cc8ddd184339cbccaaa4d285053 Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Sat, 21 Jun 2025 07:49:34 -0400 Subject: [PATCH 1/9] fix error on export table columns --- .../haveno/desktop/main/funds/locked/LockedView.java | 2 +- .../desktop/main/funds/reserved/ReservedView.java | 2 +- .../main/funds/transactions/TransactionsView.java | 2 +- .../desktop/main/market/trades/TradesChartsView.java | 2 +- desktop/src/main/java/haveno/desktop/util/GUIUtil.java | 10 ++++++++++ 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/desktop/src/main/java/haveno/desktop/main/funds/locked/LockedView.java b/desktop/src/main/java/haveno/desktop/main/funds/locked/LockedView.java index 5570ca1bef..8cb80b16f7 100644 --- a/desktop/src/main/java/haveno/desktop/main/funds/locked/LockedView.java +++ b/desktop/src/main/java/haveno/desktop/main/funds/locked/LockedView.java @@ -165,7 +165,7 @@ public class LockedView extends ActivatableView { numItems.setText(Res.get("shared.numItemsLabel", sortedList.size())); exportButton.setOnAction(event -> { - ObservableList> tableColumns = tableView.getColumns(); + ObservableList> tableColumns = GUIUtil.getContentColumns(tableView); int reportColumns = tableColumns.size(); CSVEntryConverter headerConverter = item -> { String[] columns = new String[reportColumns]; diff --git a/desktop/src/main/java/haveno/desktop/main/funds/reserved/ReservedView.java b/desktop/src/main/java/haveno/desktop/main/funds/reserved/ReservedView.java index 3ed2dfea85..e71fae8d89 100644 --- a/desktop/src/main/java/haveno/desktop/main/funds/reserved/ReservedView.java +++ b/desktop/src/main/java/haveno/desktop/main/funds/reserved/ReservedView.java @@ -165,7 +165,7 @@ public class ReservedView extends ActivatableView { numItems.setText(Res.get("shared.numItemsLabel", sortedList.size())); exportButton.setOnAction(event -> { - ObservableList> tableColumns = tableView.getColumns(); + ObservableList> tableColumns = GUIUtil.getContentColumns(tableView); int reportColumns = tableColumns.size(); CSVEntryConverter headerConverter = item -> { String[] columns = new String[reportColumns]; diff --git a/desktop/src/main/java/haveno/desktop/main/funds/transactions/TransactionsView.java b/desktop/src/main/java/haveno/desktop/main/funds/transactions/TransactionsView.java index 66434a8663..eb97c325ab 100644 --- a/desktop/src/main/java/haveno/desktop/main/funds/transactions/TransactionsView.java +++ b/desktop/src/main/java/haveno/desktop/main/funds/transactions/TransactionsView.java @@ -203,7 +203,7 @@ public class TransactionsView extends ActivatableView { numItems.setText(Res.get("shared.numItemsLabel", sortedDisplayedTransactions.size())); exportButton.setOnAction(event -> { - final ObservableList> tableColumns = tableView.getColumns(); + final ObservableList> tableColumns = GUIUtil.getContentColumns(tableView); final int reportColumns = tableColumns.size() - 1; // CSV report excludes the last column (an icon) CSVEntryConverter headerConverter = item -> { String[] columns = new String[reportColumns]; diff --git a/desktop/src/main/java/haveno/desktop/main/market/trades/TradesChartsView.java b/desktop/src/main/java/haveno/desktop/main/market/trades/TradesChartsView.java index 7470cf1c4b..bb75c80684 100644 --- a/desktop/src/main/java/haveno/desktop/main/market/trades/TradesChartsView.java +++ b/desktop/src/main/java/haveno/desktop/main/market/trades/TradesChartsView.java @@ -397,7 +397,7 @@ public class TradesChartsView extends ActivatableViewAndModel> tableColumns = tableView.getColumns(); + ObservableList> tableColumns = GUIUtil.getContentColumns(tableView); int reportColumns = tableColumns.size() + 1; boolean showAllTradeCurrencies = model.showAllTradeCurrenciesProperty.get(); diff --git a/desktop/src/main/java/haveno/desktop/util/GUIUtil.java b/desktop/src/main/java/haveno/desktop/util/GUIUtil.java index 3097780c1a..4aad28f464 100644 --- a/desktop/src/main/java/haveno/desktop/util/GUIUtil.java +++ b/desktop/src/main/java/haveno/desktop/util/GUIUtil.java @@ -1281,6 +1281,16 @@ public class GUIUtil { } } + public static ObservableList> getContentColumns(TableView tableView) { + ObservableList> contentColumns = FXCollections.observableArrayList(); + for (TableColumn column : tableView.getColumns()) { + if (!column.getStyleClass().contains("first-column") && !column.getStyleClass().contains("last-column")) { + contentColumns.add(column); + } + } + return contentColumns; + } + public static ImageView getCurrencyIcon(String currencyCode) { return getCurrencyIcon(currencyCode, 24); } From 80faa66fd6ff91f2f565110ae4a813a25f6c6d60 Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Thu, 19 Jun 2025 09:15:12 -0400 Subject: [PATCH 2/9] support wechat pay grpc api --- .../java/haveno/core/api/model/PaymentAccountForm.java | 3 ++- .../main/java/haveno/core/payment/WeChatPayAccount.java | 9 ++++++++- .../java/haveno/core/payment/payload/PaymentMethod.java | 3 ++- proto/src/main/proto/pb.proto | 1 + 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java index 6b1b494047..239f17abd4 100644 --- a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java +++ b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java @@ -78,7 +78,8 @@ public final class PaymentAccountForm implements PersistablePayload { CASH_APP, PAYPAL, VENMO, - PAYSAFE; + PAYSAFE, + WECHAT_PAY; public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) { return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name()); diff --git a/core/src/main/java/haveno/core/payment/WeChatPayAccount.java b/core/src/main/java/haveno/core/payment/WeChatPayAccount.java index 297968ef0c..9071aa7aea 100644 --- a/core/src/main/java/haveno/core/payment/WeChatPayAccount.java +++ b/core/src/main/java/haveno/core/payment/WeChatPayAccount.java @@ -38,6 +38,13 @@ public final class WeChatPayAccount extends PaymentAccount { new TraditionalCurrency("GBP") ); + private static final List INPUT_FIELD_IDS = List.of( + PaymentAccountFormField.FieldId.ACCOUNT_NAME, + PaymentAccountFormField.FieldId.ACCOUNT_NR, + PaymentAccountFormField.FieldId.TRADE_CURRENCIES, + PaymentAccountFormField.FieldId.SALT + ); + public WeChatPayAccount() { super(PaymentMethod.WECHAT_PAY); } @@ -54,7 +61,7 @@ public final class WeChatPayAccount extends PaymentAccount { @Override public @NonNull List getInputFieldIds() { - throw new RuntimeException("Not implemented"); + return INPUT_FIELD_IDS; } public void setAccountNr(String accountNr) { diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java index 4a8246fe78..e3830d8ddb 100644 --- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java @@ -369,7 +369,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList()); } diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 022031d08d..45fe43415d 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -1903,6 +1903,7 @@ message PaymentAccountForm { PAYPAL = 17; VENMO = 18; PAYSAFE = 19; + WECHAT_PAY = 20; } FormId id = 1; repeated PaymentAccountFormField fields = 2; From 84c1a193761c723e90ac6c0918baba1e90515acf Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Thu, 19 Jun 2025 09:24:26 -0400 Subject: [PATCH 3/9] support alipay grpc api --- .../java/haveno/core/api/model/PaymentAccountForm.java | 3 ++- .../src/main/java/haveno/core/payment/AliPayAccount.java | 9 ++++++++- .../java/haveno/core/payment/payload/PaymentMethod.java | 3 ++- proto/src/main/proto/pb.proto | 1 + 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java index 239f17abd4..d13a9b4300 100644 --- a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java +++ b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java @@ -79,7 +79,8 @@ public final class PaymentAccountForm implements PersistablePayload { PAYPAL, VENMO, PAYSAFE, - WECHAT_PAY; + WECHAT_PAY, + ALI_PAY; public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) { return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name()); diff --git a/core/src/main/java/haveno/core/payment/AliPayAccount.java b/core/src/main/java/haveno/core/payment/AliPayAccount.java index 1bff92b5cd..af2f617313 100644 --- a/core/src/main/java/haveno/core/payment/AliPayAccount.java +++ b/core/src/main/java/haveno/core/payment/AliPayAccount.java @@ -60,6 +60,13 @@ public final class AliPayAccount extends PaymentAccount { new TraditionalCurrency("ZAR") ); + private static final List INPUT_FIELD_IDS = List.of( + PaymentAccountFormField.FieldId.ACCOUNT_NAME, + PaymentAccountFormField.FieldId.ACCOUNT_NR, + PaymentAccountFormField.FieldId.TRADE_CURRENCIES, + PaymentAccountFormField.FieldId.SALT + ); + public AliPayAccount() { super(PaymentMethod.ALI_PAY); setSingleTradeCurrency(SUPPORTED_CURRENCIES.get(0)); @@ -77,7 +84,7 @@ public final class AliPayAccount extends PaymentAccount { @Override public @NonNull List getInputFieldIds() { - throw new RuntimeException("Not implemented"); + return INPUT_FIELD_IDS; } public void setAccountNr(String accountNr) { diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java index e3830d8ddb..d4a67ef9e1 100644 --- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java @@ -370,7 +370,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList()); } diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 45fe43415d..94ffb0447e 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -1904,6 +1904,7 @@ message PaymentAccountForm { VENMO = 18; PAYSAFE = 19; WECHAT_PAY = 20; + ALI_PAY = 21; } FormId id = 1; repeated PaymentAccountFormField fields = 2; From cf4956f45868053e72a4f727bd0046518444de3b Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Thu, 19 Jun 2025 16:05:24 -0400 Subject: [PATCH 4/9] support swish payment account over grpc api --- .../core/api/model/PaymentAccountForm.java | 3 ++- .../haveno/core/payment/PaymentAccount.java | 4 +++- .../haveno/core/payment/SwishAccount.java | 23 ++++++++++++++++++- .../core/payment/payload/PaymentMethod.java | 3 ++- proto/src/main/proto/pb.proto | 1 + 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java index d13a9b4300..bd23e18ee7 100644 --- a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java +++ b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java @@ -80,7 +80,8 @@ public final class PaymentAccountForm implements PersistablePayload { VENMO, PAYSAFE, WECHAT_PAY, - ALI_PAY; + ALI_PAY, + SWISH; public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) { return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name()); diff --git a/core/src/main/java/haveno/core/payment/PaymentAccount.java b/core/src/main/java/haveno/core/payment/PaymentAccount.java index 14dd88482b..61a332336d 100644 --- a/core/src/main/java/haveno/core/payment/PaymentAccount.java +++ b/core/src/main/java/haveno/core/payment/PaymentAccount.java @@ -755,7 +755,9 @@ public abstract class PaymentAccount implements PersistablePayload { field.setLabel(Res.get("payment.swift.swiftCode.intermediary")); break; case MOBILE_NR: - throw new IllegalArgumentException("Not implemented"); + field.setComponent(PaymentAccountFormField.Component.TEXT); + field.setLabel(Res.get("payment.mobile")); + break; case NATIONAL_ACCOUNT_ID: throw new IllegalArgumentException("Not implemented"); case PAYID: diff --git a/core/src/main/java/haveno/core/payment/SwishAccount.java b/core/src/main/java/haveno/core/payment/SwishAccount.java index a726a9a14a..eb2e10de87 100644 --- a/core/src/main/java/haveno/core/payment/SwishAccount.java +++ b/core/src/main/java/haveno/core/payment/SwishAccount.java @@ -17,12 +17,14 @@ package haveno.core.payment; +import haveno.core.api.model.PaymentAccountForm; import haveno.core.api.model.PaymentAccountFormField; import haveno.core.locale.TraditionalCurrency; import haveno.core.locale.TradeCurrency; import haveno.core.payment.payload.PaymentAccountPayload; import haveno.core.payment.payload.PaymentMethod; import haveno.core.payment.payload.SwishAccountPayload; +import haveno.core.payment.validation.SwishValidator; import lombok.EqualsAndHashCode; import lombok.NonNull; @@ -33,6 +35,13 @@ public final class SwishAccount extends PaymentAccount { public static final List SUPPORTED_CURRENCIES = List.of(new TraditionalCurrency("SEK")); + private static final List INPUT_FIELD_IDS = List.of( + PaymentAccountFormField.FieldId.ACCOUNT_NAME, + PaymentAccountFormField.FieldId.MOBILE_NR, + PaymentAccountFormField.FieldId.HOLDER_NAME, + PaymentAccountFormField.FieldId.SALT + ); + public SwishAccount() { super(PaymentMethod.SWISH); setSingleTradeCurrency(SUPPORTED_CURRENCIES.get(0)); @@ -50,7 +59,7 @@ public final class SwishAccount extends PaymentAccount { @Override public @NonNull List getInputFieldIds() { - throw new RuntimeException("Not implemented"); + return INPUT_FIELD_IDS; } public void setMobileNr(String mobileNr) { @@ -68,4 +77,16 @@ public final class SwishAccount extends PaymentAccount { public String getHolderName() { return ((SwishAccountPayload) paymentAccountPayload).getHolderName(); } + + @Override + public void validateFormField(PaymentAccountForm form, PaymentAccountFormField.FieldId fieldId, String value) { + switch (fieldId) { + case MOBILE_NR: + processValidationResult(new SwishValidator().validate(value)); + break; + default: + super.validateFormField(form, fieldId, value); + break; + } + } } diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java index d4a67ef9e1..d3c05d5d48 100644 --- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java @@ -371,7 +371,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList()); } diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 94ffb0447e..2df4245b71 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -1905,6 +1905,7 @@ message PaymentAccountForm { PAYSAFE = 19; WECHAT_PAY = 20; ALI_PAY = 21; + SWISH = 22; } FormId id = 1; repeated PaymentAccountFormField fields = 2; From 425dc1dd4d529e36adbb75a42c8070eb2f9a7d58 Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Fri, 20 Jun 2025 08:01:12 -0400 Subject: [PATCH 5/9] support wise usd payment account over grpc api --- .../core/api/model/PaymentAccountForm.java | 3 ++- .../haveno/core/payment/PaymentAccount.java | 11 +++++---- .../core/payment/TransferwiseUsdAccount.java | 23 ++++++++++++++++--- .../core/payment/payload/PaymentMethod.java | 3 ++- .../TransferwiseUsdAccountPayload.java | 10 ++++---- .../paymentmethods/TransferwiseUsdForm.java | 4 ++-- proto/src/main/proto/pb.proto | 3 ++- 7 files changed, 40 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java index bd23e18ee7..37da866031 100644 --- a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java +++ b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java @@ -81,7 +81,8 @@ public final class PaymentAccountForm implements PersistablePayload { PAYSAFE, WECHAT_PAY, ALI_PAY, - SWISH; + SWISH, + TRANSFERWISE_USD; public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) { return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name()); diff --git a/core/src/main/java/haveno/core/payment/PaymentAccount.java b/core/src/main/java/haveno/core/payment/PaymentAccount.java index 61a332336d..0f32918fed 100644 --- a/core/src/main/java/haveno/core/payment/PaymentAccount.java +++ b/core/src/main/java/haveno/core/payment/PaymentAccount.java @@ -518,7 +518,8 @@ public abstract class PaymentAccount implements PersistablePayload { case EXTRA_INFO: break; case HOLDER_ADDRESS: - throw new IllegalArgumentException("Not implemented"); + processValidationResult(new LengthValidator(0, 100).validate(value)); + break; case HOLDER_EMAIL: throw new IllegalArgumentException("Not implemented"); case HOLDER_NAME: @@ -668,11 +669,11 @@ public abstract class PaymentAccount implements PersistablePayload { break; case BENEFICIARY_ACCOUNT_NR: field.setComponent(PaymentAccountFormField.Component.TEXT); - field.setLabel(Res.get("payment.swift.account")); + field.setLabel(Res.get("payment.swift.account")); // TODO: this is specific to swift break; case BENEFICIARY_ADDRESS: field.setComponent(PaymentAccountFormField.Component.TEXTAREA); - field.setLabel(Res.get("payment.swift.address.beneficiary")); + field.setLabel(Res.get("payment.swift.address.beneficiary")); // TODO: this is specific to swift break; case BENEFICIARY_CITY: field.setComponent(PaymentAccountFormField.Component.TEXT); @@ -717,7 +718,9 @@ public abstract class PaymentAccount implements PersistablePayload { field.setLabel(Res.get("payment.shared.optionalExtra")); break; case HOLDER_ADDRESS: - throw new IllegalArgumentException("Not implemented"); + field.setComponent(PaymentAccountFormField.Component.TEXTAREA); + field.setLabel(Res.get("payment.account.owner.address")); + break; case HOLDER_EMAIL: throw new IllegalArgumentException("Not implemented"); case HOLDER_NAME: diff --git a/core/src/main/java/haveno/core/payment/TransferwiseUsdAccount.java b/core/src/main/java/haveno/core/payment/TransferwiseUsdAccount.java index 94491ddbf0..2702ffbaca 100644 --- a/core/src/main/java/haveno/core/payment/TransferwiseUsdAccount.java +++ b/core/src/main/java/haveno/core/payment/TransferwiseUsdAccount.java @@ -19,6 +19,7 @@ package haveno.core.payment; import haveno.core.api.model.PaymentAccountFormField; import haveno.core.locale.TraditionalCurrency; +import haveno.core.locale.Res; import haveno.core.locale.TradeCurrency; import haveno.core.payment.payload.PaymentAccountPayload; import haveno.core.payment.payload.PaymentMethod; @@ -33,6 +34,15 @@ public final class TransferwiseUsdAccount extends CountryBasedPaymentAccount { public static final List SUPPORTED_CURRENCIES = List.of(new TraditionalCurrency("USD")); + private static final List INPUT_FIELD_IDS = List.of( + PaymentAccountFormField.FieldId.EMAIL, + PaymentAccountFormField.FieldId.HOLDER_NAME, + PaymentAccountFormField.FieldId.HOLDER_ADDRESS, + PaymentAccountFormField.FieldId.ACCOUNT_NAME, + PaymentAccountFormField.FieldId.COUNTRY, + PaymentAccountFormField.FieldId.SALT + ); + public TransferwiseUsdAccount() { super(PaymentMethod.TRANSFERWISE_USD); // this payment method is currently restricted to United States/USD @@ -61,11 +71,11 @@ public final class TransferwiseUsdAccount extends CountryBasedPaymentAccount { } public void setBeneficiaryAddress(String address) { - ((TransferwiseUsdAccountPayload) paymentAccountPayload).setBeneficiaryAddress(address); + ((TransferwiseUsdAccountPayload) paymentAccountPayload).setHolderAddress(address); } public String getBeneficiaryAddress() { - return ((TransferwiseUsdAccountPayload) paymentAccountPayload).getBeneficiaryAddress(); + return ((TransferwiseUsdAccountPayload) paymentAccountPayload).getHolderAddress(); } @Override @@ -90,6 +100,13 @@ public final class TransferwiseUsdAccount extends CountryBasedPaymentAccount { @Override public @NotNull List getInputFieldIds() { - throw new RuntimeException("Not implemented"); + return INPUT_FIELD_IDS; + } + + @Override + protected PaymentAccountFormField getEmptyFormField(PaymentAccountFormField.FieldId fieldId) { + var field = super.getEmptyFormField(fieldId); + if (field.getId() == PaymentAccountFormField.FieldId.HOLDER_ADDRESS) field.setLabel(field.getLabel() + " " + Res.get("payment.transferwiseUsd.address")); + return field; } } diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java index d3c05d5d48..f48aeed3c9 100644 --- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java @@ -372,7 +372,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList()); } diff --git a/core/src/main/java/haveno/core/payment/payload/TransferwiseUsdAccountPayload.java b/core/src/main/java/haveno/core/payment/payload/TransferwiseUsdAccountPayload.java index 1daba610db..bdc3243a30 100644 --- a/core/src/main/java/haveno/core/payment/payload/TransferwiseUsdAccountPayload.java +++ b/core/src/main/java/haveno/core/payment/payload/TransferwiseUsdAccountPayload.java @@ -39,7 +39,7 @@ import java.util.Map; public final class TransferwiseUsdAccountPayload extends CountryBasedPaymentAccountPayload { private String email = ""; private String holderName = ""; - private String beneficiaryAddress = ""; + private String holderAddress = ""; public TransferwiseUsdAccountPayload(String paymentMethod, String id) { super(paymentMethod, id); @@ -51,7 +51,7 @@ public final class TransferwiseUsdAccountPayload extends CountryBasedPaymentAcco List acceptedCountryCodes, String email, String holderName, - String beneficiaryAddress, + String holderAddress, long maxTradePeriod, Map excludeFromJsonDataMap) { super(paymentMethod, @@ -63,7 +63,7 @@ public final class TransferwiseUsdAccountPayload extends CountryBasedPaymentAcco this.email = email; this.holderName = holderName; - this.beneficiaryAddress = beneficiaryAddress; + this.holderAddress = holderAddress; } @Override @@ -71,7 +71,7 @@ public final class TransferwiseUsdAccountPayload extends CountryBasedPaymentAcco protobuf.TransferwiseUsdAccountPayload.Builder builder = protobuf.TransferwiseUsdAccountPayload.newBuilder() .setEmail(email) .setHolderName(holderName) - .setBeneficiaryAddress(beneficiaryAddress); + .setHolderAddress(holderAddress); final protobuf.CountryBasedPaymentAccountPayload.Builder countryBasedPaymentAccountPayload = getPaymentAccountPayloadBuilder() .getCountryBasedPaymentAccountPayloadBuilder() .setTransferwiseUsdAccountPayload(builder); @@ -89,7 +89,7 @@ public final class TransferwiseUsdAccountPayload extends CountryBasedPaymentAcco new ArrayList<>(countryBasedPaymentAccountPayload.getAcceptedCountryCodesList()), accountPayloadPB.getEmail(), accountPayloadPB.getHolderName(), - accountPayloadPB.getBeneficiaryAddress(), + accountPayloadPB.getHolderAddress(), proto.getMaxTradePeriod(), new HashMap<>(proto.getExcludeFromJsonDataMap())); } diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/TransferwiseUsdForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/TransferwiseUsdForm.java index 922b5aec75..6ed90bfebf 100644 --- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/TransferwiseUsdForm.java +++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/TransferwiseUsdForm.java @@ -57,7 +57,7 @@ public class TransferwiseUsdForm extends PaymentMethodForm { addCompactTopLabelTextFieldWithCopyIcon(gridPane, ++gridRow, 1, Res.get("payment.email"), ((TransferwiseUsdAccountPayload) paymentAccountPayload).getEmail()); - String address = ((TransferwiseUsdAccountPayload) paymentAccountPayload).getBeneficiaryAddress(); + String address = ((TransferwiseUsdAccountPayload) paymentAccountPayload).getHolderAddress(); if (address.length() > 0) { TextArea textAddress = addCompactTopLabelTextArea(gridPane, gridRow, 0, Res.get("payment.account.address"), "").second; textAddress.setMinHeight(70); @@ -96,7 +96,7 @@ public class TransferwiseUsdForm extends PaymentMethodForm { updateFromInputs(); }); - String addressLabel = Res.get("payment.account.owner.address") + Res.get("payment.transferwiseUsd.address"); + String addressLabel = Res.get("payment.account.owner.address") + " " + Res.get("payment.transferwiseUsd.address"); TextArea addressTextArea = addTopLabelTextArea(gridPane, ++gridRow, addressLabel, addressLabel).second; addressTextArea.setMinHeight(70); addressTextArea.textProperty().addListener((ov, oldValue, newValue) -> { diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 2df4245b71..eb82fdf203 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -1163,7 +1163,7 @@ message TransferwiseAccountPayload { message TransferwiseUsdAccountPayload { string email = 1; string holder_name = 2; - string beneficiary_address = 3; + string holder_address = 3; } message PayseraAccountPayload { @@ -1906,6 +1906,7 @@ message PaymentAccountForm { WECHAT_PAY = 20; ALI_PAY = 21; SWISH = 22; + TRANSFERWISE_USD = 23; } FormId id = 1; repeated PaymentAccountFormField fields = 2; From 49005d604e8424d01f2ec66f147b3f7ccb229956 Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Fri, 20 Jun 2025 15:57:11 -0400 Subject: [PATCH 6/9] support amazon e-gift card payment account over grpc api --- .../core/api/model/PaymentAccountForm.java | 3 ++- .../core/payment/AmazonGiftCardAccount.java | 17 ++++++++++++++++- .../core/payment/PaymentAccountTypeAdapter.java | 3 +++ .../core/payment/payload/PaymentMethod.java | 3 ++- .../paymentmethods/AmazonGiftCardForm.java | 2 +- proto/src/main/proto/pb.proto | 1 + 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java index 37da866031..d280ced31f 100644 --- a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java +++ b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java @@ -82,7 +82,8 @@ public final class PaymentAccountForm implements PersistablePayload { WECHAT_PAY, ALI_PAY, SWISH, - TRANSFERWISE_USD; + TRANSFERWISE_USD, + AMAZON_GIFT_CARD; public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) { return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name()); diff --git a/core/src/main/java/haveno/core/payment/AmazonGiftCardAccount.java b/core/src/main/java/haveno/core/payment/AmazonGiftCardAccount.java index cb3eb35c70..65cf5719ae 100644 --- a/core/src/main/java/haveno/core/payment/AmazonGiftCardAccount.java +++ b/core/src/main/java/haveno/core/payment/AmazonGiftCardAccount.java @@ -46,6 +46,14 @@ public final class AmazonGiftCardAccount extends PaymentAccount { new TraditionalCurrency("USD") ); + private static final List INPUT_FIELD_IDS = List.of( + PaymentAccountFormField.FieldId.EMAIL_OR_MOBILE_NR, + PaymentAccountFormField.FieldId.COUNTRY, + PaymentAccountFormField.FieldId.TRADE_CURRENCIES, + PaymentAccountFormField.FieldId.ACCOUNT_NAME, + PaymentAccountFormField.FieldId.SALT + ); + @Nullable private Country country; @@ -65,7 +73,7 @@ public final class AmazonGiftCardAccount extends PaymentAccount { @Override public @NotNull List getInputFieldIds() { - throw new RuntimeException("Not implemented"); + return INPUT_FIELD_IDS; } public String getEmailOrMobileNr() { @@ -97,4 +105,11 @@ public final class AmazonGiftCardAccount extends PaymentAccount { private AmazonGiftCardAccountPayload getAmazonGiftCardAccountPayload() { return (AmazonGiftCardAccountPayload) paymentAccountPayload; } + + @Override + protected PaymentAccountFormField getEmptyFormField(PaymentAccountFormField.FieldId fieldId) { + var field = super.getEmptyFormField(fieldId); + if (field.getId() == PaymentAccountFormField.FieldId.TRADE_CURRENCIES) field.setComponent(PaymentAccountFormField.Component.SELECT_ONE); + return field; + } } diff --git a/core/src/main/java/haveno/core/payment/PaymentAccountTypeAdapter.java b/core/src/main/java/haveno/core/payment/PaymentAccountTypeAdapter.java index 0226fe4530..6ca6ea2bed 100644 --- a/core/src/main/java/haveno/core/payment/PaymentAccountTypeAdapter.java +++ b/core/src/main/java/haveno/core/payment/PaymentAccountTypeAdapter.java @@ -50,6 +50,7 @@ import static haveno.common.util.Utilities.decodeFromHex; import static haveno.core.locale.CountryUtil.findCountryByCode; import static haveno.core.locale.CurrencyUtil.getTradeCurrenciesInList; import static haveno.core.locale.CurrencyUtil.getTradeCurrency; +import static haveno.core.payment.payload.PaymentMethod.AMAZON_GIFT_CARD_ID; import static haveno.core.payment.payload.PaymentMethod.MONEY_GRAM_ID; import static java.lang.String.format; import static java.util.Arrays.stream; @@ -438,6 +439,8 @@ class PaymentAccountTypeAdapter extends TypeAdapter { // account.setSingleTradeCurrency(fiatCurrency); } else if (account.hasPaymentMethodWithId(MONEY_GRAM_ID)) { ((MoneyGramAccount) account).setCountry(country.get()); + } else if (account.hasPaymentMethodWithId(AMAZON_GIFT_CARD_ID)) { + ((AmazonGiftCardAccount) account).setCountry(country.get()); } else { String errMsg = format("cannot set the country on a %s", paymentAccountType.getSimpleName()); diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java index f48aeed3c9..1768848669 100644 --- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java @@ -373,7 +373,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList()); } diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/AmazonGiftCardForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/AmazonGiftCardForm.java index 3bcdc44075..6bd796bf7a 100644 --- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/AmazonGiftCardForm.java +++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/AmazonGiftCardForm.java @@ -120,7 +120,7 @@ public class AmazonGiftCardForm extends PaymentMethodForm { @Override protected void autoFillNameTextField() { - setAccountNameWithString(amazonGiftCardAccount.getEmailOrMobileNr()); + setAccountNameWithString(amazonGiftCardAccount.getEmailOrMobileNr() == null ? "" : amazonGiftCardAccount.getEmailOrMobileNr()); } @Override diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index eb82fdf203..5df4b5324c 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -1907,6 +1907,7 @@ message PaymentAccountForm { ALI_PAY = 21; SWISH = 22; TRANSFERWISE_USD = 23; + AMAZON_GIFT_CARD = 24; } FormId id = 1; repeated PaymentAccountFormField fields = 2; From ae650c6ee1f5117e6ede2125b53e02519ef18ccc Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Fri, 20 Jun 2025 10:57:13 -0400 Subject: [PATCH 7/9] support ach transfer payment account over grpc api --- .../core/api/model/PaymentAccountForm.java | 3 ++- .../core/payment/AchTransferAccount.java | 25 ++++++++++++++++++- .../haveno/core/payment/PaymentAccount.java | 14 ++++++++--- .../core/payment/payload/PaymentMethod.java | 3 ++- proto/src/main/proto/pb.proto | 1 + 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java index d280ced31f..72f9dbc51a 100644 --- a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java +++ b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java @@ -83,7 +83,8 @@ public final class PaymentAccountForm implements PersistablePayload { ALI_PAY, SWISH, TRANSFERWISE_USD, - AMAZON_GIFT_CARD; + AMAZON_GIFT_CARD, + ACH_TRANSFER; public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) { return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name()); diff --git a/core/src/main/java/haveno/core/payment/AchTransferAccount.java b/core/src/main/java/haveno/core/payment/AchTransferAccount.java index 9f04e4e076..8c9c1eee62 100644 --- a/core/src/main/java/haveno/core/payment/AchTransferAccount.java +++ b/core/src/main/java/haveno/core/payment/AchTransferAccount.java @@ -19,6 +19,7 @@ package haveno.core.payment; import haveno.core.api.model.PaymentAccountFormField; import haveno.core.locale.TraditionalCurrency; +import haveno.core.locale.BankUtil; import haveno.core.locale.TradeCurrency; import haveno.core.payment.payload.AchTransferAccountPayload; import haveno.core.payment.payload.BankAccountPayload; @@ -34,6 +35,19 @@ public final class AchTransferAccount extends CountryBasedPaymentAccount impleme public static final List SUPPORTED_CURRENCIES = List.of(new TraditionalCurrency("USD")); + private static final List INPUT_FIELD_IDS = List.of( + PaymentAccountFormField.FieldId.HOLDER_NAME, + PaymentAccountFormField.FieldId.HOLDER_ADDRESS, + PaymentAccountFormField.FieldId.BANK_NAME, + PaymentAccountFormField.FieldId.BRANCH_ID, + PaymentAccountFormField.FieldId.ACCOUNT_NR, + PaymentAccountFormField.FieldId.ACCOUNT_TYPE, + PaymentAccountFormField.FieldId.COUNTRY, + PaymentAccountFormField.FieldId.TRADE_CURRENCIES, + PaymentAccountFormField.FieldId.ACCOUNT_NAME, + PaymentAccountFormField.FieldId.SALT + ); + public AchTransferAccount() { super(PaymentMethod.ACH_TRANSFER); } @@ -79,6 +93,15 @@ public final class AchTransferAccount extends CountryBasedPaymentAccount impleme @Override public @NonNull List getInputFieldIds() { - throw new RuntimeException("Not implemented"); + return INPUT_FIELD_IDS; + } + + @Override + protected PaymentAccountFormField getEmptyFormField(PaymentAccountFormField.FieldId fieldId) { + var field = super.getEmptyFormField(fieldId); + if (field.getId() == PaymentAccountFormField.FieldId.TRADE_CURRENCIES) field.setComponent(PaymentAccountFormField.Component.SELECT_ONE); + if (field.getId() == PaymentAccountFormField.FieldId.BRANCH_ID) field.setLabel(BankUtil.getBranchIdLabel("US")); + if (field.getId() == PaymentAccountFormField.FieldId.ACCOUNT_TYPE) field.setLabel(BankUtil.getAccountTypeLabel("US")); + return field; } } diff --git a/core/src/main/java/haveno/core/payment/PaymentAccount.java b/core/src/main/java/haveno/core/payment/PaymentAccount.java index 0f32918fed..8a7b5f24c1 100644 --- a/core/src/main/java/haveno/core/payment/PaymentAccount.java +++ b/core/src/main/java/haveno/core/payment/PaymentAccount.java @@ -435,7 +435,8 @@ public abstract class PaymentAccount implements PersistablePayload { processValidationResult(new LengthValidator(2, 100).validate(value)); break; case ACCOUNT_TYPE: - throw new IllegalArgumentException("Not implemented"); + processValidationResult(new LengthValidator(2, 100).validate(value)); + break; case ANSWER: throw new IllegalArgumentException("Not implemented"); case BANK_ACCOUNT_NAME: @@ -491,7 +492,8 @@ public abstract class PaymentAccount implements PersistablePayload { processValidationResult(new BICValidator().validate(value)); break; case BRANCH_ID: - throw new IllegalArgumentException("Not implemented"); + processValidationResult(new LengthValidator(2, 34).validate(value)); + break; case CITY: processValidationResult(new LengthValidator(2, 34).validate(value)); break; @@ -624,7 +626,9 @@ public abstract class PaymentAccount implements PersistablePayload { field.setLabel(Res.get("payment.account.owner")); break; case ACCOUNT_TYPE: - throw new IllegalArgumentException("Not implemented"); + field.setComponent(PaymentAccountFormField.Component.SELECT_ONE); + field.setLabel(Res.get("payment.select.account")); + break; case ANSWER: throw new IllegalArgumentException("Not implemented"); case BANK_ACCOUNT_NAME: @@ -692,7 +696,9 @@ public abstract class PaymentAccount implements PersistablePayload { field.setLabel("BIC"); break; case BRANCH_ID: - throw new IllegalArgumentException("Not implemented"); + field.setComponent(PaymentAccountFormField.Component.TEXT); + //field.setLabel("Not implemented"); // expected to be overridden by subclasses + break; case CITY: field.setComponent(PaymentAccountFormField.Component.TEXT); field.setLabel(Res.get("payment.account.city")); diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java index 1768848669..c4226a97b6 100644 --- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java @@ -374,7 +374,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList()); } diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 5df4b5324c..46a6361301 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -1908,6 +1908,7 @@ message PaymentAccountForm { SWISH = 22; TRANSFERWISE_USD = 23; AMAZON_GIFT_CARD = 24; + ACH_TRANSFER = 25; } FormId id = 1; repeated PaymentAccountFormField fields = 2; From 5fb92848c28c10b2f36441d22b872ead3ebb094d Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:41:16 -0400 Subject: [PATCH 8/9] support interac e-transfer payment accounts over grpc api --- .../core/api/CorePaymentAccountsService.java | 11 ++++-- .../core/api/model/PaymentAccountForm.java | 3 +- .../core/payment/InteracETransferAccount.java | 36 +++++++++++++++++-- .../haveno/core/payment/PaymentAccount.java | 8 +++-- .../InteracETransferAccountPayload.java | 16 ++++----- .../core/payment/payload/PaymentMethod.java | 3 +- .../java/haveno/core/trade/HavenoUtils.java | 2 ++ .../paymentmethods/InteracETransferForm.java | 2 +- proto/src/main/proto/pb.proto | 3 +- 9 files changed, 65 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/haveno/core/api/CorePaymentAccountsService.java b/core/src/main/java/haveno/core/api/CorePaymentAccountsService.java index b506a00ac1..b6afd098b7 100644 --- a/core/src/main/java/haveno/core/api/CorePaymentAccountsService.java +++ b/core/src/main/java/haveno/core/api/CorePaymentAccountsService.java @@ -36,6 +36,8 @@ import haveno.core.payment.InstantCryptoCurrencyAccount; import haveno.core.payment.PaymentAccount; import haveno.core.payment.PaymentAccountFactory; import haveno.core.payment.payload.PaymentMethod; +import haveno.core.payment.validation.InteracETransferValidator; +import haveno.core.trade.HavenoUtils; import haveno.core.user.User; import java.io.File; import static java.lang.String.format; @@ -48,19 +50,24 @@ import lombok.extern.slf4j.Slf4j; @Singleton @Slf4j -class CorePaymentAccountsService { +public class CorePaymentAccountsService { private final CoreAccountService accountService; private final AccountAgeWitnessService accountAgeWitnessService; private final User user; + public final InteracETransferValidator interacETransferValidator; @Inject public CorePaymentAccountsService(CoreAccountService accountService, AccountAgeWitnessService accountAgeWitnessService, - User user) { + User user, + InteracETransferValidator interacETransferValidator) { this.accountService = accountService; this.accountAgeWitnessService = accountAgeWitnessService; this.user = user; + this.interacETransferValidator = interacETransferValidator; + + HavenoUtils.corePaymentAccountService = this; } PaymentAccount createPaymentAccount(PaymentAccountForm form) { diff --git a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java index 72f9dbc51a..34ed649266 100644 --- a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java +++ b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java @@ -84,7 +84,8 @@ public final class PaymentAccountForm implements PersistablePayload { SWISH, TRANSFERWISE_USD, AMAZON_GIFT_CARD, - ACH_TRANSFER; + ACH_TRANSFER, + INTERAC_E_TRANSFER; public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) { return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name()); diff --git a/core/src/main/java/haveno/core/payment/InteracETransferAccount.java b/core/src/main/java/haveno/core/payment/InteracETransferAccount.java index 579167c276..e1929b09e4 100644 --- a/core/src/main/java/haveno/core/payment/InteracETransferAccount.java +++ b/core/src/main/java/haveno/core/payment/InteracETransferAccount.java @@ -17,12 +17,15 @@ package haveno.core.payment; +import haveno.core.api.model.PaymentAccountForm; import haveno.core.api.model.PaymentAccountFormField; import haveno.core.locale.TraditionalCurrency; import haveno.core.locale.TradeCurrency; import haveno.core.payment.payload.InteracETransferAccountPayload; import haveno.core.payment.payload.PaymentAccountPayload; import haveno.core.payment.payload.PaymentMethod; +import haveno.core.payment.validation.InteracETransferValidator; +import haveno.core.trade.HavenoUtils; import lombok.EqualsAndHashCode; import org.jetbrains.annotations.NotNull; @@ -33,9 +36,22 @@ public final class InteracETransferAccount extends PaymentAccount { public static final List SUPPORTED_CURRENCIES = List.of(new TraditionalCurrency("CAD")); + private final InteracETransferValidator interacETransferValidator; + + private static final List INPUT_FIELD_IDS = List.of( + PaymentAccountFormField.FieldId.HOLDER_NAME, + PaymentAccountFormField.FieldId.EMAIL_OR_MOBILE_NR, + PaymentAccountFormField.FieldId.QUESTION, + PaymentAccountFormField.FieldId.ANSWER, + PaymentAccountFormField.FieldId.ACCOUNT_NAME, + PaymentAccountFormField.FieldId.SALT + ); + public InteracETransferAccount() { super(PaymentMethod.INTERAC_E_TRANSFER); setSingleTradeCurrency(SUPPORTED_CURRENCIES.get(0)); + this.interacETransferValidator = HavenoUtils.corePaymentAccountService.interacETransferValidator; + if (interacETransferValidator == null) throw new IllegalArgumentException("InteracETransferValidator cannot be null"); } @Override @@ -50,15 +66,15 @@ public final class InteracETransferAccount extends PaymentAccount { @Override public @NotNull List getInputFieldIds() { - throw new RuntimeException("Not implemented"); + return INPUT_FIELD_IDS; } public void setEmail(String email) { - ((InteracETransferAccountPayload) paymentAccountPayload).setEmail(email); + ((InteracETransferAccountPayload) paymentAccountPayload).setEmailOrMobileNr(email); } public String getEmail() { - return ((InteracETransferAccountPayload) paymentAccountPayload).getEmail(); + return ((InteracETransferAccountPayload) paymentAccountPayload).getEmailOrMobileNr(); } public void setAnswer(String answer) { @@ -84,4 +100,18 @@ public final class InteracETransferAccount extends PaymentAccount { public String getHolderName() { return ((InteracETransferAccountPayload) paymentAccountPayload).getHolderName(); } + + public void validateFormField(PaymentAccountForm form, PaymentAccountFormField.FieldId fieldId, String value) { + switch (fieldId) { + case QUESTION: + processValidationResult(interacETransferValidator.questionValidator.validate(value)); + break; + case ANSWER: + processValidationResult(interacETransferValidator.answerValidator.validate(value)); + break; + default: + super.validateFormField(form, fieldId, value); + } + + } } diff --git a/core/src/main/java/haveno/core/payment/PaymentAccount.java b/core/src/main/java/haveno/core/payment/PaymentAccount.java index 8a7b5f24c1..88e6956915 100644 --- a/core/src/main/java/haveno/core/payment/PaymentAccount.java +++ b/core/src/main/java/haveno/core/payment/PaymentAccount.java @@ -630,7 +630,9 @@ public abstract class PaymentAccount implements PersistablePayload { field.setLabel(Res.get("payment.select.account")); break; case ANSWER: - throw new IllegalArgumentException("Not implemented"); + field.setComponent(PaymentAccountFormField.Component.TEXT); + field.setLabel(Res.get("payment.answer")); + break; case BANK_ACCOUNT_NAME: field.setComponent(PaymentAccountFormField.Component.TEXT); field.setLabel(Res.get("payment.account.owner")); @@ -782,7 +784,9 @@ public abstract class PaymentAccount implements PersistablePayload { case PROMPT_PAY_ID: throw new IllegalArgumentException("Not implemented"); case QUESTION: - throw new IllegalArgumentException("Not implemented"); + field.setComponent(PaymentAccountFormField.Component.TEXT); + field.setLabel(Res.get("payment.secret")); + break; case REQUIREMENTS: throw new IllegalArgumentException("Not implemented"); case SALT: diff --git a/core/src/main/java/haveno/core/payment/payload/InteracETransferAccountPayload.java b/core/src/main/java/haveno/core/payment/payload/InteracETransferAccountPayload.java index 26105e7478..751ecbf045 100644 --- a/core/src/main/java/haveno/core/payment/payload/InteracETransferAccountPayload.java +++ b/core/src/main/java/haveno/core/payment/payload/InteracETransferAccountPayload.java @@ -36,7 +36,7 @@ import java.util.Map; @Getter @Slf4j public final class InteracETransferAccountPayload extends PaymentAccountPayload implements PayloadWithHolderName { - private String email = ""; + private String emailOrMobileNr = ""; private String holderName = ""; private String question = ""; private String answer = ""; @@ -52,7 +52,7 @@ public final class InteracETransferAccountPayload extends PaymentAccountPayload private InteracETransferAccountPayload(String paymentMethod, String id, - String email, + String emailOrMobileNr, String holderName, String question, String answer, @@ -62,7 +62,7 @@ public final class InteracETransferAccountPayload extends PaymentAccountPayload id, maxTradePeriod, excludeFromJsonDataMap); - this.email = email; + this.emailOrMobileNr = emailOrMobileNr; this.holderName = holderName; this.question = question; this.answer = answer; @@ -72,7 +72,7 @@ public final class InteracETransferAccountPayload extends PaymentAccountPayload public Message toProtoMessage() { return getPaymentAccountPayloadBuilder() .setInteracETransferAccountPayload(protobuf.InteracETransferAccountPayload.newBuilder() - .setEmail(email) + .setEmailOrMobileNr(emailOrMobileNr) .setHolderName(holderName) .setQuestion(question) .setAnswer(answer)) @@ -82,7 +82,7 @@ public final class InteracETransferAccountPayload extends PaymentAccountPayload public static InteracETransferAccountPayload fromProto(protobuf.PaymentAccountPayload proto) { return new InteracETransferAccountPayload(proto.getPaymentMethodId(), proto.getId(), - proto.getInteracETransferAccountPayload().getEmail(), + proto.getInteracETransferAccountPayload().getEmailOrMobileNr(), proto.getInteracETransferAccountPayload().getHolderName(), proto.getInteracETransferAccountPayload().getQuestion(), proto.getInteracETransferAccountPayload().getAnswer(), @@ -98,21 +98,21 @@ public final class InteracETransferAccountPayload extends PaymentAccountPayload @Override public String getPaymentDetails() { return Res.get(paymentMethodId) + " - " + Res.getWithCol("payment.account.owner") + " " + holderName + ", " + - Res.get("payment.email") + " " + email + ", " + Res.getWithCol("payment.secret") + " " + + Res.get("payment.email") + " " + emailOrMobileNr + ", " + Res.getWithCol("payment.secret") + " " + question + ", " + Res.getWithCol("payment.answer") + " " + answer; } @Override public String getPaymentDetailsForTradePopup() { return Res.getWithCol("payment.account.owner") + " " + holderName + "\n" + - Res.getWithCol("payment.email") + " " + email + "\n" + + Res.getWithCol("payment.email") + " " + emailOrMobileNr + "\n" + Res.getWithCol("payment.secret") + " " + question + "\n" + Res.getWithCol("payment.answer") + " " + answer; } @Override public byte[] getAgeWitnessInputData() { - return super.getAgeWitnessInputData(ArrayUtils.addAll(email.getBytes(StandardCharsets.UTF_8), + return super.getAgeWitnessInputData(ArrayUtils.addAll(emailOrMobileNr.getBytes(StandardCharsets.UTF_8), ArrayUtils.addAll(question.getBytes(StandardCharsets.UTF_8), answer.getBytes(StandardCharsets.UTF_8)))); } diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java index c4226a97b6..76cd97630e 100644 --- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java @@ -375,7 +375,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList()); } diff --git a/core/src/main/java/haveno/core/trade/HavenoUtils.java b/core/src/main/java/haveno/core/trade/HavenoUtils.java index 32a6d76824..b022cf3cfc 100644 --- a/core/src/main/java/haveno/core/trade/HavenoUtils.java +++ b/core/src/main/java/haveno/core/trade/HavenoUtils.java @@ -31,6 +31,7 @@ import haveno.common.file.FileUtil; import haveno.common.util.Base64; import haveno.common.util.Utilities; import haveno.core.api.CoreNotificationService; +import haveno.core.api.CorePaymentAccountsService; import haveno.core.api.XmrConnectionService; import haveno.core.app.HavenoSetup; import haveno.core.offer.OfferPayload; @@ -132,6 +133,7 @@ public class HavenoUtils { public static XmrConnectionService xmrConnectionService; public static OpenOfferManager openOfferManager; public static CoreNotificationService notificationService; + public static CorePaymentAccountsService corePaymentAccountService; public static Preferences preferences; public static boolean isSeedNode() { diff --git a/desktop/src/main/java/haveno/desktop/components/paymentmethods/InteracETransferForm.java b/desktop/src/main/java/haveno/desktop/components/paymentmethods/InteracETransferForm.java index 8447a1a01a..f57ac5cc09 100644 --- a/desktop/src/main/java/haveno/desktop/components/paymentmethods/InteracETransferForm.java +++ b/desktop/src/main/java/haveno/desktop/components/paymentmethods/InteracETransferForm.java @@ -44,7 +44,7 @@ public class InteracETransferForm extends PaymentMethodForm { addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.account.owner"), ((InteracETransferAccountPayload) paymentAccountPayload).getHolderName()); addCompactTopLabelTextField(gridPane, gridRow, 1, Res.get("payment.emailOrMobile"), - ((InteracETransferAccountPayload) paymentAccountPayload).getEmail()); + ((InteracETransferAccountPayload) paymentAccountPayload).getEmailOrMobileNr()); addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.secret"), ((InteracETransferAccountPayload) paymentAccountPayload).getQuestion()); addCompactTopLabelTextField(gridPane, gridRow, 1, Res.get("payment.answer"), diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 46a6361301..e0f05c4ef7 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -1047,7 +1047,7 @@ message FasterPaymentsAccountPayload { } message InteracETransferAccountPayload { - string email = 1; + string email_or_mobile_nr = 1; string holder_name = 2; string question = 3; string answer = 4; @@ -1909,6 +1909,7 @@ message PaymentAccountForm { TRANSFERWISE_USD = 23; AMAZON_GIFT_CARD = 24; ACH_TRANSFER = 25; + INTERAC_E_TRANSFER = 26; } FormId id = 1; repeated PaymentAccountFormField fields = 2; From bb1173cc96bb33ae9c4310193d5cc868c96dc32f Mon Sep 17 00:00:00 2001 From: woodser <13068859+woodser@users.noreply.github.com> Date: Sat, 21 Jun 2025 14:48:56 -0400 Subject: [PATCH 9/9] support US postal money order accounts over grpc api --- .../java/haveno/core/api/model/PaymentAccountForm.java | 3 ++- .../haveno/core/payment/USPostalMoneyOrderAccount.java | 9 ++++++++- .../java/haveno/core/payment/payload/PaymentMethod.java | 3 ++- proto/src/main/proto/pb.proto | 1 + 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java index 34ed649266..f7dc4a5063 100644 --- a/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java +++ b/core/src/main/java/haveno/core/api/model/PaymentAccountForm.java @@ -85,7 +85,8 @@ public final class PaymentAccountForm implements PersistablePayload { TRANSFERWISE_USD, AMAZON_GIFT_CARD, ACH_TRANSFER, - INTERAC_E_TRANSFER; + INTERAC_E_TRANSFER, + US_POSTAL_MONEY_ORDER; public static PaymentAccountForm.FormId fromProto(protobuf.PaymentAccountForm.FormId formId) { return ProtoUtil.enumFromProto(PaymentAccountForm.FormId.class, formId.name()); diff --git a/core/src/main/java/haveno/core/payment/USPostalMoneyOrderAccount.java b/core/src/main/java/haveno/core/payment/USPostalMoneyOrderAccount.java index 41667563cf..4cf6e20608 100644 --- a/core/src/main/java/haveno/core/payment/USPostalMoneyOrderAccount.java +++ b/core/src/main/java/haveno/core/payment/USPostalMoneyOrderAccount.java @@ -33,6 +33,13 @@ public final class USPostalMoneyOrderAccount extends PaymentAccount { public static final List SUPPORTED_CURRENCIES = List.of(new TraditionalCurrency("USD")); + private static final List INPUT_FIELD_IDS = List.of( + PaymentAccountFormField.FieldId.HOLDER_NAME, + PaymentAccountFormField.FieldId.POSTAL_ADDRESS, + PaymentAccountFormField.FieldId.ACCOUNT_NAME, + PaymentAccountFormField.FieldId.SALT + ); + public USPostalMoneyOrderAccount() { super(PaymentMethod.US_POSTAL_MONEY_ORDER); setSingleTradeCurrency(SUPPORTED_CURRENCIES.get(0)); @@ -50,7 +57,7 @@ public final class USPostalMoneyOrderAccount extends PaymentAccount { @Override public @NonNull List getInputFieldIds() { - throw new RuntimeException("Not implemented"); + return INPUT_FIELD_IDS; } public void setPostalAddress(String postalAddress) { diff --git a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java index 76cd97630e..dd842af7c3 100644 --- a/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/haveno/core/payment/payload/PaymentMethod.java @@ -376,7 +376,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable paymentMethodIds.contains(paymentMethod.getId())).collect(Collectors.toList()); } diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index e0f05c4ef7..647272b261 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -1910,6 +1910,7 @@ message PaymentAccountForm { AMAZON_GIFT_CARD = 24; ACH_TRANSFER = 25; INTERAC_E_TRANSFER = 26; + US_POSTAL_MONEY_ORDER = 27; } FormId id = 1; repeated PaymentAccountFormField fields = 2;