From 0b37f3080a5aeaddd2926ff2859b6446b0f3c4ba Mon Sep 17 00:00:00 2001 From: namloan Date: Wed, 9 Aug 2023 20:32:19 +0200 Subject: [PATCH 1/2] Add Pix payment method --- .../account/accounts/CountryBasedAccount.java | 3 + .../accounts/CountryBasedAccountPayload.java | 3 + .../bisq/account/accounts/PixAccount.java | 37 +++++++++ .../account/accounts/PixAccountPayload.java | 41 ++++++++++ .../payment_method/FiatPaymentRail.java | 12 ++- account/src/main/proto/account.proto | 8 ++ .../bisq/account/accounts/PixAccountTest.java | 71 ++++++++++++++++++ desktop/src/main/resources/css/images.css | 4 + .../src/main/resources/images/payment/Pix.png | Bin 0 -> 1876 bytes .../main/resources/images/payment/Pix@2x.png | Bin 0 -> 2754 bytes 10 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 account/src/main/java/bisq/account/accounts/PixAccount.java create mode 100644 account/src/main/java/bisq/account/accounts/PixAccountPayload.java create mode 100644 account/src/test/java/bisq/account/accounts/PixAccountTest.java create mode 100644 desktop/src/main/resources/images/payment/Pix.png create mode 100644 desktop/src/main/resources/images/payment/Pix@2x.png diff --git a/account/src/main/java/bisq/account/accounts/CountryBasedAccount.java b/account/src/main/java/bisq/account/accounts/CountryBasedAccount.java index f3f3ef64a2..c5dd4f5f58 100644 --- a/account/src/main/java/bisq/account/accounts/CountryBasedAccount.java +++ b/account/src/main/java/bisq/account/accounts/CountryBasedAccount.java @@ -56,6 +56,9 @@ protected bisq.account.protobuf.CountryBasedAccount.Builder getCountryBasedAccou case F2FACCOUNT: { return F2FAccount.fromProto(proto); } + case PIXACCOUNT: { + return PixAccount.fromProto(proto); + } case MESSAGE_NOT_SET: { throw new UnresolvableProtobufMessageException(proto); } diff --git a/account/src/main/java/bisq/account/accounts/CountryBasedAccountPayload.java b/account/src/main/java/bisq/account/accounts/CountryBasedAccountPayload.java index 45903bcce0..3ee9e8921f 100644 --- a/account/src/main/java/bisq/account/accounts/CountryBasedAccountPayload.java +++ b/account/src/main/java/bisq/account/accounts/CountryBasedAccountPayload.java @@ -51,6 +51,9 @@ public static CountryBasedAccountPayload fromProto(bisq.account.protobuf.Account case F2FACCOUNTPAYLOAD: { return F2FAccountPayload.fromProto(proto); } + case PIXACCOUNTPAYLOAD: { + return PixAccountPayload.fromProto(proto); + } case MESSAGE_NOT_SET: { throw new UnresolvableProtobufMessageException(proto); } diff --git a/account/src/main/java/bisq/account/accounts/PixAccount.java b/account/src/main/java/bisq/account/accounts/PixAccount.java new file mode 100644 index 0000000000..4d9d600d78 --- /dev/null +++ b/account/src/main/java/bisq/account/accounts/PixAccount.java @@ -0,0 +1,37 @@ +package bisq.account.accounts; + +import bisq.account.payment_method.FiatPaymentMethod; +import bisq.account.payment_method.FiatPaymentRail; +import bisq.account.protobuf.Account; +import bisq.common.locale.Country; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@Getter +@Slf4j +@ToString +@EqualsAndHashCode(callSuper = true) +public final class PixAccount extends CountryBasedAccount { + + private static final FiatPaymentMethod PAYMENT_METHOD = FiatPaymentMethod.fromPaymentRail(FiatPaymentRail.PIX); + + public PixAccount(String accountName, PixAccountPayload payload, Country country) { + super(accountName, PAYMENT_METHOD, payload, country); + } + + @Override + public Account toProto() { + return getAccountBuilder() + .setCountryBasedAccount(getCountryBasedAccountBuilder() + .setPixAccount(bisq.account.protobuf.PixAccount.newBuilder())) + .build(); + } + + public static PixAccount fromProto(bisq.account.protobuf.Account proto) { + return new PixAccount(proto.getAccountName(), + PixAccountPayload.fromProto(proto.getAccountPayload()), + Country.fromProto(proto.getCountryBasedAccount().getCountry())); + } +} diff --git a/account/src/main/java/bisq/account/accounts/PixAccountPayload.java b/account/src/main/java/bisq/account/accounts/PixAccountPayload.java new file mode 100644 index 0000000000..3c62d8b72d --- /dev/null +++ b/account/src/main/java/bisq/account/accounts/PixAccountPayload.java @@ -0,0 +1,41 @@ +package bisq.account.accounts; + +import bisq.account.protobuf.AccountPayload; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@Getter +@Slf4j +@ToString +@EqualsAndHashCode(callSuper = true) +public final class PixAccountPayload extends CountryBasedAccountPayload { + + private final String pixKey; + + public PixAccountPayload(String id, String paymentMethodName, String countryCode, String pixKey) { + super(id, paymentMethodName, countryCode); + this.pixKey = pixKey; + } + + @Override + public AccountPayload toProto() { + return getAccountPayloadBuilder().setCountryBasedAccountPayload( + getCountryBasedAccountPayloadBuilder().setPixAccountPayload( + bisq.account.protobuf.PixAccountPayload.newBuilder() + .setPixKey(pixKey))) + .build(); + } + + public static PixAccountPayload fromProto(AccountPayload proto) { + bisq.account.protobuf.CountryBasedAccountPayload countryBasedAccountPayload = proto.getCountryBasedAccountPayload(); + bisq.account.protobuf.PixAccountPayload pixAccountPayload = countryBasedAccountPayload.getPixAccountPayload(); + return new PixAccountPayload( + proto.getId(), + proto.getPaymentMethodName(), + countryBasedAccountPayload.getCountryCode(), + pixAccountPayload.getPixKey() + ); + } +} diff --git a/account/src/main/java/bisq/account/payment_method/FiatPaymentRail.java b/account/src/main/java/bisq/account/payment_method/FiatPaymentRail.java index dc03e7b5d6..590a64e16c 100644 --- a/account/src/main/java/bisq/account/payment_method/FiatPaymentRail.java +++ b/account/src/main/java/bisq/account/payment_method/FiatPaymentRail.java @@ -25,7 +25,11 @@ import lombok.Getter; import javax.annotation.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; /** @@ -42,8 +46,9 @@ public enum FiatPaymentRail implements PaymentRail { NATIONAL_BANK(new ArrayList<>(), new ArrayList<>()), SWIFT(), F2F(), - ACH_TRANSFER(List.of("US"), List.of("USD")); - + ACH_TRANSFER(List.of("US"), List.of("USD")), + PIX(List.of("BR"), List.of("BRL")), + FASTER_PAYMENTS(List.of("GB"), List.of("GBP")); @Getter @EqualsAndHashCode.Exclude private final List countries; @@ -138,7 +143,6 @@ public boolean supportsCurrency(String currencyCode) { PAYTM=India/PayTM NEQUI=Nequi BIZUM=Bizum -PIX=Pix AMAZON_GIFT_CARD=Amazon eGift Card CAPITUAL=Capitual CELPAY=CelPay diff --git a/account/src/main/proto/account.proto b/account/src/main/proto/account.proto index 98c8c722f9..7325edf045 100644 --- a/account/src/main/proto/account.proto +++ b/account/src/main/proto/account.proto @@ -86,6 +86,7 @@ message CountryBasedAccountPayload { BankAccountPayload bankAccountPayload = 2; SepaAccountPayload sepaAccountPayload = 10; F2FAccountPayload f2fAccountPayload = 11; + PixAccountPayload pixAccountPayload = 12; } } message SepaAccountPayload { @@ -128,6 +129,9 @@ message ZelleAccountPayload { string emailOrMobileNr = 2; } +message PixAccountPayload { + string pix_key = 1; +} // Account message Account { @@ -155,6 +159,7 @@ message CountryBasedAccount { BankAccount bankAccount = 19; SepaAccount sepaAccount = 20; F2FAccount f2fAccount = 21; + PixAccount pixAccount = 22; } } message SepaAccount { @@ -179,6 +184,9 @@ message ZelleAccount { message NationalBankAccount { } +message PixAccount { +} + message AccountStore { map accountByName = 1; optional Account selectedAccount = 2; diff --git a/account/src/test/java/bisq/account/accounts/PixAccountTest.java b/account/src/test/java/bisq/account/accounts/PixAccountTest.java new file mode 100644 index 0000000000..f39cde5e3b --- /dev/null +++ b/account/src/test/java/bisq/account/accounts/PixAccountTest.java @@ -0,0 +1,71 @@ +package bisq.account.accounts; + +import bisq.account.protobuf.Account; +import bisq.account.protobuf.AccountPayload; +import bisq.account.protobuf.CountryBasedAccount; +import bisq.account.protobuf.CountryBasedAccountPayload; +import bisq.account.protobuf.FiatPaymentMethod; +import bisq.account.protobuf.PaymentMethod; +import bisq.common.protobuf.Country; +import bisq.common.protobuf.Region; +import org.junit.jupiter.api.Test; + +import static java.lang.System.currentTimeMillis; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.data.Offset.offset; + +class PixAccountTest { + + private static final Account PROTO = Account.newBuilder() + .setAccountName("accountName") + .setCreationDate(123) + .setPaymentMethod(PaymentMethod.newBuilder() + .setName("PIX") + .setFiatPaymentMethod(FiatPaymentMethod.newBuilder().build()) + .build()) + .setAccountPayload(AccountPayload.newBuilder() + .setId("id") + .setPaymentMethodName("PIX") + .setCountryBasedAccountPayload(CountryBasedAccountPayload.newBuilder() + .setCountryCode("countryCode") + .setPixAccountPayload(bisq.account.protobuf.PixAccountPayload.newBuilder() + .setPixKey("pixKey"))) + ) + .setCountryBasedAccount(CountryBasedAccount.newBuilder() + .setCountry(Country.newBuilder() + .setCode("countryCode") + .setName("countryName") + .setRegion(Region.newBuilder() + .setCode("regionCode") + .setName("regionName"))) + .setPixAccount(bisq.account.protobuf.PixAccount.newBuilder().build()) + ) + .build(); + + private static final bisq.account.accounts.PixAccount ACCOUNT = new bisq.account.accounts.PixAccount( + "accountName", + new bisq.account.accounts.PixAccountPayload("id", "PIX", "countryCode", "pixKey"), + new bisq.common.locale.Country( + "countryCode", + "countryName", + new bisq.common.locale.Region("regionCode", "regionName"))); + + @Test + void toProto() { + var result = ACCOUNT.toProto(); + assertThat(result).usingRecursiveComparison() + .ignoringFields("accountPayload_.memoizedHashCode", "memoizedHashCode", "creationDate_") + .isEqualTo(PROTO); + assertThat(result.getCreationDate()).isCloseTo(currentTimeMillis(), offset(1000L)); + } + + @Test + void fromProto() { + var result = bisq.account.accounts.PixAccount.fromProto(PROTO); + assertThat(result) + .usingRecursiveComparison() + .ignoringFields("creationDate") + .isEqualTo(ACCOUNT); + assertThat(result.getCreationDate()).isCloseTo(System.currentTimeMillis(), offset(1000L)); + } +} \ No newline at end of file diff --git a/desktop/src/main/resources/css/images.css b/desktop/src/main/resources/css/images.css index 918057d420..a5a8a1c570 100644 --- a/desktop/src/main/resources/css/images.css +++ b/desktop/src/main/resources/css/images.css @@ -398,6 +398,10 @@ -fx-image: url("/images/payment/ACH.png"); } +#PIX { + -fx-image: url("/images/payment/Pix.png"); +} + /* Onboarding icons*/ #info-circle-solid { diff --git a/desktop/src/main/resources/images/payment/Pix.png b/desktop/src/main/resources/images/payment/Pix.png new file mode 100644 index 0000000000000000000000000000000000000000..23cc2a947f293a592a2f8119c6aab751cfb7ccec GIT binary patch literal 1876 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 literal 0 HcmV?d00001 From 26a771d49174a0e5fc6f4d7cfcfe742b7ef6dc4f Mon Sep 17 00:00:00 2001 From: namloan Date: Wed, 9 Aug 2023 21:20:31 +0200 Subject: [PATCH 2/2] Add Faster Payments payment method --- .../java/bisq/account/accounts/Account.java | 3 + .../bisq/account/accounts/AccountPayload.java | 3 + .../accounts/FasterPaymentsAccount.java | 36 ++++++++++++ .../FasterPaymentsAccountPayload.java | 40 +++++++++++++ .../payment_method/FiatPaymentRail.java | 2 +- account/src/main/proto/account.proto | 10 ++++ .../accounts/FasterPaymentsAccountTest.java | 53 ++++++++++++++++++ desktop/src/main/resources/css/images.css | 3 + .../images/payment/FasterPayments.png | Bin 0 -> 1928 bytes .../images/payment/FasterPayments@2x.png | Bin 0 -> 3615 bytes 10 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 account/src/main/java/bisq/account/accounts/FasterPaymentsAccount.java create mode 100644 account/src/main/java/bisq/account/accounts/FasterPaymentsAccountPayload.java create mode 100644 account/src/test/java/bisq/account/accounts/FasterPaymentsAccountTest.java create mode 100644 desktop/src/main/resources/images/payment/FasterPayments.png create mode 100644 desktop/src/main/resources/images/payment/FasterPayments@2x.png diff --git a/account/src/main/java/bisq/account/accounts/Account.java b/account/src/main/java/bisq/account/accounts/Account.java index 0f244c482d..9673a6a1bd 100644 --- a/account/src/main/java/bisq/account/accounts/Account.java +++ b/account/src/main/java/bisq/account/accounts/Account.java @@ -83,6 +83,9 @@ protected bisq.account.protobuf.Account.Builder getAccountBuilder() { case COUNTRYBASEDACCOUNT: { return CountryBasedAccount.fromProto(proto); } + case FASTERPAYMENTSACCOUNT: { + return FasterPaymentsAccount.fromProto(proto); + } case MESSAGE_NOT_SET: { throw new UnresolvableProtobufMessageException(proto); } diff --git a/account/src/main/java/bisq/account/accounts/AccountPayload.java b/account/src/main/java/bisq/account/accounts/AccountPayload.java index 9d0f152a21..3fe06147af 100644 --- a/account/src/main/java/bisq/account/accounts/AccountPayload.java +++ b/account/src/main/java/bisq/account/accounts/AccountPayload.java @@ -62,6 +62,9 @@ public static AccountPayload fromProto(bisq.account.protobuf.AccountPayload prot case USERDEFINEDFIATACCOUNTPAYLOAD: { return UserDefinedFiatAccountPayload.fromProto(proto); } + case FASTERPAYMENTSACCOUNTPAYLOAD: { + return FasterPaymentsAccountPayload.fromProto(proto); + } case MESSAGE_NOT_SET: { throw new UnresolvableProtobufMessageException(proto); } diff --git a/account/src/main/java/bisq/account/accounts/FasterPaymentsAccount.java b/account/src/main/java/bisq/account/accounts/FasterPaymentsAccount.java new file mode 100644 index 0000000000..9f26e44ab8 --- /dev/null +++ b/account/src/main/java/bisq/account/accounts/FasterPaymentsAccount.java @@ -0,0 +1,36 @@ +package bisq.account.accounts; + +import bisq.account.payment_method.FiatPaymentMethod; +import bisq.account.payment_method.FiatPaymentRail; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@Getter +@Slf4j +@ToString +@EqualsAndHashCode(callSuper = true) +public final class FasterPaymentsAccount extends Account { + + private static final FiatPaymentMethod PAYMENT_METHOD = FiatPaymentMethod.fromPaymentRail(FiatPaymentRail.FASTER_PAYMENTS); + + + public FasterPaymentsAccount(long creationDate, String accountName, FasterPaymentsAccountPayload accountPayload) { + super(creationDate, accountName, PAYMENT_METHOD, accountPayload); + } + + @Override + public bisq.account.protobuf.Account toProto() { + return getAccountBuilder() + .setFasterPaymentsAccount(bisq.account.protobuf.FasterPaymentsAccount.newBuilder()) + .build(); + } + + public static FasterPaymentsAccount fromProto(bisq.account.protobuf.Account proto) { + return new FasterPaymentsAccount( + proto.getCreationDate(), + proto.getAccountName(), + FasterPaymentsAccountPayload.fromProto(proto.getAccountPayload())); + } +} diff --git a/account/src/main/java/bisq/account/accounts/FasterPaymentsAccountPayload.java b/account/src/main/java/bisq/account/accounts/FasterPaymentsAccountPayload.java new file mode 100644 index 0000000000..07617172cf --- /dev/null +++ b/account/src/main/java/bisq/account/accounts/FasterPaymentsAccountPayload.java @@ -0,0 +1,40 @@ +package bisq.account.accounts; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@Getter +@Slf4j +@ToString +@EqualsAndHashCode(callSuper = true) +public final class FasterPaymentsAccountPayload extends AccountPayload { + + private final String sortCode; + private final String accountNr; + + public FasterPaymentsAccountPayload(String id, String paymentMethodName, String sortCode, String accountNr) { + super(id, paymentMethodName); + this.sortCode = sortCode; + this.accountNr = accountNr; + } + + @Override + public bisq.account.protobuf.AccountPayload toProto() { + return getAccountPayloadBuilder() + .setFasterPaymentsAccountPayload(bisq.account.protobuf.FasterPaymentsAccountPayload.newBuilder() + .setSortCode(sortCode) + .setAccountNr(accountNr)) + .build(); + } + + public static FasterPaymentsAccountPayload fromProto(bisq.account.protobuf.AccountPayload account) { + var fasterPaymentsPayload = account.getFasterPaymentsAccountPayload(); + return new FasterPaymentsAccountPayload( + account.getId(), + account.getPaymentMethodName(), + fasterPaymentsPayload.getSortCode(), + fasterPaymentsPayload.getAccountNr()); + } +} diff --git a/account/src/main/java/bisq/account/payment_method/FiatPaymentRail.java b/account/src/main/java/bisq/account/payment_method/FiatPaymentRail.java index 590a64e16c..911268805c 100644 --- a/account/src/main/java/bisq/account/payment_method/FiatPaymentRail.java +++ b/account/src/main/java/bisq/account/payment_method/FiatPaymentRail.java @@ -49,6 +49,7 @@ public enum FiatPaymentRail implements PaymentRail { ACH_TRANSFER(List.of("US"), List.of("USD")), PIX(List.of("BR"), List.of("BRL")), FASTER_PAYMENTS(List.of("GB"), List.of("GBP")); + @Getter @EqualsAndHashCode.Exclude private final List countries; @@ -124,7 +125,6 @@ public boolean supportsCurrency(String currencyCode) { WECHAT_PAY=WeChat Pay SEPA=SEPA SEPA_INSTANT=SEPA Instant Payments -FASTER_PAYMENTS=Faster Payments SWISH=Swish ZELLE=Zelle CHASE_QUICK_PAY=Chase QuickPay diff --git a/account/src/main/proto/account.proto b/account/src/main/proto/account.proto index 7325edf045..d0a794636e 100644 --- a/account/src/main/proto/account.proto +++ b/account/src/main/proto/account.proto @@ -72,6 +72,7 @@ message AccountPayload { UserDefinedFiatAccountPayload userDefinedFiatAccountPayload = 20; RevolutAccountPayload RevolutAccountPayload = 21; CountryBasedAccountPayload countryBasedAccountPayload = 22; + FasterPaymentsAccountPayload fasterPaymentsAccountPayload = 23; } } message UserDefinedFiatAccountPayload { @@ -133,6 +134,11 @@ message PixAccountPayload { string pix_key = 1; } +message FasterPaymentsAccountPayload { + string sort_code = 1; + string account_nr = 2; +} + // Account message Account { sint64 creationDate = 1; @@ -146,6 +152,7 @@ message Account { UserDefinedFiatAccount userDefinedFiatAccount = 20; RevolutAccount revolutAccount = 21; CountryBasedAccount countryBasedAccount = 22; + FasterPaymentsAccount fasterPaymentsAccount = 23; } } @@ -187,6 +194,9 @@ message NationalBankAccount { message PixAccount { } +message FasterPaymentsAccount { +} + message AccountStore { map accountByName = 1; optional Account selectedAccount = 2; diff --git a/account/src/test/java/bisq/account/accounts/FasterPaymentsAccountTest.java b/account/src/test/java/bisq/account/accounts/FasterPaymentsAccountTest.java new file mode 100644 index 0000000000..660b6bf1db --- /dev/null +++ b/account/src/test/java/bisq/account/accounts/FasterPaymentsAccountTest.java @@ -0,0 +1,53 @@ +package bisq.account.accounts; + +import bisq.account.protobuf.Account; +import bisq.account.protobuf.AccountPayload; +import bisq.account.protobuf.FasterPaymentsAccount; +import bisq.account.protobuf.FasterPaymentsAccountPayload; +import bisq.account.protobuf.FiatPaymentMethod; +import bisq.account.protobuf.PaymentMethod; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class FasterPaymentsAccountTest { + + private static final bisq.account.protobuf.Account PROTO = Account.newBuilder() + .setAccountName("accountName") + .setCreationDate(123) + .setPaymentMethod( + PaymentMethod.newBuilder() + .setName("FASTER_PAYMENTS") + .setFiatPaymentMethod( + FiatPaymentMethod.newBuilder())) + .setAccountPayload(AccountPayload.newBuilder() + .setId("id") + .setPaymentMethodName("FASTER_PAYMENTS") + .setFasterPaymentsAccountPayload(FasterPaymentsAccountPayload.newBuilder() + .setSortCode("sortCode") + .setAccountNr("accountNr"))) + .setFasterPaymentsAccount(FasterPaymentsAccount.newBuilder()) + .build(); + + private static final bisq.account.accounts.FasterPaymentsAccount ACCOUNT = new bisq.account.accounts.FasterPaymentsAccount( + 123, + "accountName", + new bisq.account.accounts.FasterPaymentsAccountPayload("id", "FASTER_PAYMENTS", "sortCode", "accountNr") + ); + + @Test + void toProto() { + var result = ACCOUNT.toProto(); + assertThat(result) + .usingRecursiveComparison() + .isEqualTo(PROTO); + } + + @Test + void fromProto() { + var result = bisq.account.accounts.FasterPaymentsAccount.fromProto(PROTO); + assertThat(result) + .usingRecursiveComparison() + .isEqualTo(ACCOUNT); + } +} \ No newline at end of file diff --git a/desktop/src/main/resources/css/images.css b/desktop/src/main/resources/css/images.css index a5a8a1c570..5b25dfed10 100644 --- a/desktop/src/main/resources/css/images.css +++ b/desktop/src/main/resources/css/images.css @@ -402,6 +402,9 @@ -fx-image: url("/images/payment/Pix.png"); } +#FASTER_PAYMENTS { + -fx-image: url("/images/payment/FasterPayments.png"); +} /* Onboarding icons*/ #info-circle-solid { diff --git a/desktop/src/main/resources/images/payment/FasterPayments.png b/desktop/src/main/resources/images/payment/FasterPayments.png new file mode 100644 index 0000000000000000000000000000000000000000..d51eb053e853da6570f4f4bf2be1ee631c8d6f29 GIT binary patch literal 1928 zcmZ`)2|QGJ9RJVg93N5Hbu&8_lVfI3TGN=)j9pqIcjH*sH1uK)GlNM6IdbJ_+l_>f zYNZ^DqOg@DttC3tW?iY!rCMjwzK5_r_1@?Ie!utqeZRlsz5nOE1Y4UQWH8DY0Dz2@ zCEXsj^2l1X0=_0EsL8-)nV&hs9DuS^=_&8!@I97gY0m&4R2zWE7yu?=C~^RRAQAvW zUI36Y08rp(U9zLVffzQ^%9p_ay0E_rEJv*aQm}`DPk>SeNH*95J5Va~zC8**$3X)S z2Z3dC99P&Phb6oa&8(HmMJ;5^MbES4bEOu1L}vahdm1*Y`Iat10HoI=3k5Q>6ahfr zgdCY7Cc~P{;&BMxyLmorf|$ccRDdET!!Cy{^2Ule0bC(jY=)a*kYOKzi8$;GMdWXW zV=`>9G@gKsH6f4)Bpelk#bPOf-M(ad`uB5k_|6QsMo z%(9V0A$~TnR7m3m@B|KgZx)*h*O`$lf|jyp%D8-~%%Z@YkU~V>^`dt_yRl|acxO>D z6yp3YrD7B~mstQvWm?hA9lu*EadPu_caonTHPtb$&Z;g*J}*;dScY%ko3~^6o2x@b zyUr3(da=_$!$N~TkR)j;!qnl%NnUMHUa{?Qk?DU|7+$ETu+F>ys8$3|UXTTyA`wFi4$+KrktIdOR&r>D-nINWL3pzg?Ot3q8C=#7FeN`&az4iLG{{6YD>($&*EuAsJUG8 zD_|gx(QbBbJZ=_Im|xOOND^RIINnz;lr23W>*J-XVwF&x9!1*lqzCY0s z865wo%A@g~YP%Xq0D9sDmWhh)dEhLn%PQ){m%m#5RSG`pW~^EopWva}duptt_unm# z#V=z6Rmr8t{WfGx4=Japsnfa`N;|a@Cnd5kZ6eFUlxfh)drwVrGMXp)@_agbPSGmM zl2tra8y-7cmU|z_D^IAcmY0t>k?nc4ZBYOIEj8=ZRJrT4z`Eo!+U^B|xAPi!l6*Ikmt2?5fZsIywyGy-cI4wF!+HIhM()<_CtFrUPwQO?YbAzn+ zg)!AC5xuEfob>hY1s2_nY>008aH&{tWSdu=lR&9y$^#mAIH{zg-$8b+Y_ovMV^^-_J$$>-PRiJ)+wq=dQ~1&b$NlQJIw50j08G*N)7eIEpS5ar}-> zd}wwYTF5%(AFuZMc%#i7|1}i1oJTg8{2)17?v?SDkIzzRLtJ*s6Q z88tf>aiE2if@3#f_q1buz6m-y^>J_MhXF^EUSaUV_O2(Y5_JEjW35+=*xhM1X$2W! d3ZacUJv=cvHjd-qG>-gVtSoHk#oN82{sW;m;JyF= literal 0 HcmV?d00001 diff --git a/desktop/src/main/resources/images/payment/FasterPayments@2x.png b/desktop/src/main/resources/images/payment/FasterPayments@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c89248a15d4495084c1fd8f2c420b20f556c6185 GIT binary patch literal 3615 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 R^60n6