From 2c593559db6949159ff5a35fb22e56819feaa4e7 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 23 Feb 2018 21:40:34 -0500 Subject: [PATCH] Merge 0.6.6 branch to master --- common/pom.xml | 2 +- .../main/java/io/bisq/common/app/Version.java | 2 +- .../io/bisq/common/locale/CurrencyUtil.java | 93 ++++++++- common/src/main/proto/pb.proto | 33 +++ .../resources/i18n/displayStrings.properties | 63 ++++-- .../i18n/displayStrings_de.properties | 10 +- .../i18n/displayStrings_el.properties | 10 +- .../i18n/displayStrings_es.properties | 10 +- .../i18n/displayStrings_hu.properties | 10 +- .../i18n/displayStrings_pt.properties | 10 +- .../i18n/displayStrings_ro.properties | 10 +- .../i18n/displayStrings_ru.properties | 10 +- .../i18n/displayStrings_sr.properties | 10 +- .../i18n/displayStrings_zh.properties | 10 +- .../i18n/in_dev/displayStrings_fr.properties | 1 - consensus/pom.xml | 2 +- core/pom.xml | 2 +- .../io/bisq/core/btc/BaseCurrencyNetwork.java | 20 +- .../java/io/bisq/core/btc/Restrictions.java | 15 -- .../core/btc/wallet/BtcWalletService.java | 39 ++-- .../bisq/core/btc/wallet/WalletService.java | 2 +- .../core/network/CoreSeedNodesRepository.java | 6 - .../io/bisq/core/offer/OfferBookService.java | 8 + .../java/io/bisq/core/offer/OpenOffer.java | 25 ++- .../io/bisq/core/offer/OpenOfferManager.java | 34 ++- .../io/bisq/core/payment/CashAppAccount.java | 46 ++++ .../bisq/core/payment/MoneyBeamAccount.java | 46 ++++ .../io/bisq/core/payment/PaymentAccount.java | 4 +- .../core/payment/PaymentAccountFactory.java | 12 ++ .../io/bisq/core/payment/PopmoneyAccount.java | 54 +++++ .../io/bisq/core/payment/RevolutAccount.java | 45 ++++ .../io/bisq/core/payment/UpholdAccount.java | 46 ++++ .../io/bisq/core/payment/VenmoAccount.java | 54 +++++ .../payload/CashAppAccountPayload.java | 98 +++++++++ .../payload/MoneyBeamAccountPayload.java | 98 +++++++++ .../core/payment/payload/PaymentMethod.java | 46 ++-- .../payload/PopmoneyAccountPayload.java | 103 +++++++++ .../payload/RevolutAccountPayload.java | 99 +++++++++ .../payment/payload/UpholdAccountPayload.java | 98 +++++++++ .../payment/payload/VenmoAccountPayload.java | 103 +++++++++ .../io/bisq/core/proto/CoreProtoResolver.java | 12 ++ .../bisq/core/provider/fee/FeeProvider.java | 2 - .../io/bisq/core/provider/fee/FeeService.java | 25 ++- .../core/provider/price/PriceFeedService.java | 1 - .../statistics/TradeStatisticsManager.java | 6 + .../java/io/bisq/core/user/Preferences.java | 26 +-- .../io/bisq/core/user/PreferencesPayload.java | 2 +- gui/pom.xml | 2 +- gui/src/main/java/io/bisq/gui/bisq.css | 5 + .../components/paymentmethods/BankForm.java | 197 +++++++++--------- .../paymentmethods/CashAppForm.java | 101 +++++++++ .../paymentmethods/MoneyBeamForm.java | 101 +++++++++ .../components/paymentmethods/OKPayForm.java | 2 +- .../paymentmethods/PopmoneyForm.java | 114 ++++++++++ .../paymentmethods/RevolutForm.java | 146 +++++++++++++ .../components/paymentmethods/UpholdForm.java | 147 +++++++++++++ .../components/paymentmethods/VenmoForm.java | 114 ++++++++++ .../fiataccounts/FiatAccountsDataModel.java | 8 +- .../fiataccounts/FiatAccountsView.java | 91 +++++--- .../createoffer/CreateOfferDataModel.java | 6 +- .../offer/createoffer/CreateOfferView.java | 30 +-- .../createoffer/CreateOfferViewModel.java | 4 - .../main/offer/takeoffer/TakeOfferView.java | 31 +-- .../windows/downloadupdate/BisqInstaller.java | 24 ++- .../closedtrades/ClosedTradesViewModel.java | 7 +- .../openoffer/OpenOffersDataModel.java | 10 +- .../portfolio/openoffer/OpenOffersView.fxml | 19 +- .../portfolio/openoffer/OpenOffersView.java | 110 +++++++++- .../openoffer/OpenOffersViewModel.java | 16 +- .../steps/buyer/BuyerStep2View.java | 18 ++ .../settings/preferences/PreferencesView.java | 39 ++-- .../java/io/bisq/gui/util/BsqFormatter.java | 4 - .../main/java/io/bisq/gui/util/GUIUtil.java | 21 ++ .../validation/AltCoinAddressValidator.java | 64 +++--- .../gui/util/validation/CashAppValidator.java | 28 +++ .../util/validation/MoneyBeamValidator.java | 28 +++ .../util/validation/PopmoneyValidator.java | 28 +++ .../gui/util/validation/RevolutValidator.java | 28 +++ .../gui/util/validation/UpholdValidator.java | 28 +++ .../gui/util/validation/VenmoValidator.java | 28 +++ .../gui/util/validation/params/ACHParams.java | 58 ++++++ .../validation/params/SpeedCashParams.java | 88 ++++++++ gui/src/main/resources/keys/29CDFD3B.asc | 51 +++++ .../AltCoinAddressValidatorTest.java | 95 +++++++++ monitor/pom.xml | 2 +- network/pom.xml | 2 +- .../PersistableNetworkPayloadMap_BTC_MAINNET | Bin 1761356 -> 1896551 bytes package/linux/32bitBuild.sh | 2 +- package/linux/64bitBuild.sh | 2 +- package/linux/Dockerfile | 2 +- package/osx/create_app.sh | 2 +- package/osx/finalize.sh | 4 +- package/windows/32bitBuild.bat | 2 +- package/windows/64bitBuild.bat | 2 +- package/windows/Bisq.iss | 2 +- pom.xml | 2 +- seednode/pom.xml | 2 +- statistics/pom.xml | 2 +- 98 files changed, 2867 insertions(+), 515 deletions(-) create mode 100644 core/src/main/java/io/bisq/core/payment/CashAppAccount.java create mode 100644 core/src/main/java/io/bisq/core/payment/MoneyBeamAccount.java create mode 100644 core/src/main/java/io/bisq/core/payment/PopmoneyAccount.java create mode 100644 core/src/main/java/io/bisq/core/payment/RevolutAccount.java create mode 100644 core/src/main/java/io/bisq/core/payment/UpholdAccount.java create mode 100644 core/src/main/java/io/bisq/core/payment/VenmoAccount.java create mode 100644 core/src/main/java/io/bisq/core/payment/payload/CashAppAccountPayload.java create mode 100644 core/src/main/java/io/bisq/core/payment/payload/MoneyBeamAccountPayload.java create mode 100644 core/src/main/java/io/bisq/core/payment/payload/PopmoneyAccountPayload.java create mode 100644 core/src/main/java/io/bisq/core/payment/payload/RevolutAccountPayload.java create mode 100644 core/src/main/java/io/bisq/core/payment/payload/UpholdAccountPayload.java create mode 100644 core/src/main/java/io/bisq/core/payment/payload/VenmoAccountPayload.java create mode 100644 gui/src/main/java/io/bisq/gui/components/paymentmethods/CashAppForm.java create mode 100644 gui/src/main/java/io/bisq/gui/components/paymentmethods/MoneyBeamForm.java create mode 100644 gui/src/main/java/io/bisq/gui/components/paymentmethods/PopmoneyForm.java create mode 100644 gui/src/main/java/io/bisq/gui/components/paymentmethods/RevolutForm.java create mode 100644 gui/src/main/java/io/bisq/gui/components/paymentmethods/UpholdForm.java create mode 100644 gui/src/main/java/io/bisq/gui/components/paymentmethods/VenmoForm.java create mode 100644 gui/src/main/java/io/bisq/gui/util/validation/CashAppValidator.java create mode 100644 gui/src/main/java/io/bisq/gui/util/validation/MoneyBeamValidator.java create mode 100644 gui/src/main/java/io/bisq/gui/util/validation/PopmoneyValidator.java create mode 100644 gui/src/main/java/io/bisq/gui/util/validation/RevolutValidator.java create mode 100644 gui/src/main/java/io/bisq/gui/util/validation/UpholdValidator.java create mode 100644 gui/src/main/java/io/bisq/gui/util/validation/VenmoValidator.java create mode 100644 gui/src/main/java/io/bisq/gui/util/validation/params/ACHParams.java create mode 100644 gui/src/main/java/io/bisq/gui/util/validation/params/SpeedCashParams.java create mode 100644 gui/src/main/resources/keys/29CDFD3B.asc diff --git a/common/pom.xml b/common/pom.xml index 2e6fd34845..5c7fcb0428 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -5,7 +5,7 @@ parent io.bisq - 0.6.5 + 0.6.6 4.0.0 diff --git a/common/src/main/java/io/bisq/common/app/Version.java b/common/src/main/java/io/bisq/common/app/Version.java index a0f0c16b5d..551efcdf06 100644 --- a/common/src/main/java/io/bisq/common/app/Version.java +++ b/common/src/main/java/io/bisq/common/app/Version.java @@ -27,7 +27,7 @@ public class Version { // VERSION = 0.5.0 introduces proto buffer for the P2P network and local DB and is a not backward compatible update // Therefore all sub versions start again with 1 // We use semantic versioning with major, minor and patch - public static final String VERSION = "0.6.5"; + public static final String VERSION = "0.6.6"; public static int getMajorVersion(String version) { return getSubVersion(version, 0); diff --git a/common/src/main/java/io/bisq/common/locale/CurrencyUtil.java b/common/src/main/java/io/bisq/common/locale/CurrencyUtil.java index 9e3887f564..737abc2966 100644 --- a/common/src/main/java/io/bisq/common/locale/CurrencyUtil.java +++ b/common/src/main/java/io/bisq/common/locale/CurrencyUtil.java @@ -96,22 +96,19 @@ public class CurrencyUtil { result.add(new CryptoCurrency("BCH", "Bitcoin Cash")); result.add(new CryptoCurrency("BCHC", "Bitcoin Clashic")); result.add(new CryptoCurrency("BTG", "Bitcoin Gold")); - result.add(new CryptoCurrency("DARX", "BitDaric")); result.add(new CryptoCurrency("BURST", "Burstcoin")); result.add(new CryptoCurrency("GBYTE", "Byte")); result.add(new CryptoCurrency("CAGE", "Cagecoin")); result.add(new CryptoCurrency("XCP", "Counterparty")); result.add(new CryptoCurrency("CREA", "Creativecoin")); result.add(new CryptoCurrency("XCN", "Cryptonite")); - result.add(new CryptoCurrency("DAI", "Dai Stablecoin", true)); result.add(new CryptoCurrency("DNET", "DarkNet")); if (!baseCurrencyCode.equals("DASH")) result.add(new CryptoCurrency("DASH", "Dash")); result.add(new CryptoCurrency("DCT", "DECENT")); result.add(new CryptoCurrency("DCR", "Decred")); result.add(new CryptoCurrency("ONION", "DeepOnion")); - if (!baseCurrencyCode.equals("DOGE")) - result.add(new CryptoCurrency("DOGE", "Dogecoin")); + result.add(new CryptoCurrency("DOGE", "Dogecoin")); result.add(new CryptoCurrency("DMC", "DynamicCoin")); result.add(new CryptoCurrency("ELLA", "Ellaism")); result.add(new CryptoCurrency("ESP", "Espers")); @@ -133,7 +130,6 @@ public class CurrencyUtil { result.add(new CryptoCurrency("NMC", "Namecoin")); result.add(new CryptoCurrency("NBT", "NuBits")); result.add(new CryptoCurrency("NXT", "Nxt")); - result.add(new CryptoCurrency("ODN", "Obsidian")); result.add(new CryptoCurrency("888", "OctoCoin")); result.add(new CryptoCurrency("PART", "Particl")); result.add(new CryptoCurrency("PASC", "Pascal Coin", true)); @@ -149,7 +145,7 @@ public class CurrencyUtil { result.add(new CryptoCurrency("SIB", "Sibcoin")); result.add(new CryptoCurrency("XSPEC", "Spectrecoin")); result.add(new CryptoCurrency("STEEM", "STEEM")); - result.add(new CryptoCurrency("STL", "Stellite")); + result.add(new CryptoCurrency("TRC", "Terracoin")); result.add(new CryptoCurrency("MVT", "The Movement", true)); @@ -157,10 +153,23 @@ public class CurrencyUtil { result.add(new CryptoCurrency("CRED", "Verify", true)); result.add(new CryptoCurrency("WAC", "WACoins")); result.add(new CryptoCurrency("WILD", "WILD Token", true)); - result.add(new CryptoCurrency("YTN", "Yenten")); result.add(new CryptoCurrency("XZC", "Zcoin")); result.add(new CryptoCurrency("ZEC", "Zcash")); result.add(new CryptoCurrency("ZEN", "ZenCash")); + + // Added 0.6.6 + result.add(new CryptoCurrency("STL", "Stellite")); + result.add(new CryptoCurrency("DAI", "Dai Stablecoin", true)); + result.add(new CryptoCurrency("YTN", "Yenten")); + result.add(new CryptoCurrency("DARX", "BitDaric")); + result.add(new CryptoCurrency("ODN", "Obsidian")); + result.add(new CryptoCurrency("CDT", "Cassubian Detk")); + result.add(new CryptoCurrency("DGM", "DigiMoney")); + result.add(new CryptoCurrency("SCS", "SpeedCash")); + result.add(new CryptoCurrency("SOS", "SOS Coin", true)); + result.add(new CryptoCurrency("ACH", "AchieveCoin")); + result.add(new CryptoCurrency("VDN", "vDinar")); + result.sort(TradeCurrency::compareTo); // Util for printing all altcoins for adding to FAQ page @@ -185,8 +194,7 @@ public class CurrencyUtil { if (!baseCurrencyCode.equals("DASH")) result.add(new CryptoCurrency("DASH", "Dash")); result.add(new CryptoCurrency("DCR", "Decred")); - if (!baseCurrencyCode.equals("DOGE")) - result.add(new CryptoCurrency("DOGE", "Dogecoin")); + result.add(new CryptoCurrency("ONION", "DeepOnion")); result.add(new CryptoCurrency("ETH", "Ether")); result.add(new CryptoCurrency("ETC", "Ether Classic")); result.add(new CryptoCurrency("GRC", "Gridcoin")); @@ -239,7 +247,72 @@ public class CurrencyUtil { new FiatCurrency("HKD"), new FiatCurrency("CNY") )); - currencies.sort(TradeCurrency::compareTo); + currencies.sort(Comparator.comparing(TradeCurrency::getCode)); + return currencies; + } + + // https://support.uphold.com/hc/en-us/articles/202473803-Supported-currencies + public static List getAllUpholdCurrencies() { + ArrayList currencies = new ArrayList<>(Arrays.asList( + new FiatCurrency("USD"), + new FiatCurrency("EUR"), + new FiatCurrency("GBP"), + new FiatCurrency("CNY"), + new FiatCurrency("JPY"), + new FiatCurrency("CHF"), + new FiatCurrency("INR"), + new FiatCurrency("MXN"), + new FiatCurrency("AUD"), + new FiatCurrency("CAD"), + new FiatCurrency("HKD"), + new FiatCurrency("NZD"), + new FiatCurrency("SGD"), + new FiatCurrency("KES"), + new FiatCurrency("ILS"), + new FiatCurrency("DKK"), + new FiatCurrency("NOK"), + new FiatCurrency("SEK"), + new FiatCurrency("PLN"), + new FiatCurrency("ARS"), + new FiatCurrency("BRL"), + new FiatCurrency("AED"), + new FiatCurrency("PHP") + )); + + currencies.sort(Comparator.comparing(TradeCurrency::getCode)); + return currencies; + } + + //https://www.revolut.com/pa/faq#can-i-hold-multiple-currencies + public static List getAllRevolutCurrencies() { + ArrayList currencies = new ArrayList<>(Arrays.asList( + new FiatCurrency("USD"), + new FiatCurrency("GBP"), + new FiatCurrency("EUR"), + new FiatCurrency("PLN"), + new FiatCurrency("CHF"), + new FiatCurrency("DKK"), + new FiatCurrency("NOK"), + new FiatCurrency("SEK"), + new FiatCurrency("RON"), + new FiatCurrency("SGD"), + new FiatCurrency("HKD"), + new FiatCurrency("AUD"), + new FiatCurrency("NZD"), + new FiatCurrency("TRY"), + new FiatCurrency("ILS"), + new FiatCurrency("AED"), + new FiatCurrency("CAD"), + new FiatCurrency("HUF"), + new FiatCurrency("INR"), + new FiatCurrency("JPY"), + new FiatCurrency("MAD"), + new FiatCurrency("QAR"), + new FiatCurrency("THB"), + new FiatCurrency("ZAR") + )); + + currencies.sort(Comparator.comparing(TradeCurrency::getCode)); return currencies; } diff --git a/common/src/main/proto/pb.proto b/common/src/main/proto/pb.proto index 2a6a53c265..813d3b6727 100644 --- a/common/src/main/proto/pb.proto +++ b/common/src/main/proto/pb.proto @@ -807,6 +807,12 @@ message PaymentAccountPayload { PerfectMoneyAccountPayload perfect_money_account_payload = 12; SwishAccountPayload swish_account_payload = 13; USPostalMoneyOrderAccountPayload u_s_postal_money_order_account_payload = 14; + UpholdAccountPayload uphold_account_payload = 16; + CashAppAccountPayload cash_app_account_payload = 17; + MoneyBeamAccountPayload money_beam_account_payload = 18; + VenmoAccountPayload venmo_account_payload = 19; + PopmoneyAccountPayload popmoney_account_payload = 20; + RevolutAccountPayload revolut_account_payload = 21; } map exclude_from_json_data = 15; } @@ -917,6 +923,32 @@ message OKPayAccountPayload { string account_nr = 1; } +message UpholdAccountPayload { + string account_id = 1; +} + +message CashAppAccountPayload { + string cash_tag = 1; +} + +message MoneyBeamAccountPayload { + string account_id = 1; +} + +message VenmoAccountPayload { + string venmo_user_name = 1; + string holder_name = 2; +} + +message PopmoneyAccountPayload { + string account_id = 1; + string holder_name = 2; +} + +message RevolutAccountPayload { + string account_id = 1; +} + message PerfectMoneyAccountPayload { string account_nr = 1; } @@ -1066,6 +1098,7 @@ message OpenOffer { RESERVED = 2; CLOSED = 3; CANCELED = 4; + DEACTIVATED = 5; } Offer offer = 1; diff --git a/common/src/main/resources/i18n/displayStrings.properties b/common/src/main/resources/i18n/displayStrings.properties index 779468ced4..683de686c1 100644 --- a/common/src/main/resources/i18n/displayStrings.properties +++ b/common/src/main/resources/i18n/displayStrings.properties @@ -84,6 +84,8 @@ shared.bankName=Bank name shared.acceptedBanks=Accepted banks shared.amountMinMax=Amount (min - max) shared.remove=Remove +shared.deactivate=Deactivate +shared.activate=Activate shared.goTo=Go to {0} shared.BTCMinMax=BTC (min - max) shared.removeOffer=Remove offer @@ -316,6 +318,8 @@ offerbook.yesCreateOffer=Yes, create offer offerbook.setupNewAccount=Set up a new trading account offerbook.removeOffer.success=Remove offer was successful. offerbook.removeOffer.failed=Remove offer failed:\n{0} +offerbook.deactivateOffer.failed=Deactivating of offer failed:\n{0} +offerbook.activateOffer.failed=Publishing of offer failed:\n{0} offerbook.withdrawFundsHint=You can withdraw the funds you paid in from the {0} screen. offerbook.warning.noTradingAccountForCurrency.headline=No trading account for selected currency @@ -474,7 +478,7 @@ portfolio.pending.step2_buyer.refTextWarn=DO NOT use any additional notice in th portfolio.pending.step2_buyer.accountDetails=Here are the trade account details of the BTC seller:\n portfolio.pending.step2_buyer.tradeId=Please don't forget to add the trade ID # suppress inspection "TrailingSpacesInProperty" -portfolio.pending.step2_buyer.assign= as \"reason for payment\" so the receiver can assign your payment to this trade.\n\n +portfolio.pending.step2_buyer.assign=as \"reason for payment\" so the receiver can assign your payment to this trade.\n\n portfolio.pending.step2_buyer.fees=If your bank charges fees you have to cover those fees. # suppress inspection "TrailingSpacesInProperty" portfolio.pending.step2_buyer.altcoin=Please transfer from your external {0} wallet\n{1} to the BTC seller.\n\n @@ -765,10 +769,10 @@ setting.preferences.general=General preferences setting.preferences.explorer=Bitcoin block explorer: setting.preferences.deviation=Max. deviation from market price: setting.preferences.autoSelectArbitrators=Auto select arbitrators: -setting.preferences.deviationToLarge=Values higher than 30 % are not allowed. +setting.preferences.deviationToLarge=Values higher than {0}% are not allowed. setting.preferences.txFee=Withdrawal transaction fee (satoshi/byte): setting.preferences.useCustomValue=Use custom value -setting.preferences.txFeeMin=Transaction fee must be at least 5 satoshi/byte +setting.preferences.txFeeMin=Transaction fee must be at least {0} satoshi/byte setting.preferences.txFeeTooLarge=Your input is above any reasonable value (>5000 satoshi/byte). Transaction fee is usually in the range of 50-400 satoshi/byte. setting.preferences.ignorePeers=Ignore peers with onion address (comma sep.): setting.preferences.currenciesInList=Currencies in market price feed list @@ -1560,14 +1564,6 @@ LTC_MAINNET=Litecoin Mainnet LTC_TESTNET=Litecoin Testnet # suppress inspection "UnusedProperty" LTC_REGTEST=Litecoin Regtest - -# suppress inspection "UnusedProperty" -DOGE_MAINNET=Dogecoin Mainnet -# suppress inspection "UnusedProperty" -DOGE_TESTNET=Dogecoin Testnet -# suppress inspection "UnusedProperty" -DOGE_REGTEST=Dogecoin Regtest - # suppress inspection "UnusedProperty" DASH_MAINNET=DASH Mainnet # suppress inspection "UnusedProperty" @@ -1629,6 +1625,7 @@ seed.restore.error=An error occurred when restoring the wallets with seed words. # Payment methods #################################################################### +payment.account=Account payment.account.no=Account no.: payment.account.name=Account name: payment.account.owner=Account owner full name @@ -1648,9 +1645,6 @@ payment.restore.default=No, restore default currency payment.email=Email: payment.country=Country: payment.extras=Extra requirements: -payment.us.info=Bank transfer with WIRE or ACH is not supported for the US because WIRE is too expensive and ACH has a high chargeback risk.\n\n\ - Please use one of the available payment methods for the US like: \ - \"Zelle (ClearXchange)\", \"Chase QuickPay\", \"US Postal Money Order\" or \"Cash Deposit\". payment.email.mobile=Email or mobile no.: payment.altcoin.address=Altcoin address: payment.altcoin=Altcoin: @@ -1658,7 +1652,13 @@ payment.select.altcoin=Select or search altcoin payment.secret=Secret question: payment.answer=Answer: payment.wallet=Wallet ID: -payment.supported.okpay=Supported currencies: +payment.uphold.accountId=Username or email or phone no.: +payment.cashApp.cashTag=$Cashtag: +payment.moneyBeam.accountId=Email or phone no.: +payment.venmo.venmoUserName=Venmo username: +payment.popmoney.accountId=Email or phone no.: +payment.revolut.accountId=Email or phone no.: +payment.supportedCurrencies=Supported currencies: payment.limitations=Limitations: payment.salt=Salt for account age verification: payment.error.noHexSalt=The salt need to be in HEX format.\n\ @@ -1703,6 +1703,7 @@ before starting a trade or creating an offer.\n\n\ \t● FirstBank Person to Person Transfers\n\ \t● Frost Send Money\n\ \t● U.S. Bank Send Money\n\ +\t● TD Bank\n\ \t● Wells Fargo SurePay\n\n\ 3. You need to be sure to not exceed the daily or monthly Zelle (ClearXchange) transfer limits.\n\n\ Please use Zelle (ClearXchange) only if you fulfill all those requirements, \ @@ -1715,6 +1716,20 @@ to get in contact with the {1} buyer by using the provided email address or mobi payment.westernUnion.info=When using Western Union the BTC buyer has to send the MTCN (tracking number) and a photo of the receipt by email to the BTC seller. \ The receipt must clearly show the seller''s full name, city, country and the amount. The buyer will get displayed the seller''s email in the trade process. +payment.limits.info=Please be aware that all bank transfers carry a certain amount of chargeback risk.\n\ + \n\ + To mitigate this risk, Bisq sets per-trade limits based on two factors:\n\ + \n\ + 1. The estimated level of chargeback risk for the payment method used\n\ + 2. The age of your account for that payment method\n\ + \n\ + The account you are creating now is new and its age is zero. As your account grows in age over a two-month period, your per-trade limits will grow along with it:\n\ + \n\ + ● During the 1st month, your per-trade limit will be {0}\n\ + ● During the 2nd month, your per-trade limit will be {1}\n\ + ● After the 2nd month, your per-trade limit will be {2}\n\ + \n\ + Please note that there are no limits on the total number of times you can trade. # We use constants from the code so we do not use our normal naming convention # dynamic values are not recognized by IntelliJ @@ -1741,6 +1756,12 @@ WESTERN_UNION_SHORT=Western Union # Do not translate brand names OK_PAY=OKPay +UPHOLD=Uphold +CASH_APP=Cash App +MONEY_BEAM=MoneyBeam (N26) +VENMO=Venmo +POPMONEY=Popmoney +REVOLUT=Revolut PERFECT_MONEY=Perfect Money ALI_PAY=AliPay SEPA=SEPA @@ -1755,6 +1776,18 @@ BLOCK_CHAINS=Altcoins # suppress inspection "UnusedProperty" OK_PAY_SHORT=OKPay # suppress inspection "UnusedProperty" +UPHOLD_SHORT=Uphold +# suppress inspection "UnusedProperty" +CASH_APP_SHORT=Cash App +# suppress inspection "UnusedProperty" +MONEY_BEAM_SHORT=MoneyBeam (N26) +# suppress inspection "UnusedProperty" +VENMO_SHORT=Venmo +# suppress inspection "UnusedProperty" +POPMONEY_SHORT=Popmoney +# suppress inspection "UnusedProperty" +REVOLUT_SHORT=Revolut +# suppress inspection "UnusedProperty" PERFECT_MONEY_SHORT=Perfect Money # suppress inspection "UnusedProperty" ALI_PAY_SHORT=AliPay diff --git a/common/src/main/resources/i18n/displayStrings_de.properties b/common/src/main/resources/i18n/displayStrings_de.properties index afc9869c4d..36d7a2eb11 100644 --- a/common/src/main/resources/i18n/displayStrings_de.properties +++ b/common/src/main/resources/i18n/displayStrings_de.properties @@ -1326,13 +1326,6 @@ LTC_TESTNET=Litecoin-Testnetzwerk # suppress inspection "UnusedProperty" LTC_REGTEST=Litecoin-Regtest -# suppress inspection "UnusedProperty" -DOGE_MAINNET=Dogecoin-Hauptnetzwerk -# suppress inspection "UnusedProperty" -DOGE_TESTNET=Dogecoin-Testnetzwerk -# suppress inspection "UnusedProperty" -DOGE_REGTEST=Dogecoin-Regtest - # suppress inspection "UnusedProperty" DASH_MAINNET=DASH-Hauptnetz # suppress inspection "UnusedProperty" @@ -1401,7 +1394,6 @@ payment.restore.default=Nein, Standardwährung wiederherstellen payment.email=E-Mail: payment.country=Land: payment.extras=Besondere Anforderungen: -payment.us.info=Überweisungen mit WIRE oder ACH werden in den USA nicht unterstützt, da WIRE zu teuer ist und ACH ein hohes Rückbuchungsrisikio beinhaltet.\n\nBitte nutzen Sie stattdessen die Zahlungsmethoden \"Zelle (ClearXchange)\", \"Chase QuickPay\", \"US Postal Money Order\" oder \"Cash Deposit\". payment.email.mobile=E-Mail oder Telefonnummer: payment.altcoin.address=Altcoin-Adresse: payment.altcoin=Altcoin: @@ -1409,7 +1401,7 @@ payment.select.altcoin=Altcoin wählen oder suchen payment.secret=Geheimfrage: payment.answer=Antwort: payment.wallet=Wallet-ID: -payment.supported.okpay=Unterstützte Währungen: +payment.supportedCurrencies=Unterstützte Währungen: payment.limitations=Einschränkungen: payment.accept.euro=Händel aus diesen Euroländern akzeptieren: payment.accept.nonEuro=Händel aus diesen Nicht-Euroländern akzeptieren: diff --git a/common/src/main/resources/i18n/displayStrings_el.properties b/common/src/main/resources/i18n/displayStrings_el.properties index 994a26e00f..6162fc07b1 100644 --- a/common/src/main/resources/i18n/displayStrings_el.properties +++ b/common/src/main/resources/i18n/displayStrings_el.properties @@ -1281,13 +1281,6 @@ LTC_TESTNET=Litecoin Testnet # suppress inspection "UnusedProperty" LTC_REGTEST=Litecoin Regtest -# suppress inspection "UnusedProperty" -DOGE_MAINNET=Dogecoin Mainnet -# suppress inspection "UnusedProperty" -DOGE_TESTNET=Dogecoin Testnet -# suppress inspection "UnusedProperty" -DOGE_REGTEST=Dogecoin Regtest - # suppress inspection "UnusedProperty" DASH_MAINNET=DASH Mainnet # suppress inspection "UnusedProperty" @@ -1356,7 +1349,6 @@ payment.restore.default=Όχι, επανάφερε το προεπιλεγμέ payment.email=Email: payment.country=Χώρα: payment.extras=Επιπλέον προαπαιτήσεις: -payment.us.info=Bank transfer with WIRE or ACH is not supported for the US because WIRE is too expensive and ACH has a high chargeback risk.\n\nPlease use one of the available payment methods for the US like: \"Zelle (ClearXchange)\", \"Chase QuickPay\", \"US Postal Money Order\" or \"Cash Deposit\". payment.email.mobile=Email ή αριθμός κινητού: payment.altcoin.address=Διεύθυνση altcoin: payment.altcoin=Altcoin: @@ -1364,7 +1356,7 @@ payment.select.altcoin=Διάλεξε ή αναζήτησε altcoin: payment.secret=Ερώτηση ασφάλειας: payment.answer=Απάντηση: payment.wallet=Ταυτότητα πορτοφολιού: -payment.supported.okpay= Υποστηριζόμενα νομίσματα: +payment.supportedCurrencies=Υποστηριζόμενα νομίσματα: payment.limitations=Περιορισμοί: payment.accept.euro=Αποδοχή συναλλαγών από τις ακόλουθες χώρες Ευρώ: payment.accept.nonEuro=Αποδοχή συναλλαγών από τις ακόλουθες χώρες εκτός Ευρώ: diff --git a/common/src/main/resources/i18n/displayStrings_es.properties b/common/src/main/resources/i18n/displayStrings_es.properties index 9bb9b8bacd..44ba87502a 100644 --- a/common/src/main/resources/i18n/displayStrings_es.properties +++ b/common/src/main/resources/i18n/displayStrings_es.properties @@ -1281,13 +1281,6 @@ LTC_TESTNET=Testnet Litecoin # suppress inspection "UnusedProperty" LTC_REGTEST=Regtest Litecoin -# suppress inspection "UnusedProperty" -DOGE_MAINNET=Red principal Dogecoin -# suppress inspection "UnusedProperty" -DOGE_TESTNET=Testnet Dogecoin -# suppress inspection "UnusedProperty" -DOGE_REGTEST=Regtest Dogecoin - # suppress inspection "UnusedProperty" DASH_MAINNET=DASH Mainnet # suppress inspection "UnusedProperty" @@ -1356,7 +1349,6 @@ payment.restore.default=No, restaurar moneda por defecto. payment.email=Email: payment.country=País: payment.extras=Requisitos extra: -payment.us.info=Bank transfer with WIRE or ACH is not supported for the US because WIRE is too expensive and ACH has a high chargeback risk.\n\nPlease use one of the available payment methods for the US like: \"Zelle (ClearXchange)\", \"Chase QuickPay\", \"US Postal Money Order\" or \"Cash Deposit\". payment.email.mobile=Email o número de móvil: payment.altcoin.address=Dirección de altcoin: payment.altcoin=Altcoin: @@ -1364,7 +1356,7 @@ payment.select.altcoin=Seleccione o busque altcoin payment.secret=Pregunta secreta: payment.answer=Respuesta: payment.wallet=ID de cartera: -payment.supported.okpay=Monedas soportadas: +payment.supportedCurrencies=Monedas soportadas: payment.limitations=Límitaciones: payment.accept.euro=Aceptar intercambios desde estos países Euro. payment.accept.nonEuro=Aceptar intercambios desde estos países no-Euro: diff --git a/common/src/main/resources/i18n/displayStrings_hu.properties b/common/src/main/resources/i18n/displayStrings_hu.properties index c202524795..4d716770d6 100644 --- a/common/src/main/resources/i18n/displayStrings_hu.properties +++ b/common/src/main/resources/i18n/displayStrings_hu.properties @@ -1405,13 +1405,6 @@ LTC_TESTNET=Litecoin Testnet # suppress inspection "UnusedProperty" LTC_REGTEST=Litecoin Regtest -# suppress inspection "UnusedProperty" -DOGE_MAINNET=Dogecoin Mainnet -# suppress inspection "UnusedProperty" -DOGE_TESTNET=Dogecoin Testnet -# suppress inspection "UnusedProperty" -DOGE_REGTEST=Dogecoin Regtest - # suppress inspection "UnusedProperty" DASH_MAINNET=DASH főhálozat # suppress inspection "UnusedProperty" @@ -1484,7 +1477,6 @@ payment.restore.default=Nem, alapértelmezett valuta visszaállítása payment.email=E-mail: payment.country=Ország: payment.extras=Extra követelmények: -payment.us.info=A WIRE vagy ACH átutalása nem támogatott az Egyesült Államokban, mivel hogy a WIRE túl drága és az ACH magas visszaterhelési kockázattal jár.\n\nHasználja helyette a következő fizetési módokat: \"Zelle (ClearXchange)\", \"Chase QuickPay\", \"US Posta Pénz Rendelés\" vagy \"Készpénz befizetése\". payment.email.mobile=E-mail vagy mobil: payment.altcoin.address=Altérmék cím: payment.altcoin=Altérme: @@ -1492,7 +1484,7 @@ payment.select.altcoin=Válassz vagy keress altérmét payment.secret=Titkos kérdés: payment.answer=Válasz: payment.wallet=Pénztárca azonosító: -payment.supported.okpay=Támogatott valuták: +payment.supportedCurrencies=Támogatott valuták: payment.limitations=Korlátozások: payment.salt=Só a fiók korhatár ellenőrzéséhez: payment.error.noHexSalt=A sónak HEX formátumban kell lennie.\nCsak akkor ajánlatos szerkeszteni a só mezőt, ha át szeretné vinni a sót egy régebbi fiókból, a fiók korának megőrzése érdekében. A fiók korát a fiók sójának és az azonosító számlaadatok (pl. IBAN) használatával lesz ellenőrizve. diff --git a/common/src/main/resources/i18n/displayStrings_pt.properties b/common/src/main/resources/i18n/displayStrings_pt.properties index 15a8efe4d9..0c09adeb0a 100644 --- a/common/src/main/resources/i18n/displayStrings_pt.properties +++ b/common/src/main/resources/i18n/displayStrings_pt.properties @@ -1281,13 +1281,6 @@ LTC_TESTNET=Litecoin Testnet # suppress inspection "UnusedProperty" LTC_REGTEST=Litecoin Regtest -# suppress inspection "UnusedProperty" -DOGE_MAINNET=Dogecoin Mainnet -# suppress inspection "UnusedProperty" -DOGE_TESTNET=Dogecoin Testnet -# suppress inspection "UnusedProperty" -DOGE_REGTEST=Dogecoin Regtest - # suppress inspection "UnusedProperty" DASH_MAINNET=DASH Mainnet # suppress inspection "UnusedProperty" @@ -1356,7 +1349,6 @@ payment.restore.default=Não, resturar para a moeda padrão payment.email=Email: payment.country=País: payment.extras=Requerimentos adicionais: -payment.us.info=Bank transfer with WIRE or ACH is not supported for the US because WIRE is too expensive and ACH has a high chargeback risk.\n\nPlease use one of the available payment methods for the US like: \"Zelle (ClearXchange)\", \"Chase QuickPay\", \"US Postal Money Order\" or \"Cash Deposit\". payment.email.mobile=Email ou celular: payment.altcoin.address=Endereço altcoin: payment.altcoin=Altcoin: @@ -1364,7 +1356,7 @@ payment.select.altcoin=Selecionar ou buscar altcoin payment.secret=Pergunta secreta: payment.answer=Resposta: payment.wallet=ID da carteira: -payment.supported.okpay=Moedas suportadas: +payment.supportedCurrencies=Moedas suportadas: payment.limitations=Limitações: payment.accept.euro=Aceitar negociações destes países do Euro: payment.accept.nonEuro=Aceitar negociações desses países fora do Euro: diff --git a/common/src/main/resources/i18n/displayStrings_ro.properties b/common/src/main/resources/i18n/displayStrings_ro.properties index 6e951b5818..23f1c36843 100644 --- a/common/src/main/resources/i18n/displayStrings_ro.properties +++ b/common/src/main/resources/i18n/displayStrings_ro.properties @@ -1405,13 +1405,6 @@ LTC_TESTNET=Litecoin Testnet # suppress inspection "UnusedProperty" LTC_REGTEST=Litecoin Regtest -# suppress inspection "UnusedProperty" -DOGE_MAINNET=Dogecoin Mainnet -# suppress inspection "UnusedProperty" -DOGE_TESTNET=Dogecoin Testnet -# suppress inspection "UnusedProperty" -DOGE_REGTEST=Dogecoin Regtest - # suppress inspection "UnusedProperty" DASH_MAINNET=Rețeaua principală DASH # suppress inspection "UnusedProperty" @@ -1484,7 +1477,6 @@ payment.restore.default=Nu, restaurează valuta prestabilită payment.email=E-mail: payment.country=Țara: payment.extras=Cerințe extra: -payment.us.info=Transferul bancar cu WIRE sau ACH nu sunt acceptate pentru SUA, deoarece WIRE este prea scump și ACH are un risc prea mare de rambursare.\n\nTe rugăm să folosești mai degrabă metode de plată disponibile în SUA precum: \"Zelle (ClearXchange)\", \"Chase QuickPay\", \"Ordin de plată poștală SUA\" sau \"Depozit Numerar\". payment.email.mobile=E-mail sau nr. mobil: payment.altcoin.address=Adresă altcoin: payment.altcoin=Altcoin: @@ -1492,7 +1484,7 @@ payment.select.altcoin=Selectează sau caută altcoin payment.secret=Întrebarea secretă: payment.answer=Răspuns: payment.wallet=Cod portofel: -payment.supported.okpay=Valute acceptate: +payment.supportedCurrencies=Valute acceptate: payment.limitations=Limite: payment.salt=Sare pentru verificarea vechimii contului: payment.error.noHexSalt=Sarea trebuie să fie în format HEX.\nSe recomandă editarea câmpul de sare dacă dorești să transferi sarea dintr-un cont vechi pentru a păstra vechimea contului. Vechimea contului este verificată folosind sarea contului și datele de identificare ale acestuia (de exemplu codul IBAN). diff --git a/common/src/main/resources/i18n/displayStrings_ru.properties b/common/src/main/resources/i18n/displayStrings_ru.properties index e4023be8de..d89cc6b885 100644 --- a/common/src/main/resources/i18n/displayStrings_ru.properties +++ b/common/src/main/resources/i18n/displayStrings_ru.properties @@ -1281,13 +1281,6 @@ LTC_TESTNET=Litecoin Тест-сеть # suppress inspection "UnusedProperty" LTC_REGTEST=Litecoin Регистр.-тест -# suppress inspection "UnusedProperty" -DOGE_MAINNET=Dogecoin основная сеть -# suppress inspection "UnusedProperty" -DOGE_TESTNET=Dogecoin тест-сеть -# suppress inspection "UnusedProperty" -DOGE_REGTEST=Dogecoin Регистр. -тест - # suppress inspection "UnusedProperty" DASH_MAINNET=DASH Mainnet # suppress inspection "UnusedProperty" @@ -1356,7 +1349,6 @@ payment.restore.default=Нет, восстановить валюту по ум payment.email=Электронная почта: payment.country=Страна: payment.extras=Дополнительные требования: -payment.us.info=Bank transfer with WIRE or ACH is not supported for the US because WIRE is too expensive and ACH has a high chargeback risk.\n\nPlease use one of the available payment methods for the US like: \"Zelle (ClearXchange)\", \"Chase QuickPay\", \"US Postal Money Order\" or \"Cash Deposit\". payment.email.mobile=Электронная почта или номер моб. тел.: payment.altcoin.address=Альткоин-адрес: payment.altcoin=Альткоин: @@ -1364,7 +1356,7 @@ payment.select.altcoin=Выбор или поиск альткоин payment.secret=Секретный вопрос: payment.answer=Ответ: payment.wallet=Идентификатор кошелька: -payment.supported.okpay=Поддерживаемые валюты: +payment.supportedCurrencies=Поддерживаемые валюты: payment.limitations=Ограничения: payment.accept.euro=Принять сделки от этих стран Евро: payment.accept.nonEuro=Примите сделки от этих не- Евро стран: diff --git a/common/src/main/resources/i18n/displayStrings_sr.properties b/common/src/main/resources/i18n/displayStrings_sr.properties index 16920a37de..a9d592ede7 100644 --- a/common/src/main/resources/i18n/displayStrings_sr.properties +++ b/common/src/main/resources/i18n/displayStrings_sr.properties @@ -1281,13 +1281,6 @@ LTC_TESTNET=Lajtkoin Testnet # suppress inspection "UnusedProperty" LTC_REGTEST=Lajtkoin Regtest -# suppress inspection "UnusedProperty" -DOGE_MAINNET=Dogekoin Mejnnet -# suppress inspection "UnusedProperty" -DOGE_TESTNET=Dogekoin Testnet -# suppress inspection "UnusedProperty" -DOGE_REGTEST=Dogekoin Regtest - # suppress inspection "UnusedProperty" DASH_MAINNET=DASH Mainnet # suppress inspection "UnusedProperty" @@ -1356,7 +1349,6 @@ payment.restore.default=Ne, vrati podrazumevanu valutu payment.email=Email: payment.country=Država: payment.extras=Dodatni zahtevi: -payment.us.info=Bank transfer with WIRE or ACH is not supported for the US because WIRE is too expensive and ACH has a high chargeback risk.\n\nPlease use one of the available payment methods for the US like: \"Zelle (ClearXchange)\", \"Chase QuickPay\", \"US Postal Money Order\" or \"Cash Deposit\". payment.email.mobile=Email ili br. mobilnog: payment.altcoin.address=Altkoin adresa: payment.altcoin=Altkoin: @@ -1364,7 +1356,7 @@ payment.select.altcoin=Izaberi ili traži altkoin payment.secret=Tajno pitanje: payment.answer=Odgovor: payment.wallet=ID novčanika: -payment.supported.okpay=Podržane valute: +payment.supportedCurrencies=Podržane valute: payment.limitations=Ograničenja: payment.accept.euro=Prihvati trgovine od ovih Euro država: payment.accept.nonEuro=Prihvati trgovine od ovih ne-Euro država: diff --git a/common/src/main/resources/i18n/displayStrings_zh.properties b/common/src/main/resources/i18n/displayStrings_zh.properties index f0e3b6b246..54db2683af 100644 --- a/common/src/main/resources/i18n/displayStrings_zh.properties +++ b/common/src/main/resources/i18n/displayStrings_zh.properties @@ -1281,13 +1281,6 @@ LTC_TESTNET=莱特币测试网络 # suppress inspection "UnusedProperty" LTC_REGTEST=莱特币回归测试 -# suppress inspection "UnusedProperty" -DOGE_MAINNET=狗狗币主干网络 -# suppress inspection "UnusedProperty" -DOGE_TESTNET=狗狗币测试网络 -# suppress inspection "UnusedProperty" -DOGE_REGTEST=狗狗币回归测试 - # suppress inspection "UnusedProperty" DASH_MAINNET=达世币主干网络 # suppress inspection "UnusedProperty" @@ -1356,7 +1349,6 @@ payment.restore.default=不,恢复默认值 payment.email=电子邮箱: payment.country=国家: payment.extras=额外要求: -payment.us.info=不支持美国银行使用WIRE或ACH方式的转账. 因为WIRE方式太昂贵而ACH方式有很高的撤销风险.\n请使用\"ClearXchange\", \"US Postal Money Order\" 或 \"Cash/ATM Deposit\" 支付方式. payment.email.mobile=电子邮箱或手机号码: payment.altcoin.address=数字货币地址: payment.altcoin=数字货币: @@ -1364,7 +1356,7 @@ payment.select.altcoin=选择或搜索数字货币 payment.secret=密保问题: payment.answer=答案: payment.wallet=钱包ID: -payment.supported.okpay=支持的货币: +payment.supportedCurrencies=支持的货币: payment.limitations=限制条件: payment.accept.euro=接受来自这些欧元国家的交易: payment.accept.nonEuro=接受来自这些非欧元国家的交易: diff --git a/common/src/main/resources/i18n/in_dev/displayStrings_fr.properties b/common/src/main/resources/i18n/in_dev/displayStrings_fr.properties index 83a9e3eb54..1526fb5832 100644 --- a/common/src/main/resources/i18n/in_dev/displayStrings_fr.properties +++ b/common/src/main/resources/i18n/in_dev/displayStrings_fr.properties @@ -45,7 +45,6 @@ payment.email=Email: payment.country=Country: payment.owner.email=Account holder email: payment.extras=Extra requirements: -payment.us.info=Bank transfer with WIRE or ACH is not supported for the US because WIRE is too expensive and ACH has a high chargeback risk.\n\nPlease use payment methods \"Zelle (ClearXchange)\", \"US Postal Money Order\" or \"Cash Deposit\" instead. payment.email.mobile=Email or mobile no.: payment.altcoin.address=Altcoin address: payment.address=address: diff --git a/consensus/pom.xml b/consensus/pom.xml index 75343cdf2b..34af05fe64 100644 --- a/consensus/pom.xml +++ b/consensus/pom.xml @@ -5,7 +5,7 @@ parent io.bisq - 0.6.5 + 0.6.6 4.0.0 diff --git a/core/pom.xml b/core/pom.xml index a6c9c90190..12792bc63d 100755 --- a/core/pom.xml +++ b/core/pom.xml @@ -6,7 +6,7 @@ parent io.bisq - 0.6.5 + 0.6.6 core diff --git a/core/src/main/java/io/bisq/core/btc/BaseCurrencyNetwork.java b/core/src/main/java/io/bisq/core/btc/BaseCurrencyNetwork.java index d56a432bf8..a66d4af168 100644 --- a/core/src/main/java/io/bisq/core/btc/BaseCurrencyNetwork.java +++ b/core/src/main/java/io/bisq/core/btc/BaseCurrencyNetwork.java @@ -20,7 +20,6 @@ package io.bisq.core.btc; import io.bisq.core.app.BisqEnvironment; import io.bisq.core.provider.fee.FeeService; import lombok.Getter; -import org.bitcoinj.core.Coin; import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.params.MainNetParams; import org.bitcoinj.params.RegTestParams; @@ -36,10 +35,6 @@ public enum BaseCurrencyNetwork { LTC_TESTNET(LitecoinTestNet3Params.get(), "LTC", "TESTNET", "Litecoin"), LTC_REGTEST(LitecoinRegTestParams.get(), "LTC", "REGTEST", "Litecoin"), - DOGE_MAINNET(DogecoinMainNetParams.get(), "DOGE", "MAINNET", "Dogecoin"), - DOGE_TESTNET(DogecoinTestNet3Params.get(), "DOGE", "TESTNET", "Dogecoin"), - DOGE_REGTEST(DogecoinRegTestParams.get(), "DOGE", "REGTEST", "Dogecoin"), - DASH_MAINNET(DashMainNetParams.get(), "DASH", "MAINNET", "Dash"), DASH_TESTNET(DashTestNet3Params.get(), "DASH", "TESTNET", "Dash"), DASH_REGTEST(DashRegTestParams.get(), "DASH", "REGTEST", "Dash"); @@ -80,21 +75,14 @@ public enum BaseCurrencyNetwork { return "DASH".equals(currencyCode); } - public boolean isDoge() { - return "DOGE".equals(currencyCode); - } - - - public Coin getDefaultMinFee() { + public long getDefaultMinFeePerByte() { switch (BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode()) { case "BTC": - return FeeService.BTC_REFERENCE_DEFAULT_MIN_TX_FEE; + return FeeService.BTC_REFERENCE_DEFAULT_MIN_TX_FEE_PER_KB.divide(1000).value; case "LTC": - return FeeService.LTC_REFERENCE_DEFAULT_MIN_TX_FEE; - case "DOGE": - return FeeService.DOGE_REFERENCE_DEFAULT_MIN_TX_FEE; + return FeeService.LTC_REFERENCE_DEFAULT_MIN_TX_FEE.value; case "DASH": - return FeeService.DASH_REFERENCE_DEFAULT_MIN_TX_FEE; + return FeeService.DASH_REFERENCE_DEFAULT_MIN_TX_FEE.value; default: throw new RuntimeException("Unsupported code at getDefaultMinFee: " + BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode()); } diff --git a/core/src/main/java/io/bisq/core/btc/Restrictions.java b/core/src/main/java/io/bisq/core/btc/Restrictions.java index cea1ded3af..63cc559d16 100644 --- a/core/src/main/java/io/bisq/core/btc/Restrictions.java +++ b/core/src/main/java/io/bisq/core/btc/Restrictions.java @@ -54,9 +54,6 @@ public class Restrictions { case "LTC": MIN_TRADE_AMOUNT = Coin.valueOf(100_000); // 0.04 EUR @ 40 EUR/LTC break; - case "DOGE": - MIN_TRADE_AMOUNT = Coin.valueOf(1_000_000_000L); // 0.03 EUR at DOGE price 0.003 EUR; - break; case "DASH": MIN_TRADE_AMOUNT = Coin.valueOf(20_000L); // 0.03 EUR at @ 150 EUR/DASH; break; @@ -74,9 +71,6 @@ public class Restrictions { case "LTC": MAX_BUYER_SECURITY_DEPOSIT = Coin.valueOf(1_200_000_000); // 500 EUR @ 40 EUR/LTC break; - case "DOGE": - MAX_BUYER_SECURITY_DEPOSIT = Coin.valueOf(20_000_000_000_000L); // 500 EUR @ 0.0025 EUR/DOGE; - break; case "DASH": MAX_BUYER_SECURITY_DEPOSIT = Coin.valueOf(300_000_000L); // 450 EUR @ 150 EUR/DASH; break; @@ -94,9 +88,6 @@ public class Restrictions { case "LTC": MIN_BUYER_SECURITY_DEPOSIT = Coin.valueOf(6_000_000); // 2.4 EUR @ 40 EUR/LTC break; - case "DOGE": - MIN_BUYER_SECURITY_DEPOSIT = Coin.valueOf(100_000_000_000L); // 2.5 EUR @ 0.0025 EUR/DOGE; - break; case "DASH": MIN_BUYER_SECURITY_DEPOSIT = Coin.valueOf(1_500_000L); // 2.5 EUR @ 150 EUR/DASH; break; @@ -113,9 +104,6 @@ public class Restrictions { case "LTC": DEFAULT_BUYER_SECURITY_DEPOSIT = Coin.valueOf(200_000_000); // 75 EUR @ 40 EUR/LTC break; - case "DOGE": - DEFAULT_BUYER_SECURITY_DEPOSIT = Coin.valueOf(3_000_000_000_000L); // 75 EUR @ 0.0025 EUR/DOGE; - break; case "DASH": DEFAULT_BUYER_SECURITY_DEPOSIT = Coin.valueOf(50_000_000L); // 75 EUR @ 150 EUR/DASH; break; @@ -132,9 +120,6 @@ public class Restrictions { case "LTC": SELLER_SECURITY_DEPOSIT = Coin.valueOf(60_000_000); // 25 EUR @ 40 EUR/LTC break; - case "DOGE": - SELLER_SECURITY_DEPOSIT = Coin.valueOf(1_000_000_000_000L); // 25 EUR @ 0.0025 EUR/DOGE; - break; case "DASH": SELLER_SECURITY_DEPOSIT = Coin.valueOf(15_000_000L); // 25 EUR @ 150 EUR/DASH; break; diff --git a/core/src/main/java/io/bisq/core/btc/wallet/BtcWalletService.java b/core/src/main/java/io/bisq/core/btc/wallet/BtcWalletService.java index 67f9b1f9cc..0ce78b3bf5 100644 --- a/core/src/main/java/io/bisq/core/btc/wallet/BtcWalletService.java +++ b/core/src/main/java/io/bisq/core/btc/wallet/BtcWalletService.java @@ -22,7 +22,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import io.bisq.common.handlers.ErrorMessageHandler; -import io.bisq.core.app.BisqEnvironment; import io.bisq.core.btc.*; import io.bisq.core.btc.exceptions.TransactionVerificationException; import io.bisq.core.btc.exceptions.WalletException; @@ -293,6 +292,7 @@ public class BtcWalletService extends WalletService { int numInputs = preparedBsqTxInputs.size() + 1; // We add 1 for the BTC fee input Transaction resultTx = null; boolean isFeeOutsideTolerance; + boolean opReturnIsOnlyOutput; do { counter++; if (counter >= 10) { @@ -331,7 +331,8 @@ public class BtcWalletService extends WalletService { // We might have the rare case that both inputs matched the required fees, so both did not require // a change output. // In such cases we need to add artificially a change output (OP_RETURN is not allowed as only output) - forcedChangeValue = resultTx.getOutputs().size() == 0 ? Restrictions.getMinNonDustOutput() : Coin.ZERO; + opReturnIsOnlyOutput = resultTx.getOutputs().size() == 0; + forcedChangeValue = opReturnIsOnlyOutput ? Restrictions.getMinNonDustOutput() : Coin.ZERO; // add OP_RETURN output if (opReturnData != null) @@ -343,7 +344,9 @@ public class BtcWalletService extends WalletService { // calculated fee must be inside of a tolerance range with tx fee isFeeOutsideTolerance = Math.abs(resultTx.getFee().value - estimatedFeeAsLong) > 1000; } - while (forcedChangeValue.isPositive() || isFeeOutsideTolerance); + while (opReturnIsOnlyOutput || + isFeeOutsideTolerance || + resultTx.getFee().value < txFeePerByte.multiply(resultTx.bitcoinSerialize().length).value); // Sign all BTC inputs for (int i = preparedBsqTxInputs.size(); i < resultTx.getInputs().size(); i++) { @@ -603,10 +606,6 @@ public class BtcWalletService extends WalletService { do { counter++; fee = txFeeForWithdrawalPerByte.multiply(txSize); - final Coin defaultMinFee = BisqEnvironment.getBaseCurrencyNetwork().getDefaultMinFee(); - if (fee.compareTo(defaultMinFee) < 0) - fee = defaultMinFee; - newTransaction.clearOutputs(); newTransaction.addOutput(amount.subtract(fee), toAddress); @@ -621,9 +620,10 @@ public class BtcWalletService extends WalletService { tx = sendRequest.tx; txSize = tx.bitcoinSerialize().length; printTx("FeeEstimationTransaction", tx); - sendRequest.tx.getOutputs().stream().forEach(o -> log.debug("Output value " + o.getValue().toFriendlyString())); + sendRequest.tx.getOutputs().forEach(o -> log.debug("Output value " + o.getValue().toFriendlyString())); } - while (counter < 10 && Math.abs(tx.getFee().value - txFeeForWithdrawalPerByte.multiply(txSize).value) > 1000); + while (feeEstimationNotSatisfied(counter, tx)); + if (counter == 10) log.error("Could not calculate the fee. Tx=" + tx); @@ -722,17 +722,13 @@ public class BtcWalletService extends WalletService { do { counter++; fee = txFeeForWithdrawalPerByte.multiply(txSize); - final Coin defaultMinFee = BisqEnvironment.getBaseCurrencyNetwork().getDefaultMinFee(); - if (fee.compareTo(defaultMinFee) < 0) - fee = defaultMinFee; - SendRequest sendRequest = getSendRequest(fromAddress, toAddress, amount, fee, aesKey, context); wallet.completeTx(sendRequest); tx = sendRequest.tx; txSize = tx.bitcoinSerialize().length; printTx("FeeEstimationTransaction", tx); } - while (counter < 10 && Math.abs(tx.getFee().value - txFeeForWithdrawalPerByte.multiply(txSize).value) > 1000); + while (feeEstimationNotSatisfied(counter, tx)); if (counter == 10) log.error("Could not calculate the fee. Tx=" + tx); @@ -773,9 +769,6 @@ public class BtcWalletService extends WalletService { do { counter++; fee = txFeeForWithdrawalPerByte.multiply(txSize); - final Coin defaultMinFee = BisqEnvironment.getBaseCurrencyNetwork().getDefaultMinFee(); - if (fee.compareTo(defaultMinFee) < 0) - fee = defaultMinFee; // We use a dummy address for the output SendRequest sendRequest = getSendRequestForMultipleAddresses(fromAddresses, getOrCreateAddressEntry(AddressEntry.Context.AVAILABLE).getAddressString(), amount, fee, null, aesKey); wallet.completeTx(sendRequest); @@ -783,7 +776,7 @@ public class BtcWalletService extends WalletService { txSize = tx.bitcoinSerialize().length; printTx("FeeEstimationTransactionForMultipleAddresses", tx); } - while (counter < 10 && Math.abs(tx.getFee().value - txFeeForWithdrawalPerByte.multiply(txSize).value) > 1000); + while (feeEstimationNotSatisfied(counter, tx)); if (counter == 10) log.error("Could not calculate the fee. Tx=" + tx); @@ -795,6 +788,14 @@ public class BtcWalletService extends WalletService { } } + private boolean feeEstimationNotSatisfied(int counter, Transaction tx) { + long targetFee = getTxFeeForWithdrawalPerByte().multiply(tx.bitcoinSerialize().length).value; + return counter < 10 && + (tx.getFee().value < targetFee || + tx.getFee().value - targetFee > 1000); + } + + /////////////////////////////////////////////////////////////////////////////////////////// // Withdrawal Send /////////////////////////////////////////////////////////////////////////////////////////// @@ -873,7 +874,7 @@ public class BtcWalletService extends WalletService { "The amount is too low (dust limit)."); final Coin netValue = amount.subtract(fee); - if(netValue.isNegative()) + if (netValue.isNegative()) throw new InsufficientMoneyException(netValue.multiply(-1), "The mining fee for that transaction exceed the available amount."); tx.addOutput(netValue, Address.fromBase58(params, toAddress)); diff --git a/core/src/main/java/io/bisq/core/btc/wallet/WalletService.java b/core/src/main/java/io/bisq/core/btc/wallet/WalletService.java index e32c956be3..23c8da8ca4 100644 --- a/core/src/main/java/io/bisq/core/btc/wallet/WalletService.java +++ b/core/src/main/java/io/bisq/core/btc/wallet/WalletService.java @@ -427,7 +427,7 @@ public abstract class WalletService { return outputs; } - Coin getTxFeeForWithdrawalPerByte() { + public Coin getTxFeeForWithdrawalPerByte() { Coin fee = (preferences.isUseCustomWithdrawalTxFee()) ? Coin.valueOf(preferences.getWithdrawalTxFeeInBytes()) : feeService.getTxFeePerByte(); diff --git a/core/src/main/java/io/bisq/core/network/CoreSeedNodesRepository.java b/core/src/main/java/io/bisq/core/network/CoreSeedNodesRepository.java index 49eb54e8a3..53219e7b55 100644 --- a/core/src/main/java/io/bisq/core/network/CoreSeedNodesRepository.java +++ b/core/src/main/java/io/bisq/core/network/CoreSeedNodesRepository.java @@ -115,9 +115,6 @@ public class CoreSeedNodesRepository implements SeedNodesRepository { new NodeAddress("acyvotgewx46pebw.onion:8003"), new NodeAddress("pklgy3vdfn3obkur.onion:8003"), - // DOGE mainnet - // new NodeAddress("t6bwuj75mvxswavs.onion:8006"), removed in version 0.6 (DOGE not supported anymore) - // DASH mainnet new NodeAddress("toeu5ikb27ydscxt.onion:8009"), new NodeAddress("ae4yvaivhnekkhqf.onion:8009") @@ -151,9 +148,6 @@ public class CoreSeedNodesRepository implements SeedNodesRepository { // regtest new NodeAddress("localhost:2005"), - // DOGE regtest - new NodeAddress("localhost:2008"), - // DASH regtest new NodeAddress("localhost:2011") ); diff --git a/core/src/main/java/io/bisq/core/offer/OfferBookService.java b/core/src/main/java/io/bisq/core/offer/OfferBookService.java index 6ef7deb6d6..bd2dd2038b 100644 --- a/core/src/main/java/io/bisq/core/offer/OfferBookService.java +++ b/core/src/main/java/io/bisq/core/offer/OfferBookService.java @@ -144,6 +144,14 @@ public class OfferBookService { } } + public void activateOffer(Offer offer, @Nullable ResultHandler resultHandler, @Nullable ErrorMessageHandler errorMessageHandler) { + addOffer(offer, resultHandler, errorMessageHandler); + } + + public void deactivateOffer(OfferPayload offerPayload, @Nullable ResultHandler resultHandler, @Nullable ErrorMessageHandler errorMessageHandler) { + removeOffer(offerPayload, resultHandler, errorMessageHandler); + } + public void removeOffer(OfferPayload offerPayload, @Nullable ResultHandler resultHandler, @Nullable ErrorMessageHandler errorMessageHandler) { if (p2PService.removeData(offerPayload, true)) { log.trace("Remove offer from network was successful. OfferPayload ID = " + offerPayload.getId()); diff --git a/core/src/main/java/io/bisq/core/offer/OpenOffer.java b/core/src/main/java/io/bisq/core/offer/OpenOffer.java index c28ea0e4d1..e10a7ed48b 100644 --- a/core/src/main/java/io/bisq/core/offer/OpenOffer.java +++ b/core/src/main/java/io/bisq/core/offer/OpenOffer.java @@ -19,6 +19,7 @@ package io.bisq.core.offer; import io.bisq.common.Timer; import io.bisq.common.UserThread; +import io.bisq.common.proto.ProtoUtil; import io.bisq.common.storage.Storage; import io.bisq.core.trade.Tradable; import io.bisq.core.trade.TradableList; @@ -40,29 +41,34 @@ public final class OpenOffer implements Tradable { AVAILABLE, RESERVED, CLOSED, - CANCELED + CANCELED, + DEACTIVATED } @Getter private final Offer offer; @Getter - private State state = State.AVAILABLE; + private State state; transient private Storage> storage; public OpenOffer(Offer offer, Storage> storage) { this.offer = offer; this.storage = storage; + state = State.AVAILABLE; } /////////////////////////////////////////////////////////////////////////////////////////// // PROTO BUFFER /////////////////////////////////////////////////////////////////////////////////////////// - private OpenOffer(Offer offer) { + private OpenOffer(Offer offer, State state) { this.offer = offer; - } + this.state = state; + if (this.state == State.RESERVED) + setState(State.AVAILABLE); + } @Override public PB.Tradable toProtoMessage() { @@ -73,11 +79,8 @@ public final class OpenOffer implements Tradable { } public static Tradable fromProto(PB.OpenOffer proto) { - OpenOffer openOffer = new OpenOffer(Offer.fromProto(proto.getOffer())); - // If we have a reserved state from the local db we reset it - if (openOffer.getState() == State.RESERVED) - openOffer.setState(State.AVAILABLE); - return openOffer; + return new OpenOffer(Offer.fromProto(proto.getOffer()), + ProtoUtil.enumFromProto(OpenOffer.State.class, proto.getState().name())); } @@ -118,6 +121,10 @@ public final class OpenOffer implements Tradable { stopTimeout(); } + public boolean isDeactivated() { + return state == State.DEACTIVATED; + } + private void startTimeout() { stopTimeout(); diff --git a/core/src/main/java/io/bisq/core/offer/OpenOfferManager.java b/core/src/main/java/io/bisq/core/offer/OpenOfferManager.java index 24fda8c9d7..4de1a1e759 100644 --- a/core/src/main/java/io/bisq/core/offer/OpenOfferManager.java +++ b/core/src/main/java/io/bisq/core/offer/OpenOfferManager.java @@ -327,7 +327,30 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe } } - // Remove from my offers + public void activateOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + Offer offer = openOffer.getOffer(); + openOffer.setStorage(openOfferTradableListStorage); + offerBookService.activateOffer(offer, + () -> { + openOffer.setState(OpenOffer.State.AVAILABLE); + log.debug("activateOpenOffer, offerId={}", offer.getId()); + resultHandler.handleResult(); + }, + errorMessageHandler); + } + + public void deactivateOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + Offer offer = openOffer.getOffer(); + openOffer.setStorage(openOfferTradableListStorage); + offerBookService.deactivateOffer(offer.getOfferPayload(), + () -> { + openOffer.setState(OpenOffer.State.DEACTIVATED); + log.debug("deactivateOpenOffer, offerId={}", offer.getId()); + resultHandler.handleResult(); + }, + errorMessageHandler); + } + public void removeOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { Offer offer = openOffer.getOffer(); offerBookService.removeOffer(offer.getOfferPayload(), @@ -483,13 +506,8 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe final OpenOffer openOffer = openOffersList.get(i); UserThread.runAfterRandomDelay(() -> { if (openOffers.contains(openOffer)) { - // The openOffer.getId().contains("_") check is because there was once a version - // where we encoded the version nr in the offer id with a "_" as separator. - // That caused several issues and was reverted. So if there are still old offers out with that - // special offer ID format those must not be published as they cause failed taker attempts - // with lost taker fee. String id = openOffer.getId(); - if (id != null && !id.contains("_")) + if (id != null && !openOffer.isDeactivated()) republishOffer(openOffer); else log.warn("You have an offer with an invalid offer ID: offerID=" + id); @@ -567,7 +585,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe final OpenOffer openOffer = openOffersList.get(i); UserThread.runAfterRandomDelay(() -> { // we need to check if in the meantime the offer has been removed - if (openOffers.contains(openOffer)) + if (openOffers.contains(openOffer) && !openOffer.isDeactivated()) refreshOffer(openOffer); }, minDelay, maxDelay, TimeUnit.MILLISECONDS); } diff --git a/core/src/main/java/io/bisq/core/payment/CashAppAccount.java b/core/src/main/java/io/bisq/core/payment/CashAppAccount.java new file mode 100644 index 0000000000..8e2380e12a --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/CashAppAccount.java @@ -0,0 +1,46 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment; + +import io.bisq.common.locale.FiatCurrency; +import io.bisq.core.payment.payload.CashAppAccountPayload; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.PaymentMethod; +import lombok.EqualsAndHashCode; + +//TODO missing support for selected trade currency +@EqualsAndHashCode(callSuper = true) +public final class CashAppAccount extends PaymentAccount { + public CashAppAccount() { + super(PaymentMethod.CASH_APP); + setSingleTradeCurrency(new FiatCurrency("USD")); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new CashAppAccountPayload(paymentMethod.getId(), id); + } + + public void setCashTag(String cashTag) { + ((CashAppAccountPayload) paymentAccountPayload).setCashTag(cashTag); + } + + public String getCashTag() { + return ((CashAppAccountPayload) paymentAccountPayload).getCashTag(); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/MoneyBeamAccount.java b/core/src/main/java/io/bisq/core/payment/MoneyBeamAccount.java new file mode 100644 index 0000000000..f1e208b1c1 --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/MoneyBeamAccount.java @@ -0,0 +1,46 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment; + +import io.bisq.common.locale.FiatCurrency; +import io.bisq.core.payment.payload.MoneyBeamAccountPayload; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.PaymentMethod; +import lombok.EqualsAndHashCode; + +//TODO missing support for selected trade currency +@EqualsAndHashCode(callSuper = true) +public final class MoneyBeamAccount extends PaymentAccount { + public MoneyBeamAccount() { + super(PaymentMethod.MONEY_BEAM); + setSingleTradeCurrency(new FiatCurrency("EUR")); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new MoneyBeamAccountPayload(paymentMethod.getId(), id); + } + + public void setAccountId(String accountId) { + ((MoneyBeamAccountPayload) paymentAccountPayload).setAccountId(accountId); + } + + public String getAccountId() { + return ((MoneyBeamAccountPayload) paymentAccountPayload).getAccountId(); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/PaymentAccount.java b/core/src/main/java/io/bisq/core/payment/PaymentAccount.java index 239a543af5..d00ce84d19 100644 --- a/core/src/main/java/io/bisq/core/payment/PaymentAccount.java +++ b/core/src/main/java/io/bisq/core/payment/PaymentAccount.java @@ -47,10 +47,8 @@ public abstract class PaymentAccount implements PersistablePayload { protected String id; @Setter protected long creationDate; - @Setter public PaymentAccountPayload paymentAccountPayload; - @Setter protected String accountName; protected final List tradeCurrencies = new ArrayList<>(); @@ -138,7 +136,7 @@ public abstract class PaymentAccount implements PersistablePayload { @Nullable public TradeCurrency getSingleTradeCurrency() { - if (!tradeCurrencies.isEmpty()) + if (tradeCurrencies.size() == 1) return tradeCurrencies.get(0); else return null; diff --git a/core/src/main/java/io/bisq/core/payment/PaymentAccountFactory.java b/core/src/main/java/io/bisq/core/payment/PaymentAccountFactory.java index abfc0e32da..5ef280ab2d 100644 --- a/core/src/main/java/io/bisq/core/payment/PaymentAccountFactory.java +++ b/core/src/main/java/io/bisq/core/payment/PaymentAccountFactory.java @@ -24,6 +24,18 @@ public class PaymentAccountFactory { switch (paymentMethod.getId()) { case PaymentMethod.OK_PAY_ID: return new OKPayAccount(); + case PaymentMethod.UPHOLD_ID: + return new UpholdAccount(); + case PaymentMethod.CASH_APP_ID: + return new CashAppAccount(); + case PaymentMethod.MONEY_BEAM_ID: + return new MoneyBeamAccount(); + case PaymentMethod.VENMO_ID: + return new VenmoAccount(); + case PaymentMethod.POPMONEY_ID: + return new PopmoneyAccount(); + case PaymentMethod.REVOLUT_ID: + return new RevolutAccount(); case PaymentMethod.PERFECT_MONEY_ID: return new PerfectMoneyAccount(); case PaymentMethod.SEPA_ID: diff --git a/core/src/main/java/io/bisq/core/payment/PopmoneyAccount.java b/core/src/main/java/io/bisq/core/payment/PopmoneyAccount.java new file mode 100644 index 0000000000..00c03b7e5f --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/PopmoneyAccount.java @@ -0,0 +1,54 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment; + +import io.bisq.common.locale.FiatCurrency; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.PaymentMethod; +import io.bisq.core.payment.payload.PopmoneyAccountPayload; +import lombok.EqualsAndHashCode; + +//TODO missing support for selected trade currency +@EqualsAndHashCode(callSuper = true) +public final class PopmoneyAccount extends PaymentAccount { + public PopmoneyAccount() { + super(PaymentMethod.POPMONEY); + setSingleTradeCurrency(new FiatCurrency("USD")); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new PopmoneyAccountPayload(paymentMethod.getId(), id); + } + + public void setAccountId(String accountId) { + ((PopmoneyAccountPayload) paymentAccountPayload).setAccountId(accountId); + } + + public String getAccountId() { + return ((PopmoneyAccountPayload) paymentAccountPayload).getAccountId(); + } + + public void setHolderName(String holderName) { + ((PopmoneyAccountPayload) paymentAccountPayload).setHolderName(holderName); + } + + public String getHolderName() { + return ((PopmoneyAccountPayload) paymentAccountPayload).getHolderName(); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/RevolutAccount.java b/core/src/main/java/io/bisq/core/payment/RevolutAccount.java new file mode 100644 index 0000000000..d6ae8d800a --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/RevolutAccount.java @@ -0,0 +1,45 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment; + +import io.bisq.common.locale.CurrencyUtil; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.PaymentMethod; +import io.bisq.core.payment.payload.RevolutAccountPayload; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +public final class RevolutAccount extends PaymentAccount { + public RevolutAccount() { + super(PaymentMethod.REVOLUT); + tradeCurrencies.addAll(CurrencyUtil.getAllRevolutCurrencies()); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new RevolutAccountPayload(paymentMethod.getId(), id); + } + + public void setAccountId(String accountId) { + ((RevolutAccountPayload) paymentAccountPayload).setAccountId(accountId); + } + + public String getAccountId() { + return ((RevolutAccountPayload) paymentAccountPayload).getAccountId(); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/UpholdAccount.java b/core/src/main/java/io/bisq/core/payment/UpholdAccount.java new file mode 100644 index 0000000000..570adef1d5 --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/UpholdAccount.java @@ -0,0 +1,46 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment; + +import io.bisq.common.locale.CurrencyUtil; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.PaymentMethod; +import io.bisq.core.payment.payload.UpholdAccountPayload; +import lombok.EqualsAndHashCode; + +//TODO missing support for selected trade currency +@EqualsAndHashCode(callSuper = true) +public final class UpholdAccount extends PaymentAccount { + public UpholdAccount() { + super(PaymentMethod.UPHOLD); + tradeCurrencies.addAll(CurrencyUtil.getAllUpholdCurrencies()); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new UpholdAccountPayload(paymentMethod.getId(), id); + } + + public void setAccountId(String accountId) { + ((UpholdAccountPayload) paymentAccountPayload).setAccountId(accountId); + } + + public String getAccountId() { + return ((UpholdAccountPayload) paymentAccountPayload).getAccountId(); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/VenmoAccount.java b/core/src/main/java/io/bisq/core/payment/VenmoAccount.java new file mode 100644 index 0000000000..fd64e50d49 --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/VenmoAccount.java @@ -0,0 +1,54 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment; + +import io.bisq.common.locale.FiatCurrency; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.PaymentMethod; +import io.bisq.core.payment.payload.VenmoAccountPayload; +import lombok.EqualsAndHashCode; + +//TODO missing support for selected trade currency +@EqualsAndHashCode(callSuper = true) +public final class VenmoAccount extends PaymentAccount { + public VenmoAccount() { + super(PaymentMethod.VENMO); + setSingleTradeCurrency(new FiatCurrency("USD")); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new VenmoAccountPayload(paymentMethod.getId(), id); + } + + public void setVenmoUserName(String venmoUserName) { + ((VenmoAccountPayload) paymentAccountPayload).setVenmoUserName(venmoUserName); + } + + public String getVenmoUserName() { + return ((VenmoAccountPayload) paymentAccountPayload).getVenmoUserName(); + } + + public void setHolderName(String holderName) { + ((VenmoAccountPayload) paymentAccountPayload).setHolderName(holderName); + } + + public String getHolderName() { + return ((VenmoAccountPayload) paymentAccountPayload).getHolderName(); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/payload/CashAppAccountPayload.java b/core/src/main/java/io/bisq/core/payment/payload/CashAppAccountPayload.java new file mode 100644 index 0000000000..d5e3481993 --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/payload/CashAppAccountPayload.java @@ -0,0 +1,98 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment.payload; + +import com.google.protobuf.Message; +import io.bisq.generated.protobuffer.PB; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class CashAppAccountPayload extends PaymentAccountPayload { + private String cashTag = ""; + + public CashAppAccountPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private CashAppAccountPayload(String paymentMethod, + String id, + String cashTag, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.cashTag = cashTag; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setCashAppAccountPayload(PB.CashAppAccountPayload.newBuilder() + .setCashTag(cashTag)) + .build(); + } + + public static CashAppAccountPayload fromProto(PB.PaymentAccountPayload proto) { + return new CashAppAccountPayload(proto.getPaymentMethodId(), + proto.getId(), + proto.getCashAppAccountPayload().getCashTag(), + proto.getMaxTradePeriod(), + CollectionUtils.isEmpty(proto.getExcludeFromJsonDataMap()) ? null : new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return "CashApp - Account: " + cashTag; + } + + @Override + public String getPaymentDetailsForTradePopup() { + return getPaymentDetails(); + } + + @Override + public byte[] getAgeWitnessInputData() { + return super.getAgeWitnessInputData(cashTag.getBytes(Charset.forName("UTF-8"))); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/payload/MoneyBeamAccountPayload.java b/core/src/main/java/io/bisq/core/payment/payload/MoneyBeamAccountPayload.java new file mode 100644 index 0000000000..d405e4bda7 --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/payload/MoneyBeamAccountPayload.java @@ -0,0 +1,98 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment.payload; + +import com.google.protobuf.Message; +import io.bisq.generated.protobuffer.PB; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class MoneyBeamAccountPayload extends PaymentAccountPayload { + private String accountId = ""; + + public MoneyBeamAccountPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private MoneyBeamAccountPayload(String paymentMethod, + String id, + String accountId, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.accountId = accountId; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setMoneyBeamAccountPayload(PB.MoneyBeamAccountPayload.newBuilder() + .setAccountId(accountId)) + .build(); + } + + public static MoneyBeamAccountPayload fromProto(PB.PaymentAccountPayload proto) { + return new MoneyBeamAccountPayload(proto.getPaymentMethodId(), + proto.getId(), + proto.getMoneyBeamAccountPayload().getAccountId(), + proto.getMaxTradePeriod(), + CollectionUtils.isEmpty(proto.getExcludeFromJsonDataMap()) ? null : new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return "MoneyBeam - Account: " + accountId; + } + + @Override + public String getPaymentDetailsForTradePopup() { + return getPaymentDetails(); + } + + @Override + public byte[] getAgeWitnessInputData() { + return super.getAgeWitnessInputData(accountId.getBytes(Charset.forName("UTF-8"))); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/payload/PaymentMethod.java b/core/src/main/java/io/bisq/core/payment/payload/PaymentMethod.java index 577866fb33..47841d6b18 100644 --- a/core/src/main/java/io/bisq/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/io/bisq/core/payment/payload/PaymentMethod.java @@ -28,7 +28,10 @@ import lombok.extern.slf4j.Slf4j; import org.bitcoinj.core.Coin; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; import java.util.concurrent.TimeUnit; @EqualsAndHashCode(exclude = {"maxTradePeriod", "maxTradeLimit"}) @@ -44,6 +47,12 @@ public final class PaymentMethod implements PersistablePayload, Comparable { private static final long DAY = TimeUnit.HOURS.toMillis(24); public static final String OK_PAY_ID = "OK_PAY"; + public static final String UPHOLD_ID = "UPHOLD"; + public static final String CASH_APP_ID = "CASH_APP"; + public static final String MONEY_BEAM_ID = "MONEY_BEAM"; + public static final String VENMO_ID = "VENMO"; + public static final String POPMONEY_ID = "POPMONEY"; + public static final String REVOLUT_ID = "REVOLUT"; public static final String PERFECT_MONEY_ID = "PERFECT_MONEY"; public static final String SEPA_ID = "SEPA"; public static final String SEPA_INSTANT_ID = "SEPA_INSTANT"; @@ -62,6 +71,12 @@ public final class PaymentMethod implements PersistablePayload, Comparable { public static final String BLOCK_CHAINS_ID = "BLOCK_CHAINS"; public static PaymentMethod OK_PAY; + public static PaymentMethod UPHOLD; + public static PaymentMethod CASH_APP; + public static PaymentMethod MONEY_BEAM; + public static PaymentMethod VENMO; + public static PaymentMethod POPMONEY; + public static PaymentMethod REVOLUT; public static PaymentMethod PERFECT_MONEY; public static PaymentMethod SEPA; public static PaymentMethod SEPA_INSTANT; @@ -117,31 +132,27 @@ public final class PaymentMethod implements PersistablePayload, Comparable { public static List getAllValues() { if (ALL_VALUES == null) { + Coin maxTradeLimitHighRisk; Coin maxTradeLimitMidRisk; Coin maxTradeLimitLowRisk; Coin maxTradeLimitVeryLowRisk; switch (BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode()) { case "BTC": - // av. price June 2017: 2500 EUR/BTC - // av. price Oct 2017: 4700 EUR/BTC + // we want to avoid more then 4 decimal places (0.125 / 4 = 0.03125), so we use a bit higher value to get 0.04 for first month + maxTradeLimitHighRisk = Coin.parseCoin("0.16"); + maxTradeLimitMidRisk = Coin.parseCoin("0.25"); maxTradeLimitLowRisk = Coin.parseCoin("0.5"); maxTradeLimitVeryLowRisk = Coin.parseCoin("1"); break; case "LTC": - // av. price June 2017: 40 EUR/LTC + maxTradeLimitHighRisk = Coin.parseCoin("12.5"); maxTradeLimitMidRisk = Coin.parseCoin("25"); maxTradeLimitLowRisk = Coin.parseCoin("50"); maxTradeLimitVeryLowRisk = Coin.parseCoin("100"); break; - case "DOGE": - // av. price June 2017: 0.002850 EUR/DOGE - maxTradeLimitMidRisk = Coin.parseCoin("250000"); - maxTradeLimitLowRisk = Coin.parseCoin("500000"); - maxTradeLimitVeryLowRisk = Coin.parseCoin("1000000"); - break; case "DASH": - // av. price June 2017: 150 EUR/DASH + maxTradeLimitHighRisk = Coin.parseCoin("5"); maxTradeLimitMidRisk = Coin.parseCoin("10"); maxTradeLimitLowRisk = Coin.parseCoin("20"); maxTradeLimitVeryLowRisk = Coin.parseCoin("40"); @@ -156,6 +167,7 @@ public final class PaymentMethod implements PersistablePayload, Comparable { // EUR SEPA = new PaymentMethod(SEPA_ID, 6 * DAY, maxTradeLimitMidRisk), SEPA_INSTANT = new PaymentMethod(SEPA_INSTANT_ID, DAY, maxTradeLimitMidRisk), + MONEY_BEAM = new PaymentMethod(MONEY_BEAM_ID, DAY, maxTradeLimitHighRisk), // UK FASTER_PAYMENTS = new PaymentMethod(FASTER_PAYMENTS_ID, DAY, maxTradeLimitMidRisk), @@ -165,6 +177,11 @@ public final class PaymentMethod implements PersistablePayload, Comparable { // US CLEAR_X_CHANGE = new PaymentMethod(CLEAR_X_CHANGE_ID, 4 * DAY, maxTradeLimitMidRisk), + CASH_APP = new PaymentMethod(CASH_APP_ID, DAY, maxTradeLimitHighRisk), + + VENMO = new PaymentMethod(VENMO_ID, DAY, maxTradeLimitHighRisk), + + POPMONEY = new PaymentMethod(POPMONEY_ID, DAY, maxTradeLimitHighRisk), CHASE_QUICK_PAY = new PaymentMethod(CHASE_QUICK_PAY_ID, DAY, maxTradeLimitMidRisk), US_POSTAL_MONEY_ORDER = new PaymentMethod(US_POSTAL_MONEY_ORDER_ID, 8 * DAY, maxTradeLimitMidRisk), @@ -180,6 +197,8 @@ public final class PaymentMethod implements PersistablePayload, Comparable { // Trans national OK_PAY = new PaymentMethod(OK_PAY_ID, DAY, maxTradeLimitVeryLowRisk), + UPHOLD = new PaymentMethod(UPHOLD_ID, DAY, maxTradeLimitHighRisk), + REVOLUT = new PaymentMethod(REVOLUT_ID, DAY, maxTradeLimitHighRisk), PERFECT_MONEY = new PaymentMethod(PERFECT_MONEY_ID, DAY, maxTradeLimitLowRisk), // China @@ -233,10 +252,7 @@ public final class PaymentMethod implements PersistablePayload, Comparable { public static PaymentMethod getPaymentMethodById(String id) { Optional paymentMethodOptional = getAllValues().stream().filter(e -> e.getId().equals(id)).findFirst(); - if (paymentMethodOptional.isPresent()) - return paymentMethodOptional.get(); - else - return new PaymentMethod(Res.get("shared.na")); + return paymentMethodOptional.orElseGet(() -> new PaymentMethod(Res.get("shared.na"))); } // Hack for SF as the smallest unit is 1 SF ;-( and price is about 3 BTC! diff --git a/core/src/main/java/io/bisq/core/payment/payload/PopmoneyAccountPayload.java b/core/src/main/java/io/bisq/core/payment/payload/PopmoneyAccountPayload.java new file mode 100644 index 0000000000..3e62f85074 --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/payload/PopmoneyAccountPayload.java @@ -0,0 +1,103 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment.payload; + +import com.google.protobuf.Message; +import io.bisq.generated.protobuffer.PB; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class PopmoneyAccountPayload extends PaymentAccountPayload { + private String accountId = ""; + private String holderName = ""; + + public PopmoneyAccountPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private PopmoneyAccountPayload(String paymentMethod, + String id, + String accountId, + String holderName, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.accountId = accountId; + this.holderName = holderName; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setPopmoneyAccountPayload(PB.PopmoneyAccountPayload.newBuilder() + .setAccountId(accountId) + .setHolderName(holderName)) + .build(); + } + + public static PopmoneyAccountPayload fromProto(PB.PaymentAccountPayload proto) { + return new PopmoneyAccountPayload(proto.getPaymentMethodId(), + proto.getId(), + proto.getPopmoneyAccountPayload().getAccountId(), + proto.getPopmoneyAccountPayload().getHolderName(), + proto.getMaxTradePeriod(), + CollectionUtils.isEmpty(proto.getExcludeFromJsonDataMap()) ? null : new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return "Popmoney - Holder name: " + holderName + ", email or phone no.: " + accountId; + } + + @Override + public String getPaymentDetailsForTradePopup() { + return getPaymentDetails(); + } + + @Override + public byte[] getAgeWitnessInputData() { + return super.getAgeWitnessInputData(accountId.getBytes(Charset.forName("UTF-8"))); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/payload/RevolutAccountPayload.java b/core/src/main/java/io/bisq/core/payment/payload/RevolutAccountPayload.java new file mode 100644 index 0000000000..3f33e44f28 --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/payload/RevolutAccountPayload.java @@ -0,0 +1,99 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment.payload; + +import com.google.protobuf.Message; +import io.bisq.common.locale.Res; +import io.bisq.generated.protobuffer.PB; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class RevolutAccountPayload extends PaymentAccountPayload { + private String accountId = ""; + + public RevolutAccountPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private RevolutAccountPayload(String paymentMethod, + String id, + String accountId, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.accountId = accountId; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setRevolutAccountPayload(PB.RevolutAccountPayload.newBuilder() + .setAccountId(accountId)) + .build(); + } + + public static RevolutAccountPayload fromProto(PB.PaymentAccountPayload proto) { + return new RevolutAccountPayload(proto.getPaymentMethodId(), + proto.getId(), + proto.getRevolutAccountPayload().getAccountId(), + proto.getMaxTradePeriod(), + CollectionUtils.isEmpty(proto.getExcludeFromJsonDataMap()) ? null : new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return Res.get(paymentMethodId) + " - " + Res.getWithCol("payment.account") + accountId; + } + + @Override + public String getPaymentDetailsForTradePopup() { + return getPaymentDetails(); + } + + @Override + public byte[] getAgeWitnessInputData() { + return super.getAgeWitnessInputData(accountId.getBytes(Charset.forName("UTF-8"))); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/payload/UpholdAccountPayload.java b/core/src/main/java/io/bisq/core/payment/payload/UpholdAccountPayload.java new file mode 100644 index 0000000000..adaea17e9f --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/payload/UpholdAccountPayload.java @@ -0,0 +1,98 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment.payload; + +import com.google.protobuf.Message; +import io.bisq.generated.protobuffer.PB; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class UpholdAccountPayload extends PaymentAccountPayload { + private String accountId = ""; + + public UpholdAccountPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private UpholdAccountPayload(String paymentMethod, + String id, + String accountId, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.accountId = accountId; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setUpholdAccountPayload(PB.UpholdAccountPayload.newBuilder() + .setAccountId(accountId)) + .build(); + } + + public static UpholdAccountPayload fromProto(PB.PaymentAccountPayload proto) { + return new UpholdAccountPayload(proto.getPaymentMethodId(), + proto.getId(), + proto.getUpholdAccountPayload().getAccountId(), + proto.getMaxTradePeriod(), + CollectionUtils.isEmpty(proto.getExcludeFromJsonDataMap()) ? null : new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return "Uphold - Account: " + accountId; + } + + @Override + public String getPaymentDetailsForTradePopup() { + return getPaymentDetails(); + } + + @Override + public byte[] getAgeWitnessInputData() { + return super.getAgeWitnessInputData(accountId.getBytes(Charset.forName("UTF-8"))); + } +} diff --git a/core/src/main/java/io/bisq/core/payment/payload/VenmoAccountPayload.java b/core/src/main/java/io/bisq/core/payment/payload/VenmoAccountPayload.java new file mode 100644 index 0000000000..a49488769e --- /dev/null +++ b/core/src/main/java/io/bisq/core/payment/payload/VenmoAccountPayload.java @@ -0,0 +1,103 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.core.payment.payload; + +import com.google.protobuf.Message; +import io.bisq.generated.protobuffer.PB; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class VenmoAccountPayload extends PaymentAccountPayload { + private String venmoUserName = ""; + private String holderName = ""; + + public VenmoAccountPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private VenmoAccountPayload(String paymentMethod, + String id, + String venmoUserName, + String holderName, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.venmoUserName = venmoUserName; + this.holderName = holderName; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setVenmoAccountPayload(PB.VenmoAccountPayload.newBuilder() + .setVenmoUserName(venmoUserName) + .setHolderName(holderName)) + .build(); + } + + public static VenmoAccountPayload fromProto(PB.PaymentAccountPayload proto) { + return new VenmoAccountPayload(proto.getPaymentMethodId(), + proto.getId(), + proto.getVenmoAccountPayload().getVenmoUserName(), + proto.getVenmoAccountPayload().getHolderName(), + proto.getMaxTradePeriod(), + CollectionUtils.isEmpty(proto.getExcludeFromJsonDataMap()) ? null : new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return "Venmo - Holder name: " + holderName + ", Venmo username: " + venmoUserName; + } + + @Override + public String getPaymentDetailsForTradePopup() { + return getPaymentDetails(); + } + + @Override + public byte[] getAgeWitnessInputData() { + return super.getAgeWitnessInputData(venmoUserName.getBytes(Charset.forName("UTF-8"))); + } +} diff --git a/core/src/main/java/io/bisq/core/proto/CoreProtoResolver.java b/core/src/main/java/io/bisq/core/proto/CoreProtoResolver.java index 89e0e43e70..3de657f5f9 100644 --- a/core/src/main/java/io/bisq/core/proto/CoreProtoResolver.java +++ b/core/src/main/java/io/bisq/core/proto/CoreProtoResolver.java @@ -60,6 +60,18 @@ public class CoreProtoResolver implements ProtoResolver { return InteracETransferAccountPayload.fromProto(proto); case O_K_PAY_ACCOUNT_PAYLOAD: return OKPayAccountPayload.fromProto(proto); + case UPHOLD_ACCOUNT_PAYLOAD: + return UpholdAccountPayload.fromProto(proto); + case CASH_APP_ACCOUNT_PAYLOAD: + return CashAppAccountPayload.fromProto(proto); + case MONEY_BEAM_ACCOUNT_PAYLOAD: + return MoneyBeamAccountPayload.fromProto(proto); + case VENMO_ACCOUNT_PAYLOAD: + return VenmoAccountPayload.fromProto(proto); + case POPMONEY_ACCOUNT_PAYLOAD: + return PopmoneyAccountPayload.fromProto(proto); + case REVOLUT_ACCOUNT_PAYLOAD: + return RevolutAccountPayload.fromProto(proto); case PERFECT_MONEY_ACCOUNT_PAYLOAD: return PerfectMoneyAccountPayload.fromProto(proto); case SWISH_ACCOUNT_PAYLOAD: diff --git a/core/src/main/java/io/bisq/core/provider/fee/FeeProvider.java b/core/src/main/java/io/bisq/core/provider/fee/FeeProvider.java index 44250cbb73..02d50b895a 100644 --- a/core/src/main/java/io/bisq/core/provider/fee/FeeProvider.java +++ b/core/src/main/java/io/bisq/core/provider/fee/FeeProvider.java @@ -52,12 +52,10 @@ public class FeeProvider extends HttpClientProvider { LinkedTreeMap dataMap = (LinkedTreeMap) linkedTreeMap.get("dataMap"); Long btcTxFee = dataMap.get("btcTxFee").longValue(); Long ltcTxFee = dataMap.get("ltcTxFee").longValue(); - Long dogeTxFee = dataMap.get("dogeTxFee").longValue(); Long dashTxFee = dataMap.get("dashTxFee").longValue(); map.put("BTC", btcTxFee); map.put("LTC", ltcTxFee); - map.put("DOGE", dogeTxFee); map.put("DASH", dashTxFee); } catch (Throwable t) { log.error(t.toString()); diff --git a/core/src/main/java/io/bisq/core/provider/fee/FeeService.java b/core/src/main/java/io/bisq/core/provider/fee/FeeService.java index 2de865bc8c..403f2d33c2 100644 --- a/core/src/main/java/io/bisq/core/provider/fee/FeeService.java +++ b/core/src/main/java/io/bisq/core/provider/fee/FeeService.java @@ -45,11 +45,9 @@ public class FeeService { private static final Logger log = LoggerFactory.getLogger(FeeService.class); // fixed min fee - public static final Coin BTC_REFERENCE_DEFAULT_MIN_TX_FEE = Transaction.REFERENCE_DEFAULT_MIN_TX_FEE; // 5000 + public static final Coin BTC_REFERENCE_DEFAULT_MIN_TX_FEE_PER_KB = Transaction.REFERENCE_DEFAULT_MIN_TX_FEE; // 5000 // https://litecoin.info/Transaction_fees min fee is 100_000 public static final Coin LTC_REFERENCE_DEFAULT_MIN_TX_FEE = Coin.valueOf(100_000); - // min fee is 1 DOGE - public static final Coin DOGE_REFERENCE_DEFAULT_MIN_TX_FEE = Coin.valueOf(1_000_000_000); //TODO check // min tx fee per tx is 10000 now, 1000 in sept 2017 public static final Coin DASH_REFERENCE_DEFAULT_MIN_TX_FEE = Coin.valueOf(10_000); @@ -58,7 +56,6 @@ public class FeeService { // fees are per byte public static final long BTC_DEFAULT_TX_FEE = 200; // fees are between 20-600 sat/byte. We try to stay on the safe side. public static final long LTC_DEFAULT_TX_FEE = LTC_REFERENCE_DEFAULT_MIN_TX_FEE.value / 200; - public static final long DOGE_DEFAULT_TX_FEE = DOGE_REFERENCE_DEFAULT_MIN_TX_FEE.value / 200; // 200 bytes tx -> 200*5_000_000L=1_000_000_000 (1 DOGE) public static final long DASH_DEFAULT_TX_FEE = DASH_REFERENCE_DEFAULT_MIN_TX_FEE.value / 200; // 200 bytes tx -> 200*50=10000 private static long MIN_MAKER_FEE_IN_BASE_CUR; @@ -80,6 +77,7 @@ public class FeeService { private long epochInSecondAtLastRequest; private long lastRequest; private IntegerProperty feeUpdateCounter = new SimpleIntegerProperty(0); + private long minFeePerByte; /////////////////////////////////////////////////////////////////////////////////////////// @@ -99,8 +97,8 @@ public class FeeService { */ switch (baseCurrencyCode) { case "BTC": - MIN_MAKER_FEE_IN_BASE_CUR = 20_000; // 4 USD at BTC price 20000 USD - MIN_TAKER_FEE_IN_BASE_CUR = 20_000; + MIN_MAKER_FEE_IN_BASE_CUR = 5_000; // 1 USD at BTC price 20000 USD + MIN_TAKER_FEE_IN_BASE_CUR = 5_000; DEFAULT_MAKER_FEE_IN_BASE_CUR = 200_000; // 10 USD at BTC price 20000 USD for 0.25 BTC (maxTradeAmount for most fiat trades) DEFAULT_TAKER_FEE_IN_BASE_CUR = 200_000; txFeePerByte = BTC_DEFAULT_TX_FEE; @@ -112,13 +110,6 @@ public class FeeService { DEFAULT_TAKER_FEE_IN_BASE_CUR = 360_000; // 7.5 USD at LTC price 40 USD txFeePerByte = LTC_DEFAULT_TX_FEE; break; - case "DOGE": - MIN_MAKER_FEE_IN_BASE_CUR = 20_000_000_000L; // 0.5 USD at DOGE price 0.003 USD - MIN_TAKER_FEE_IN_BASE_CUR = 20_000_000_000L; - DEFAULT_MAKER_FEE_IN_BASE_CUR = 200_000; // 5 USD at DOGE price 0.003 USD for 800 000 DOGE (maxTradeAmount) - DEFAULT_TAKER_FEE_IN_BASE_CUR = 300_000; // 7.5 USD at DOGE price 0.003 USD - txFeePerByte = DOGE_DEFAULT_TX_FEE; - break; case "DASH": MIN_MAKER_FEE_IN_BASE_CUR = 300_000; // 0.5 USD at DASH price 150 USD MIN_TAKER_FEE_IN_BASE_CUR = 300_000; @@ -132,6 +123,8 @@ public class FeeService { } public void onAllServicesInitialized() { + minFeePerByte = BisqEnvironment.getBaseCurrencyNetwork().getDefaultMinFeePerByte(); + requestFees(null, null); // We update all 5 min. @@ -154,6 +147,12 @@ public class FeeService { epochInSecondAtLastRequest = timeStampMap.get("bitcoinFeesTs"); final Map map = result.second; txFeePerByte = map.get(baseCurrencyCode); + + if (txFeePerByte < minFeePerByte) { + log.warn("The delivered fee per byte is smaller than the min. default fee of 5 sat/byte"); + txFeePerByte = minFeePerByte; + } + feeUpdateCounter.set(feeUpdateCounter.get() + 1); log.info("{} tx fee: txFeePerByte={}", baseCurrencyCode, txFeePerByte); if (resultHandler != null) diff --git a/core/src/main/java/io/bisq/core/provider/price/PriceFeedService.java b/core/src/main/java/io/bisq/core/provider/price/PriceFeedService.java index 8dcfa30291..e802c25a06 100644 --- a/core/src/main/java/io/bisq/core/provider/price/PriceFeedService.java +++ b/core/src/main/java/io/bisq/core/provider/price/PriceFeedService.java @@ -382,7 +382,6 @@ public class PriceFeedService { cache.putAll(priceMap); break; case "LTC": - case "DOGE": case "DASH": // apply conversion of btc based price to baseCurrencyCode based with btc/baseCurrencyCode price MarketPrice baseCurrencyPrice = priceMap.get(baseCurrencyCode); diff --git a/core/src/main/java/io/bisq/core/trade/statistics/TradeStatisticsManager.java b/core/src/main/java/io/bisq/core/trade/statistics/TradeStatisticsManager.java index aed627af8f..3cf287b23f 100644 --- a/core/src/main/java/io/bisq/core/trade/statistics/TradeStatisticsManager.java +++ b/core/src/main/java/io/bisq/core/trade/statistics/TradeStatisticsManager.java @@ -257,6 +257,12 @@ public class TradeStatisticsManager { newlyAdded.add("YTN"); newlyAdded.add("DARX"); newlyAdded.add("ODN"); + newlyAdded.add("CDT"); + newlyAdded.add("DGM"); + newlyAdded.add("SCS"); + newlyAdded.add("SOS"); + newlyAdded.add("ACH"); + newlyAdded.add("VDN"); coinsWithValidator.addAll(newlyAdded); diff --git a/core/src/main/java/io/bisq/core/user/Preferences.java b/core/src/main/java/io/bisq/core/user/Preferences.java index f248857172..6cb0b17e26 100644 --- a/core/src/main/java/io/bisq/core/user/Preferences.java +++ b/core/src/main/java/io/bisq/core/user/Preferences.java @@ -75,13 +75,6 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid new BlockChainExplorer("SoChain", "https://chain.so/tx/LTCTEST/", "https://chain.so/address/LTCTEST/") )); - private static final ArrayList DOGE_MAIN_NET_EXPLORERS = new ArrayList<>(Arrays.asList( - new BlockChainExplorer("SoChain", "https://chain.so/tx/doge/", "https://chain.so/address/doge/") - )); - private static final ArrayList DOGE_TEST_NET_EXPLORERS = new ArrayList<>(Arrays.asList( - new BlockChainExplorer("SoChain", "https://chain.so/tx/DOGETEST/", "https://chain.so/address/DOGETEST/") - )); - private static final ArrayList DASH_MAIN_NET_EXPLORERS = new ArrayList<>(Arrays.asList( new BlockChainExplorer("SoChain", "https://chain.so/tx/dash/", "https://chain.so/address/dash/") )); @@ -195,10 +188,6 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid setBlockChainExplorerMainNet(LTC_MAIN_NET_EXPLORERS.get(0)); setBlockChainExplorerTestNet(LTC_TEST_NET_EXPLORERS.get(0)); break; - case "DOGE": - setBlockChainExplorerMainNet(DOGE_MAIN_NET_EXPLORERS.get(0)); - setBlockChainExplorerTestNet(DOGE_TEST_NET_EXPLORERS.get(0)); - break; case "DASH": setBlockChainExplorerMainNet(DASH_MAIN_NET_EXPLORERS.get(0)); setBlockChainExplorerTestNet(DASH_TEST_NET_EXPLORERS.get(0)); @@ -552,11 +541,6 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid case LTC_TESTNET: case LTC_REGTEST: return LTC_TEST_NET_EXPLORERS; - case DOGE_MAINNET: - return DOGE_MAIN_NET_EXPLORERS; - case DOGE_TESTNET: - case DOGE_REGTEST: - return DOGE_TEST_NET_EXPLORERS; case DASH_MAINNET: return DASH_MAIN_NET_EXPLORERS; case DASH_REGTEST: @@ -604,6 +588,10 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid return prefPayload.getBridgeAddresses(); } + public long getWithdrawalTxFeeInBytes() { + return Math.max(prefPayload.getWithdrawalTxFeeInBytes(), BisqEnvironment.getBaseCurrencyNetwork().getDefaultMinFeePerByte()); + } + /////////////////////////////////////////////////////////////////////////////////////////// // Private @@ -688,8 +676,6 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid void setBridgeAddresses(List bridgeAddresses); - List getBridgeAddresses(); - void setBridgeOptionOrdinal(int bridgeOptionOrdinal); void setTorTransportOrdinal(int torTransportOrdinal); @@ -697,5 +683,9 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid void setCustomBridges(String customBridges); void setBitcoinNodesOptionOrdinal(int bitcoinNodesOption); + + List getBridgeAddresses(); + + long getWithdrawalTxFeeInBytes(); } } diff --git a/core/src/main/java/io/bisq/core/user/PreferencesPayload.java b/core/src/main/java/io/bisq/core/user/PreferencesPayload.java index 6dc54640d2..a51a6930f3 100644 --- a/core/src/main/java/io/bisq/core/user/PreferencesPayload.java +++ b/core/src/main/java/io/bisq/core/user/PreferencesPayload.java @@ -44,7 +44,7 @@ public final class PreferencesPayload implements PersistableEnvelope { private TradeCurrency preferredTradeCurrency; private long withdrawalTxFeeInBytes = 100; private boolean useCustomWithdrawalTxFee = false; - private double maxPriceDistanceInPercent = 0.1; + private double maxPriceDistanceInPercent = 0.3; @Nullable private String offerBookChartScreenCurrencyCode; @Nullable diff --git a/gui/pom.xml b/gui/pom.xml index 025d896a07..601d8a0909 100644 --- a/gui/pom.xml +++ b/gui/pom.xml @@ -22,7 +22,7 @@ parent io.bisq - 0.6.5 + 0.6.6 4.0.0 diff --git a/gui/src/main/java/io/bisq/gui/bisq.css b/gui/src/main/java/io/bisq/gui/bisq.css index d1bb3db744..9a0849d54b 100644 --- a/gui/src/main/java/io/bisq/gui/bisq.css +++ b/gui/src/main/java/io/bisq/gui/bisq.css @@ -686,6 +686,11 @@ textfield */ -fx-background-color: -bs-very-light-grey; } +/* Open Offer */ +.offer-disabled { + -fx-text-fill: -bs-light-grey; +} + /* OfferBook */ .table-title { diff --git a/gui/src/main/java/io/bisq/gui/components/paymentmethods/BankForm.java b/gui/src/main/java/io/bisq/gui/components/paymentmethods/BankForm.java index 394ddbae93..175ed50cad 100644 --- a/gui/src/main/java/io/bisq/gui/components/paymentmethods/BankForm.java +++ b/gui/src/main/java/io/bisq/gui/components/paymentmethods/BankForm.java @@ -292,109 +292,104 @@ abstract class BankForm extends PaymentMethodForm { countryComboBox.setOnAction(e -> { Country selectedItem = countryComboBox.getSelectionModel().getSelectedItem(); if (selectedItem != null) { - if (selectedItem.code.equals("US")) { - new Popup<>().information(Res.get("payment.us.info")) - .onClose(closeHandler::run) - .show(); + getCountryBasedPaymentAccount().setCountry(selectedItem); + String countryCode = selectedItem.code; + TradeCurrency currency = CurrencyUtil.getCurrencyByCountryCode(countryCode); + paymentAccount.setSingleTradeCurrency(currency); + currencyComboBox.setDisable(false); + currencyComboBox.getSelectionModel().select(currency); + + bankIdLabel.setText(BankUtil.getBankIdLabel(countryCode)); + branchIdLabel.setText(BankUtil.getBranchIdLabel(countryCode)); + accountNrLabel.setText(BankUtil.getAccountNrLabel(countryCode)); + accountTypeLabel.setText(BankUtil.getAccountTypeLabel(countryCode)); + + bankNameInputTextField.setText(""); + bankIdInputTextField.setText(""); + branchIdInputTextField.setText(""); + accountNrInputTextField.setText(""); + accountTypeComboBox.getSelectionModel().clearSelection(); + accountTypeComboBox.setItems(FXCollections.observableArrayList(BankUtil.getAccountTypeValues(countryCode))); + + if (BankUtil.useValidation(countryCode) && !validatorsApplied) { + validatorsApplied = true; + if (useHolderID) + holderIdInputTextField.setValidator(inputValidator); + bankNameInputTextField.setValidator(inputValidator); + bankIdInputTextField.setValidator(new BankIdValidator(countryCode)); + branchIdInputTextField.setValidator(new BranchIdValidator(countryCode)); + accountNrInputTextField.setValidator(new AccountNrValidator(countryCode)); } else { - getCountryBasedPaymentAccount().setCountry(selectedItem); - String countryCode = selectedItem.code; - TradeCurrency currency = CurrencyUtil.getCurrencyByCountryCode(countryCode); - paymentAccount.setSingleTradeCurrency(currency); - currencyComboBox.setDisable(false); - currencyComboBox.getSelectionModel().select(currency); - - bankIdLabel.setText(BankUtil.getBankIdLabel(countryCode)); - branchIdLabel.setText(BankUtil.getBranchIdLabel(countryCode)); - accountNrLabel.setText(BankUtil.getAccountNrLabel(countryCode)); - accountTypeLabel.setText(BankUtil.getAccountTypeLabel(countryCode)); - - bankNameInputTextField.setText(""); - bankIdInputTextField.setText(""); - branchIdInputTextField.setText(""); - accountNrInputTextField.setText(""); - accountTypeComboBox.getSelectionModel().clearSelection(); - accountTypeComboBox.setItems(FXCollections.observableArrayList(BankUtil.getAccountTypeValues(countryCode))); - - if (BankUtil.useValidation(countryCode) && !validatorsApplied) { - validatorsApplied = true; - if (useHolderID) - holderIdInputTextField.setValidator(inputValidator); - bankNameInputTextField.setValidator(inputValidator); - bankIdInputTextField.setValidator(new BankIdValidator(countryCode)); - branchIdInputTextField.setValidator(new BranchIdValidator(countryCode)); - accountNrInputTextField.setValidator(new AccountNrValidator(countryCode)); - } else { - validatorsApplied = false; - if (useHolderID) - holderIdInputTextField.setValidator(null); - bankNameInputTextField.setValidator(null); - bankIdInputTextField.setValidator(null); - branchIdInputTextField.setValidator(null); - accountNrInputTextField.setValidator(null); - } - holderNameInputTextField.resetValidation(); - bankNameInputTextField.resetValidation(); - bankIdInputTextField.resetValidation(); - branchIdInputTextField.resetValidation(); - accountNrInputTextField.resetValidation(); - - boolean requiresHolderId = BankUtil.isHolderIdRequired(countryCode); - if (requiresHolderId) { - holderNameInputTextField.minWidthProperty().unbind(); - holderNameInputTextField.setMinWidth(250); - } else { - holderNameInputTextField.minWidthProperty().bind(currencyComboBox.widthProperty()); - } - - if (useHolderID) { - if (!requiresHolderId) - holderIdInputTextField.setText(""); - - holderIdInputTextField.resetValidation(); - holderIdInputTextField.setVisible(requiresHolderId); - holderIdInputTextField.setManaged(requiresHolderId); - - holderIdLabel.setText(BankUtil.getHolderIdLabel(countryCode)); - holderIdLabel.setVisible(requiresHolderId); - holderIdLabel.setManaged(requiresHolderId); - } - - - boolean bankNameRequired = BankUtil.isBankNameRequired(countryCode); - bankNameTuple.first.setVisible(bankNameRequired); - bankNameTuple.first.setManaged(bankNameRequired); - bankNameInputTextField.setVisible(bankNameRequired); - bankNameInputTextField.setManaged(bankNameRequired); - - boolean bankIdRequired = BankUtil.isBankIdRequired(countryCode); - bankIdTuple.first.setVisible(bankIdRequired); - bankIdTuple.first.setManaged(bankIdRequired); - bankIdInputTextField.setVisible(bankIdRequired); - bankIdInputTextField.setManaged(bankIdRequired); - - boolean branchIdRequired = BankUtil.isBranchIdRequired(countryCode); - branchIdTuple.first.setVisible(branchIdRequired); - branchIdTuple.first.setManaged(branchIdRequired); - branchIdInputTextField.setVisible(branchIdRequired); - branchIdInputTextField.setManaged(branchIdRequired); - - boolean accountNrRequired = BankUtil.isAccountNrRequired(countryCode); - accountNrTuple.first.setVisible(accountNrRequired); - accountNrTuple.first.setManaged(accountNrRequired); - accountNrInputTextField.setVisible(accountNrRequired); - accountNrInputTextField.setManaged(accountNrRequired); - - boolean accountTypeRequired = BankUtil.isAccountTypeRequired(countryCode); - accountTypeTuple.first.setVisible(accountTypeRequired); - accountTypeTuple.first.setManaged(accountTypeRequired); - accountTypeTuple.second.setVisible(accountTypeRequired); - accountTypeTuple.second.setManaged(accountTypeRequired); - - updateFromInputs(); - - onCountryChanged(); + validatorsApplied = false; + if (useHolderID) + holderIdInputTextField.setValidator(null); + bankNameInputTextField.setValidator(null); + bankIdInputTextField.setValidator(null); + branchIdInputTextField.setValidator(null); + accountNrInputTextField.setValidator(null); } + holderNameInputTextField.resetValidation(); + bankNameInputTextField.resetValidation(); + bankIdInputTextField.resetValidation(); + branchIdInputTextField.resetValidation(); + accountNrInputTextField.resetValidation(); + + boolean requiresHolderId = BankUtil.isHolderIdRequired(countryCode); + if (requiresHolderId) { + holderNameInputTextField.minWidthProperty().unbind(); + holderNameInputTextField.setMinWidth(250); + } else { + holderNameInputTextField.minWidthProperty().bind(currencyComboBox.widthProperty()); + } + + if (useHolderID) { + if (!requiresHolderId) + holderIdInputTextField.setText(""); + + holderIdInputTextField.resetValidation(); + holderIdInputTextField.setVisible(requiresHolderId); + holderIdInputTextField.setManaged(requiresHolderId); + + holderIdLabel.setText(BankUtil.getHolderIdLabel(countryCode)); + holderIdLabel.setVisible(requiresHolderId); + holderIdLabel.setManaged(requiresHolderId); + } + + + boolean bankNameRequired = BankUtil.isBankNameRequired(countryCode); + bankNameTuple.first.setVisible(bankNameRequired); + bankNameTuple.first.setManaged(bankNameRequired); + bankNameInputTextField.setVisible(bankNameRequired); + bankNameInputTextField.setManaged(bankNameRequired); + + boolean bankIdRequired = BankUtil.isBankIdRequired(countryCode); + bankIdTuple.first.setVisible(bankIdRequired); + bankIdTuple.first.setManaged(bankIdRequired); + bankIdInputTextField.setVisible(bankIdRequired); + bankIdInputTextField.setManaged(bankIdRequired); + + boolean branchIdRequired = BankUtil.isBranchIdRequired(countryCode); + branchIdTuple.first.setVisible(branchIdRequired); + branchIdTuple.first.setManaged(branchIdRequired); + branchIdInputTextField.setVisible(branchIdRequired); + branchIdInputTextField.setManaged(branchIdRequired); + + boolean accountNrRequired = BankUtil.isAccountNrRequired(countryCode); + accountNrTuple.first.setVisible(accountNrRequired); + accountNrTuple.first.setManaged(accountNrRequired); + accountNrInputTextField.setVisible(accountNrRequired); + accountNrInputTextField.setManaged(accountNrRequired); + + boolean accountTypeRequired = BankUtil.isAccountTypeRequired(countryCode); + accountTypeTuple.first.setVisible(accountTypeRequired); + accountTypeTuple.first.setManaged(accountTypeRequired); + accountTypeTuple.second.setVisible(accountTypeRequired); + accountTypeTuple.second.setManaged(accountTypeRequired); + + updateFromInputs(); + + onCountryChanged(); + } }); diff --git a/gui/src/main/java/io/bisq/gui/components/paymentmethods/CashAppForm.java b/gui/src/main/java/io/bisq/gui/components/paymentmethods/CashAppForm.java new file mode 100644 index 0000000000..3e3231b95a --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/components/paymentmethods/CashAppForm.java @@ -0,0 +1,101 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.components.paymentmethods; + +import io.bisq.common.locale.Res; +import io.bisq.common.locale.TradeCurrency; +import io.bisq.core.payment.AccountAgeWitnessService; +import io.bisq.core.payment.CashAppAccount; +import io.bisq.core.payment.PaymentAccount; +import io.bisq.core.payment.payload.CashAppAccountPayload; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.gui.components.InputTextField; +import io.bisq.gui.util.BSFormatter; +import io.bisq.gui.util.Layout; +import io.bisq.gui.util.validation.CashAppValidator; +import io.bisq.gui.util.validation.InputValidator; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import org.apache.commons.lang3.StringUtils; + +import static io.bisq.gui.util.FormBuilder.*; + +public class CashAppForm extends PaymentMethodForm { + private final CashAppAccount account; + private final CashAppValidator validator; + private InputTextField accountIdInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountPayload paymentAccountPayload) { + addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.cashApp.cashTag"), ((CashAppAccountPayload) paymentAccountPayload).getCashTag()); + return gridRow; + } + + public CashAppForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, CashAppValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.account = (CashAppAccount) paymentAccount; + this.validator = aliPayValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + accountIdInputTextField = addLabelInputTextField(gridPane, ++gridRow, Res.get("payment.cashApp.cashTag")).second; + accountIdInputTextField.setValidator(validator); + accountIdInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + account.setCashTag(newValue); + updateFromInputs(); + }); + + final TradeCurrency singleTradeCurrency = account.getSingleTradeCurrency(); + final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : ""; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + addAccountNameTextFieldWithAutoFillCheckBox(); + } + + @Override + protected void autoFillNameTextField() { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { + String accountNr = accountIdInputTextField.getText(); + accountNr = StringUtils.abbreviate(accountNr, 9); + String method = Res.get(paymentAccount.getPaymentMethod().getId()); + accountNameTextField.setText(method.concat(": ").concat(accountNr)); + } + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), account.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.paymentMethod"), Res.get(account.getPaymentMethod().getId())); + TextField field = addLabelTextField(gridPane, ++gridRow, Res.get("payment.cashApp.cashTag"), account.getCashTag()).second; + field.setMouseTransparent(false); + final TradeCurrency singleTradeCurrency = account.getSingleTradeCurrency(); + final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : ""; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && validator.validate(account.getCashTag()).isValid + && account.getTradeCurrencies().size() > 0); + } +} diff --git a/gui/src/main/java/io/bisq/gui/components/paymentmethods/MoneyBeamForm.java b/gui/src/main/java/io/bisq/gui/components/paymentmethods/MoneyBeamForm.java new file mode 100644 index 0000000000..86940fdc57 --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/components/paymentmethods/MoneyBeamForm.java @@ -0,0 +1,101 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.components.paymentmethods; + +import io.bisq.common.locale.Res; +import io.bisq.common.locale.TradeCurrency; +import io.bisq.core.payment.AccountAgeWitnessService; +import io.bisq.core.payment.MoneyBeamAccount; +import io.bisq.core.payment.PaymentAccount; +import io.bisq.core.payment.payload.MoneyBeamAccountPayload; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.gui.components.InputTextField; +import io.bisq.gui.util.BSFormatter; +import io.bisq.gui.util.Layout; +import io.bisq.gui.util.validation.InputValidator; +import io.bisq.gui.util.validation.MoneyBeamValidator; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import org.apache.commons.lang3.StringUtils; + +import static io.bisq.gui.util.FormBuilder.*; + +public class MoneyBeamForm extends PaymentMethodForm { + private final MoneyBeamAccount account; + private final MoneyBeamValidator validator; + private InputTextField accountIdInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountPayload paymentAccountPayload) { + addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.moneyBeam.accountId"), ((MoneyBeamAccountPayload) paymentAccountPayload).getAccountId()); + return gridRow; + } + + public MoneyBeamForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, MoneyBeamValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.account = (MoneyBeamAccount) paymentAccount; + this.validator = aliPayValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + accountIdInputTextField = addLabelInputTextField(gridPane, ++gridRow, Res.get("payment.moneyBeam.accountId")).second; + accountIdInputTextField.setValidator(validator); + accountIdInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + account.setAccountId(newValue); + updateFromInputs(); + }); + + final TradeCurrency singleTradeCurrency = account.getSingleTradeCurrency(); + final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : ""; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + addAccountNameTextFieldWithAutoFillCheckBox(); + } + + @Override + protected void autoFillNameTextField() { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { + String accountNr = accountIdInputTextField.getText(); + accountNr = StringUtils.abbreviate(accountNr, 9); + String method = Res.get(paymentAccount.getPaymentMethod().getId()); + accountNameTextField.setText(method.concat(": ").concat(accountNr)); + } + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), account.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.paymentMethod"), Res.get(account.getPaymentMethod().getId())); + TextField field = addLabelTextField(gridPane, ++gridRow, Res.get("payment.moneyBeam.accountId"), account.getAccountId()).second; + field.setMouseTransparent(false); + final TradeCurrency singleTradeCurrency = account.getSingleTradeCurrency(); + final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : ""; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && validator.validate(account.getAccountId()).isValid + && account.getTradeCurrencies().size() > 0); + } +} diff --git a/gui/src/main/java/io/bisq/gui/components/paymentmethods/OKPayForm.java b/gui/src/main/java/io/bisq/gui/components/paymentmethods/OKPayForm.java index 70e1d2393e..04f3167c90 100644 --- a/gui/src/main/java/io/bisq/gui/components/paymentmethods/OKPayForm.java +++ b/gui/src/main/java/io/bisq/gui/components/paymentmethods/OKPayForm.java @@ -82,7 +82,7 @@ public class OKPayForm extends PaymentMethodForm { } private void addCurrenciesGrid(boolean isEditable) { - Label label = addLabel(gridPane, ++gridRow, Res.get("payment.supported.okpay"), 0); + Label label = addLabel(gridPane, ++gridRow, Res.get("payment.supportedCurrencies"), 0); GridPane.setValignment(label, VPos.TOP); FlowPane flowPane = new FlowPane(); flowPane.setPadding(new Insets(10, 10, 10, 10)); diff --git a/gui/src/main/java/io/bisq/gui/components/paymentmethods/PopmoneyForm.java b/gui/src/main/java/io/bisq/gui/components/paymentmethods/PopmoneyForm.java new file mode 100644 index 0000000000..47867e6c13 --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/components/paymentmethods/PopmoneyForm.java @@ -0,0 +1,114 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.components.paymentmethods; + +import io.bisq.common.locale.Res; +import io.bisq.common.locale.TradeCurrency; +import io.bisq.core.payment.AccountAgeWitnessService; +import io.bisq.core.payment.PaymentAccount; +import io.bisq.core.payment.PopmoneyAccount; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.PopmoneyAccountPayload; +import io.bisq.gui.components.InputTextField; +import io.bisq.gui.util.BSFormatter; +import io.bisq.gui.util.Layout; +import io.bisq.gui.util.validation.InputValidator; +import io.bisq.gui.util.validation.PopmoneyValidator; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import org.apache.commons.lang3.StringUtils; + +import static io.bisq.gui.util.FormBuilder.*; + +public class PopmoneyForm extends PaymentMethodForm { + private final PopmoneyAccount account; + private final PopmoneyValidator validator; + private InputTextField accountIdInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountPayload paymentAccountPayload) { + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("payment.account.owner"), + ((PopmoneyAccountPayload) paymentAccountPayload).getHolderName()); + addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.popmoney.accountId"), ((PopmoneyAccountPayload) paymentAccountPayload).getAccountId()); + return gridRow; + } + + public PopmoneyForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, PopmoneyValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.account = (PopmoneyAccount) paymentAccount; + this.validator = aliPayValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + InputTextField holderNameInputTextField = addLabelInputTextField(gridPane, ++gridRow, + Res.getWithCol("payment.account.owner")).second; + holderNameInputTextField.setValidator(inputValidator); + holderNameInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + account.setHolderName(newValue); + updateFromInputs(); + }); + + accountIdInputTextField = addLabelInputTextField(gridPane, ++gridRow, Res.get("payment.popmoney.accountId")).second; + accountIdInputTextField.setValidator(validator); + accountIdInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + account.setAccountId(newValue); + updateFromInputs(); + }); + + final TradeCurrency singleTradeCurrency = account.getSingleTradeCurrency(); + final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : ""; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + addAccountNameTextFieldWithAutoFillCheckBox(); + } + + @Override + protected void autoFillNameTextField() { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { + String accountNr = accountIdInputTextField.getText(); + accountNr = StringUtils.abbreviate(accountNr, 9); + String method = Res.get(paymentAccount.getPaymentMethod().getId()); + accountNameTextField.setText(method.concat(": ").concat(accountNr)); + } + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), account.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.paymentMethod"), Res.get(account.getPaymentMethod().getId())); + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("payment.account.owner"), + account.getHolderName()); + TextField field = addLabelTextField(gridPane, ++gridRow, Res.get("payment.popmoney.accountId"), account.getAccountId()).second; + field.setMouseTransparent(false); + final TradeCurrency singleTradeCurrency = account.getSingleTradeCurrency(); + final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : ""; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && inputValidator.validate(account.getHolderName()).isValid + && validator.validate(account.getAccountId()).isValid + && account.getTradeCurrencies().size() > 0); + } +} diff --git a/gui/src/main/java/io/bisq/gui/components/paymentmethods/RevolutForm.java b/gui/src/main/java/io/bisq/gui/components/paymentmethods/RevolutForm.java new file mode 100644 index 0000000000..408be054aa --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/components/paymentmethods/RevolutForm.java @@ -0,0 +1,146 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.components.paymentmethods; + +import io.bisq.common.locale.CurrencyUtil; +import io.bisq.common.locale.Res; +import io.bisq.core.payment.AccountAgeWitnessService; +import io.bisq.core.payment.PaymentAccount; +import io.bisq.core.payment.RevolutAccount; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.RevolutAccountPayload; +import io.bisq.gui.components.InputTextField; +import io.bisq.gui.util.BSFormatter; +import io.bisq.gui.util.Layout; +import io.bisq.gui.util.validation.InputValidator; +import io.bisq.gui.util.validation.RevolutValidator; +import javafx.geometry.Insets; +import javafx.geometry.VPos; +import javafx.scene.control.CheckBox; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.control.Tooltip; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.GridPane; +import org.apache.commons.lang3.StringUtils; + +import static io.bisq.gui.util.FormBuilder.*; + +public class RevolutForm extends PaymentMethodForm { + private final RevolutAccount account; + private RevolutValidator validator; + private InputTextField accountIdInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, + PaymentAccountPayload paymentAccountPayload) { + addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.revolut.accountId"), + ((RevolutAccountPayload) paymentAccountPayload).getAccountId()); + return gridRow; + } + + public RevolutForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, + RevolutValidator revolutValidator, InputValidator inputValidator, GridPane gridPane, + int gridRow, BSFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.account = (RevolutAccount) paymentAccount; + this.validator = revolutValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + accountIdInputTextField = addLabelInputTextField(gridPane, ++gridRow, Res.get("payment.revolut.accountId")).second; + accountIdInputTextField.setValidator(validator); + accountIdInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + account.setAccountId(newValue); + updateFromInputs(); + }); + + addCurrenciesGrid(true); + addLimitations(); + addAccountNameTextFieldWithAutoFillCheckBox(); + } + + private void addCurrenciesGrid(boolean isEditable) { + Label label = addLabel(gridPane, ++gridRow, Res.get("payment.supportedCurrencies"), 0); + GridPane.setValignment(label, VPos.TOP); + FlowPane flowPane = new FlowPane(); + flowPane.setPadding(new Insets(10, 10, 10, 10)); + flowPane.setVgap(10); + flowPane.setHgap(10); + + if (isEditable) + flowPane.setId("flow-pane-checkboxes-bg"); + else + flowPane.setId("flow-pane-checkboxes-non-editable-bg"); + + CurrencyUtil.getAllRevolutCurrencies().forEach(e -> { + CheckBox checkBox = new CheckBox(e.getCode()); + checkBox.setMouseTransparent(!isEditable); + checkBox.setSelected(account.getTradeCurrencies().contains(e)); + checkBox.setMinWidth(60); + checkBox.setMaxWidth(checkBox.getMinWidth()); + checkBox.setTooltip(new Tooltip(e.getName())); + checkBox.setOnAction(event -> { + if (checkBox.isSelected()) + account.addCurrency(e); + else + account.removeCurrency(e); + + updateAllInputsValid(); + }); + flowPane.getChildren().add(checkBox); + }); + + GridPane.setRowIndex(flowPane, gridRow); + GridPane.setColumnIndex(flowPane, 1); + gridPane.getChildren().add(flowPane); + } + + @Override + protected void autoFillNameTextField() { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { + String AccountId = accountIdInputTextField.getText(); + AccountId = StringUtils.abbreviate(AccountId, 9); + String method = Res.get(paymentAccount.getPaymentMethod().getId()); + accountNameTextField.setText(method.concat(": ").concat(AccountId)); + } + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), + account.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.paymentMethod"), + Res.get(account.getPaymentMethod().getId())); + TextField field = addLabelTextField(gridPane, ++gridRow, Res.get("payment.revolut.accountId"), + account.getAccountId()).second; + field.setMouseTransparent(false); + addLimitations(); + addCurrenciesGrid(false); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && validator.validate(account.getAccountId()).isValid + && account.getTradeCurrencies().size() > 0); + } +} diff --git a/gui/src/main/java/io/bisq/gui/components/paymentmethods/UpholdForm.java b/gui/src/main/java/io/bisq/gui/components/paymentmethods/UpholdForm.java new file mode 100644 index 0000000000..eef97092ec --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/components/paymentmethods/UpholdForm.java @@ -0,0 +1,147 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.components.paymentmethods; + +import io.bisq.common.locale.CurrencyUtil; +import io.bisq.common.locale.Res; +import io.bisq.core.payment.AccountAgeWitnessService; +import io.bisq.core.payment.PaymentAccount; +import io.bisq.core.payment.UpholdAccount; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.UpholdAccountPayload; +import io.bisq.gui.components.InputTextField; +import io.bisq.gui.util.BSFormatter; +import io.bisq.gui.util.Layout; +import io.bisq.gui.util.validation.InputValidator; +import io.bisq.gui.util.validation.UpholdValidator; +import javafx.geometry.Insets; +import javafx.geometry.VPos; +import javafx.scene.control.CheckBox; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.control.Tooltip; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.GridPane; +import org.apache.commons.lang3.StringUtils; + +import static io.bisq.gui.util.FormBuilder.*; + +public class UpholdForm extends PaymentMethodForm { + private final UpholdAccount upholdAccount; + private UpholdValidator upholdValidator; + private InputTextField accountIdInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, + PaymentAccountPayload paymentAccountPayload) { + addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.uphold.accountId"), + ((UpholdAccountPayload) paymentAccountPayload).getAccountId()); + return gridRow; + } + + public UpholdForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, + UpholdValidator upholdValidator, InputValidator inputValidator, GridPane gridPane, + int gridRow, BSFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.upholdAccount = (UpholdAccount) paymentAccount; + this.upholdValidator = upholdValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + accountIdInputTextField = addLabelInputTextField(gridPane, ++gridRow, Res.get("payment.uphold.accountId")).second; + accountIdInputTextField.setValidator(upholdValidator); + accountIdInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + upholdAccount.setAccountId(newValue); + updateFromInputs(); + }); + + addCurrenciesGrid(true); + addLimitations(); + addAccountNameTextFieldWithAutoFillCheckBox(); + } + + private void addCurrenciesGrid(boolean isEditable) { + Label label = addLabel(gridPane, ++gridRow, Res.get("payment.supportedCurrencies"), 0); + GridPane.setValignment(label, VPos.TOP); + FlowPane flowPane = new FlowPane(); + flowPane.setPadding(new Insets(10, 10, 10, 10)); + flowPane.setVgap(10); + flowPane.setHgap(10); + + if (isEditable) + flowPane.setId("flow-pane-checkboxes-bg"); + else + flowPane.setId("flow-pane-checkboxes-non-editable-bg"); + + CurrencyUtil.getAllUpholdCurrencies().stream().forEach(e -> + { + CheckBox checkBox = new CheckBox(e.getCode()); + checkBox.setMouseTransparent(!isEditable); + checkBox.setSelected(upholdAccount.getTradeCurrencies().contains(e)); + checkBox.setMinWidth(60); + checkBox.setMaxWidth(checkBox.getMinWidth()); + checkBox.setTooltip(new Tooltip(e.getName())); + checkBox.setOnAction(event -> { + if (checkBox.isSelected()) + upholdAccount.addCurrency(e); + else + upholdAccount.removeCurrency(e); + + updateAllInputsValid(); + }); + flowPane.getChildren().add(checkBox); + }); + + GridPane.setRowIndex(flowPane, gridRow); + GridPane.setColumnIndex(flowPane, 1); + gridPane.getChildren().add(flowPane); + } + + @Override + protected void autoFillNameTextField() { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { + String AccountId = accountIdInputTextField.getText(); + AccountId = StringUtils.abbreviate(AccountId, 9); + String method = Res.get(paymentAccount.getPaymentMethod().getId()); + accountNameTextField.setText(method.concat(": ").concat(AccountId)); + } + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), + upholdAccount.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.paymentMethod"), + Res.get(upholdAccount.getPaymentMethod().getId())); + TextField field = addLabelTextField(gridPane, ++gridRow, Res.get("payment.uphold.accountId"), + upholdAccount.getAccountId()).second; + field.setMouseTransparent(false); + addLimitations(); + addCurrenciesGrid(false); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && upholdValidator.validate(upholdAccount.getAccountId()).isValid + && upholdAccount.getTradeCurrencies().size() > 0); + } +} diff --git a/gui/src/main/java/io/bisq/gui/components/paymentmethods/VenmoForm.java b/gui/src/main/java/io/bisq/gui/components/paymentmethods/VenmoForm.java new file mode 100644 index 0000000000..645ff8544c --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/components/paymentmethods/VenmoForm.java @@ -0,0 +1,114 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.components.paymentmethods; + +import io.bisq.common.locale.Res; +import io.bisq.common.locale.TradeCurrency; +import io.bisq.core.payment.AccountAgeWitnessService; +import io.bisq.core.payment.PaymentAccount; +import io.bisq.core.payment.VenmoAccount; +import io.bisq.core.payment.payload.PaymentAccountPayload; +import io.bisq.core.payment.payload.VenmoAccountPayload; +import io.bisq.gui.components.InputTextField; +import io.bisq.gui.util.BSFormatter; +import io.bisq.gui.util.Layout; +import io.bisq.gui.util.validation.InputValidator; +import io.bisq.gui.util.validation.VenmoValidator; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import org.apache.commons.lang3.StringUtils; + +import static io.bisq.gui.util.FormBuilder.*; + +public class VenmoForm extends PaymentMethodForm { + private final VenmoAccount account; + private final VenmoValidator validator; + private InputTextField accountIdInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, PaymentAccountPayload paymentAccountPayload) { + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("payment.account.owner"), + ((VenmoAccountPayload) paymentAccountPayload).getHolderName()); + addLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.venmo.venmoUserName"), ((VenmoAccountPayload) paymentAccountPayload).getVenmoUserName()); + return gridRow; + } + + public VenmoForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, VenmoValidator aliPayValidator, InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.account = (VenmoAccount) paymentAccount; + this.validator = aliPayValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + InputTextField holderNameInputTextField = addLabelInputTextField(gridPane, ++gridRow, + Res.getWithCol("payment.account.owner")).second; + holderNameInputTextField.setValidator(inputValidator); + holderNameInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + account.setHolderName(newValue); + updateFromInputs(); + }); + + accountIdInputTextField = addLabelInputTextField(gridPane, ++gridRow, Res.get("payment.venmo.venmoUserName")).second; + accountIdInputTextField.setValidator(validator); + accountIdInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + account.setVenmoUserName(newValue); + updateFromInputs(); + }); + + final TradeCurrency singleTradeCurrency = account.getSingleTradeCurrency(); + final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : ""; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + addAccountNameTextFieldWithAutoFillCheckBox(); + } + + @Override + protected void autoFillNameTextField() { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { + String accountNr = accountIdInputTextField.getText(); + accountNr = StringUtils.abbreviate(accountNr, 9); + String method = Res.get(paymentAccount.getPaymentMethod().getId()); + accountNameTextField.setText(method.concat(": ").concat(accountNr)); + } + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), account.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.paymentMethod"), Res.get(account.getPaymentMethod().getId())); + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("payment.account.owner"), + account.getHolderName()); + TextField field = addLabelTextField(gridPane, ++gridRow, Res.get("payment.venmo.venmoUserName"), account.getVenmoUserName()).second; + field.setMouseTransparent(false); + final TradeCurrency singleTradeCurrency = account.getSingleTradeCurrency(); + final String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : ""; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && inputValidator.validate(account.getHolderName()).isValid + && validator.validate(account.getVenmoUserName()).isValid + && account.getTradeCurrencies().size() > 0); + } +} diff --git a/gui/src/main/java/io/bisq/gui/main/account/content/fiataccounts/FiatAccountsDataModel.java b/gui/src/main/java/io/bisq/gui/main/account/content/fiataccounts/FiatAccountsDataModel.java index 40127a1a98..2d0f0d22f9 100644 --- a/gui/src/main/java/io/bisq/gui/main/account/content/fiataccounts/FiatAccountsDataModel.java +++ b/gui/src/main/java/io/bisq/gui/main/account/content/fiataccounts/FiatAccountsDataModel.java @@ -19,6 +19,7 @@ package io.bisq.gui.main.account.content.fiataccounts; import com.google.inject.Inject; import io.bisq.common.locale.CryptoCurrency; +import io.bisq.common.locale.CurrencyUtil; import io.bisq.common.locale.FiatCurrency; import io.bisq.common.locale.TradeCurrency; import io.bisq.common.proto.persistable.PersistenceProtoResolver; @@ -108,7 +109,12 @@ class FiatAccountsDataModel extends ActivatableDataModel { else preferences.addCryptoCurrency((CryptoCurrency) singleTradeCurrency); } else if (tradeCurrencies != null && !tradeCurrencies.isEmpty()) { - tradeCurrencies.stream().forEach(tradeCurrency -> { + if (tradeCurrencies.contains(CurrencyUtil.getDefaultTradeCurrency())) + paymentAccount.setSelectedTradeCurrency(CurrencyUtil.getDefaultTradeCurrency()); + else + paymentAccount.setSelectedTradeCurrency(tradeCurrencies.get(0)); + + tradeCurrencies.forEach(tradeCurrency -> { if (tradeCurrency instanceof FiatCurrency) preferences.addFiatCurrency((FiatCurrency) tradeCurrency); else diff --git a/gui/src/main/java/io/bisq/gui/main/account/content/fiataccounts/FiatAccountsView.java b/gui/src/main/java/io/bisq/gui/main/account/content/fiataccounts/FiatAccountsView.java index 6751c68b41..f5de364791 100644 --- a/gui/src/main/java/io/bisq/gui/main/account/content/fiataccounts/FiatAccountsView.java +++ b/gui/src/main/java/io/bisq/gui/main/account/content/fiataccounts/FiatAccountsView.java @@ -46,6 +46,7 @@ import javafx.scene.layout.GridPane; import javafx.scene.text.TextAlignment; import javafx.util.Callback; import javafx.util.StringConverter; +import org.bitcoinj.core.Coin; import javax.inject.Inject; import java.util.List; @@ -64,6 +65,12 @@ public class FiatAccountsView extends ActivatableViewAndModel().information(Res.get("payment.clearXchange.info", currencyName, currencyName)) - .width(900) - .closeButtonText(Res.get("shared.cancel")) - .actionButtonText(Res.get("shared.iConfirm")) - .onAction(() -> doSaveNewAccount(paymentAccount)) - .show(); - } else if (paymentAccount instanceof WesternUnionAccount) { - new Popup<>().information(Res.get("payment.westernUnion.info", currencyName, currencyName)) - .width(700) - .closeButtonText(Res.get("shared.cancel")) - .actionButtonText(Res.get("shared.iUnderstand")) - .onAction(() -> doSaveNewAccount(paymentAccount)) - .show(); - } else { - doSaveNewAccount(paymentAccount); - } + Coin maxTradeLimitAsCoin = paymentAccount.getPaymentMethod().getMaxTradeLimitAsCoin("USD"); + Coin maxTradeLimitSecondMonth = maxTradeLimitAsCoin.divide(2L); + Coin maxTradeLimitFirstMonth = maxTradeLimitAsCoin.divide(4L); + new Popup<>().information(Res.get("payment.limits.info", + formatter.formatCoinWithCode(maxTradeLimitFirstMonth), + formatter.formatCoinWithCode(maxTradeLimitSecondMonth), + formatter.formatCoinWithCode(maxTradeLimitAsCoin))) + .width(700) + .closeButtonText(Res.get("shared.cancel")) + .actionButtonText(Res.get("shared.iUnderstand")) + .onAction(() -> { + final String currencyName = BisqEnvironment.getBaseCurrencyNetwork().getCurrencyName(); + if (paymentAccount instanceof ClearXchangeAccount) { + new Popup<>().information(Res.get("payment.clearXchange.info", currencyName, currencyName)) + .width(900) + .closeButtonText(Res.get("shared.cancel")) + .actionButtonText(Res.get("shared.iConfirm")) + .onAction(() -> doSaveNewAccount(paymentAccount)) + .show(); + } else if (paymentAccount instanceof WesternUnionAccount) { + new Popup<>().information(Res.get("payment.westernUnion.info")) + .width(700) + .closeButtonText(Res.get("shared.cancel")) + .actionButtonText(Res.get("shared.iUnderstand")) + .onAction(() -> doSaveNewAccount(paymentAccount)) + .show(); + } else { + doSaveNewAccount(paymentAccount); + } + }) + .show(); } private void doSaveNewAccount(PaymentAccount paymentAccount) { - if (!model.getPaymentAccounts().stream().filter(e -> e.getAccountName() != null && - e.getAccountName().equals(paymentAccount.getAccountName())) - .findAny() - .isPresent()) { - - // TODO apply salt if user provided it - // testing - // paymentAccount.setSaltAsHex("a25b65f612e49ba6c4ab80a95fc9b723bcff9e7c6bd06f020d4bdffdac060eed"); - + if (model.getPaymentAccounts().stream().noneMatch(e -> e.getAccountName() != null && + e.getAccountName().equals(paymentAccount.getAccountName()))) { model.onSaveNewAccount(paymentAccount); removeNewAccountForm(); } else { @@ -341,6 +366,18 @@ public class FiatAccountsView extends ActivatableViewAndModel() { - @Override - public String toString(PaymentAccount paymentAccount) { - TradeCurrency singleTradeCurrency = paymentAccount.getSingleTradeCurrency(); - String code = singleTradeCurrency != null ? singleTradeCurrency.getCode() : ""; - return paymentAccount.getAccountName() + " (" + code + ", " + - Res.get(paymentAccount.getPaymentMethod().getId()) + ")"; - } - - @Override - public PaymentAccount fromString(String s) { - return null; - } - }); + paymentAccountsComboBox.setConverter(GUIUtil.getPaymentAccountsComboBoxStringConverter()); GUIUtil.focusWhenAddedToScene(amountTextField); } @@ -433,6 +420,10 @@ public class CreateOfferView extends ActivatableViewAndModel tradeCurrencies = paymentAccount.getTradeCurrencies(); currencyComboBox.setItems(FXCollections.observableArrayList(tradeCurrencies)); - - // we select comboBox following the user currency, if user currency not available in account, we select first - TradeCurrency tradeCurrency = model.getTradeCurrency(); - if (tradeCurrencies.contains(tradeCurrency)) - currencyComboBox.getSelectionModel().select(tradeCurrency); + if (paymentAccount.getSelectedTradeCurrency() != null) + currencyComboBox.getSelectionModel().select(paymentAccount.getSelectedTradeCurrency()); + else if (tradeCurrencies.contains(model.getTradeCurrency())) + currencyComboBox.getSelectionModel().select(model.getTradeCurrency()); else currencyComboBox.getSelectionModel().select(tradeCurrencies.get(0)); @@ -461,6 +451,8 @@ public class CreateOfferView extends ActivatableViewAndModel - model.onTakeOffer(() -> { - offerDetailsWindow.hide(); - offerDetailsWindowDisplayed = false; - }) + model.onTakeOffer(() -> { + offerDetailsWindow.hide(); + offerDetailsWindowDisplayed = false; + }) ).show(model.getOffer(), model.dataModel.getAmount().get(), model.dataModel.tradePrice); offerDetailsWindowDisplayed = true; } else { @@ -684,20 +680,7 @@ public class TakeOfferView extends ActivatableViewAndModel() { - @Override - public String toString(PaymentAccount paymentAccount) { - TradeCurrency singleTradeCurrency = paymentAccount.getSingleTradeCurrency(); - String code = singleTradeCurrency != null ? singleTradeCurrency.getCode() : ""; - return paymentAccount.getAccountName() + " (" + code + ", " + - Res.get(paymentAccount.getPaymentMethod().getId()) + ")"; - } - - @Override - public PaymentAccount fromString(String s) { - return null; - } - }); + paymentAccountsComboBox.setConverter(GUIUtil.getPaymentAccountsComboBoxStringConverter()); paymentAccountsComboBox.setVisible(false); paymentAccountsComboBox.setManaged(false); paymentAccountsComboBox.setOnAction(e -> { @@ -971,7 +954,7 @@ public class TakeOfferView extends ActivatableViewAndModel amountValueCurrencyBoxTuple = getNonEditableValueCurrencyBox(); amountRangeTextField = amountValueCurrencyBoxTuple.second; - Tuple2 amountInputBoxTuple = getTradeInputBox( amountValueCurrencyBoxTuple.first, + Tuple2 amountInputBoxTuple = getTradeInputBox(amountValueCurrencyBoxTuple.first, Res.get("takeOffer.amountPriceBox.amountRangeDescription")); amountRangeBox = amountInputBoxTuple.second; diff --git a/gui/src/main/java/io/bisq/gui/main/overlays/windows/downloadupdate/BisqInstaller.java b/gui/src/main/java/io/bisq/gui/main/overlays/windows/downloadupdate/BisqInstaller.java index e34da23968..bcc4911819 100644 --- a/gui/src/main/java/io/bisq/gui/main/overlays/windows/downloadupdate/BisqInstaller.java +++ b/gui/src/main/java/io/bisq/gui/main/overlays/windows/downloadupdate/BisqInstaller.java @@ -38,10 +38,11 @@ import static com.google.common.base.Preconditions.checkArgument; @Slf4j public class BisqInstaller { - static final String FINGER_PRINT_MANFRED_KARRER = "F379A1C6"; - static final String FINGER_PRINT_CHRIS_BEAMS = "5BC5ED73"; - static final String PUB_KEY_HOSTING_URL = "https://bisq.network/pubkey/"; - static final String DOWNLOAD_HOST_URL = "https://github.com/bisq-network/exchange/releases/download/"; + private static final String FINGER_PRINT_MANFRED_KARRER = "F379A1C6"; + private static final String FINGER_PRINT_CHRIS_BEAMS = "5BC5ED73"; + private static final String FINGER_PRINT_CHRISTOPH_ATTENEDER = "29CDFD3B"; + private static final String PUB_KEY_HOSTING_URL = "https://bisq.network/pubkey/"; + private static final String DOWNLOAD_HOST_URL = "https://github.com/bisq-network/exchange/releases/download/"; public boolean isSupportedOS() { return Utilities.isOSX() || Utilities.isWindows() || Utilities.isLinux(); @@ -79,7 +80,7 @@ public class BisqInstaller { try { return Optional.of(downloadFiles(fileDescriptors, Utilities.getDownloadOfHomeDir())); } catch (IOException exception) { - return Optional.empty(); + return Optional.empty(); } } @@ -91,7 +92,7 @@ public class BisqInstaller { * @return The task handling the download * @throws IOException */ - public static DownloadTask downloadFiles(List fileDescriptors, String saveDir) throws IOException { + private static DownloadTask downloadFiles(List fileDescriptors, String saveDir) throws IOException { if (saveDir == null) saveDir = Utilities.getDownloadOfHomeDir(); DownloadTask task = new DownloadTask(fileDescriptors, saveDir); @@ -178,7 +179,7 @@ public class BisqInstaller { } @NotNull - public FileDescriptor getInstallerDescriptor(String version, String partialUrl) { + private FileDescriptor getInstallerDescriptor(String version, String partialUrl) { String fileName; String prefix = "Bisq-"; // https://github.com/bisq-network/exchange/releases/download/v0.5.1/Bisq-0.5.1.dmg @@ -200,7 +201,7 @@ public class BisqInstaller { } @NotNull - public FileDescriptor getSigningKeyDescriptor(String url) { + private FileDescriptor getSigningKeyDescriptor(String url) { String fileName = "signingkey.asc"; return FileDescriptor.builder() .type(DownloadType.SIGNING_KEY) @@ -217,7 +218,7 @@ public class BisqInstaller { * * @return list of keys to check agains corresponding sigs. */ - public List getKeyFileDescriptors() { + private List getKeyFileDescriptors() { List list = new ArrayList<>(); list.add(getKeyFileDescriptor(FINGER_PRINT_MANFRED_KARRER)); @@ -226,6 +227,9 @@ public class BisqInstaller { list.add(getKeyFileDescriptor(FINGER_PRINT_CHRIS_BEAMS)); list.add(getLocalKeyFileDescriptor(FINGER_PRINT_CHRIS_BEAMS)); + list.add(getKeyFileDescriptor(FINGER_PRINT_CHRISTOPH_ATTENEDER)); + list.add(getLocalKeyFileDescriptor(FINGER_PRINT_CHRISTOPH_ATTENEDER)); + return list; } @@ -260,7 +264,7 @@ public class BisqInstaller { List result = Lists.newArrayList(); for (FileDescriptor key : keys) { - if (!result.stream().filter(e -> e.getId().equals(key.getId())).findAny().isPresent()) { + if (result.stream().noneMatch(e -> e.getId().equals(key.getId()))) { result.add(FileDescriptor.builder() .type(DownloadType.SIG) .fileName(installerFileDescriptor.getFileName().concat(suffix)) diff --git a/gui/src/main/java/io/bisq/gui/main/portfolio/closedtrades/ClosedTradesViewModel.java b/gui/src/main/java/io/bisq/gui/main/portfolio/closedtrades/ClosedTradesViewModel.java index f0aa9727dd..787ba5c742 100644 --- a/gui/src/main/java/io/bisq/gui/main/portfolio/closedtrades/ClosedTradesViewModel.java +++ b/gui/src/main/java/io/bisq/gui/main/portfolio/closedtrades/ClosedTradesViewModel.java @@ -35,8 +35,8 @@ class ClosedTradesViewModel extends ActivatableWithDataModel - - - - - - - - + + + + + + + + + - \ No newline at end of file + diff --git a/gui/src/main/java/io/bisq/gui/main/portfolio/openoffer/OpenOffersView.java b/gui/src/main/java/io/bisq/gui/main/portfolio/openoffer/OpenOffersView.java index aca986f47a..66fcb3b152 100644 --- a/gui/src/main/java/io/bisq/gui/main/portfolio/openoffer/OpenOffersView.java +++ b/gui/src/main/java/io/bisq/gui/main/portfolio/openoffer/OpenOffersView.java @@ -40,6 +40,7 @@ import javafx.scene.control.*; import javafx.scene.image.ImageView; import javafx.scene.layout.VBox; import javafx.util.Callback; +import org.jetbrains.annotations.NotNull; import javax.inject.Inject; @@ -50,7 +51,7 @@ public class OpenOffersView extends ActivatableViewAndModel tableView; @FXML TableColumn priceColumn, amountColumn, volumeColumn, - marketColumn, directionColumn, dateColumn, offerIdColumn, removeItemColumn; + marketColumn, directionColumn, dateColumn, offerIdColumn, deactivateItemColumn, removeItemColumn; private final Navigation navigation; private final OfferDetailsWindow offerDetailsWindow; private SortedList sortedList; @@ -71,6 +72,7 @@ public class OpenOffersView extends ActivatableViewAndModel { + log.debug("Deactivate offer was successful"); + }, + (message) -> { + log.error(message); + new Popup<>().warning(Res.get("offerbook.deactivateOffer.failed", message)).show(); + }); + } else { + new Popup<>().information(Res.get("popup.warning.notFullyConnected")).show(); + } + } + + private void onActivateOpenOffer(OpenOffer openOffer) { + if (model.isBootstrapped()) { + model.onActivateOpenOffer(openOffer, + () -> { + log.debug("Activate offer was successful"); + }, + (message) -> { + log.error(message); + new Popup<>().warning(Res.get("offerbook.activateOffer.failed", message)).show(); + }); + } else { + new Popup<>().information(Res.get("popup.warning.notFullyConnected")).show(); + } + } + private void onRemoveOpenOffer(OpenOffer openOffer) { if (model.isBootstrapped()) { String key = "RemoveOfferWarning"; @@ -135,7 +168,7 @@ public class OpenOffersView extends ActivatableViewAndModel { log.debug("Remove offer was successful"); String key = "WithdrawFundsAfterRemoveOfferInfo"; @@ -196,10 +229,12 @@ public class OpenOffersView extends ActivatableViewAndModel new ReadOnlyObjectWrapper<>(offerListItem.getValue())); + deactivateItemColumn.setCellFactory( + new Callback, TableCell>() { + @Override + public TableCell call(TableColumn column) { + return new TableCell() { + final ImageView iconView = new ImageView(); + Button button; + + private void updateState(@NotNull OpenOffer openOffer) { + if (openOffer.isDeactivated()) { + button.setText(Res.get("shared.activate")); + iconView.setId("image-alert-round"); + button.setGraphic(iconView); + } else { + button.setText(Res.get("shared.deactivate")); + iconView.setId("image-green_circle"); + button.setGraphic(iconView); + } + } + + @Override + public void updateItem(final OpenOfferListItem item, boolean empty) { + super.updateItem(item, empty); + + if (item != null && !empty) { + if (button == null) { + button = new AutoTooltipButton(); + button.setGraphic(iconView); + updateState(item.getOpenOffer()); + button.setMinWidth(70); + setGraphic(button); + } + button.setOnAction(event -> { + if (item.getOpenOffer().isDeactivated()) { + onActivateOpenOffer(item.getOpenOffer()); + } else { + onDeactivateOpenOffer(item.getOpenOffer()); + } + updateState(item.getOpenOffer()); + tableView.refresh(); + }); + } else { + setGraphic(null); + if (button != null) { + button.setOnAction(null); + button = null; + } + } + } + }; + } + }); + } + private void setRemoveColumnCellFactory() { removeItemColumn.setCellValueFactory((offerListItem) -> new ReadOnlyObjectWrapper<>(offerListItem.getValue())); removeItemColumn.setCellFactory( @@ -323,6 +420,7 @@ public class OpenOffersView extends ActivatableViewAndModel this.formatter = formatter; } - void onCancelOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { - dataModel.onCancelOpenOffer(openOffer, resultHandler, errorMessageHandler); + void onActivateOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + dataModel.onActivateOpenOffer(openOffer, resultHandler, errorMessageHandler); + } + + void onDeactivateOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + dataModel.onDeactivateOpenOffer(openOffer, resultHandler, errorMessageHandler); + } + + void onRemoveOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + dataModel.onRemoveOpenOffer(openOffer, resultHandler, errorMessageHandler); } public ObservableList getList() { @@ -99,6 +107,10 @@ class OpenOffersViewModel extends ActivatableWithDataModel return formatter.formatDateTime(item.getOffer().getDate()); } + boolean isDeactivated(OpenOfferListItem item) { + return item != null && item.getOpenOffer() != null && item.getOpenOffer().isDeactivated(); + } + boolean isBootstrapped() { return p2PService.isBootstrapped(); } diff --git a/gui/src/main/java/io/bisq/gui/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java b/gui/src/main/java/io/bisq/gui/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java index 233ffe7176..760ab13c99 100644 --- a/gui/src/main/java/io/bisq/gui/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java +++ b/gui/src/main/java/io/bisq/gui/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java @@ -157,6 +157,24 @@ public class BuyerStep2View extends TradeStepView { case PaymentMethod.OK_PAY_ID: gridRow = OKPayForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); break; + case PaymentMethod.UPHOLD_ID: + gridRow = UpholdForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); + break; + case PaymentMethod.CASH_APP_ID: + gridRow = CashAppForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); + break; + case PaymentMethod.MONEY_BEAM_ID: + gridRow = MoneyBeamForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); + break; + case PaymentMethod.VENMO_ID: + gridRow = VenmoForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); + break; + case PaymentMethod.POPMONEY_ID: + gridRow = PopmoneyForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); + break; + case PaymentMethod.REVOLUT_ID: + gridRow = RevolutForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); + break; case PaymentMethod.PERFECT_MONEY_ID: gridRow = PerfectMoneyForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); break; diff --git a/gui/src/main/java/io/bisq/gui/main/settings/preferences/PreferencesView.java b/gui/src/main/java/io/bisq/gui/main/settings/preferences/PreferencesView.java index f0101c4003..476e918d13 100644 --- a/gui/src/main/java/io/bisq/gui/main/settings/preferences/PreferencesView.java +++ b/gui/src/main/java/io/bisq/gui/main/settings/preferences/PreferencesView.java @@ -51,6 +51,7 @@ import javafx.scene.layout.GridPane; import javafx.util.Callback; import javafx.util.StringConverter; import org.apache.commons.lang3.StringUtils; +import org.bitcoinj.core.Coin; import javax.inject.Inject; import java.util.Arrays; @@ -217,15 +218,16 @@ public class PreferencesView extends ActivatableViewAndModel().warning(Res.get("setting.preferences.txFeeMin")).show(); + int withdrawalTxFeePerByte = Integer.parseInt(transactionFeeInputTextField.getText()); + final long minFeePerByte = BisqEnvironment.getBaseCurrencyNetwork().getDefaultMinFeePerByte(); + if (withdrawalTxFeePerByte < minFeePerByte) { + new Popup<>().warning(Res.get("setting.preferences.txFeeMin", minFeePerByte)).show(); transactionFeeInputTextField.setText(estimatedFee); - } else if (withdrawalTxFeeInBytes > 5000) { + } else if (withdrawalTxFeePerByte > 5000) { new Popup<>().warning(Res.get("setting.preferences.txFeeTooLarge")).show(); transactionFeeInputTextField.setText(estimatedFee); } else { - preferences.setWithdrawalTxFeeInBytes(withdrawalTxFeeInBytes); + preferences.setWithdrawalTxFeeInBytes(withdrawalTxFeePerByte); } } catch (NumberFormatException t) { log.error(t.toString()); @@ -249,10 +251,11 @@ public class PreferencesView extends ActivatableViewAndModel { try { double value = formatter.parsePercentStringToDouble(newValue); - if (value <= 0.3) { + final double maxDeviation = 0.5; + if (value <= maxDeviation) { preferences.setMaxPriceDistanceInPercent(value); } else { - new Popup<>().warning(Res.get("setting.preferences.deviationToLarge")).show(); + new Popup<>().warning(Res.get("setting.preferences.deviationToLarge", maxDeviation * 100)).show(); UserThread.runAfter(() -> deviationInputTextField.setText(formatter.formatPercentagePrice(preferences.getMaxPriceDistanceInPercent())), 100, TimeUnit.MILLISECONDS); } } catch (NumberFormatException t) { @@ -451,12 +454,6 @@ public class PreferencesView extends ActivatableViewAndModel baseCurrencyNetworks = Arrays.asList(BaseCurrencyNetwork.values()); - // We don't support DOGE anymore due lack of interest but leave it in the code in case it will get - // re-activated some day - baseCurrencyNetworks = baseCurrencyNetworks.stream() - .filter(e -> !e.isDoge()) - .collect(Collectors.toList()); - // show ony mainnet in production version if (!DevEnv.DEV_MODE) baseCurrencyNetworks = baseCurrencyNetworks.stream() @@ -475,7 +472,7 @@ public class PreferencesView extends ActivatableViewAndModel getPaymentAccountsComboBoxStringConverter() { + return new StringConverter() { + @Override + public String toString(PaymentAccount paymentAccount) { + if (paymentAccount.hasMultipleCurrencies()) { + return paymentAccount.getAccountName() + " (" + Res.get(paymentAccount.getPaymentMethod().getId()) + ")"; + } else { + TradeCurrency singleTradeCurrency = paymentAccount.getSingleTradeCurrency(); + String prefix = singleTradeCurrency != null ? singleTradeCurrency.getCode() + ", " : ""; + return paymentAccount.getAccountName() + " (" + prefix + + Res.get(paymentAccount.getPaymentMethod().getId()) + ")"; + } + } + + @Override + public PaymentAccount fromString(String s) { + return null; + } + }; + } } diff --git a/gui/src/main/java/io/bisq/gui/util/validation/AltCoinAddressValidator.java b/gui/src/main/java/io/bisq/gui/util/validation/AltCoinAddressValidator.java index 32c7c4076b..d8c14580d6 100644 --- a/gui/src/main/java/io/bisq/gui/util/validation/AltCoinAddressValidator.java +++ b/gui/src/main/java/io/bisq/gui/util/validation/AltCoinAddressValidator.java @@ -75,9 +75,6 @@ public final class AltCoinAddressValidator extends InputValidator { case LTC_MAINNET: case LTC_TESTNET: case LTC_REGTEST: - case DOGE_MAINNET: - case DOGE_TESTNET: - case DOGE_REGTEST: case DASH_MAINNET: case DASH_TESTNET: case DASH_REGTEST: @@ -118,9 +115,6 @@ public final class AltCoinAddressValidator extends InputValidator { case BTC_MAINNET: case BTC_TESTNET: case BTC_REGTEST: - case DOGE_MAINNET: - case DOGE_TESTNET: - case DOGE_REGTEST: case DASH_MAINNET: case DASH_TESTNET: case DASH_REGTEST: @@ -140,26 +134,7 @@ public final class AltCoinAddressValidator extends InputValidator { } case "DOGE": try { - switch (BisqEnvironment.getBaseCurrencyNetwork()) { - case BTC_MAINNET: - case BTC_TESTNET: - case BTC_REGTEST: - case LTC_MAINNET: - case LTC_TESTNET: - case LTC_REGTEST: - case DASH_MAINNET: - case DASH_TESTNET: - case DASH_REGTEST: - case DOGE_MAINNET: - Address.fromBase58(DogecoinMainNetParams.get(), input); - break; - case DOGE_TESTNET: - Address.fromBase58(DogecoinTestNet3Params.get(), input); - break; - case DOGE_REGTEST: - Address.fromBase58(DogecoinRegTestParams.get(), input); - break; - } + Address.fromBase58(DogecoinMainNetParams.get(), input); return new ValidationResult(true); } catch (AddressFormatException e) { return new ValidationResult(false, getErrorMessage(e)); @@ -173,9 +148,6 @@ public final class AltCoinAddressValidator extends InputValidator { case LTC_MAINNET: case LTC_TESTNET: case LTC_REGTEST: - case DOGE_MAINNET: - case DOGE_TESTNET: - case DOGE_REGTEST: case DASH_MAINNET: Address.fromBase58(DashMainNetParams.get(), input); break; @@ -458,6 +430,40 @@ public final class AltCoinAddressValidator extends InputValidator { } catch (AddressFormatException e) { return new ValidationResult(false, getErrorMessage(e)); } + case "CDT": + if (input.startsWith("D")) + return new ValidationResult(true); + else + return new ValidationResult(false); + case "DGM": + if (input.matches("^[D-E][a-zA-Z0-9]{33}$")) + return new ValidationResult(true); + else + return regexTestFailed; + case "SCS": + try { + Address.fromBase58(SpeedCashParams.get(), input); + return new ValidationResult(true); + } catch (AddressFormatException e) { + return new ValidationResult(false, getErrorMessage(e)); + } + case "SOS": + if (!input.matches("^(0x)?[0-9a-fA-F]{40}$")) + return regexTestFailed; + else + return new ValidationResult(true); + case "ACH": + try { + Address.fromBase58(ACHParams.get(), input); + return new ValidationResult(true); + } catch (AddressFormatException e) { + return new ValidationResult(false, getErrorMessage(e)); + } + case "VDN": + if (!input.matches("^[D][0-9a-zA-Z]{33}$")) + return regexTestFailed; + else + return new ValidationResult(true); // Add new coins at the end... default: diff --git a/gui/src/main/java/io/bisq/gui/util/validation/CashAppValidator.java b/gui/src/main/java/io/bisq/gui/util/validation/CashAppValidator.java new file mode 100644 index 0000000000..283d03e980 --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/util/validation/CashAppValidator.java @@ -0,0 +1,28 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.util.validation; + + +public final class CashAppValidator extends InputValidator { + + @Override + public ValidationResult validate(String input) { + // TODO + return super.validate(input); + } +} diff --git a/gui/src/main/java/io/bisq/gui/util/validation/MoneyBeamValidator.java b/gui/src/main/java/io/bisq/gui/util/validation/MoneyBeamValidator.java new file mode 100644 index 0000000000..785e04b783 --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/util/validation/MoneyBeamValidator.java @@ -0,0 +1,28 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.util.validation; + + +public final class MoneyBeamValidator extends InputValidator { + + @Override + public ValidationResult validate(String input) { + // TODO + return super.validate(input); + } +} diff --git a/gui/src/main/java/io/bisq/gui/util/validation/PopmoneyValidator.java b/gui/src/main/java/io/bisq/gui/util/validation/PopmoneyValidator.java new file mode 100644 index 0000000000..1a70dc7bd2 --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/util/validation/PopmoneyValidator.java @@ -0,0 +1,28 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.util.validation; + + +public final class PopmoneyValidator extends InputValidator { + + @Override + public ValidationResult validate(String input) { + // TODO + return super.validate(input); + } +} diff --git a/gui/src/main/java/io/bisq/gui/util/validation/RevolutValidator.java b/gui/src/main/java/io/bisq/gui/util/validation/RevolutValidator.java new file mode 100644 index 0000000000..3068ecc8f3 --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/util/validation/RevolutValidator.java @@ -0,0 +1,28 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.util.validation; + + +public final class RevolutValidator extends InputValidator { + + @Override + public ValidationResult validate(String input) { + // TODO + return super.validate(input); + } +} diff --git a/gui/src/main/java/io/bisq/gui/util/validation/UpholdValidator.java b/gui/src/main/java/io/bisq/gui/util/validation/UpholdValidator.java new file mode 100644 index 0000000000..bee83be9ea --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/util/validation/UpholdValidator.java @@ -0,0 +1,28 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.util.validation; + + +public final class UpholdValidator extends InputValidator { + + @Override + public ValidationResult validate(String input) { + // TODO + return super.validate(input); + } +} diff --git a/gui/src/main/java/io/bisq/gui/util/validation/VenmoValidator.java b/gui/src/main/java/io/bisq/gui/util/validation/VenmoValidator.java new file mode 100644 index 0000000000..9945e234ad --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/util/validation/VenmoValidator.java @@ -0,0 +1,28 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.util.validation; + + +public final class VenmoValidator extends InputValidator { + + @Override + public ValidationResult validate(String input) { + // TODO + return super.validate(input); + } +} diff --git a/gui/src/main/java/io/bisq/gui/util/validation/params/ACHParams.java b/gui/src/main/java/io/bisq/gui/util/validation/params/ACHParams.java new file mode 100644 index 0000000000..e757ec9b73 --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/util/validation/params/ACHParams.java @@ -0,0 +1,58 @@ +/* + * Copyright 2013 Google Inc. + * Copyright 2015 Andreas Schildbach + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.bisq.gui.util.validation.params; + +import org.bitcoinj.core.Utils; +import org.bitcoinj.params.AbstractBitcoinNetParams; + +public class ACHParams extends AbstractBitcoinNetParams { + + public ACHParams() { + super(); + interval = INTERVAL; + targetTimespan = TARGET_TIMESPAN; + maxTarget = Utils.decodeCompactBits(0x1d00ffffL); + dumpedPrivateKeyHeader = 128; + + // Address format is different to BTC, rest is the same + addressHeader = 23; //BTG 38; + p2shHeader = 34; //BTG 23; + + acceptableAddressCodes = new int[]{addressHeader, p2shHeader}; + port = 7337; //BTC and BTG 8333 + packetMagic = 0x1461de3cL; //BTG 0xe1476d44L, BTC 0xf9beb4d9L; + bip32HeaderPub = 0x02651F71; //BTG and BTC 0x0488B21E; //The 4 byte header that serializes in base58 to "xpub". + bip32HeaderPriv = 0x02355E56; //BTG and BTC 0x0488ADE4; //The 4 byte header that serializes in base58 to "xprv" + + id = ID_MAINNET; + } + + private static ACHParams instance; + + public static synchronized ACHParams get() { + if (instance == null) { + instance = new ACHParams(); + } + return instance; + } + + @Override + public String getPaymentProtocolId() { + return PAYMENT_PROTOCOL_ID_MAINNET; + } +} diff --git a/gui/src/main/java/io/bisq/gui/util/validation/params/SpeedCashParams.java b/gui/src/main/java/io/bisq/gui/util/validation/params/SpeedCashParams.java new file mode 100644 index 0000000000..202865ed4e --- /dev/null +++ b/gui/src/main/java/io/bisq/gui/util/validation/params/SpeedCashParams.java @@ -0,0 +1,88 @@ +/* + * This file is part of Bisq. + * + * Bisq 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. + * + * Bisq 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 Bisq. If not, see . + */ + +package io.bisq.gui.util.validation.params; + +import org.bitcoinj.core.*; +import org.bitcoinj.store.BlockStore; +import org.bitcoinj.store.BlockStoreException; +import org.bitcoinj.utils.MonetaryFormat; + +public class SpeedCashParams extends NetworkParameters { + + private static SpeedCashParams instance; + + public static synchronized SpeedCashParams get() { + if (instance == null) { + instance = new SpeedCashParams(); + } + return instance; + } + + // We only use the properties needed for address validation + public SpeedCashParams() { + super(); + addressHeader = 63; + p2shHeader = 85; + acceptableAddressCodes = new int[]{addressHeader, p2shHeader}; + } + + // default dummy implementations, not used... + @Override + public String getPaymentProtocolId() { + return PAYMENT_PROTOCOL_ID_MAINNET; + } + + @Override + public void checkDifficultyTransitions(StoredBlock storedPrev, Block next, BlockStore blockStore) throws VerificationException, BlockStoreException { + } + + @Override + public Coin getMaxMoney() { + return null; + } + + @Override + public Coin getMinNonDustOutput() { + return null; + } + + @Override + public MonetaryFormat getMonetaryFormat() { + return null; + } + + @Override + public String getUriScheme() { + return null; + } + + @Override + public boolean hasMaxMoney() { + return false; + } + + @Override + public BitcoinSerializer getSerializer(boolean parseRetain) { + return null; + } + + @Override + public int getProtocolVersionNum(ProtocolVersion version) { + return 0; + } +} diff --git a/gui/src/main/resources/keys/29CDFD3B.asc b/gui/src/main/resources/keys/29CDFD3B.asc new file mode 100644 index 0000000000..18f37a913f --- /dev/null +++ b/gui/src/main/resources/keys/29CDFD3B.asc @@ -0,0 +1,51 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=9LRS +-----END PGP PUBLIC KEY BLOCK----- diff --git a/gui/src/test/java/io/bisq/gui/util/validation/AltCoinAddressValidatorTest.java b/gui/src/test/java/io/bisq/gui/util/validation/AltCoinAddressValidatorTest.java index 35c5bff1cf..425b3e1a26 100644 --- a/gui/src/test/java/io/bisq/gui/util/validation/AltCoinAddressValidatorTest.java +++ b/gui/src/test/java/io/bisq/gui/util/validation/AltCoinAddressValidatorTest.java @@ -643,4 +643,99 @@ public class AltCoinAddressValidatorTest { assertFalse(validator.validate("SSnwqFBiyqK1n4BV7kPX86iesev2NobhEo").isValid); assertFalse(validator.validate("").isValid); } + + @Test + public void testCDT() { + AltCoinAddressValidator validator = new AltCoinAddressValidator(); + validator.setCurrencyCode("CDT"); + + assertTrue(validator.validate("DM7BjopQ3bGYxSPZ4yhfttxqnDrEkyc3sw").isValid); + assertTrue(validator.validate("DB4CaJ81SiT3VtpGC8K1RMirPJZjsmKiZd").isValid); + assertTrue(validator.validate("DE7uB1mws1RwYNDPpfEnQ7a4i9tdqqV1Lf").isValid); + assertTrue(validator.validate("DJ8FnzVCa8AXEBt5aqPcJubKRzanQKvxkY").isValid); + assertTrue(validator.validate("D5QmzfBjwrUyAKtvectJL7kBawfWtwdJqz").isValid); + assertTrue(validator.validate("DDRJemKbVtTVV8r2jSG9wevv3JeUj2edAr").isValid); + + assertFalse(validator.validate("17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhemqq").isValid); + assertFalse(validator.validate("0x2a65Aca4D5fC5B5C859090a6c34d1641353982266").isValid); + assertFalse(validator.validate("SSnwqFBiyqK1n4BV7kPX86iesev2NobhEo").isValid); + assertFalse(validator.validate("").isValid); + } + + @Test + public void testDGM() { + AltCoinAddressValidator validator = new AltCoinAddressValidator(); + validator.setCurrencyCode("DGM"); + + assertTrue(validator.validate("DvaAgcLKrno2AC7kYhHVDCrkhx2xHFpXUf").isValid); + assertTrue(validator.validate("E9p49poRmnuLdnu55bzKe7t48xtYv2bRES").isValid); + + assertFalse(validator.validate("0xmnuL9poRmnuLd55bzKe7t48xtYv2bRES").isValid); + assertFalse(validator.validate("DvaAgcLKrno2AC7kYhHVDC").isValid); + assertFalse(validator.validate("19p49poRmnuLdnu55bzKe7t48xtYv2bRES").isValid); + assertFalse(validator.validate("").isValid); + } + + @Test + public void testSCS() { + AltCoinAddressValidator validator = new AltCoinAddressValidator(); + validator.setCurrencyCode("SCS"); + + assertTrue(validator.validate("SNrVzPaFVCQGH4Rdch2EuhoyeWMfgWqk1J").isValid); + assertTrue(validator.validate("SXPvGe87gdCFQH8zPU3JdKNGwAa4c6979r").isValid); + assertTrue(validator.validate("STGvWjZdkwDeNoYa73cqMrAFFYm5xtJndc").isValid); + assertTrue(validator.validate("SVPZMBgDxBVDRisdDZGD1XQwyAz8RBbo3J").isValid); + + assertFalse(validator.validate("SVPZMBgDxBVDRisdDZGD1XQwyAz8RBbo3R").isValid); + assertFalse(validator.validate("mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn").isValid); + assertFalse(validator.validate("XLfvvLuwjUrz2kf5gghEmUPFE3vFvwfEiL").isValid); + assertFalse(validator.validate("").isValid); + } + + @Test + public void testSOS() { + AltCoinAddressValidator validator = new AltCoinAddressValidator(); + validator.setCurrencyCode("SOS"); + + assertTrue(validator.validate("0x2a65Aca4D5fC5B5C859090a6c34d164135398226").isValid); + assertTrue(validator.validate("2a65Aca4D5fC5B5C859090a6c34d164135398226").isValid); + + assertFalse(validator.validate("0x2a65Aca4D5fC5B5C859090a6c34d1641353982266").isValid); + assertFalse(validator.validate("0x2a65Aca4D5fC5B5C859090a6c34d16413539822g").isValid); + assertFalse(validator.validate("2a65Aca4D5fC5B5C859090a6c34d16413539822g").isValid); + assertFalse(validator.validate("").isValid); + } + + @Test + public void testACH() { + AltCoinAddressValidator validator = new AltCoinAddressValidator(); + validator.setCurrencyCode("ACH"); + + assertTrue(validator.validate("AciV7ZyJDpCg7kGGmbo97VjgjpVZkXRTMD").isValid); + assertTrue(validator.validate("ARhW8anWaZtExdK2cQkBwsvsQZ9TkC9bwH").isValid); + assertTrue(validator.validate("AcxpGTWX4zFiD8p8hfYw99RXV7MY2y8hs9").isValid); + + assertFalse(validator.validate("GWaSW6PHfQKBv8EXV3xiqGG2zxKZh4XYNu").isValid); + assertFalse(validator.validate("AcxpGTWX4zFiD8p8hfY099RXV7MY2y8hs9").isValid); + assertFalse(validator.validate("17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem").isValid); + assertFalse(validator.validate("").isValid); + } + + @Test + public void testVDN() { + AltCoinAddressValidator validator = new AltCoinAddressValidator(); + validator.setCurrencyCode("VDN"); + + assertTrue(validator.validate("DG1KpSsSXd3uitgwHaA1i6T1Bj1hWEwAxB").isValid); + assertTrue(validator.validate("DPEfTj1C9tTKEqkLPUwtUtCZHd7ViedBmZ").isValid); + assertTrue(validator.validate("DLzjxv6Rk9hMYEFHBLqvyT8pkfS43u9Md5").isValid); + assertTrue(validator.validate("DHexLqYt4ooDDnpmfEMSa1oJBbaZBxURZH").isValid); + assertTrue(validator.validate("DHPybrRc2iqeE4aU8mmXKf8v38JTDyH2V9").isValid); + + assertFalse(validator.validate("17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhemqq").isValid); + assertFalse(validator.validate("3CDJNfdWX8m2NwuGUV3nhXHXEeLygMXoAj").isValid); + assertFalse(validator.validate("DG1KpSsSXd3uitgwHaA1i6T1BjSHORTER").isValid); + assertFalse(validator.validate("DG1KpSsSXd3uitgwHaA1i6T1Bj1hWLONGER").isValid); + assertFalse(validator.validate("HG1KpSsSXd3uitgwHaA1i6T1Bj1hWEwAxB").isValid); + } } diff --git a/monitor/pom.xml b/monitor/pom.xml index 5738c6a275..ac68de577f 100644 --- a/monitor/pom.xml +++ b/monitor/pom.xml @@ -22,7 +22,7 @@ parent io.bisq - 0.6.5 + 0.6.6 4.0.0 diff --git a/network/pom.xml b/network/pom.xml index bbba81741c..e4076b8308 100644 --- a/network/pom.xml +++ b/network/pom.xml @@ -5,7 +5,7 @@ parent io.bisq - 0.6.5 + 0.6.6 4.0.0 diff --git a/network/src/main/resources/PersistableNetworkPayloadMap_BTC_MAINNET b/network/src/main/resources/PersistableNetworkPayloadMap_BTC_MAINNET index b6cde27594fded464ba5723d9584dc44f3b5f030..eefeb93c6c8f2f08ccf2ab66924263eb9f49f819 100644 GIT binary patch delta 238033 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 delta 114464 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 diff --git a/package/linux/32bitBuild.sh b/package/linux/32bitBuild.sh index c353fc9387..59851f5cd6 100644 --- a/package/linux/32bitBuild.sh +++ b/package/linux/32bitBuild.sh @@ -6,7 +6,7 @@ mkdir -p gui/deploy set -e # Edit version -version=0.6.5 +version=0.6.6 dir="/media/sf_vm_shared_ubuntu14_32bit" diff --git a/package/linux/64bitBuild.sh b/package/linux/64bitBuild.sh index 6d7b5bf7c2..d450b75510 100644 --- a/package/linux/64bitBuild.sh +++ b/package/linux/64bitBuild.sh @@ -6,7 +6,7 @@ mkdir -p gui/deploy set -e # Edit version -version=0.6.5 +version=0.6.6 dir="/media/sf_vm_shared_ubuntu" diff --git a/package/linux/Dockerfile b/package/linux/Dockerfile index 1acad84e2b..2a6dffc171 100644 --- a/package/linux/Dockerfile +++ b/package/linux/Dockerfile @@ -8,7 +8,7 @@ # pull base image FROM openjdk:8-jdk -ENV version 0.6.5 +ENV version 0.6.6 RUN apt-get update && apt-get install -y --no-install-recommends openjfx && rm -rf /var/lib/apt/lists/* && apt-get install -y vim fakeroot diff --git a/package/osx/create_app.sh b/package/osx/create_app.sh index 9303bb8952..5192c240f9 100755 --- a/package/osx/create_app.sh +++ b/package/osx/create_app.sh @@ -5,7 +5,7 @@ mkdir -p gui/deploy set -e -version="0.6.5" +version="0.6.6" mvn clean package verify -DskipTests -Dmaven.javadoc.skip=true diff --git a/package/osx/finalize.sh b/package/osx/finalize.sh index f8417bb08c..5e6e4fbf38 100644 --- a/package/osx/finalize.sh +++ b/package/osx/finalize.sh @@ -1,6 +1,6 @@ #!/bin/bash -version="0.6.5" +version="0.6.6" target_dir="/Users/dev/Documents/__bisq/_releases/$version" src_dir="/Users/dev/idea/exchange" @@ -16,6 +16,8 @@ mkdir -p $target_dir cp "$target_dir/../F379A1C6.asc" "$target_dir/" # sig key cbeams cp "$target_dir/../5BC5ED73.asc" "$target_dir/" +# sig key Christoph Atteneder +cp "$target_dir/../29CDFD3B.asc" "$target_dir/" # signing key cp "$target_dir/../signingkey.asc" "$target_dir/" diff --git a/package/windows/32bitBuild.bat b/package/windows/32bitBuild.bat index 6c08f4932d..5c1d165c3b 100644 --- a/package/windows/32bitBuild.bat +++ b/package/windows/32bitBuild.bat @@ -5,7 +5,7 @@ :: 32 bit build :: Needs Inno Setup 5 or later (http://www.jrsoftware.org/isdl.php) -SET version=0.6.5 +SET version=0.6.6 :: Private setup SET outdir=\\VBOXSVR\vm_shared_windows_32bit diff --git a/package/windows/64bitBuild.bat b/package/windows/64bitBuild.bat index 94e6e6e935..50cbe54e2a 100644 --- a/package/windows/64bitBuild.bat +++ b/package/windows/64bitBuild.bat @@ -5,7 +5,7 @@ :: 64 bit build :: Needs Inno Setup 5 or later (http://www.jrsoftware.org/isdl.php) -SET version=0.6.5 +SET version=0.6.6 :: Private setup SET outdir=\\VBOXSVR\vm_shared_windows diff --git a/package/windows/Bisq.iss b/package/windows/Bisq.iss index 6d565dc94a..d0055b4986 100755 --- a/package/windows/Bisq.iss +++ b/package/windows/Bisq.iss @@ -3,7 +3,7 @@ [Setup] AppId={{bisq}} AppName=Bisq -AppVersion=0.6.5 +AppVersion=0.6.6 AppVerName=Bisq AppPublisher=Bisq AppComments=Bisq diff --git a/pom.xml b/pom.xml index 018e160a78..f5f8b1fa35 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.bisq parent pom - 0.6.5 + 0.6.6 Bisq - The decentralized exchange network https://bisq.io diff --git a/seednode/pom.xml b/seednode/pom.xml index ccf0f035a0..a00fca7a08 100644 --- a/seednode/pom.xml +++ b/seednode/pom.xml @@ -22,7 +22,7 @@ parent io.bisq - 0.6.5 + 0.6.6 4.0.0 diff --git a/statistics/pom.xml b/statistics/pom.xml index 908332990c..827e513290 100644 --- a/statistics/pom.xml +++ b/statistics/pom.xml @@ -22,7 +22,7 @@ parent io.bisq - 0.6.5 + 0.6.6 4.0.0