diff --git a/apitest/scripts/trade-simulation-utils.sh b/apitest/scripts/trade-simulation-utils.sh index c43beaf2ec8..6b146222619 100755 --- a/apitest/scripts/trade-simulation-utils.sh +++ b/apitest/scripts/trade-simulation-utils.sh @@ -458,7 +458,7 @@ delayconfirmpaymentreceived() { } # This is a large function that should be broken up if it ever makes sense to not treat a trade -# execution simulation as an atomic operation. But we are not testing api methods here, just +# execution simulation as an bsq swap operation. But we are not testing api methods here, just # demonstrating how to use them to get through the trade protocol. It should work for any trade # between Bob & Alice, as long as Alice is maker, Bob is taker, and the offer to be taken is the # first displayed in Bob's getoffers command output. diff --git a/apitest/src/test/java/bisq/apitest/ApiTestCase.java b/apitest/src/test/java/bisq/apitest/ApiTestCase.java index fb4938d4790..315561cbb6f 100644 --- a/apitest/src/test/java/bisq/apitest/ApiTestCase.java +++ b/apitest/src/test/java/bisq/apitest/ApiTestCase.java @@ -17,6 +17,8 @@ package bisq.apitest; +import java.time.Duration; + import java.io.IOException; import java.util.concurrent.ExecutionException; @@ -32,9 +34,9 @@ import static bisq.apitest.config.BisqAppConfig.alicedaemon; import static bisq.apitest.config.BisqAppConfig.arbdaemon; import static bisq.apitest.config.BisqAppConfig.bobdaemon; +import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly; import static java.net.InetAddress.getLoopbackAddress; import static java.util.Arrays.stream; -import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -131,11 +133,7 @@ protected static void genBtcBlocksThenWait(int numBlocks, long wait) { } protected static void sleep(long ms) { - try { - MILLISECONDS.sleep(ms); - } catch (InterruptedException ignored) { - // empty - } + sleepUninterruptibly(Duration.ofMillis(ms)); } protected final String testName(TestInfo testInfo) { diff --git a/apitest/src/test/java/bisq/apitest/method/offer/CancelOfferTest.java b/apitest/src/test/java/bisq/apitest/method/offer/CancelOfferTest.java index 8db313583cd..d0ec6d86f1b 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/CancelOfferTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/CancelOfferTest.java @@ -35,7 +35,7 @@ import static bisq.apitest.config.ApiTestConfig.BSQ; import static bisq.core.btc.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent; import static org.junit.jupiter.api.Assertions.assertEquals; -import static protobuf.OfferPayload.Direction.BUY; +import static protobuf.OfferDirection.BUY; @Disabled @Slf4j diff --git a/apitest/src/test/java/bisq/apitest/method/offer/CreateBSQOffersTest.java b/apitest/src/test/java/bisq/apitest/method/offer/CreateBSQOffersTest.java index 652d7f50dcf..b76a8b7aedc 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/CreateBSQOffersTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/CreateBSQOffersTest.java @@ -40,8 +40,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import static protobuf.OfferPayload.Direction.BUY; -import static protobuf.OfferPayload.Direction.SELL; +import static protobuf.OfferDirection.BUY; +import static protobuf.OfferDirection.SELL; @Disabled @Slf4j diff --git a/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingFixedPriceTest.java b/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingFixedPriceTest.java index 715e05a92e7..096c457e77d 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingFixedPriceTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingFixedPriceTest.java @@ -36,8 +36,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import static protobuf.OfferPayload.Direction.BUY; -import static protobuf.OfferPayload.Direction.SELL; +import static protobuf.OfferDirection.BUY; +import static protobuf.OfferDirection.SELL; @Disabled @Slf4j diff --git a/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java b/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java index 391bb4c5a37..efa983caba0 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/CreateOfferUsingMarketPriceMarginTest.java @@ -52,8 +52,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import static protobuf.OfferPayload.Direction.BUY; -import static protobuf.OfferPayload.Direction.SELL; +import static protobuf.OfferDirection.BUY; +import static protobuf.OfferDirection.SELL; @SuppressWarnings("ConstantConditions") @Disabled diff --git a/apitest/src/test/java/bisq/apitest/method/offer/EditOfferTest.java b/apitest/src/test/java/bisq/apitest/method/offer/EditOfferTest.java index a947044d07c..018b7277e3c 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/EditOfferTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/EditOfferTest.java @@ -47,8 +47,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static protobuf.OfferPayload.Direction.BUY; -import static protobuf.OfferPayload.Direction.SELL; +import static protobuf.OfferDirection.BUY; +import static protobuf.OfferDirection.SELL; @SuppressWarnings("ALL") @Disabled diff --git a/apitest/src/test/java/bisq/apitest/method/offer/ValidateCreateOfferTest.java b/apitest/src/test/java/bisq/apitest/method/offer/ValidateCreateOfferTest.java index 33626ee6c3c..cc8a02f33d9 100644 --- a/apitest/src/test/java/bisq/apitest/method/offer/ValidateCreateOfferTest.java +++ b/apitest/src/test/java/bisq/apitest/method/offer/ValidateCreateOfferTest.java @@ -35,7 +35,7 @@ import static java.lang.String.format; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static protobuf.OfferPayload.Direction.BUY; +import static protobuf.OfferDirection.BUY; @Disabled @Slf4j diff --git a/apitest/src/test/java/bisq/apitest/method/trade/ExpectedProtocolStatus.java b/apitest/src/test/java/bisq/apitest/method/trade/ExpectedProtocolStatus.java index 63655585947..f054349ff9b 100644 --- a/apitest/src/test/java/bisq/apitest/method/trade/ExpectedProtocolStatus.java +++ b/apitest/src/test/java/bisq/apitest/method/trade/ExpectedProtocolStatus.java @@ -1,6 +1,6 @@ package bisq.apitest.method.trade; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; /** * A test fixture encapsulating expected trade protocol status. diff --git a/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBSQOfferTest.java b/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBSQOfferTest.java index fc365931d5f..9acdb4b32ad 100644 --- a/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBSQOfferTest.java +++ b/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBSQOfferTest.java @@ -37,13 +37,13 @@ import static bisq.cli.TableFormat.formatBalancesTbls; import static bisq.cli.TableFormat.formatOfferTable; import static bisq.core.btc.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent; -import static bisq.core.trade.Trade.Phase.DEPOSIT_CONFIRMED; -import static bisq.core.trade.Trade.Phase.FIAT_SENT; -import static bisq.core.trade.Trade.Phase.PAYOUT_PUBLISHED; -import static bisq.core.trade.Trade.State.BUYER_RECEIVED_PAYOUT_TX_PUBLISHED_MSG; -import static bisq.core.trade.Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN; -import static bisq.core.trade.Trade.State.SELLER_RECEIVED_FIAT_PAYMENT_INITIATED_MSG; -import static bisq.core.trade.Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.DEPOSIT_CONFIRMED; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.FIAT_SENT; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.PAYOUT_PUBLISHED; +import static bisq.core.trade.model.bisq_v1.Trade.State.BUYER_RECEIVED_PAYOUT_TX_PUBLISHED_MSG; +import static bisq.core.trade.model.bisq_v1.Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN; +import static bisq.core.trade.model.bisq_v1.Trade.State.SELLER_RECEIVED_FIAT_PAYMENT_INITIATED_MSG; +import static bisq.core.trade.model.bisq_v1.Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG; import static java.lang.String.format; import static java.util.Collections.singletonList; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -51,7 +51,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.fail; import static protobuf.Offer.State.OFFER_FEE_PAID; -import static protobuf.OfferPayload.Direction.SELL; +import static protobuf.OfferDirection.SELL; diff --git a/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferTest.java b/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferTest.java index 8f03520b525..7a7f0dd9c8e 100644 --- a/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferTest.java +++ b/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferTest.java @@ -37,17 +37,17 @@ import static bisq.apitest.config.ApiTestConfig.BSQ; import static bisq.cli.TableFormat.formatBalancesTbls; import static bisq.core.btc.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent; -import static bisq.core.trade.Trade.Phase.DEPOSIT_CONFIRMED; -import static bisq.core.trade.Trade.Phase.FIAT_SENT; -import static bisq.core.trade.Trade.Phase.PAYOUT_PUBLISHED; -import static bisq.core.trade.Trade.State.*; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.DEPOSIT_CONFIRMED; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.FIAT_SENT; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.PAYOUT_PUBLISHED; +import static bisq.core.trade.model.bisq_v1.Trade.State.*; import static java.lang.String.format; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.fail; import static protobuf.Offer.State.OFFER_FEE_PAID; -import static protobuf.OfferPayload.Direction.BUY; +import static protobuf.OfferDirection.BUY; import static protobuf.OpenOffer.State.AVAILABLE; @Disabled diff --git a/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java b/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java index 1035875010e..a625d86fae4 100644 --- a/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java +++ b/apitest/src/test/java/bisq/apitest/method/trade/TakeBuyBTCOfferWithNationalBankAcctTest.java @@ -55,14 +55,14 @@ import static bisq.apitest.config.ApiTestConfig.BSQ; import static bisq.cli.TableFormat.formatBalancesTbls; import static bisq.core.btc.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent; -import static bisq.core.trade.Trade.Phase.DEPOSIT_CONFIRMED; -import static bisq.core.trade.Trade.Phase.FIAT_SENT; -import static bisq.core.trade.Trade.Phase.PAYOUT_PUBLISHED; -import static bisq.core.trade.Trade.State.*; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.DEPOSIT_CONFIRMED; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.FIAT_SENT; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.PAYOUT_PUBLISHED; +import static bisq.core.trade.model.bisq_v1.Trade.State.*; import static java.lang.String.format; import static org.junit.jupiter.api.Assertions.*; import static protobuf.Offer.State.OFFER_FEE_PAID; -import static protobuf.OfferPayload.Direction.BUY; +import static protobuf.OfferDirection.BUY; import static protobuf.OpenOffer.State.AVAILABLE; /** diff --git a/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBSQOfferTest.java b/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBSQOfferTest.java index 786601e6fa1..d33e0e360e7 100644 --- a/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBSQOfferTest.java +++ b/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBSQOfferTest.java @@ -38,21 +38,21 @@ import static bisq.cli.TableFormat.formatBalancesTbls; import static bisq.cli.TableFormat.formatOfferTable; import static bisq.core.btc.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent; -import static bisq.core.trade.Trade.Phase.DEPOSIT_CONFIRMED; -import static bisq.core.trade.Trade.Phase.FIAT_SENT; -import static bisq.core.trade.Trade.Phase.PAYOUT_PUBLISHED; -import static bisq.core.trade.Trade.Phase.WITHDRAWN; -import static bisq.core.trade.Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN; -import static bisq.core.trade.Trade.State.SELLER_RECEIVED_FIAT_PAYMENT_INITIATED_MSG; -import static bisq.core.trade.Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG; -import static bisq.core.trade.Trade.State.WITHDRAW_COMPLETED; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.DEPOSIT_CONFIRMED; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.FIAT_SENT; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.PAYOUT_PUBLISHED; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.WITHDRAWN; +import static bisq.core.trade.model.bisq_v1.Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN; +import static bisq.core.trade.model.bisq_v1.Trade.State.SELLER_RECEIVED_FIAT_PAYMENT_INITIATED_MSG; +import static bisq.core.trade.model.bisq_v1.Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG; +import static bisq.core.trade.model.bisq_v1.Trade.State.WITHDRAW_COMPLETED; import static java.lang.String.format; import static java.util.Collections.singletonList; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; -import static protobuf.OfferPayload.Direction.BUY; +import static protobuf.OfferDirection.BUY; diff --git a/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBTCOfferTest.java b/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBTCOfferTest.java index c4abd90934b..078d2998599 100644 --- a/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBTCOfferTest.java +++ b/apitest/src/test/java/bisq/apitest/method/trade/TakeSellBTCOfferTest.java @@ -37,18 +37,18 @@ import static bisq.apitest.config.ApiTestConfig.BTC; import static bisq.cli.TableFormat.formatBalancesTbls; import static bisq.core.btc.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent; -import static bisq.core.trade.Trade.Phase.DEPOSIT_CONFIRMED; -import static bisq.core.trade.Trade.Phase.FIAT_SENT; -import static bisq.core.trade.Trade.Phase.PAYOUT_PUBLISHED; -import static bisq.core.trade.Trade.Phase.WITHDRAWN; -import static bisq.core.trade.Trade.State.*; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.DEPOSIT_CONFIRMED; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.FIAT_SENT; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.PAYOUT_PUBLISHED; +import static bisq.core.trade.model.bisq_v1.Trade.Phase.WITHDRAWN; +import static bisq.core.trade.model.bisq_v1.Trade.State.*; import static java.lang.String.format; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import static protobuf.Offer.State.OFFER_FEE_PAID; -import static protobuf.OfferPayload.Direction.SELL; +import static protobuf.OfferDirection.SELL; import static protobuf.OpenOffer.State.AVAILABLE; @Disabled diff --git a/apitest/src/test/java/bisq/apitest/method/wallet/BsqWalletTest.java b/apitest/src/test/java/bisq/apitest/method/wallet/BsqWalletTest.java index e978624c2f0..f96d422f6a5 100644 --- a/apitest/src/test/java/bisq/apitest/method/wallet/BsqWalletTest.java +++ b/apitest/src/test/java/bisq/apitest/method/wallet/BsqWalletTest.java @@ -124,7 +124,7 @@ public void testBalancesAfterSendingBsqAndGeneratingBtcBlock(final TestInfo test genBtcBlocksThenWait(1, 4000); BsqBalanceInfo alicesBsqBalances = aliceClient.getBalances().getBsq(); - BsqBalanceInfo bobsBsqBalances = waitForBsqNewAvailableConfirmedBalance(bobClient, 150000000); + BsqBalanceInfo bobsBsqBalances = waitForBsqNewAvailableBalance(bobClient, 150000000); log.debug("See Available Confirmed BSQ Balances..."); printBobAndAliceBsqBalances(testInfo, @@ -166,8 +166,8 @@ private BsqBalanceInfo waitForNonZeroBsqUnverifiedBalance(GrpcClient grpcClient) return bsqBalance; } - private BsqBalanceInfo waitForBsqNewAvailableConfirmedBalance(GrpcClient grpcClient, - long staleBalance) { + private BsqBalanceInfo waitForBsqNewAvailableBalance(GrpcClient grpcClient, + long staleBalance) { BsqBalanceInfo bsqBalance = grpcClient.getBsqBalances(); for (int numRequests = 1; numRequests <= 15 && bsqBalance.getAvailableConfirmedBalance() == staleBalance; diff --git a/apitest/src/test/java/bisq/apitest/method/wallet/WalletTestUtil.java b/apitest/src/test/java/bisq/apitest/method/wallet/WalletTestUtil.java index 85b9f04e84f..e5c002fba5f 100644 --- a/apitest/src/test/java/bisq/apitest/method/wallet/WalletTestUtil.java +++ b/apitest/src/test/java/bisq/apitest/method/wallet/WalletTestUtil.java @@ -38,13 +38,13 @@ public class WalletTestUtil { 0); @SuppressWarnings("SameParameterValue") - public static bisq.core.api.model.BsqBalanceInfo bsqBalanceModel(long availableConfirmedBalance, + public static bisq.core.api.model.BsqBalanceInfo bsqBalanceModel(long availableBalance, long unverifiedBalance, long unconfirmedChangeBalance, long lockedForVotingBalance, long lockupBondsBalance, long unlockingBondsBalance) { - return bisq.core.api.model.BsqBalanceInfo.valueOf(availableConfirmedBalance, + return bisq.core.api.model.BsqBalanceInfo.valueOf(availableBalance, unverifiedBalance, unconfirmedChangeBalance, lockedForVotingBalance, @@ -54,7 +54,7 @@ public static bisq.core.api.model.BsqBalanceInfo bsqBalanceModel(long availableC public static void verifyBsqBalances(bisq.core.api.model.BsqBalanceInfo expected, BsqBalanceInfo actual) { - assertEquals(expected.getAvailableConfirmedBalance(), actual.getAvailableConfirmedBalance()); + assertEquals(expected.getAvailableBalance(), actual.getAvailableConfirmedBalance()); assertEquals(expected.getUnverifiedBalance(), actual.getUnverifiedBalance()); assertEquals(expected.getUnconfirmedChangeBalance(), actual.getUnconfirmedChangeBalance()); assertEquals(expected.getLockedForVotingBalance(), actual.getLockedForVotingBalance()); diff --git a/apitest/src/test/java/bisq/apitest/scenario/LongRunningOfferDeactivationTest.java b/apitest/src/test/java/bisq/apitest/scenario/LongRunningOfferDeactivationTest.java index e7f09247a86..46195144dcc 100644 --- a/apitest/src/test/java/bisq/apitest/scenario/LongRunningOfferDeactivationTest.java +++ b/apitest/src/test/java/bisq/apitest/scenario/LongRunningOfferDeactivationTest.java @@ -35,8 +35,8 @@ import static bisq.core.btc.wallet.Restrictions.getDefaultBuyerSecurityDepositAsPercent; import static java.lang.System.getenv; import static org.junit.jupiter.api.Assertions.fail; -import static protobuf.OfferPayload.Direction.BUY; -import static protobuf.OfferPayload.Direction.SELL; +import static protobuf.OfferDirection.BUY; +import static protobuf.OfferDirection.SELL; diff --git a/build.gradle b/build.gradle index 2314a222005..cf41f0124c8 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,7 @@ configure(subprojects) { ext { // in alphabetical order bcVersion = '1.63' - bitcoinjVersion = '3186b20' + bitcoinjVersion = '42bbae9' codecVersion = '1.13' easybindVersion = '1.0.3' easyVersion = '4.0.1' diff --git a/cli/src/main/java/bisq/cli/DirectionFormat.java b/cli/src/main/java/bisq/cli/DirectionFormat.java index ac0e5b6c556..b3cb1773f47 100644 --- a/cli/src/main/java/bisq/cli/DirectionFormat.java +++ b/cli/src/main/java/bisq/cli/DirectionFormat.java @@ -24,8 +24,8 @@ import static bisq.cli.ColumnHeaderConstants.COL_HEADER_DIRECTION; import static java.lang.String.format; -import static protobuf.OfferPayload.Direction.BUY; -import static protobuf.OfferPayload.Direction.SELL; +import static protobuf.OfferDirection.BUY; +import static protobuf.OfferDirection.SELL; class DirectionFormat { diff --git a/cli/src/main/java/bisq/cli/opts/AbstractMethodOptionParser.java b/cli/src/main/java/bisq/cli/opts/AbstractMethodOptionParser.java index e0b08ed7713..ffa172b0997 100644 --- a/cli/src/main/java/bisq/cli/opts/AbstractMethodOptionParser.java +++ b/cli/src/main/java/bisq/cli/opts/AbstractMethodOptionParser.java @@ -53,7 +53,6 @@ protected AbstractMethodOptionParser(String[] args) { public AbstractMethodOptionParser parse() { try { options = parser.parse(new ArgumentList(args).getMethodArguments()); - //noinspection unchecked nonOptionArguments = (List) options.nonOptionArguments(); return this; } catch (OptionException ex) { diff --git a/cli/src/main/java/bisq/cli/request/OffersServiceRequest.java b/cli/src/main/java/bisq/cli/request/OffersServiceRequest.java index 215c4f3e80d..9a44dc6ebed 100644 --- a/cli/src/main/java/bisq/cli/request/OffersServiceRequest.java +++ b/cli/src/main/java/bisq/cli/request/OffersServiceRequest.java @@ -38,8 +38,8 @@ import static bisq.proto.grpc.EditOfferRequest.EditType.TRIGGER_PRICE_ONLY; import static java.util.Comparator.comparing; import static java.util.stream.Collectors.toList; -import static protobuf.OfferPayload.Direction.BUY; -import static protobuf.OfferPayload.Direction.SELL; +import static protobuf.OfferDirection.BUY; +import static protobuf.OfferDirection.SELL; diff --git a/common/src/main/java/bisq/common/config/ConfigFileEditor.java b/common/src/main/java/bisq/common/config/ConfigFileEditor.java index f067430165d..38054cb39e1 100644 --- a/common/src/main/java/bisq/common/config/ConfigFileEditor.java +++ b/common/src/main/java/bisq/common/config/ConfigFileEditor.java @@ -65,7 +65,7 @@ public void clearOption(String name) { if (ConfigFileOption.isOption(line)) { ConfigFileOption option = ConfigFileOption.parse(line); if (option.name.equals(name)) { - log.warn("Cleared existing config file option '{}'", option); + log.debug("Cleared existing config file option '{}'", option); continue; } } diff --git a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java index 85d35e19af1..835b0dd08d8 100644 --- a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java +++ b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessService.java @@ -23,7 +23,7 @@ import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferRestrictions; import bisq.core.payment.AssetAccount; import bisq.core.payment.ChargeBackRisk; @@ -33,9 +33,9 @@ import bisq.core.support.dispute.Dispute; import bisq.core.support.dispute.DisputeResult; import bisq.core.support.dispute.arbitration.TraderDataItem; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.TradingPeer; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; import bisq.core.user.User; import bisq.network.p2p.BootstrapListener; @@ -308,7 +308,7 @@ public Optional findWitness(Offer offer) { } private Optional findTradePeerWitness(Trade trade) { - TradingPeer tradingPeer = trade.getProcessModel().getTradingPeer(); + TradingPeer tradingPeer = trade.getProcessModel().getTradePeer(); return (tradingPeer == null || tradingPeer.getPaymentAccountPayload() == null || tradingPeer.getPubKeyRing() == null) ? @@ -421,11 +421,11 @@ private long getTradeLimit(Coin maxTradeLimit, String currencyCode, AccountAgeWitness accountAgeWitness, AccountAge accountAgeCategory, - OfferPayload.Direction direction, + OfferDirection direction, PaymentMethod paymentMethod) { if (CurrencyUtil.isCryptoCurrency(currencyCode) || !PaymentMethod.hasChargebackRisk(paymentMethod, currencyCode) || - direction == OfferPayload.Direction.SELL) { + direction == OfferDirection.SELL) { return maxTradeLimit.value; } @@ -500,7 +500,7 @@ public long getMyAccountAge(PaymentAccountPayload paymentAccountPayload) { return getAccountAge(getMyWitness(paymentAccountPayload), new Date()); } - public long getMyTradeLimit(PaymentAccount paymentAccount, String currencyCode, OfferPayload.Direction direction) { + public long getMyTradeLimit(PaymentAccount paymentAccount, String currencyCode, OfferDirection direction) { if (paymentAccount == null) return 0; @@ -641,13 +641,12 @@ private boolean verifyPeersTradeLimit(Offer offer, ErrorMessageHandler errorMessageHandler) { checkNotNull(offer); final String currencyCode = offer.getCurrencyCode(); - final Coin defaultMaxTradeLimit = PaymentMethod.getPaymentMethodById( - offer.getOfferPayload().getPaymentMethodId()).getMaxTradeLimitAsCoin(currencyCode); + final Coin defaultMaxTradeLimit = offer.getPaymentMethod().getMaxTradeLimitAsCoin(currencyCode); long peersCurrentTradeLimit = defaultMaxTradeLimit.value; if (!hasTradeLimitException(peersWitness)) { final long accountSignAge = getWitnessSignAge(peersWitness, peersCurrentDate); AccountAge accountAgeCategory = getPeersAccountAgeCategory(accountSignAge); - OfferPayload.Direction direction = offer.isMyOffer(keyRing) ? + OfferDirection direction = offer.isMyOffer(keyRing) ? offer.getMirroredDirection() : offer.getDirection(); peersCurrentTradeLimit = getTradeLimit(defaultMaxTradeLimit, currencyCode, peersWitness, accountAgeCategory, direction, offer.getPaymentMethod()); @@ -732,8 +731,8 @@ public void arbitratorSignAccountAgeWitness(AccountAgeWitness accountAgeWitness, public Optional traderSignAndPublishPeersAccountAgeWitness(Trade trade) { AccountAgeWitness peersWitness = findTradePeerWitness(trade).orElse(null); Coin tradeAmount = trade.getTradeAmount(); - checkNotNull(trade.getProcessModel().getTradingPeer().getPubKeyRing(), "Peer must have a keyring"); - PublicKey peersPubKey = trade.getProcessModel().getTradingPeer().getPubKeyRing().getSignaturePubKey(); + checkNotNull(trade.getProcessModel().getTradePeer().getPubKeyRing(), "Peer must have a keyring"); + PublicKey peersPubKey = trade.getProcessModel().getTradePeer().getPubKeyRing().getSignaturePubKey(); checkNotNull(peersWitness, "Not able to find peers witness, unable to sign for trade {}", trade.toString()); checkNotNull(tradeAmount, "Trade amount must not be null"); diff --git a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessUtils.java b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessUtils.java index 628f0a81862..bc3b03ac7e1 100644 --- a/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessUtils.java +++ b/core/src/main/java/bisq/core/account/witness/AccountAgeWitnessUtils.java @@ -20,7 +20,7 @@ import bisq.core.account.sign.SignedWitness; import bisq.core.account.sign.SignedWitnessService; import bisq.core.payment.payload.PaymentAccountPayload; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.network.p2p.storage.P2PDataStorage; diff --git a/core/src/main/java/bisq/core/api/CoreApi.java b/core/src/main/java/bisq/core/api/CoreApi.java index 2fb5c39c5a0..30279e6c590 100644 --- a/core/src/main/java/bisq/core/api/CoreApi.java +++ b/core/src/main/java/bisq/core/api/CoreApi.java @@ -25,7 +25,7 @@ import bisq.core.offer.OpenOffer; import bisq.core.payment.PaymentAccount; import bisq.core.payment.payload.PaymentMethod; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.statistics.TradeStatistics3; import bisq.core.trade.statistics.TradeStatisticsManager; diff --git a/core/src/main/java/bisq/core/api/CoreOffersService.java b/core/src/main/java/bisq/core/api/CoreOffersService.java index 4649f4f0b31..1f5fd6d103d 100644 --- a/core/src/main/java/bisq/core/api/CoreOffersService.java +++ b/core/src/main/java/bisq/core/api/CoreOffersService.java @@ -19,15 +19,16 @@ import bisq.core.monetary.Altcoin; import bisq.core.monetary.Price; -import bisq.core.offer.CreateOfferService; -import bisq.core.offer.MutableOfferPayloadFields; import bisq.core.offer.Offer; import bisq.core.offer.OfferBookService; -import bisq.core.offer.OfferFilter; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; +import bisq.core.offer.OfferFilterService; import bisq.core.offer.OfferUtil; import bisq.core.offer.OpenOffer; import bisq.core.offer.OpenOfferManager; +import bisq.core.offer.bisq_v1.CreateOfferService; +import bisq.core.offer.bisq_v1.MutableOfferPayloadFields; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.payment.PaymentAccount; import bisq.core.provider.price.PriceFeedService; import bisq.core.user.User; @@ -57,8 +58,7 @@ import static bisq.common.util.MathUtils.scaleUpByPowerOf10; import static bisq.core.locale.CurrencyUtil.isCryptoCurrency; import static bisq.core.offer.Offer.State; -import static bisq.core.offer.OfferPayload.Direction; -import static bisq.core.offer.OfferPayload.Direction.BUY; +import static bisq.core.offer.OfferDirection.BUY; import static bisq.core.offer.OpenOffer.State.AVAILABLE; import static bisq.core.offer.OpenOffer.State.DEACTIVATED; import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; @@ -85,7 +85,7 @@ class CoreOffersService { private final CoreWalletsService coreWalletsService; private final CreateOfferService createOfferService; private final OfferBookService offerBookService; - private final OfferFilter offerFilter; + private final OfferFilterService offerFilterService; private final OpenOfferManager openOfferManager; private final OfferUtil offerUtil; private final PriceFeedService priceFeedService; @@ -97,7 +97,7 @@ public CoreOffersService(CoreContext coreContext, CoreWalletsService coreWalletsService, CreateOfferService createOfferService, OfferBookService offerBookService, - OfferFilter offerFilter, + OfferFilterService offerFilterService, OpenOfferManager openOfferManager, OfferUtil offerUtil, PriceFeedService priceFeedService, @@ -107,7 +107,7 @@ public CoreOffersService(CoreContext coreContext, this.coreWalletsService = coreWalletsService; this.createOfferService = createOfferService; this.offerBookService = offerBookService; - this.offerFilter = offerFilter; + this.offerFilterService = offerFilterService; this.openOfferManager = openOfferManager; this.offerUtil = offerUtil; this.priceFeedService = priceFeedService; @@ -118,7 +118,7 @@ Offer getOffer(String id) { return offerBookService.getOffers().stream() .filter(o -> o.getId().equals(id)) .filter(o -> !o.isMyOffer(keyRing)) - .filter(o -> offerFilter.canTakeOffer(o, coreContext.isApiUser()).isValid()) + .filter(o -> offerFilterService.canTakeOffer(o, coreContext.isApiUser()).isValid()) .findAny().orElseThrow(() -> new IllegalStateException(format("offer with id '%s' not found", id))); } @@ -135,7 +135,7 @@ List getOffers(String direction, String currencyCode) { return offerBookService.getOffers().stream() .filter(o -> !o.isMyOffer(keyRing)) .filter(o -> offerMatchesDirectionAndCurrency(o, direction, currencyCode)) - .filter(o -> offerFilter.canTakeOffer(o, coreContext.isApiUser()).isValid()) + .filter(o -> offerFilterService.canTakeOffer(o, coreContext.isApiUser()).isValid()) .sorted(priceComparator(direction)) .collect(Collectors.toList()); } @@ -183,8 +183,8 @@ void createAndPlaceOffer(String currencyCode, throw new IllegalArgumentException(format("payment account with id %s not found", paymentAccountId)); String upperCaseCurrencyCode = currencyCode.toUpperCase(); - String offerId = createOfferService.getRandomOfferId(); - Direction direction = Direction.valueOf(directionAsString.toUpperCase()); + String offerId = OfferUtil.getRandomOfferId(); + OfferDirection direction = OfferDirection.valueOf(directionAsString.toUpperCase()); Price price = Price.valueOf(upperCaseCurrencyCode, priceStringToLong(priceAsString, upperCaseCurrencyCode)); Coin amount = Coin.valueOf(amountAsLong); Coin minAmount = Coin.valueOf(minAmountAsLong); @@ -256,7 +256,7 @@ void editOffer(String offerId, editedMarketPriceMargin, editType); Offer editedOffer = new Offer(editedPayload); - priceFeedService.setCurrencyCode(openOffer.getOffer().getOfferPayload().getCurrencyCode()); + priceFeedService.setCurrencyCode(openOffer.getOffer().getCurrencyCode()); editedOffer.setPriceFeedService(priceFeedService); editedOffer.setState(State.AVAILABLE); openOfferManager.editOpenOfferStart(openOffer, @@ -302,7 +302,7 @@ private OfferPayload getMergedOfferPayload(OpenOffer openOffer, // code fields. Note: triggerPrice isDeactivated fields are in OpenOffer, not // in OfferPayload. Offer offer = openOffer.getOffer(); - String currencyCode = offer.getOfferPayload().getCurrencyCode(); + String currencyCode = offer.getCurrencyCode(); boolean isEditingPrice = editType.equals(FIXED_PRICE_ONLY) || editType.equals(FIXED_PRICE_AND_ACTIVATION_STATE); Price editedPrice; if (isEditingPrice) { @@ -320,15 +320,15 @@ private OfferPayload getMergedOfferPayload(OpenOffer openOffer, Objects.requireNonNull(editedPrice).getValue(), isUsingMktPriceMargin ? exactMultiply(editedMarketPriceMargin, 0.01) : 0.00, isUsingMktPriceMargin, - offer.getOfferPayload().getBaseCurrencyCode(), - offer.getOfferPayload().getCounterCurrencyCode(), + offer.getBaseCurrencyCode(), + offer.getCounterCurrencyCode(), offer.getPaymentMethod().getId(), offer.getMakerPaymentAccountId(), - offer.getOfferPayload().getCountryCode(), - offer.getOfferPayload().getAcceptedCountryCodes(), - offer.getOfferPayload().getBankId(), - offer.getOfferPayload().getAcceptedBankIds(), - offer.getOfferPayload().getExtraDataMap()); + offer.getCountryCode(), + offer.getAcceptedCountryCodes(), + offer.getBankId(), + offer.getAcceptedBankIds(), + offer.getExtraDataMap()); log.info("Merging OfferPayload with {}", mutableOfferPayloadFields); return offerUtil.getMergedOfferPayload(openOffer, mutableOfferPayloadFields); } @@ -336,7 +336,7 @@ private OfferPayload getMergedOfferPayload(OpenOffer openOffer, private void verifyPaymentAccountIsValidForNewOffer(Offer offer, PaymentAccount paymentAccount) { if (!isPaymentAccountValidForOffer(offer, paymentAccount)) { String error = format("cannot create %s offer with payment account %s", - offer.getOfferPayload().getCounterCurrencyCode(), + offer.getCounterCurrencyCode(), paymentAccount.getId()); throw new IllegalStateException(error); } @@ -346,7 +346,7 @@ private boolean offerMatchesDirectionAndCurrency(Offer offer, String direction, String currencyCode) { var offerOfWantedDirection = offer.getDirection().name().equalsIgnoreCase(direction); - var offerInWantedCurrency = offer.getOfferPayload().getCounterCurrencyCode() + var offerInWantedCurrency = offer.getCounterCurrencyCode() .equalsIgnoreCase(currencyCode); return offerOfWantedDirection && offerInWantedCurrency; } diff --git a/core/src/main/java/bisq/core/api/CorePaymentAccountsService.java b/core/src/main/java/bisq/core/api/CorePaymentAccountsService.java index 416dde6531b..78d6dd8befd 100644 --- a/core/src/main/java/bisq/core/api/CorePaymentAccountsService.java +++ b/core/src/main/java/bisq/core/api/CorePaymentAccountsService.java @@ -82,7 +82,7 @@ Set getPaymentAccounts() { List getFiatPaymentMethods() { return PaymentMethod.getPaymentMethods().stream() - .filter(paymentMethod -> !paymentMethod.isAsset()) + .filter(PaymentMethod::isFiat) .sorted(Comparator.comparing(PaymentMethod::getId)) .collect(Collectors.toList()); } @@ -132,7 +132,7 @@ PaymentAccount createCryptoCurrencyPaymentAccount(String accountName, List getCryptoCurrencyPaymentMethods() { return PaymentMethod.getPaymentMethods().stream() - .filter(PaymentMethod::isAsset) + .filter(PaymentMethod::isAltcoin) .sorted(Comparator.comparing(PaymentMethod::getId)) .collect(Collectors.toList()); } diff --git a/core/src/main/java/bisq/core/api/CoreTradesService.java b/core/src/main/java/bisq/core/api/CoreTradesService.java index 2f5683108a9..80fd6f6ca00 100644 --- a/core/src/main/java/bisq/core/api/CoreTradesService.java +++ b/core/src/main/java/bisq/core/api/CoreTradesService.java @@ -21,14 +21,14 @@ import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; import bisq.core.offer.OfferUtil; -import bisq.core.offer.takeoffer.TakeOfferModel; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; +import bisq.core.offer.bisq_v1.TakeOfferModel; import bisq.core.trade.TradeManager; -import bisq.core.trade.TradeUtil; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.protocol.BuyerProtocol; -import bisq.core.trade.protocol.SellerProtocol; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.TradeUtil; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.BuyerProtocol; +import bisq.core.trade.protocol.bisq_v1.SellerProtocol; import bisq.core.user.User; import bisq.core.util.validation.BtcAddressValidator; @@ -100,7 +100,7 @@ void takeOffer(Offer offer, throw new IllegalArgumentException(format("payment account with id '%s' not found", paymentAccountId)); var useSavingsWallet = true; - //noinspection ConstantConditions + takeOfferModel.initModel(offer, paymentAccount, useSavingsWallet); log.info("Initiating take {} offer, {}", offer.isBuyOffer() ? "buy" : "sell", diff --git a/core/src/main/java/bisq/core/api/CoreWalletsService.java b/core/src/main/java/bisq/core/api/CoreWalletsService.java index 54f841e125c..f2dec09a530 100644 --- a/core/src/main/java/bisq/core/api/CoreWalletsService.java +++ b/core/src/main/java/bisq/core/api/CoreWalletsService.java @@ -82,7 +82,6 @@ import javax.annotation.Nullable; -import static bisq.common.config.BaseCurrencyNetwork.BTC_DAO_REGTEST; import static bisq.core.btc.wallet.Restrictions.getMinNonDustOutput; import static bisq.core.util.ParsingUtils.parseToCoin; import static java.lang.String.format; @@ -583,14 +582,14 @@ private BsqBalanceInfo getBsqBalances() { verifyWalletsAreAvailable(); verifyEncryptedWalletIsUnlocked(); - var availableConfirmedBalance = bsqWalletService.getAvailableConfirmedBalance(); + var availableBalance = bsqWalletService.getAvailableBalance(); var unverifiedBalance = bsqWalletService.getUnverifiedBalance(); var unconfirmedChangeBalance = bsqWalletService.getUnconfirmedChangeBalance(); var lockedForVotingBalance = bsqWalletService.getLockedForVotingBalance(); var lockupBondsBalance = bsqWalletService.getLockupBondsBalance(); var unlockingBondsBalance = bsqWalletService.getUnlockingBondsBalance(); - return new BsqBalanceInfo(availableConfirmedBalance.value, + return new BsqBalanceInfo(availableBalance.value, unverifiedBalance.value, unconfirmedChangeBalance.value, lockedForVotingBalance.value, diff --git a/core/src/main/java/bisq/core/api/model/BsqBalanceInfo.java b/core/src/main/java/bisq/core/api/model/BsqBalanceInfo.java index 23324e21f33..cde41915c25 100644 --- a/core/src/main/java/bisq/core/api/model/BsqBalanceInfo.java +++ b/core/src/main/java/bisq/core/api/model/BsqBalanceInfo.java @@ -17,20 +17,20 @@ public class BsqBalanceInfo implements Payload { -1); // All balances are in BSQ satoshis. - private final long availableConfirmedBalance; + private final long availableBalance; private final long unverifiedBalance; private final long unconfirmedChangeBalance; private final long lockedForVotingBalance; private final long lockupBondsBalance; private final long unlockingBondsBalance; - public BsqBalanceInfo(long availableConfirmedBalance, + public BsqBalanceInfo(long availableBalance, long unverifiedBalance, long unconfirmedChangeBalance, long lockedForVotingBalance, long lockupBondsBalance, long unlockingBondsBalance) { - this.availableConfirmedBalance = availableConfirmedBalance; + this.availableBalance = availableBalance; this.unverifiedBalance = unverifiedBalance; this.unconfirmedChangeBalance = unconfirmedChangeBalance; this.lockedForVotingBalance = lockedForVotingBalance; @@ -39,14 +39,14 @@ public BsqBalanceInfo(long availableConfirmedBalance, } @VisibleForTesting - public static BsqBalanceInfo valueOf(long availableConfirmedBalance, + public static BsqBalanceInfo valueOf(long availableBalance, long unverifiedBalance, long unconfirmedChangeBalance, long lockedForVotingBalance, long lockupBondsBalance, long unlockingBondsBalance) { // Convenience for creating a model instance instead of a proto. - return new BsqBalanceInfo(availableConfirmedBalance, + return new BsqBalanceInfo(availableBalance, unverifiedBalance, unconfirmedChangeBalance, lockedForVotingBalance, @@ -58,10 +58,11 @@ public static BsqBalanceInfo valueOf(long availableConfirmedBalance, // PROTO BUFFER /////////////////////////////////////////////////////////////////////////////////////////// + // TODO rename availableConfirmedBalance in proto if possible @Override public bisq.proto.grpc.BsqBalanceInfo toProtoMessage() { return bisq.proto.grpc.BsqBalanceInfo.newBuilder() - .setAvailableConfirmedBalance(availableConfirmedBalance) + .setAvailableConfirmedBalance(availableBalance) .setUnverifiedBalance(unverifiedBalance) .setUnconfirmedChangeBalance(unconfirmedChangeBalance) .setLockedForVotingBalance(lockedForVotingBalance) @@ -83,7 +84,7 @@ public static BsqBalanceInfo fromProto(bisq.proto.grpc.BsqBalanceInfo proto) { @Override public String toString() { return "BsqBalanceInfo{" + - "availableConfirmedBalance=" + availableConfirmedBalance + + "availableBalance=" + availableBalance + ", unverifiedBalance=" + unverifiedBalance + ", unconfirmedChangeBalance=" + unconfirmedChangeBalance + ", lockedForVotingBalance=" + lockedForVotingBalance + diff --git a/core/src/main/java/bisq/core/api/model/OfferInfo.java b/core/src/main/java/bisq/core/api/model/OfferInfo.java index 15ad2acc108..67cee988a3b 100644 --- a/core/src/main/java/bisq/core/api/model/OfferInfo.java +++ b/core/src/main/java/bisq/core/api/model/OfferInfo.java @@ -144,8 +144,8 @@ private static OfferInfoBuilder getOfferInfoBuilder(Offer offer, boolean isMyOff .withPaymentAccountId(offer.getMakerPaymentAccountId()) .withPaymentMethodId(offer.getPaymentMethod().getId()) .withPaymentMethodShortName(offer.getPaymentMethod().getShortName()) - .withBaseCurrencyCode(offer.getOfferPayload().getBaseCurrencyCode()) - .withCounterCurrencyCode(offer.getOfferPayload().getCounterCurrencyCode()) + .withBaseCurrencyCode(offer.getBaseCurrencyCode()) + .withCounterCurrencyCode(offer.getCounterCurrencyCode()) .withDate(offer.getDate().getTime()) .withState(offer.getState().name()) .withIsMyOffer(isMyOffer); diff --git a/core/src/main/java/bisq/core/api/model/TradeInfo.java b/core/src/main/java/bisq/core/api/model/TradeInfo.java index 38bf15256d2..880c9a5e76e 100644 --- a/core/src/main/java/bisq/core/api/model/TradeInfo.java +++ b/core/src/main/java/bisq/core/api/model/TradeInfo.java @@ -17,8 +17,8 @@ package bisq.core.api.model; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.Payload; @@ -34,7 +34,7 @@ @Getter public class TradeInfo implements Payload { - // The client cannot see bisq.core.trade.Trade or its fromProto method. We use the + // The client cannot see Trade or its fromProto method. We use the // lighter weight TradeInfo proto wrapper instead, containing just enough fields to // view and interact with trades. @@ -138,8 +138,8 @@ public static TradeInfo toTradeInfo(Trade trade, String role, boolean isMyOffer) .withTradeVolume(trade.getTradeVolume() == null ? 0 : trade.getTradeVolume().getValue()) .withTradingPeerNodeAddress(Objects.requireNonNull( trade.getTradingPeerNodeAddress()).getHostNameWithoutPostFix()) - .withState(trade.getState().name()) - .withPhase(trade.getPhase().name()) + .withState(trade.getTradeState().name()) + .withPhase(trade.getTradePhase().name()) .withTradePeriodState(trade.getTradePeriodState().name()) .withIsDepositPublished(trade.isDepositPublished()) .withIsDepositConfirmed(trade.isDepositConfirmed()) diff --git a/core/src/main/java/bisq/core/app/BisqSetup.java b/core/src/main/java/bisq/core/app/BisqSetup.java index 541fe069da5..dadc31b2b37 100644 --- a/core/src/main/java/bisq/core/app/BisqSetup.java +++ b/core/src/main/java/bisq/core/app/BisqSetup.java @@ -42,7 +42,7 @@ import bisq.core.support.dispute.mediation.MediationManager; import bisq.core.support.dispute.refund.RefundManager; import bisq.core.trade.TradeManager; -import bisq.core.trade.TradeTxException; +import bisq.core.trade.bisq_v1.TradeTxException; import bisq.core.user.Preferences; import bisq.core.user.User; import bisq.core.util.FormattingUtils; @@ -657,7 +657,10 @@ private void maybeShowSecurityRecommendation() { } private void maybeShowLocalhostRunningInfo() { - maybeTriggerDisplayHandler("bitcoinLocalhostNode", displayLocalhostHandler, localBitcoinNode.shouldBeUsed()); + if (Config.baseCurrencyNetwork().isMainnet()) { + maybeTriggerDisplayHandler("bitcoinLocalhostNode", displayLocalhostHandler, + localBitcoinNode.shouldBeUsed()); + } } private void maybeShowAccountSigningStateInfo() { diff --git a/core/src/main/java/bisq/core/app/DomainInitialisation.java b/core/src/main/java/bisq/core/app/DomainInitialisation.java index b0dbd16b774..8674ccb902b 100644 --- a/core/src/main/java/bisq/core/app/DomainInitialisation.java +++ b/core/src/main/java/bisq/core/app/DomainInitialisation.java @@ -34,7 +34,7 @@ import bisq.core.notifications.alerts.market.MarketAlerts; import bisq.core.notifications.alerts.price.PriceAlert; import bisq.core.offer.OpenOfferManager; -import bisq.core.offer.TriggerPriceService; +import bisq.core.offer.bisq_v1.TriggerPriceService; import bisq.core.payment.AmazonGiftCardAccount; import bisq.core.payment.RevolutAccount; import bisq.core.payment.TradeLimits; @@ -49,8 +49,8 @@ import bisq.core.support.dispute.refund.refundagent.RefundAgentManager; import bisq.core.support.traderchat.TraderChatManager; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.FailedTradesManager; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.trade.txproof.xmr.XmrTxProofService; import bisq.core.user.User; diff --git a/core/src/main/java/bisq/core/app/P2PNetworkSetup.java b/core/src/main/java/bisq/core/app/P2PNetworkSetup.java index 2643a389dc4..614e4ecf0b6 100644 --- a/core/src/main/java/bisq/core/app/P2PNetworkSetup.java +++ b/core/src/main/java/bisq/core/app/P2PNetworkSetup.java @@ -84,7 +84,8 @@ public P2PNetworkSetup(PriceFeedService priceFeedService, this.preferences = preferences; } - BooleanProperty init(Runnable initWalletServiceHandler, @Nullable Consumer displayTorNetworkSettingsHandler) { + BooleanProperty init(Runnable initWalletServiceHandler, + @Nullable Consumer displayTorNetworkSettingsHandler) { StringProperty bootstrapState = new SimpleStringProperty(); StringProperty bootstrapWarning = new SimpleStringProperty(); BooleanProperty hiddenServicePublished = new SimpleBooleanProperty(); diff --git a/core/src/main/java/bisq/core/btc/Balances.java b/core/src/main/java/bisq/core/btc/Balances.java index 5d3ddd4e437..ff6ece544c4 100644 --- a/core/src/main/java/bisq/core/btc/Balances.java +++ b/core/src/main/java/bisq/core/btc/Balances.java @@ -24,10 +24,10 @@ import bisq.core.offer.OpenOfferManager; import bisq.core.support.dispute.Dispute; import bisq.core.support.dispute.refund.RefundManager; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.FailedTradesManager; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.UserThread; diff --git a/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java b/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java index 1cf1d07cd47..049b4a4d5f0 100644 --- a/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java +++ b/core/src/main/java/bisq/core/btc/TxFeeEstimationService.java @@ -55,11 +55,11 @@ public class TxFeeEstimationService { // segwit deposit tx with change vsize = 263 // segwit payout tx vsize = 169 // segwit delayed payout tx vsize = 139 - public static int TYPICAL_TX_WITH_1_INPUT_VSIZE = 175; - private static int DEPOSIT_TX_VSIZE = 233; +public static final int TYPICAL_TX_WITH_1_INPUT_VSIZE = 175; + private static final int DEPOSIT_TX_VSIZE = 233; - private static int BSQ_INPUT_INCREASE = 70; - private static int MAX_ITERATIONS = 10; + private static final int BSQ_INPUT_INCREASE = 70; + private static final int MAX_ITERATIONS = 10; private final FeeService feeService; private final BtcWalletService btcWalletService; diff --git a/core/src/main/java/bisq/core/btc/listeners/BsqBalanceListener.java b/core/src/main/java/bisq/core/btc/listeners/BsqBalanceListener.java index 7923db370c5..fa6c5a1af6c 100644 --- a/core/src/main/java/bisq/core/btc/listeners/BsqBalanceListener.java +++ b/core/src/main/java/bisq/core/btc/listeners/BsqBalanceListener.java @@ -20,7 +20,7 @@ import org.bitcoinj.core.Coin; public interface BsqBalanceListener { - void onUpdateBalances(Coin availableConfirmedBalance, + void onUpdateBalances(Coin availableBalance, Coin availableNonBsqBalance, Coin unverifiedBalance, Coin unconfirmedChangeBalance, diff --git a/core/src/main/java/bisq/core/btc/listeners/TxConfidenceListener.java b/core/src/main/java/bisq/core/btc/listeners/TxConfidenceListener.java index 6677555e811..6eaa1b4b5da 100644 --- a/core/src/main/java/bisq/core/btc/listeners/TxConfidenceListener.java +++ b/core/src/main/java/bisq/core/btc/listeners/TxConfidenceListener.java @@ -19,18 +19,15 @@ import org.bitcoinj.core.TransactionConfidence; -public class TxConfidenceListener { - private final String txID; +import lombok.Getter; - public TxConfidenceListener(String txID) { - this.txID = txID; - } +public abstract class TxConfidenceListener { + @Getter + private final String txId; - public String getTxID() { - return txID; + public TxConfidenceListener(String txId) { + this.txId = txId; } - @SuppressWarnings("UnusedParameters") - public void onTransactionConfidenceChanged(TransactionConfidence confidence) { - } + abstract public void onTransactionConfidenceChanged(TransactionConfidence confidence); } diff --git a/core/src/main/java/bisq/core/btc/model/RawTransactionInput.java b/core/src/main/java/bisq/core/btc/model/RawTransactionInput.java index 3a59ab07f9c..0b2d74de36e 100644 --- a/core/src/main/java/bisq/core/btc/model/RawTransactionInput.java +++ b/core/src/main/java/bisq/core/btc/model/RawTransactionInput.java @@ -17,33 +17,82 @@ package bisq.core.btc.model; +import bisq.core.btc.wallet.BtcWalletService; + import bisq.common.proto.network.NetworkPayload; import bisq.common.proto.persistable.PersistablePayload; import bisq.common.util.Utilities; import com.google.protobuf.ByteString; +import org.bitcoinj.core.Transaction; +import org.bitcoinj.core.TransactionInput; +import org.bitcoinj.script.Script; + +import java.util.Objects; + import lombok.EqualsAndHashCode; +import lombok.Getter; import javax.annotation.concurrent.Immutable; @EqualsAndHashCode @Immutable +@Getter public final class RawTransactionInput implements NetworkPayload, PersistablePayload { public final long index; // Index of spending txo public final byte[] parentTransaction; // Spending tx (fromTx) public final long value; + // Added at Bsq swap release + // id of the org.bitcoinj.script.Script.ScriptType. Useful to know if input is segwit. + // Lowest Script.ScriptType.id value is 1, so we use 0 as value for not defined + public final int scriptTypeId; + + public RawTransactionInput(TransactionInput input) { + this(input.getOutpoint().getIndex(), + Objects.requireNonNull(Objects.requireNonNull(input.getConnectedOutput()).getParentTransaction()), + Objects.requireNonNull(input.getValue()).value, + input.getConnectedOutput() != null && + input.getConnectedOutput().getScriptPubKey() != null && + input.getConnectedOutput().getScriptPubKey().getScriptType() != null ? + input.getConnectedOutput().getScriptPubKey().getScriptType().id : -1); + } + + // Does not set the scriptTypeId. Use RawTransactionInput(TransactionInput input) for any new code. + @Deprecated + public RawTransactionInput(long index, byte[] parentTransaction, long value) { + this(index, parentTransaction, value, 0); + } + + private RawTransactionInput(long index, Transaction parentTransaction, long value, int scriptTypeId) { + this(index, + parentTransaction.bitcoinSerialize(scriptTypeId == Script.ScriptType.P2WPKH.id || + scriptTypeId == Script.ScriptType.P2WSH.id), + value, scriptTypeId); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + /** * Holds the relevant data for the connected output for a tx input. * @param index the index of the parentTransaction * @param parentTransaction the spending output tx, not the parent tx of the input * @param value the number of satoshis being spent + * @param scriptTypeId The id of the org.bitcoinj.script.Script.ScriptType of the spending output + * If not set it is 0. */ - public RawTransactionInput(long index, byte[] parentTransaction, long value) { + private RawTransactionInput(long index, + byte[] parentTransaction, + long value, + int scriptTypeId) { this.index = index; this.parentTransaction = parentTransaction; this.value = value; + this.scriptTypeId = scriptTypeId; } @Override @@ -52,11 +101,36 @@ public protobuf.RawTransactionInput toProtoMessage() { .setIndex(index) .setParentTransaction(ByteString.copyFrom(parentTransaction)) .setValue(value) + .setScriptTypeId(scriptTypeId) .build(); } public static RawTransactionInput fromProto(protobuf.RawTransactionInput proto) { - return new RawTransactionInput(proto.getIndex(), proto.getParentTransaction().toByteArray(), proto.getValue()); + return new RawTransactionInput(proto.getIndex(), + proto.getParentTransaction().toByteArray(), + proto.getValue(), + proto.getScriptTypeId()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + public boolean isSegwit() { + return isP2WPKH() || isP2WSH(); + } + + public boolean isP2WPKH() { + return scriptTypeId == Script.ScriptType.P2WPKH.id; + } + + public boolean isP2WSH() { + return scriptTypeId == Script.ScriptType.P2WSH.id; + } + + public String getParentTxId(BtcWalletService btcWalletService) { + return btcWalletService.getTxFromSerializedTx(parentTransaction).getTxId().toString(); } @Override @@ -65,6 +139,7 @@ public String toString() { "index=" + index + ", parentTransaction as HEX " + Utilities.bytesAsHexString(parentTransaction) + ", value=" + value + + ", scriptTypeId=" + scriptTypeId + '}'; } } diff --git a/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java b/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java index 82851886322..1f4d2652a77 100644 --- a/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java +++ b/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java @@ -64,9 +64,6 @@ public List getProvidedBtcNodes() { new BtcNode("btc1.sqrrm.net", "jygcc54etaubgdpcvzgbihjaqbc37cstpvum5sjzvka4bibkp4wrgnqd.onion", "185.25.48.184", BtcNode.DEFAULT_PORT, "@sqrrm"), new BtcNode("btc2.sqrrm.net", "h32haomoe52ljz6qopedsocvotvoj5lm2zmecfhdhawb3flbsf64l2qd.onion", "81.171.22.143", BtcNode.DEFAULT_PORT, "@sqrrm"), - // KanoczTomas -// new BtcNode("btc.ispol.sk", "mbm6ffx6j5ygi2ck.onion", "193.58.196.212", BtcNode.DEFAULT_PORT, "@KanoczTomas"), - // Devin Bileck new BtcNode("btc1.bisq.services", "devinbtctu7uctl7hly2juu3thbgeivfnvw3ckj3phy6nyvpnx66yeyd.onion", "172.105.21.216", BtcNode.DEFAULT_PORT, "@devinbileck"), new BtcNode("btc2.bisq.services", "devinbtcyk643iruzfpaxw3on2jket7rbjmwygm42dmdyub3ietrbmid.onion", "173.255.240.205", BtcNode.DEFAULT_PORT, "@devinbileck"), @@ -77,9 +74,6 @@ public List getProvidedBtcNodes() { new BtcNode("node140.hnl.wiz.biz", "jto2jfbsxhb6yvhcrrjddrgbakte6tgsy3c3z3prss64gndgvovvosyd.onion", "103.99.168.140", BtcNode.DEFAULT_PORT, "@wiz"), new BtcNode("node210.fmt.wiz.biz", "rfqmn3qe36uaptkxhdvi74p4hyrzhir6vhmzb2hqryxodig4gue2zbyd.onion", "103.99.170.210", BtcNode.DEFAULT_PORT, "@wiz"), new BtcNode("node220.fmt.wiz.biz", "azbpsh4arqlm6442wfimy7qr65bmha2zhgjg7wbaji6vvaug53hur2qd.onion", "103.99.170.220", BtcNode.DEFAULT_PORT, "@wiz") - - // Rob Kaandorp -// new BtcNode(null, "2pj2o2mrawj7yotg.onion", null, BtcNode.DEFAULT_PORT, "@robkaandorp") // cannot provide IP because no static IP ) : new ArrayList<>(); } diff --git a/core/src/main/java/bisq/core/btc/wallet/BsqCoinSelector.java b/core/src/main/java/bisq/core/btc/wallet/BsqCoinSelector.java index e6d122a6b80..2d893a54bd8 100644 --- a/core/src/main/java/bisq/core/btc/wallet/BsqCoinSelector.java +++ b/core/src/main/java/bisq/core/btc/wallet/BsqCoinSelector.java @@ -26,6 +26,8 @@ import javax.inject.Inject; +import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; /** @@ -36,9 +38,13 @@ public class BsqCoinSelector extends BisqDefaultCoinSelector { private final DaoStateService daoStateService; private final UnconfirmedBsqChangeOutputListService unconfirmedBsqChangeOutputListService; + @Setter + @Getter + private boolean allowSpendMyOwnUnconfirmedTxOutputs = true; @Inject - public BsqCoinSelector(DaoStateService daoStateService, UnconfirmedBsqChangeOutputListService unconfirmedBsqChangeOutputListService) { + public BsqCoinSelector(DaoStateService daoStateService, + UnconfirmedBsqChangeOutputListService unconfirmedBsqChangeOutputListService) { // permitForeignPendingTx is not relevant here as we do not support pending foreign utxos anyway. super(false); this.daoStateService = daoStateService; @@ -53,17 +59,19 @@ protected boolean isTxOutputSpendable(TransactionOutput output) { return false; // If it is a normal confirmed BSQ output we use the default lookup at the daoState - if (daoStateService.isTxOutputSpendable(new TxOutputKey(parentTransaction.getTxId().toString(), output.getIndex()))) + TxOutputKey txOutputKey = new TxOutputKey(parentTransaction.getTxId().toString(), output.getIndex()); + if (daoStateService.isTxOutputSpendable(txOutputKey)) return true; // It might be that it is an unconfirmed change output which we allow to be used for spending without requiring a confirmation. // We check if we have the output in the dao state, if so we have a confirmed but unspendable output (e.g. confiscated). - if (daoStateService.getTxOutput(new TxOutputKey(parentTransaction.getTxId().toString(), output.getIndex())).isPresent()) + if (daoStateService.getTxOutput(txOutputKey).isPresent()) return false; + // If we have set the isUnconfirmedSpendable flag to true (default) we check for unconfirmed own change outputs. // Only if it's not existing yet in the dao state (unconfirmed) we use our unconfirmedBsqChangeOutputList to // check if it is an own change output. - return unconfirmedBsqChangeOutputListService.hasTransactionOutput(output); + return allowSpendMyOwnUnconfirmedTxOutputs && unconfirmedBsqChangeOutputListService.hasTransactionOutput(output); } // For BSQ we do not check for dust attack utxos as they are 5.46 BSQ and a considerable value. diff --git a/core/src/main/java/bisq/core/btc/wallet/BsqTransferService.java b/core/src/main/java/bisq/core/btc/wallet/BsqTransferService.java index 5639004c70f..29b9282589a 100644 --- a/core/src/main/java/bisq/core/btc/wallet/BsqTransferService.java +++ b/core/src/main/java/bisq/core/btc/wallet/BsqTransferService.java @@ -42,7 +42,7 @@ public BsqTransferModel getBsqTransferModel(Address address, Transaction preparedSendTx = bsqWalletService.getPreparedSendBsqTx(address.toString(), receiverAmount); Transaction txWithBtcFee = btcWalletService.completePreparedSendBsqTx(preparedSendTx, txFeePerVbyte); - Transaction signedTx = bsqWalletService.signTx(txWithBtcFee); + Transaction signedTx = bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); return new BsqTransferModel(address, receiverAmount, diff --git a/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java b/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java index 708c5044678..74d3da3ac40 100644 --- a/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/BsqWalletService.java @@ -34,6 +34,7 @@ import bisq.core.dao.state.unconfirmed.UnconfirmedBsqChangeOutputListService; import bisq.core.provider.fee.FeeService; import bisq.core.user.Preferences; +import bisq.core.util.coin.BsqFormatter; import bisq.common.UserThread; @@ -95,15 +96,20 @@ public interface WalletTransactionsChangeListener { private final CopyOnWriteArraySet bsqBalanceListeners = new CopyOnWriteArraySet<>(); private final List walletTransactionsChangeListeners = new ArrayList<>(); private boolean updateBsqWalletTransactionsPending; + @Getter + private final BsqFormatter bsqFormatter; + // balance of non BSQ satoshis @Getter private Coin availableNonBsqBalance = Coin.ZERO; @Getter - private Coin availableConfirmedBalance = Coin.ZERO; + private Coin availableBalance = Coin.ZERO; @Getter private Coin unverifiedBalance = Coin.ZERO; @Getter + private Coin verifiedBalance = Coin.ZERO; + @Getter private Coin unconfirmedChangeBalance = Coin.ZERO; @Getter private Coin lockedForVotingBalance = Coin.ZERO; @@ -125,7 +131,8 @@ public BsqWalletService(WalletsSetup walletsSetup, UnconfirmedBsqChangeOutputListService unconfirmedBsqChangeOutputListService, Preferences preferences, FeeService feeService, - DaoKillSwitch daoKillSwitch) { + DaoKillSwitch daoKillSwitch, + BsqFormatter bsqFormatter) { super(walletsSetup, preferences, feeService); @@ -135,6 +142,7 @@ public BsqWalletService(WalletsSetup walletsSetup, this.daoStateService = daoStateService; this.unconfirmedBsqChangeOutputListService = unconfirmedBsqChangeOutputListService; this.daoKillSwitch = daoKillSwitch; + this.bsqFormatter = bsqFormatter; nonBsqCoinSelector.setPreferences(preferences); @@ -284,18 +292,20 @@ private void updateBsqBalance() { .mapToLong(TxOutput::getValue) .sum()); - availableConfirmedBalance = bsqCoinSelector.select(NetworkParameters.MAX_MONEY, + availableBalance = bsqCoinSelector.select(NetworkParameters.MAX_MONEY, wallet.calculateAllSpendCandidates()).valueGathered; - if (availableConfirmedBalance.isNegative()) - availableConfirmedBalance = Coin.ZERO; + if (availableBalance.isNegative()) + availableBalance = Coin.ZERO; unconfirmedChangeBalance = unconfirmedBsqChangeOutputListService.getBalance(); availableNonBsqBalance = nonBsqCoinSelector.select(NetworkParameters.MAX_MONEY, wallet.calculateAllSpendCandidates()).valueGathered; - bsqBalanceListeners.forEach(e -> e.onUpdateBalances(availableConfirmedBalance, availableNonBsqBalance, unverifiedBalance, + verifiedBalance = availableBalance.subtract(unconfirmedChangeBalance); + + bsqBalanceListeners.forEach(e -> e.onUpdateBalances(availableBalance, availableNonBsqBalance, unverifiedBalance, unconfirmedChangeBalance, lockedForVotingBalance, lockupBondsBalance, unlockingBondsBalance)); log.info("updateBsqBalance took {} ms", System.currentTimeMillis() - ts); } @@ -481,28 +491,10 @@ public Optional isWalletTransaction(String txId) { // Sign tx /////////////////////////////////////////////////////////////////////////////////////////// - public Transaction signTx(Transaction tx) throws WalletException, TransactionVerificationException { - for (int i = 0; i < tx.getInputs().size(); i++) { - TransactionInput txIn = tx.getInputs().get(i); - TransactionOutput connectedOutput = txIn.getConnectedOutput(); - if (connectedOutput != null && connectedOutput.isMine(wallet)) { - signTransactionInput(wallet, aesKey, tx, txIn, i); - checkScriptSig(tx, txIn, i); - } - } - - for (TransactionOutput txo : tx.getOutputs()) { - Coin value = txo.getValue(); - // OpReturn outputs have value 0 - if (value.isPositive()) { - checkArgument(Restrictions.isAboveDust(txo.getValue()), - "An output value is below dust limit. Transaction=" + tx); - } - } - - checkWalletConsistency(wallet); - verifyTransaction(tx); - printTx("BSQ wallet: Signed Tx", tx); + public Transaction signTxAndVerifyNoDustOutputs(Transaction tx) + throws WalletException, TransactionVerificationException { + WalletService.signTx(wallet, aesKey, tx); + WalletService.verifyNonDustTxo(tx); return tx; } @@ -540,6 +532,7 @@ public Transaction getPreparedSendBsqTx(String receiverAddress, return getPreparedSendTx(receiverAddress, receiverAmount, bsqCoinSelector); } + /////////////////////////////////////////////////////////////////////////////////////////// // Send BTC (non-BSQ) with BTC fee (e.g. the issuance output from a lost comp. request) /////////////////////////////////////////////////////////////////////////////////////////// @@ -781,6 +774,7 @@ public Transaction getPreparedLockupTx(Coin lockupAmount) throws AddressFormatEx return tx; } + /////////////////////////////////////////////////////////////////////////////////////////// // Unlock bond tx /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java b/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java index bef6378b794..2437b2b8f3d 100644 --- a/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/BtcWalletService.java @@ -23,6 +23,7 @@ import bisq.core.btc.exceptions.WalletException; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.model.AddressEntryList; +import bisq.core.btc.model.RawTransactionInput; import bisq.core.btc.setup.WalletsSetup; import bisq.core.btc.wallet.http.MemPoolSpaceTxBroadcaster; import bisq.core.provider.fee.FeeService; @@ -47,6 +48,7 @@ import org.bitcoinj.script.Script; import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.script.ScriptPattern; +import org.bitcoinj.wallet.CoinSelection; import org.bitcoinj.wallet.SendRequest; import org.bitcoinj.wallet.Wallet; @@ -61,6 +63,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -1330,4 +1333,30 @@ public Transaction createRefundPayoutTx(Coin buyerAmount, return resultTx; } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Find inputs and change + /////////////////////////////////////////////////////////////////////////////////////////// + + public Tuple2, Coin> getInputsAndChange(Coin required) throws InsufficientMoneyException { + BtcCoinSelector coinSelector = new BtcCoinSelector(walletsSetup.getAddressesByContext(AddressEntry.Context.AVAILABLE), + preferences.getIgnoreDustThreshold()); + CoinSelection coinSelection = coinSelector.select(required, Objects.requireNonNull(wallet).calculateAllSpendCandidates()); + + Coin change; + try { + change = coinSelector.getChange(required, coinSelection); + } catch (InsufficientMoneyException e) { + log.error("Missing funds in getSellersBtcInputsForBsqSwapTx. missing={}", e.missing); + throw new InsufficientMoneyException(e.missing); + } + + Transaction dummyTx = new Transaction(params); + coinSelection.gathered.forEach(dummyTx::addInput); + List inputs = dummyTx.getInputs().stream() + .map(RawTransactionInput::new) + .collect(Collectors.toList()); + return new Tuple2<>(inputs, change); + } } diff --git a/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java b/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java index 94d6e75cf36..a3dbffd6787 100644 --- a/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java @@ -68,8 +68,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.jetbrains.annotations.NotNull; - import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkArgument; @@ -891,8 +889,7 @@ public Transaction sellerSignsAndFinalizesPayoutTx(Transaction depositTx, input.setScriptSig(inputScript); } else { input.setScriptSig(ScriptBuilder.createEmpty()); - TransactionWitness witness = TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig); - input.setWitness(witness); + input.setWitness(TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig)); } WalletService.printTx("payoutTx", payoutTx); WalletService.verifyTransaction(payoutTx); @@ -971,8 +968,7 @@ public Transaction finalizeMediatedPayoutTx(Transaction depositTx, input.setScriptSig(inputScript); } else { input.setScriptSig(ScriptBuilder.createEmpty()); - TransactionWitness witness = TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig); - input.setWitness(witness); + input.setWitness(TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig)); } WalletService.printTx("mediated payoutTx", payoutTx); WalletService.verifyTransaction(payoutTx); @@ -1059,8 +1055,7 @@ public Transaction traderSignAndFinalizeDisputedPayoutTx(byte[] depositTxSeriali input.setScriptSig(inputScript); } else { input.setScriptSig(ScriptBuilder.createEmpty()); - TransactionWitness witness = TransactionWitness.redeemP2WSH(redeemScript, arbitratorTxSig, tradersTxSig); - input.setWitness(witness); + input.setWitness(TransactionWitness.redeemP2WSH(redeemScript, arbitratorTxSig, tradersTxSig)); } WalletService.printTx("disputed payoutTx", payoutTx); WalletService.verifyTransaction(payoutTx); @@ -1077,14 +1072,14 @@ public Transaction traderSignAndFinalizeDisputedPayoutTx(byte[] depositTxSeriali /////////////////////////////////////////////////////////////////////////////////////////// public Tuple2 emergencyBuildPayoutTxFrom2of2MultiSig(String depositTxHex, - Coin buyerPayoutAmount, - Coin sellerPayoutAmount, - Coin txFee, - String buyerAddressString, - String sellerAddressString, - String buyerPubKeyAsHex, - String sellerPubKeyAsHex, - boolean hashedMultiSigOutputIsLegacy) { + Coin buyerPayoutAmount, + Coin sellerPayoutAmount, + Coin txFee, + String buyerAddressString, + String sellerAddressString, + String buyerPubKeyAsHex, + String sellerPubKeyAsHex, + boolean hashedMultiSigOutputIsLegacy) { byte[] buyerPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(buyerPubKeyAsHex)).getPubKey(); byte[] sellerPubKey = ECKey.fromPublicOnly(Utils.HEX.decode(sellerPubKeyAsHex)).getPubKey(); Script redeemScript = get2of2MultiSigRedeemScript(buyerPubKey, sellerPubKey); @@ -1105,7 +1100,10 @@ public Tuple2 emergencyBuildPayoutTxFrom2of2MultiSig(String depo return new Tuple2<>(redeemScriptHex, unsignedTxHex); } - public String emergencyGenerateSignature(String rawTxHex, String redeemScriptHex, Coin inputValue, String myPrivKeyAsHex) + public String emergencyGenerateSignature(String rawTxHex, + String redeemScriptHex, + Coin inputValue, + String myPrivKeyAsHex) throws IllegalArgumentException { boolean hashedMultiSigOutputIsLegacy = true; if (rawTxHex.startsWith("010000000001")) @@ -1129,10 +1127,10 @@ public String emergencyGenerateSignature(String rawTxHex, String redeemScriptHex } public Tuple2 emergencyApplySignatureToPayoutTxFrom2of2MultiSig(String unsignedTxHex, - String redeemScriptHex, - String buyerSignatureAsHex, - String sellerSignatureAsHex, - boolean hashedMultiSigOutputIsLegacy) + String redeemScriptHex, + String buyerSignatureAsHex, + String sellerSignatureAsHex, + boolean hashedMultiSigOutputIsLegacy) throws AddressFormatException, SignatureDecodeException { Transaction payoutTx = new Transaction(params, Utils.HEX.decode(unsignedTxHex)); TransactionSignature buyerTxSig = TransactionSignature.decodeFromBitcoin(Utils.HEX.decode(buyerSignatureAsHex), true, true); @@ -1146,8 +1144,7 @@ public Tuple2 emergencyApplySignatureToPayoutTxFrom2of2MultiSig( input.setScriptSig(inputScript); } else { input.setScriptSig(ScriptBuilder.createEmpty()); - TransactionWitness witness = TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig); - input.setWitness(witness); + input.setWitness(TransactionWitness.redeemP2WSH(redeemScript, sellerTxSig, buyerTxSig)); } String txId = payoutTx.getTxId().toString(); String signedTxHex = Utils.HEX.encode(payoutTx.bitcoinSerialize(!hashedMultiSigOutputIsLegacy)); @@ -1207,7 +1204,12 @@ public Transaction getClonedTransaction(Transaction tx) { // Private methods /////////////////////////////////////////////////////////////////////////////////////////// - private RawTransactionInput getRawInputFromTransactionInput(@NotNull TransactionInput input) { + // This method might be replace by RawTransactionInput constructor taking the TransactionInput as param. + // As we used segwit=false for the bitcoinSerialize method here we still keep it to not risk to break anything, + // though it very likely should be fine to replace it with the RawTransactionInput constructor call. + @Deprecated + private RawTransactionInput getRawInputFromTransactionInput(TransactionInput input) { + checkNotNull(input, "input must not be null"); checkNotNull(input.getConnectedOutput(), "input.getConnectedOutput() must not be null"); checkNotNull(input.getConnectedOutput().getParentTransaction(), "input.getConnectedOutput().getParentTransaction() must not be null"); @@ -1222,10 +1224,13 @@ private RawTransactionInput getRawInputFromTransactionInput(@NotNull Transaction input.getValue().value); } - private TransactionInput getTransactionInput(Transaction depositTx, + private TransactionInput getTransactionInput(Transaction parentTransaction, byte[] scriptProgram, RawTransactionInput rawTransactionInput) { - return new TransactionInput(params, depositTx, scriptProgram, getConnectedOutPoint(rawTransactionInput), + return new TransactionInput(params, + parentTransaction, + scriptProgram, + getConnectedOutPoint(rawTransactionInput), Coin.valueOf(rawTransactionInput.value)); } @@ -1239,7 +1244,6 @@ public boolean isP2WH(RawTransactionInput rawTransactionInput) { checkNotNull(getConnectedOutPoint(rawTransactionInput).getConnectedOutput()).getScriptPubKey()); } - // TODO: Once we have removed legacy arbitrator from dispute domain we can remove that method as well. // Atm it is still used by traderSignAndFinalizeDisputedPayoutTx which is used by ArbitrationManager. diff --git a/core/src/main/java/bisq/core/btc/wallet/WalletService.java b/core/src/main/java/bisq/core/btc/wallet/WalletService.java index 0b893e470a8..93708c79c09 100644 --- a/core/src/main/java/bisq/core/btc/wallet/WalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/WalletService.java @@ -102,6 +102,7 @@ import javax.annotation.Nullable; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; @@ -278,6 +279,31 @@ public static void checkScriptSig(Transaction transaction, // Sign tx /////////////////////////////////////////////////////////////////////////////////////////// + public static void signTx(Wallet wallet, + KeyParameter aesKey, + Transaction tx) + throws WalletException, TransactionVerificationException { + for (int i = 0; i < tx.getInputs().size(); i++) { + TransactionInput input = tx.getInput(i); + TransactionOutput connectedOutput = input.getConnectedOutput(); + if (connectedOutput == null) { + log.error("connectedOutput is null"); + continue; + } + if (!connectedOutput.isMine(wallet)) { + log.error("connectedOutput is not mine"); + continue; + } + + signTransactionInput(wallet, aesKey, tx, input, i); + checkScriptSig(tx, input, i); + } + + checkWalletConsistency(wallet); + verifyTransaction(tx); + printTx("Signed Tx", tx); + } + public static void signTransactionInput(Wallet wallet, KeyParameter aesKey, Transaction tx, @@ -357,12 +383,13 @@ public static void signTransactionInput(Wallet wallet, txIn.setScriptSig(ScriptBuilder.createEmpty()); txIn.setWitness(TransactionWitness.redeemP2WPKH(txSig, key)); } catch (ECKey.KeyIsEncryptedException e1) { + log.error(e1.toString()); throw e1; } catch (ECKey.MissingPrivateKeyException e1) { log.warn("No private key in keypair for input {}", index); } } else { - // log.error("Unexpected script type."); + log.error("Unexpected script type."); throw new RuntimeException("Unexpected script type."); } } else { @@ -374,6 +401,23 @@ public static void signTransactionInput(Wallet wallet, } + /////////////////////////////////////////////////////////////////////////////////////////// + // Dust + /////////////////////////////////////////////////////////////////////////////////////////// + + public static void verifyNonDustTxo(Transaction tx) { + for (TransactionOutput txo : tx.getOutputs()) { + Coin value = txo.getValue(); + // OpReturn outputs have value 0 + if (value.isPositive()) { + checkArgument(Restrictions.isAboveDust(txo.getValue()), + "An output value is below dust limit. Transaction=" + tx); + } + } + + } + + /////////////////////////////////////////////////////////////////////////////////////////// // Broadcast tx /////////////////////////////////////////////////////////////////////////////////////////// @@ -482,7 +526,7 @@ private TransactionConfidence getMostRecentConfidence(List tx != null && tx.getTxId().toString() != null && txConfidenceListener != null && - tx.getTxId().toString().equals(txConfidenceListener.getTxID())) + tx.getTxId().toString().equals(txConfidenceListener.getTxId())) .forEach(txConfidenceListener -> txConfidenceListener.onTransactionConfidenceChanged(tx.getConfidence())); } @@ -859,7 +908,7 @@ void notifyBalanceListeners(Transaction tx) { if (balanceListener.getAddress() != null) balance = getBalanceForAddress(balanceListener.getAddress()); else - balance = getAvailableConfirmedBalance(); + balance = getAvailableBalance(); balanceListener.onBalanceChanged(balance, tx); } diff --git a/core/src/main/java/bisq/core/dao/DaoFacade.java b/core/src/main/java/bisq/core/dao/DaoFacade.java index 8adfe466a26..2d1ac71601c 100644 --- a/core/src/main/java/bisq/core/dao/DaoFacade.java +++ b/core/src/main/java/bisq/core/dao/DaoFacade.java @@ -60,6 +60,7 @@ import bisq.core.dao.state.model.blockchain.Block; import bisq.core.dao.state.model.blockchain.Tx; import bisq.core.dao.state.model.blockchain.TxOutput; +import bisq.core.dao.state.model.blockchain.TxOutputKey; import bisq.core.dao.state.model.blockchain.TxType; import bisq.core.dao.state.model.governance.Ballot; import bisq.core.dao.state.model.governance.BondedRoleType; @@ -649,6 +650,14 @@ public Set getUnspentTxOutputs() { return daoStateService.getUnspentTxOutputs(); } + public boolean isTxOutputSpendable(TxOutputKey txOutputKey) { + return daoStateService.isTxOutputSpendable(txOutputKey); + } + + public long getUnspentTxOutputValue(TxOutputKey key) { + return daoStateService.getUnspentTxOutputValue(key); + } + public int getNumTxs() { return daoStateService.getNumTxs(); } @@ -796,4 +805,8 @@ public Set getAllDonationAddresses() { return allPastParamValues; } + + public boolean isParseBlockChainComplete() { + return daoStateService.isParseBlockChainComplete(); + } } diff --git a/core/src/main/java/bisq/core/dao/governance/asset/AssetService.java b/core/src/main/java/bisq/core/dao/governance/asset/AssetService.java index 0a6843a6447..6db225836cf 100644 --- a/core/src/main/java/bisq/core/dao/governance/asset/AssetService.java +++ b/core/src/main/java/bisq/core/dao/governance/asset/AssetService.java @@ -205,7 +205,7 @@ public Transaction payFee(StatefulAsset statefulAsset, // We add the BTC inputs for the miner fee. Transaction txWithBtcFee = btcWalletService.completePreparedBurnBsqTx(preparedBurnFeeTx, opReturnData); // We sign the BSQ inputs of the final tx. - Transaction transaction = bsqWalletService.signTx(txWithBtcFee); + Transaction transaction = bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); log.info("Asset listing fee tx: " + transaction); return transaction; } catch (WalletException | TransactionVerificationException e) { diff --git a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java index d0edacc099f..c0eb65001cc 100644 --- a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java +++ b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java @@ -356,7 +356,7 @@ private Transaction getBlindVoteTx(Coin stake, Coin fee, byte[] opReturnData) throws InsufficientMoneyException, WalletException, TransactionVerificationException { Transaction preparedTx = bsqWalletService.getPreparedBlindVoteTx(fee, stake); Transaction txWithBtcFee = btcWalletService.completePreparedBlindVoteTx(preparedTx, opReturnData); - return bsqWalletService.signTx(txWithBtcFee); + return bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); } private void maybeRePublishMyBlindVote() { diff --git a/core/src/main/java/bisq/core/dao/governance/bond/lockup/LockupTxService.java b/core/src/main/java/bisq/core/dao/governance/bond/lockup/LockupTxService.java index 901793c74de..eb8772b0ec3 100644 --- a/core/src/main/java/bisq/core/dao/governance/bond/lockup/LockupTxService.java +++ b/core/src/main/java/bisq/core/dao/governance/bond/lockup/LockupTxService.java @@ -104,7 +104,7 @@ private Transaction getLockupTx(Coin lockupAmount, int lockTime, LockupReason lo byte[] opReturnData = BondConsensus.getLockupOpReturnData(lockTime, lockupReason, hash); Transaction preparedTx = bsqWalletService.getPreparedLockupTx(lockupAmount); Transaction txWithBtcFee = btcWalletService.completePreparedBsqTx(preparedTx, opReturnData); - Transaction transaction = bsqWalletService.signTx(txWithBtcFee); + Transaction transaction = bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); log.info("Lockup tx: " + transaction); return transaction; } diff --git a/core/src/main/java/bisq/core/dao/governance/bond/unlock/UnlockTxService.java b/core/src/main/java/bisq/core/dao/governance/bond/unlock/UnlockTxService.java index a4c6691cf67..2afa7b06640 100644 --- a/core/src/main/java/bisq/core/dao/governance/bond/unlock/UnlockTxService.java +++ b/core/src/main/java/bisq/core/dao/governance/bond/unlock/UnlockTxService.java @@ -104,7 +104,7 @@ private Transaction getUnlockTx(String lockupTxId) TxOutput lockupTxOutput = optionalLockupTxOutput.get(); Transaction preparedTx = bsqWalletService.getPreparedUnlockTx(lockupTxOutput); Transaction txWithBtcFee = btcWalletService.completePreparedBsqTx(preparedTx, null); - Transaction transaction = bsqWalletService.signTx(txWithBtcFee); + Transaction transaction = bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); log.info("Unlock tx: " + transaction); return transaction; } diff --git a/core/src/main/java/bisq/core/dao/governance/proofofburn/ProofOfBurnService.java b/core/src/main/java/bisq/core/dao/governance/proofofburn/ProofOfBurnService.java index 47125ad1552..febcb8b4495 100644 --- a/core/src/main/java/bisq/core/dao/governance/proofofburn/ProofOfBurnService.java +++ b/core/src/main/java/bisq/core/dao/governance/proofofburn/ProofOfBurnService.java @@ -140,7 +140,7 @@ public Transaction burn(String preImageAsString, long amount) throws Insufficien // We add the BTC inputs for the miner fee. Transaction txWithBtcFee = btcWalletService.completePreparedBurnBsqTx(preparedBurnFeeTx, opReturnData); // We sign the BSQ inputs of the final tx. - Transaction transaction = bsqWalletService.signTx(txWithBtcFee); + Transaction transaction = bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); log.info("Proof of burn tx: " + transaction); return transaction; } catch (WalletException | TransactionVerificationException e) { diff --git a/core/src/main/java/bisq/core/dao/governance/proposal/BaseProposalFactory.java b/core/src/main/java/bisq/core/dao/governance/proposal/BaseProposalFactory.java index 53c2967feb6..6c634a6c133 100644 --- a/core/src/main/java/bisq/core/dao/governance/proposal/BaseProposalFactory.java +++ b/core/src/main/java/bisq/core/dao/governance/proposal/BaseProposalFactory.java @@ -99,7 +99,7 @@ private Transaction createTransaction(R proposal) throws InsufficientMoneyExcept Transaction txWithBtcFee = completeTx(preparedBurnFeeTx, opReturnData, proposal); // We sign the BSQ inputs of the final tx. - Transaction transaction = bsqWalletService.signTx(txWithBtcFee); + Transaction transaction = bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); log.info("Proposal tx: " + transaction); return transaction; } catch (WalletException | TransactionVerificationException e) { diff --git a/core/src/main/java/bisq/core/dao/governance/votereveal/VoteRevealService.java b/core/src/main/java/bisq/core/dao/governance/votereveal/VoteRevealService.java index 94b4f0b9a67..b02c03ba370 100644 --- a/core/src/main/java/bisq/core/dao/governance/votereveal/VoteRevealService.java +++ b/core/src/main/java/bisq/core/dao/governance/votereveal/VoteRevealService.java @@ -270,6 +270,6 @@ private Transaction getVoteRevealTx(TxOutput stakeTxOutput, byte[] opReturnData) throws InsufficientMoneyException, WalletException, TransactionVerificationException { Transaction preparedTx = bsqWalletService.getPreparedVoteRevealTx(stakeTxOutput); Transaction txWithBtcFee = btcWalletService.completePreparedVoteRevealTx(preparedTx, opReturnData); - return bsqWalletService.signTx(txWithBtcFee); + return bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); } } diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateService.java b/core/src/main/java/bisq/core/dao/state/DaoStateService.java index bc75fb3602f..e3869e06bec 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateService.java @@ -21,6 +21,7 @@ import bisq.core.dao.governance.bond.BondConsensus; import bisq.core.dao.governance.param.Param; import bisq.core.dao.state.model.DaoState; +import bisq.core.dao.state.model.blockchain.BaseTxOutput; import bisq.core.dao.state.model.blockchain.Block; import bisq.core.dao.state.model.blockchain.SpentInfo; import bisq.core.dao.state.model.blockchain.Tx; @@ -484,6 +485,12 @@ public Optional getUnspentTxOutput(TxOutputKey key) { return Optional.ofNullable(getUnspentTxOutputMap().getOrDefault(key, null)); } + public long getUnspentTxOutputValue(TxOutputKey key) { + return getUnspentTxOutput(key) + .map(BaseTxOutput::getValue) + .orElse(0L); + } + public boolean isTxOutputSpendable(TxOutputKey key) { if (!isUnspent(key)) return false; @@ -492,7 +499,12 @@ public boolean isTxOutputSpendable(TxOutputKey key) { // The above isUnspent call satisfies optionalTxOutput.isPresent() checkArgument(optionalTxOutput.isPresent(), "optionalTxOutput must be present"); TxOutput txOutput = optionalTxOutput.get(); + return isTxOutputSpendable(txOutput); + } + public boolean isTxOutputSpendable(TxOutput txOutput) { + // OP_RETURN_OUTPUTs are actually not spendable but as we have no value on them + // they would not be used anyway. switch (txOutput.getTxOutputType()) { case UNDEFINED_OUTPUT: return false; diff --git a/core/src/main/java/bisq/core/filter/Filter.java b/core/src/main/java/bisq/core/filter/Filter.java index be43c3f7465..b5fb27e9319 100644 --- a/core/src/main/java/bisq/core/filter/Filter.java +++ b/core/src/main/java/bisq/core/filter/Filter.java @@ -39,13 +39,15 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import lombok.Value; +import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import javax.annotation.Nullable; @Slf4j -@Value +@Getter +@EqualsAndHashCode public final class Filter implements ProtectedStoragePayload, ExpirablePayload { public static final long TTL = TimeUnit.DAYS.toMillis(180); diff --git a/core/src/main/java/bisq/core/filter/FilterManager.java b/core/src/main/java/bisq/core/filter/FilterManager.java index 472ba4bfcfb..3d0768b8965 100644 --- a/core/src/main/java/bisq/core/filter/FilterManager.java +++ b/core/src/main/java/bisq/core/filter/FilterManager.java @@ -499,13 +499,13 @@ private void onFilterAddedFromNetwork(Filter newFilter) { if (currentFilter != null) { if (currentFilter.getCreationDate() > newFilter.getCreationDate()) { - log.warn("We received a new filter from the network but the creation date is older than the " + + log.debug("We received a new filter from the network but the creation date is older than the " + "filter we have already. We ignore the new filter."); addToInvalidFilters(newFilter); return; } else { - log.warn("We received a new filter from the network and the creation date is newer than the " + + log.debug("We received a new filter from the network and the creation date is newer than the " + "filter we have already. We ignore the old filter."); addToInvalidFilters(currentFilter); } diff --git a/core/src/main/java/bisq/core/locale/Res.java b/core/src/main/java/bisq/core/locale/Res.java index cec006aff0d..5bd882f1769 100644 --- a/core/src/main/java/bisq/core/locale/Res.java +++ b/core/src/main/java/bisq/core/locale/Res.java @@ -120,13 +120,13 @@ public static String get(String key) { .replace("bitcoin", baseCurrencyNameLowerCase); } catch (MissingResourceException e) { log.warn("Missing resource for key: {}", key); - e.printStackTrace(); - if (DevEnv.isDevMode()) + if (DevEnv.isDevMode()) { + e.printStackTrace(); UserThread.runAfter(() -> { // We delay a bit to not throw while UI is not ready throw new RuntimeException("Missing resource for key: " + key); }, 1); - + } return key; } } diff --git a/core/src/main/java/bisq/core/notifications/alerts/TradeEvents.java b/core/src/main/java/bisq/core/notifications/alerts/TradeEvents.java index 7bfe9556930..d0565d4db2f 100644 --- a/core/src/main/java/bisq/core/notifications/alerts/TradeEvents.java +++ b/core/src/main/java/bisq/core/notifications/alerts/TradeEvents.java @@ -21,8 +21,8 @@ import bisq.core.notifications.MobileMessage; import bisq.core.notifications.MobileMessageType; import bisq.core.notifications.MobileNotificationService; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.crypto.KeyRing; import bisq.common.crypto.PubKeyRing; diff --git a/core/src/main/java/bisq/core/notifications/alerts/market/MarketAlerts.java b/core/src/main/java/bisq/core/notifications/alerts/market/MarketAlerts.java index bd170c08792..6f25f2782a2 100644 --- a/core/src/main/java/bisq/core/notifications/alerts/market/MarketAlerts.java +++ b/core/src/main/java/bisq/core/notifications/alerts/market/MarketAlerts.java @@ -26,7 +26,7 @@ import bisq.core.notifications.MobileNotificationService; import bisq.core.offer.Offer; import bisq.core.offer.OfferBookService; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; import bisq.core.user.User; @@ -109,7 +109,7 @@ private void applyFilterOnAllOffers() { // % price get multiplied by 10000 to have 0.12% be converted to 12. For fixed price we have precision of 8 for // altcoins and precision of 4 for fiat. private String getAlertId(Offer offer) { - double price = offer.isUseMarketBasedPrice() ? offer.getMarketPriceMargin() * 10000 : offer.getOfferPayload().getPrice(); + double price = offer.isUseMarketBasedPrice() ? offer.getMarketPriceMargin() * 10000 : offer.getFixedPrice(); String priceString = String.valueOf((long) price); return offer.getId() + "|" + priceString; } @@ -119,7 +119,7 @@ private void onOfferAdded(Offer offer) { MarketPrice marketPrice = priceFeedService.getMarketPrice(currencyCode); Price offerPrice = offer.getPrice(); if (marketPrice != null && offerPrice != null) { - boolean isSellOffer = offer.getDirection() == OfferPayload.Direction.SELL; + boolean isSellOffer = offer.getDirection() == OfferDirection.SELL; String shortOfferId = offer.getShortId(); boolean isFiatCurrency = CurrencyUtil.isFiatCurrency(currencyCode); String alertId = getAlertId(offer); diff --git a/core/src/main/java/bisq/core/offer/Offer.java b/core/src/main/java/bisq/core/offer/Offer.java index 05305dadf0d..70f2afe5704 100644 --- a/core/src/main/java/bisq/core/offer/Offer.java +++ b/core/src/main/java/bisq/core/offer/Offer.java @@ -24,6 +24,8 @@ import bisq.core.monetary.Volume; import bisq.core.offer.availability.OfferAvailabilityModel; import bisq.core.offer.availability.OfferAvailabilityProtocol; +import bisq.core.offer.bisq_v1.MarketPriceNotAvailableException; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.payment.payload.PaymentMethod; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; @@ -75,7 +77,6 @@ public class Offer implements NetworkPayload, PersistablePayload { // from one provider. private final static double PRICE_TOLERANCE = 0.01; - /////////////////////////////////////////////////////////////////////////////////////////// // Enums /////////////////////////////////////////////////////////////////////////////////////////// @@ -94,7 +95,7 @@ public enum State { /////////////////////////////////////////////////////////////////////////////////////////// @Getter - private final OfferPayload offerPayload; + private final OfferPayloadBase offerPayloadBase; @JsonExclude @Getter final transient private ObjectProperty stateProperty = new SimpleObjectProperty<>(Offer.State.UNKNOWN); @@ -119,8 +120,8 @@ public enum State { // Constructor /////////////////////////////////////////////////////////////////////////////////////////// - public Offer(OfferPayload offerPayload) { - this.offerPayload = offerPayload; + public Offer(OfferPayloadBase offerPayloadBase) { + this.offerPayloadBase = offerPayloadBase; } @@ -130,7 +131,8 @@ public Offer(OfferPayload offerPayload) { @Override public protobuf.Offer toProtoMessage() { - return protobuf.Offer.newBuilder().setOfferPayload(offerPayload.toProtoMessage().getOfferPayload()).build(); + return protobuf.Offer.newBuilder().setOfferPayload(((OfferPayload) offerPayloadBase) + .toProtoMessage().getOfferPayload()).build(); } public static Offer fromProto(protobuf.Offer proto) { @@ -166,43 +168,53 @@ public void cancelAvailabilityRequest() { @Nullable public Price getPrice() { String currencyCode = getCurrencyCode(); - if (offerPayload.isUseMarketBasedPrice()) { - checkNotNull(priceFeedService, "priceFeed must not be null"); - MarketPrice marketPrice = priceFeedService.getMarketPrice(currencyCode); - if (marketPrice != null && marketPrice.isRecentExternalPriceAvailable()) { - double factor; - double marketPriceMargin = offerPayload.getMarketPriceMargin(); - if (CurrencyUtil.isCryptoCurrency(currencyCode)) { - factor = getDirection() == OfferPayload.Direction.SELL ? - 1 - marketPriceMargin : 1 + marketPriceMargin; - } else { - factor = getDirection() == OfferPayload.Direction.BUY ? - 1 - marketPriceMargin : 1 + marketPriceMargin; - } - double marketPriceAsDouble = marketPrice.getPrice(); - double targetPriceAsDouble = marketPriceAsDouble * factor; - try { - int precision = CurrencyUtil.isCryptoCurrency(currencyCode) ? - Altcoin.SMALLEST_UNIT_EXPONENT : - Fiat.SMALLEST_UNIT_EXPONENT; - double scaled = MathUtils.scaleUpByPowerOf10(targetPriceAsDouble, precision); - final long roundedToLong = MathUtils.roundDoubleToLong(scaled); - return Price.valueOf(currencyCode, roundedToLong); - } catch (Exception e) { - log.error("Exception at getPrice / parseToFiat: " + e.toString() + "\n" + - "That case should never happen."); - return null; - } + Optional optionalOfferPayload = getOfferPayload(); + if (!optionalOfferPayload.isPresent()) { + return Price.valueOf(currencyCode, offerPayloadBase.getPrice()); + } + + OfferPayload offerPayload = optionalOfferPayload.get(); + if (!offerPayload.isUseMarketBasedPrice()) { + return Price.valueOf(currencyCode, offerPayloadBase.getPrice()); + } + + checkNotNull(priceFeedService, "priceFeed must not be null"); + MarketPrice marketPrice = priceFeedService.getMarketPrice(currencyCode); + if (marketPrice != null && marketPrice.isRecentExternalPriceAvailable()) { + double factor; + double marketPriceMargin = offerPayload.getMarketPriceMargin(); + if (CurrencyUtil.isCryptoCurrency(currencyCode)) { + factor = getDirection() == OfferDirection.SELL ? + 1 - marketPriceMargin : 1 + marketPriceMargin; } else { - log.trace("We don't have a market price. " + - "That case could only happen if you don't have a price feed."); + factor = getDirection() == OfferDirection.BUY ? + 1 - marketPriceMargin : 1 + marketPriceMargin; + } + double marketPriceAsDouble = marketPrice.getPrice(); + double targetPriceAsDouble = marketPriceAsDouble * factor; + try { + int precision = CurrencyUtil.isCryptoCurrency(currencyCode) ? + Altcoin.SMALLEST_UNIT_EXPONENT : + Fiat.SMALLEST_UNIT_EXPONENT; + double scaled = MathUtils.scaleUpByPowerOf10(targetPriceAsDouble, precision); + final long roundedToLong = MathUtils.roundDoubleToLong(scaled); + return Price.valueOf(currencyCode, roundedToLong); + } catch (Exception e) { + log.error("Exception at getPrice / parseToFiat: " + e + "\n" + + "That case should never happen."); return null; } } else { - return Price.valueOf(currencyCode, offerPayload.getPrice()); + log.trace("We don't have a market price. " + + "That case could only happen if you don't have a price feed."); + return null; } } + public long getFixedPrice() { + return offerPayloadBase.getPrice(); + } + public void checkTradePriceTolerance(long takersTradePrice) throws TradePriceOutOfToleranceException, MarketPriceNotAvailableException, IllegalArgumentException { Price tradePrice = Price.valueOf(getCurrencyCode(), takersTradePrice); @@ -234,17 +246,16 @@ public void checkTradePriceTolerance(long takersTradePrice) throws TradePriceOut @Nullable public Volume getVolumeByAmount(Coin amount) { Price price = getPrice(); - if (price != null && amount != null) { - Volume volumeByAmount = price.getVolumeByAmount(amount); - if (offerPayload.getPaymentMethodId().equals(PaymentMethod.HAL_CASH_ID)) - volumeByAmount = VolumeUtil.getAdjustedVolumeForHalCash(volumeByAmount); - else if (CurrencyUtil.isFiatCurrency(offerPayload.getCurrencyCode())) - volumeByAmount = VolumeUtil.getRoundedFiatVolume(volumeByAmount); - - return volumeByAmount; - } else { + if (price == null || amount == null) { return null; } + Volume volumeByAmount = price.getVolumeByAmount(amount); + if (offerPayloadBase.getPaymentMethodId().equals(PaymentMethod.HAL_CASH_ID)) + volumeByAmount = VolumeUtil.getAdjustedVolumeForHalCash(volumeByAmount); + else if (CurrencyUtil.isFiatCurrency(offerPayloadBase.getCurrencyCode())) + volumeByAmount = VolumeUtil.getRoundedFiatVolume(volumeByAmount); + + return volumeByAmount; } public void resetState() { @@ -265,7 +276,7 @@ public ObjectProperty stateProperty() { } public void setOfferFeePaymentTxId(String offerFeePaymentTxID) { - offerPayload.setOfferFeePaymentTxId(offerFeePaymentTxID); + getOfferPayload().ifPresent(p -> p.setOfferFeePaymentTxId(offerFeePaymentTxID)); } public void setErrorMessage(String errorMessage) { @@ -279,52 +290,52 @@ public void setErrorMessage(String errorMessage) { // converted payload properties public Coin getTxFee() { - return Coin.valueOf(offerPayload.getTxFee()); + return Coin.valueOf(getOfferPayload().map(OfferPayload::getTxFee).orElse(0L)); } public Coin getMakerFee() { - return Coin.valueOf(offerPayload.getMakerFee()); + return getOfferPayload().map(OfferPayload::getMakerFee).map(Coin::valueOf).orElse(Coin.ZERO); } public boolean isCurrencyForMakerFeeBtc() { - return offerPayload.isCurrencyForMakerFeeBtc(); + return getOfferPayload().map(OfferPayload::isCurrencyForMakerFeeBtc).orElse(false); } public Coin getBuyerSecurityDeposit() { - return Coin.valueOf(offerPayload.getBuyerSecurityDeposit()); + return Coin.valueOf(getOfferPayload().map(OfferPayload::getBuyerSecurityDeposit).orElse(0L)); } public Coin getSellerSecurityDeposit() { - return Coin.valueOf(offerPayload.getSellerSecurityDeposit()); + return Coin.valueOf(getOfferPayload().map(OfferPayload::getSellerSecurityDeposit).orElse(0L)); } public Coin getMaxTradeLimit() { - return Coin.valueOf(offerPayload.getMaxTradeLimit()); + return getOfferPayload().map(OfferPayload::getMaxTradeLimit).map(Coin::valueOf).orElse(Coin.ZERO); } public Coin getAmount() { - return Coin.valueOf(offerPayload.getAmount()); + return Coin.valueOf(offerPayloadBase.getAmount()); } public Coin getMinAmount() { - return Coin.valueOf(offerPayload.getMinAmount()); + return Coin.valueOf(offerPayloadBase.getMinAmount()); } public boolean isRange() { - return offerPayload.getAmount() != offerPayload.getMinAmount(); + return offerPayloadBase.getAmount() != offerPayloadBase.getMinAmount(); } public Date getDate() { - return new Date(offerPayload.getDate()); + return new Date(offerPayloadBase.getDate()); } public PaymentMethod getPaymentMethod() { - return PaymentMethod.getPaymentMethodById(offerPayload.getPaymentMethodId()); + return PaymentMethod.getPaymentMethodById(offerPayloadBase.getPaymentMethodId()); } // utils public String getShortId() { - return Utilities.getShortId(offerPayload.getId()); + return Utilities.getShortId(offerPayloadBase.getId()); } @Nullable @@ -338,18 +349,17 @@ public Volume getMinVolume() { } public boolean isBuyOffer() { - return getDirection() == OfferPayload.Direction.BUY; + return getDirection() == OfferDirection.BUY; } - public OfferPayload.Direction getMirroredDirection() { - return getDirection() == OfferPayload.Direction.BUY ? OfferPayload.Direction.SELL : OfferPayload.Direction.BUY; + public OfferDirection getMirroredDirection() { + return getDirection() == OfferDirection.BUY ? OfferDirection.SELL : OfferDirection.BUY; } public boolean isMyOffer(KeyRing keyRing) { return getPubKeyRing().equals(keyRing.getPubKeyRing()); } - public Optional getAccountAgeWitnessHashAsHex() { Map extraDataMap = getExtraDataMap(); if (extraDataMap != null && extraDataMap.containsKey(OfferPayload.ACCOUNT_AGE_WITNESS_HASH)) @@ -400,32 +410,32 @@ public String getErrorMessage() { // Delegate Getter (boilerplate code generated via IntelliJ generate delegate feature) /////////////////////////////////////////////////////////////////////////////////////////// - public OfferPayload.Direction getDirection() { - return offerPayload.getDirection(); + public OfferDirection getDirection() { + return offerPayloadBase.getDirection(); } public String getId() { - return offerPayload.getId(); + return offerPayloadBase.getId(); } @Nullable public List getAcceptedBankIds() { - return offerPayload.getAcceptedBankIds(); + return getOfferPayload().map(OfferPayload::getAcceptedBankIds).orElse(null); } @Nullable public String getBankId() { - return offerPayload.getBankId(); + return getOfferPayload().map(OfferPayload::getBankId).orElse(null); } @Nullable public List getAcceptedCountryCodes() { - return offerPayload.getAcceptedCountryCodes(); + return getOfferPayload().map(OfferPayload::getAcceptedCountryCodes).orElse(null); } @Nullable public String getCountryCode() { - return offerPayload.getCountryCode(); + return getOfferPayload().map(OfferPayload::getCountryCode).orElse(null); } public String getCurrencyCode() { @@ -433,89 +443,80 @@ public String getCurrencyCode() { return currencyCode; } - currencyCode = offerPayload.getBaseCurrencyCode().equals("BTC") ? - offerPayload.getCounterCurrencyCode() : - offerPayload.getBaseCurrencyCode(); + currencyCode = getBaseCurrencyCode().equals("BTC") ? + getCounterCurrencyCode() : + getBaseCurrencyCode(); return currencyCode; } + public String getCounterCurrencyCode() { + return offerPayloadBase.getCounterCurrencyCode(); + } + + public String getBaseCurrencyCode() { + return offerPayloadBase.getBaseCurrencyCode(); + } + + public String getPaymentMethodId() { + return offerPayloadBase.getPaymentMethodId(); + } + public long getProtocolVersion() { - return offerPayload.getProtocolVersion(); + return offerPayloadBase.getProtocolVersion(); } public boolean isUseMarketBasedPrice() { - return offerPayload.isUseMarketBasedPrice(); + return getOfferPayload().map(OfferPayload::isUseMarketBasedPrice).orElse(false); } public double getMarketPriceMargin() { - return offerPayload.getMarketPriceMargin(); + return getOfferPayload().map(OfferPayload::getMarketPriceMargin).orElse(0D); } public NodeAddress getMakerNodeAddress() { - return offerPayload.getOwnerNodeAddress(); + return offerPayloadBase.getOwnerNodeAddress(); } public PubKeyRing getPubKeyRing() { - return offerPayload.getPubKeyRing(); + return offerPayloadBase.getPubKeyRing(); } public String getMakerPaymentAccountId() { - return offerPayload.getMakerPaymentAccountId(); + return offerPayloadBase.getMakerPaymentAccountId(); } public String getOfferFeePaymentTxId() { - return offerPayload.getOfferFeePaymentTxId(); + return getOfferPayload().map(OfferPayload::getOfferFeePaymentTxId).orElse(null); } public String getVersionNr() { - return offerPayload.getVersionNr(); + return offerPayloadBase.getVersionNr(); } public long getMaxTradePeriod() { - return offerPayload.getMaxTradePeriod(); + return getOfferPayload().map(OfferPayload::getMaxTradePeriod).orElse(0L); } public NodeAddress getOwnerNodeAddress() { - return offerPayload.getOwnerNodeAddress(); + return offerPayloadBase.getOwnerNodeAddress(); } // Yet unused public PublicKey getOwnerPubKey() { - return offerPayload.getOwnerPubKey(); + return offerPayloadBase.getOwnerPubKey(); } @Nullable public Map getExtraDataMap() { - return offerPayload.getExtraDataMap(); + return offerPayloadBase.getExtraDataMap(); } public boolean isUseAutoClose() { - return offerPayload.isUseAutoClose(); - } - - public long getBlockHeightAtOfferCreation() { - return offerPayload.getBlockHeightAtOfferCreation(); - } - - @Nullable - public String getHashOfChallenge() { - return offerPayload.getHashOfChallenge(); - } - - public boolean isPrivateOffer() { - return offerPayload.isPrivateOffer(); - } - - public long getUpperClosePrice() { - return offerPayload.getUpperClosePrice(); - } - - public long getLowerClosePrice() { - return offerPayload.getLowerClosePrice(); + return getOfferPayload().map(OfferPayload::isUseAutoClose).orElse(false); } public boolean isUseReOpenAfterAutoClose() { - return offerPayload.isUseReOpenAfterAutoClose(); + return getOfferPayload().map(OfferPayload::isUseReOpenAfterAutoClose).orElse(false); } public boolean isXmrAutoConf() { @@ -533,6 +534,17 @@ public boolean isXmr() { return getCurrencyCode().equals("XMR"); } + public Optional getOfferPayload() { + if (offerPayloadBase instanceof OfferPayload) { + return Optional.of((OfferPayload) offerPayloadBase); + } + return Optional.empty(); + } + + public byte[] getOfferPayloadHash() { + return offerPayloadBase.getHash(); + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -540,7 +552,8 @@ public boolean equals(Object o) { Offer offer = (Offer) o; - if (offerPayload != null ? !offerPayload.equals(offer.offerPayload) : offer.offerPayload != null) return false; + if (offerPayloadBase != null ? !offerPayloadBase.equals(offer.offerPayloadBase) : offer.offerPayloadBase != null) + return false; //noinspection SimplifiableIfStatement if (getState() != offer.getState()) return false; return !(getErrorMessage() != null ? !getErrorMessage().equals(offer.getErrorMessage()) : offer.getErrorMessage() != null); @@ -549,7 +562,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - int result = offerPayload != null ? offerPayload.hashCode() : 0; + int result = offerPayloadBase != null ? offerPayloadBase.hashCode() : 0; result = 31 * result + (getState() != null ? getState().hashCode() : 0); result = 31 * result + (getErrorMessage() != null ? getErrorMessage().hashCode() : 0); return result; @@ -560,7 +573,7 @@ public String toString() { return "Offer{" + "getErrorMessage()='" + getErrorMessage() + '\'' + ", state=" + getState() + - ", offerPayload=" + offerPayload + + ", offerPayloadBase=" + offerPayloadBase + '}'; } } diff --git a/core/src/main/java/bisq/core/offer/OfferBookService.java b/core/src/main/java/bisq/core/offer/OfferBookService.java index 71a28280ef7..c736ea75d9f 100644 --- a/core/src/main/java/bisq/core/offer/OfferBookService.java +++ b/core/src/main/java/bisq/core/offer/OfferBookService.java @@ -19,6 +19,7 @@ import bisq.core.filter.FilterManager; import bisq.core.locale.Res; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.provider.price.PriceFeedService; import bisq.network.p2p.BootstrapListener; @@ -87,9 +88,9 @@ public OfferBookService(P2PService p2PService, @Override public void onAdded(Collection protectedStorageEntries) { protectedStorageEntries.forEach(protectedStorageEntry -> offerBookChangedListeners.forEach(listener -> { - if (protectedStorageEntry.getProtectedStoragePayload() instanceof OfferPayload) { - OfferPayload offerPayload = (OfferPayload) protectedStorageEntry.getProtectedStoragePayload(); - Offer offer = new Offer(offerPayload); + if (protectedStorageEntry.getProtectedStoragePayload() instanceof OfferPayloadBase) { + OfferPayloadBase offerPayloadBase = (OfferPayloadBase) protectedStorageEntry.getProtectedStoragePayload(); + Offer offer = new Offer(offerPayloadBase); offer.setPriceFeedService(priceFeedService); listener.onAdded(offer); } @@ -99,9 +100,9 @@ public void onAdded(Collection protectedStorageEntries) { @Override public void onRemoved(Collection protectedStorageEntries) { protectedStorageEntries.forEach(protectedStorageEntry -> offerBookChangedListeners.forEach(listener -> { - if (protectedStorageEntry.getProtectedStoragePayload() instanceof OfferPayload) { - OfferPayload offerPayload = (OfferPayload) protectedStorageEntry.getProtectedStoragePayload(); - Offer offer = new Offer(offerPayload); + if (protectedStorageEntry.getProtectedStoragePayload() instanceof OfferPayloadBase) { + OfferPayloadBase offerPayloadBase = (OfferPayloadBase) protectedStorageEntry.getProtectedStoragePayload(); + Offer offer = new Offer(offerPayloadBase); offer.setPriceFeedService(priceFeedService); listener.onRemoved(offer); } @@ -141,7 +142,7 @@ public void addOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandl return; } - boolean result = p2PService.addProtectedStorageEntry(offer.getOfferPayload()); + boolean result = p2PService.addProtectedStorageEntry(offer.getOfferPayloadBase()); if (result) { resultHandler.handleResult(); } else { @@ -149,7 +150,7 @@ public void addOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHandl } } - public void refreshTTL(OfferPayload offerPayload, + public void refreshTTL(OfferPayloadBase offerPayloadBase, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { if (filterManager.requireUpdateToNewVersionForTrading()) { @@ -157,7 +158,7 @@ public void refreshTTL(OfferPayload offerPayload, return; } - boolean result = p2PService.refreshTTL(offerPayload); + boolean result = p2PService.refreshTTL(offerPayloadBase); if (result) { resultHandler.handleResult(); } else { @@ -171,16 +172,16 @@ public void activateOffer(Offer offer, addOffer(offer, resultHandler, errorMessageHandler); } - public void deactivateOffer(OfferPayload offerPayload, + public void deactivateOffer(OfferPayloadBase offerPayloadBase, @Nullable ResultHandler resultHandler, @Nullable ErrorMessageHandler errorMessageHandler) { - removeOffer(offerPayload, resultHandler, errorMessageHandler); + removeOffer(offerPayloadBase, resultHandler, errorMessageHandler); } - public void removeOffer(OfferPayload offerPayload, + public void removeOffer(OfferPayloadBase offerPayloadBase, @Nullable ResultHandler resultHandler, @Nullable ErrorMessageHandler errorMessageHandler) { - if (p2PService.removeData(offerPayload)) { + if (p2PService.removeData(offerPayloadBase)) { if (resultHandler != null) resultHandler.handleResult(); } else { @@ -191,18 +192,18 @@ public void removeOffer(OfferPayload offerPayload, public List getOffers() { return p2PService.getDataMap().values().stream() - .filter(data -> data.getProtectedStoragePayload() instanceof OfferPayload) + .filter(data -> data.getProtectedStoragePayload() instanceof OfferPayloadBase) .map(data -> { - OfferPayload offerPayload = (OfferPayload) data.getProtectedStoragePayload(); - Offer offer = new Offer(offerPayload); + OfferPayloadBase offerPayloadBase = (OfferPayloadBase) data.getProtectedStoragePayload(); + Offer offer = new Offer(offerPayloadBase); offer.setPriceFeedService(priceFeedService); return offer; }) .collect(Collectors.toList()); } - public void removeOfferAtShutDown(OfferPayload offerPayload) { - removeOffer(offerPayload, null, null); + public void removeOfferAtShutDown(OfferPayloadBase offerPayloadBase) { + removeOffer(offerPayloadBase, null, null); } public boolean isBootstrapped() { diff --git a/core/src/main/java/bisq/core/offer/OfferDirection.java b/core/src/main/java/bisq/core/offer/OfferDirection.java new file mode 100644 index 00000000000..ade5334a887 --- /dev/null +++ b/core/src/main/java/bisq/core/offer/OfferDirection.java @@ -0,0 +1,33 @@ +/* + * 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 bisq.core.offer; + +import bisq.common.proto.ProtoUtil; + +public enum OfferDirection { + BUY, + SELL; + + public static OfferDirection fromProto(protobuf.OfferDirection direction) { + return ProtoUtil.enumFromProto(OfferDirection.class, direction.name()); + } + + public static protobuf.OfferDirection toProtoMessage(OfferDirection direction) { + return protobuf.OfferDirection.valueOf(direction.name()); + } +} diff --git a/core/src/main/java/bisq/core/offer/OfferFilter.java b/core/src/main/java/bisq/core/offer/OfferFilterService.java similarity index 96% rename from core/src/main/java/bisq/core/offer/OfferFilter.java rename to core/src/main/java/bisq/core/offer/OfferFilterService.java index bfd37f2af12..08c64d34cf0 100644 --- a/core/src/main/java/bisq/core/offer/OfferFilter.java +++ b/core/src/main/java/bisq/core/offer/OfferFilterService.java @@ -43,7 +43,7 @@ @Slf4j @Singleton -public class OfferFilter { +public class OfferFilterService { private final User user; private final Preferences preferences; private final FilterManager filterManager; @@ -52,10 +52,10 @@ public class OfferFilter { private final Map myInsufficientTradeLimitCache = new HashMap<>(); @Inject - public OfferFilter(User user, - Preferences preferences, - FilterManager filterManager, - AccountAgeWitnessService accountAgeWitnessService) { + public OfferFilterService(User user, + Preferences preferences, + FilterManager filterManager, + AccountAgeWitnessService accountAgeWitnessService) { this.user = user; this.preferences = preferences; this.filterManager = filterManager; diff --git a/core/src/main/java/bisq/core/offer/OfferForJson.java b/core/src/main/java/bisq/core/offer/OfferForJson.java index afac82ae4e6..1ac2b658b17 100644 --- a/core/src/main/java/bisq/core/offer/OfferForJson.java +++ b/core/src/main/java/bisq/core/offer/OfferForJson.java @@ -40,7 +40,7 @@ public class OfferForJson { private static final Logger log = LoggerFactory.getLogger(OfferForJson.class); - public final OfferPayload.Direction direction; + public final OfferDirection direction; public final String currencyCode; public final long minAmount; public final long amount; @@ -53,7 +53,7 @@ public class OfferForJson { // primaryMarket fields are based on industry standard where primaryMarket is always in the focus (in the app BTC is always in the focus - will be changed in a larger refactoring once) public String currencyPair; - public OfferPayload.Direction primaryMarketDirection; + public OfferDirection primaryMarketDirection; public String priceDisplayString; public String primaryMarketAmountDisplayString; @@ -75,7 +75,7 @@ public class OfferForJson { transient private final MonetaryFormat coinFormat = MonetaryFormat.BTC; - public OfferForJson(OfferPayload.Direction direction, + public OfferForJson(OfferDirection direction, String currencyCode, Coin minAmount, Coin amount, @@ -104,7 +104,7 @@ private void setDisplayStrings() { try { final Price price = getPrice(); if (CurrencyUtil.isCryptoCurrency(currencyCode)) { - primaryMarketDirection = direction == OfferPayload.Direction.BUY ? OfferPayload.Direction.SELL : OfferPayload.Direction.BUY; + primaryMarketDirection = direction == OfferDirection.BUY ? OfferDirection.SELL : OfferDirection.BUY; currencyPair = currencyCode + "/" + Res.getBaseCurrencyCode(); // int precision = 8; diff --git a/core/src/main/java/bisq/core/offer/OfferPayloadBase.java b/core/src/main/java/bisq/core/offer/OfferPayloadBase.java new file mode 100644 index 00000000000..4ce2c8304fc --- /dev/null +++ b/core/src/main/java/bisq/core/offer/OfferPayloadBase.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 bisq.core.offer; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.storage.payload.ExpirablePayload; +import bisq.network.p2p.storage.payload.ProtectedStoragePayload; +import bisq.network.p2p.storage.payload.RequiresOwnerIsOnlinePayload; + +import bisq.common.crypto.Hash; +import bisq.common.crypto.PubKeyRing; +import bisq.common.util.Hex; +import bisq.common.util.JsonExclude; + +import java.security.PublicKey; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +import javax.annotation.Nullable; + +@EqualsAndHashCode(exclude = {"hash"}) +@Getter +public abstract class OfferPayloadBase implements ProtectedStoragePayload, ExpirablePayload, RequiresOwnerIsOnlinePayload { + public static final long TTL = TimeUnit.MINUTES.toMillis(9); + + protected final String id; + protected final long date; + // For fiat offer the baseCurrencyCode is BTC and the counterCurrencyCode is the fiat currency + // For altcoin offers it is the opposite. baseCurrencyCode is the altcoin and the counterCurrencyCode is BTC. + protected final String baseCurrencyCode; + protected final String counterCurrencyCode; + // price if fixed price is used (usePercentageBasedPrice = false), otherwise 0 + protected final long price; + protected final long amount; + protected final long minAmount; + protected final String paymentMethodId; + protected final String makerPaymentAccountId; + protected final NodeAddress ownerNodeAddress; + protected final OfferDirection direction; + protected final String versionNr; + protected final int protocolVersion; + @JsonExclude + protected final PubKeyRing pubKeyRing; + // cache + protected transient byte[] hash; + @Nullable + protected final Map extraDataMap; + + public OfferPayloadBase(String id, + long date, + NodeAddress ownerNodeAddress, + PubKeyRing pubKeyRing, + String baseCurrencyCode, + String counterCurrencyCode, + OfferDirection direction, + long price, + long amount, + long minAmount, + String paymentMethodId, + String makerPaymentAccountId, + @Nullable Map extraDataMap, + String versionNr, + int protocolVersion) { + this.id = id; + this.date = date; + this.ownerNodeAddress = ownerNodeAddress; + this.pubKeyRing = pubKeyRing; + this.baseCurrencyCode = baseCurrencyCode; + this.counterCurrencyCode = counterCurrencyCode; + this.direction = direction; + this.price = price; + this.amount = amount; + this.minAmount = minAmount; + this.paymentMethodId = paymentMethodId; + this.makerPaymentAccountId = makerPaymentAccountId; + this.extraDataMap = extraDataMap; + this.versionNr = versionNr; + this.protocolVersion = protocolVersion; + } + + public byte[] getHash() { + if (this.hash == null) { + this.hash = Hash.getSha256Hash(this.toProtoMessage().toByteArray()); + } + return this.hash; + } + + @Override + public PublicKey getOwnerPubKey() { + return pubKeyRing.getSignaturePubKey(); + } + + // In the offer we support base and counter currency + // Fiat offers have base currency BTC and counterCurrency Fiat + // Altcoins have base currency Altcoin and counterCurrency BTC + // The rest of the app does not support yet that concept of base currency and counter currencies + // so we map here for convenience + public String getCurrencyCode() { + return getBaseCurrencyCode().equals("BTC") ? getCounterCurrencyCode() : getBaseCurrencyCode(); + } + + @Override + public long getTTL() { + return TTL; + } + + @Override + public String toString() { + return "OfferPayloadBase{" + + "\r\n id='" + id + '\'' + + ",\r\n date=" + date + + ",\r\n baseCurrencyCode='" + baseCurrencyCode + '\'' + + ",\r\n counterCurrencyCode='" + counterCurrencyCode + '\'' + + ",\r\n price=" + price + + ",\r\n amount=" + amount + + ",\r\n minAmount=" + minAmount + + ",\r\n paymentMethodId='" + paymentMethodId + '\'' + + ",\r\n makerPaymentAccountId='" + makerPaymentAccountId + '\'' + + ",\r\n ownerNodeAddress=" + ownerNodeAddress + + ",\r\n direction=" + direction + + ",\r\n versionNr='" + versionNr + '\'' + + ",\r\n protocolVersion=" + protocolVersion + + ",\r\n pubKeyRing=" + pubKeyRing + + ",\r\n hash=" + (hash != null ? Hex.encode(hash) : "null") + + ",\r\n extraDataMap=" + extraDataMap + + "\r\n}"; + } +} diff --git a/core/src/main/java/bisq/core/offer/OfferRestrictions.java b/core/src/main/java/bisq/core/offer/OfferRestrictions.java index eec00333d36..04e824c715d 100644 --- a/core/src/main/java/bisq/core/offer/OfferRestrictions.java +++ b/core/src/main/java/bisq/core/offer/OfferRestrictions.java @@ -17,6 +17,8 @@ package bisq.core.offer; +import bisq.core.offer.bisq_v1.OfferPayload; + import bisq.common.app.Capabilities; import bisq.common.app.Capability; import bisq.common.config.Config; @@ -40,7 +42,7 @@ public static boolean requiresNodeAddressUpdate() { public static Coin TOLERATED_SMALL_TRADE_AMOUNT = Coin.parseCoin("0.01"); static boolean hasOfferMandatoryCapability(Offer offer, Capability mandatoryCapability) { - Map extraDataMap = offer.getOfferPayload().getExtraDataMap(); + Map extraDataMap = offer.getExtraDataMap(); if (extraDataMap != null && extraDataMap.containsKey(OfferPayload.CAPABILITIES)) { String commaSeparatedOrdinals = extraDataMap.get(OfferPayload.CAPABILITIES); Capabilities capabilities = Capabilities.fromStringList(commaSeparatedOrdinals); diff --git a/core/src/main/java/bisq/core/offer/OfferUtil.java b/core/src/main/java/bisq/core/offer/OfferUtil.java index fb76a69c89e..c676c57bbdc 100644 --- a/core/src/main/java/bisq/core/offer/OfferUtil.java +++ b/core/src/main/java/bisq/core/offer/OfferUtil.java @@ -25,9 +25,12 @@ import bisq.core.locale.Res; import bisq.core.monetary.Price; import bisq.core.monetary.Volume; +import bisq.core.offer.bisq_v1.MutableOfferPayloadFields; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.payment.CashByMailAccount; import bisq.core.payment.F2FAccount; import bisq.core.payment.PaymentAccount; +import bisq.core.payment.payload.PaymentMethod; import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; @@ -42,8 +45,10 @@ import bisq.network.p2p.P2PService; import bisq.common.app.Capabilities; +import bisq.common.app.Version; import bisq.common.util.MathUtils; import bisq.common.util.Tuple2; +import bisq.common.util.Utilities; import org.bitcoinj.core.Coin; import org.bitcoinj.core.Transaction; @@ -57,6 +62,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.UUID; import java.util.function.Predicate; import lombok.extern.slf4j.Slf4j; @@ -69,7 +75,7 @@ import static bisq.core.btc.wallet.Restrictions.getMinBuyerSecurityDepositAsPercent; import static bisq.core.btc.wallet.Restrictions.getMinNonDustOutput; import static bisq.core.btc.wallet.Restrictions.isDust; -import static bisq.core.offer.OfferPayload.*; +import static bisq.core.offer.bisq_v1.OfferPayload.*; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static java.lang.String.format; @@ -112,6 +118,40 @@ public OfferUtil(AccountAgeWitnessService accountAgeWitnessService, this.tradeStatisticsManager = tradeStatisticsManager; } + public static String getRandomOfferId() { + return Utilities.getRandomPrefix(5, 8) + "-" + + UUID.randomUUID() + "-" + + getStrippedVersion(); + } + + public static String getStrippedVersion() { + return Version.VERSION.replace(".", ""); + } + + // We add a counter at the end of the offer id signalling the number of times that offer has + // been mutated ether due edit or due pow adjustments. + public static String getOfferIdWithMutationCounter(String id) { + String[] split = id.split("-"); + String base = id; + int counter = 0; + if (split.length > 7) { + String counterString = split[7]; + int endIndex = id.length() - counterString.length() - 1; + base = id.substring(0, endIndex); + try { + counter = Integer.parseInt(counterString); + } catch (Exception ignore) { + } + } + counter++; + return base + "-" + counter; + } + + public static String getVersionFromId(String id) { + String[] split = id.split("-"); + return split[6]; + } + public void maybeSetFeePaymentCurrencyPreference(String feeCurrencyCode) { if (!feeCurrencyCode.isEmpty()) { if (!isValidFeePaymentCurrencyCode.test(feeCurrencyCode)) @@ -132,13 +172,13 @@ else if (feeCurrencyCode.equalsIgnoreCase("BTC") && !preferences.isPayFeeInBtc() * @return {@code true} for an offer to buy BTC from the taker, {@code false} for an * offer to sell BTC to the taker */ - public boolean isBuyOffer(Direction direction) { - return direction == Direction.BUY; + public boolean isBuyOffer(OfferDirection direction) { + return direction == OfferDirection.BUY; } public long getMaxTradeLimit(PaymentAccount paymentAccount, String currencyCode, - Direction direction) { + OfferDirection direction) { return paymentAccount != null ? accountAgeWitnessService.getMyTradeLimit(paymentAccount, currencyCode, direction) : 0; @@ -181,7 +221,7 @@ public Coin getUsableBsqBalance() { // We have to keep a minimum amount of BSQ == bitcoin dust limit, otherwise there // would be dust violations for change UTXOs; essentially means the minimum usable // balance of BSQ is 5.46. - Coin usableBsqBalance = bsqWalletService.getAvailableConfirmedBalance().subtract(getMinNonDustOutput()); + Coin usableBsqBalance = bsqWalletService.getAvailableBalance().subtract(getMinNonDustOutput()); return usableBsqBalance.isNegative() ? Coin.ZERO : usableBsqBalance; } @@ -240,7 +280,7 @@ public boolean isCurrencyForMakerFeeBtc(@Nullable Coin amount) { * @return {@code true} if the balance is sufficient, {@code false} otherwise */ public boolean isBsqForMakerFeeAvailable(@Nullable Coin amount) { - Coin availableBalance = bsqWalletService.getAvailableConfirmedBalance(); + Coin availableBalance = bsqWalletService.getAvailableBalance(); Coin makerFee = CoinUtil.getMakerFee(false, amount); // If we don't know yet the maker fee (amount is not set) we return true, @@ -274,7 +314,7 @@ public boolean isCurrencyForTakerFeeBtc(Coin amount) { } public boolean isBsqForTakerFeeAvailable(@Nullable Coin amount) { - Coin availableBalance = bsqWalletService.getAvailableConfirmedBalance(); + Coin availableBalance = bsqWalletService.getAvailableBalance(); Coin takerFee = getTakerFee(false, amount); // If we don't know yet the maker fee (amount is not set) we return true, @@ -291,7 +331,7 @@ public boolean isBsqForTakerFeeAvailable(@Nullable Coin amount) { } public boolean isBlockChainPaymentMethod(Offer offer) { - return offer != null && offer.getPaymentMethod().isAsset(); + return offer != null && offer.getPaymentMethod().isBlockchain(); } public Optional getFeeInUserFiatCurrency(Coin makerFee, @@ -313,7 +353,7 @@ public Optional getFeeInUserFiatCurrency(Coin makerFee, public Map getExtraDataMap(PaymentAccount paymentAccount, String currencyCode, - Direction direction) { + OfferDirection direction) { Map extraDataMap = new HashMap<>(); if (CurrencyUtil.isFiatCurrency(currencyCode)) { String myWitnessHashAsHex = accountAgeWitnessService @@ -336,7 +376,7 @@ public Map getExtraDataMap(PaymentAccount paymentAccount, extraDataMap.put(CAPABILITIES, Capabilities.app.toStringList()); - if (currencyCode.equals("XMR") && direction == Direction.SELL) { + if (currencyCode.equals("XMR") && direction == OfferDirection.SELL) { preferences.getAutoConfirmSettingsList().stream() .filter(e -> e.getCurrencyCode().equals("XMR")) .filter(AutoConfirmSettings::isEnabled) @@ -350,17 +390,21 @@ public void validateOfferData(double buyerSecurityDeposit, PaymentAccount paymentAccount, String currencyCode, Coin makerFeeAsCoin) { + validateBasicOfferData(paymentAccount.getPaymentMethod(), currencyCode); checkNotNull(makerFeeAsCoin, "makerFee must not be null"); - checkNotNull(p2PService.getAddress(), "Address must not be null"); checkArgument(buyerSecurityDeposit <= getMaxBuyerSecurityDepositAsPercent(), "securityDeposit must not exceed " + getMaxBuyerSecurityDepositAsPercent()); checkArgument(buyerSecurityDeposit >= getMinBuyerSecurityDepositAsPercent(), "securityDeposit must not be less than " + getMinBuyerSecurityDepositAsPercent()); + } + + public void validateBasicOfferData(PaymentMethod paymentMethod, String currencyCode) { + checkNotNull(p2PService.getAddress(), "Address must not be null"); checkArgument(!filterManager.isCurrencyBanned(currencyCode), Res.get("offerbook.warning.currencyBanned")); - checkArgument(!filterManager.isPaymentMethodBanned(paymentAccount.getPaymentMethod()), + checkArgument(!filterManager.isPaymentMethodBanned(paymentMethod), Res.get("offerbook.warning.paymentMethodBanned")); } @@ -370,45 +414,45 @@ public void validateOfferData(double buyerSecurityDeposit, // Immutable fields are sourced from the original openOffer param. public OfferPayload getMergedOfferPayload(OpenOffer openOffer, MutableOfferPayloadFields mutableOfferPayloadFields) { - OfferPayload originalOfferPayload = openOffer.getOffer().getOfferPayload(); - return new OfferPayload(originalOfferPayload.getId(), - originalOfferPayload.getDate(), - originalOfferPayload.getOwnerNodeAddress(), - originalOfferPayload.getPubKeyRing(), - originalOfferPayload.getDirection(), + OfferPayload original = openOffer.getOffer().getOfferPayload().orElseThrow(); + return new OfferPayload(original.getId(), + original.getDate(), + original.getOwnerNodeAddress(), + original.getPubKeyRing(), + original.getDirection(), mutableOfferPayloadFields.getPrice(), mutableOfferPayloadFields.getMarketPriceMargin(), mutableOfferPayloadFields.isUseMarketBasedPrice(), - originalOfferPayload.getAmount(), - originalOfferPayload.getMinAmount(), + original.getAmount(), + original.getMinAmount(), mutableOfferPayloadFields.getBaseCurrencyCode(), mutableOfferPayloadFields.getCounterCurrencyCode(), - originalOfferPayload.getArbitratorNodeAddresses(), - originalOfferPayload.getMediatorNodeAddresses(), + original.getArbitratorNodeAddresses(), + original.getMediatorNodeAddresses(), mutableOfferPayloadFields.getPaymentMethodId(), mutableOfferPayloadFields.getMakerPaymentAccountId(), - originalOfferPayload.getOfferFeePaymentTxId(), + original.getOfferFeePaymentTxId(), mutableOfferPayloadFields.getCountryCode(), mutableOfferPayloadFields.getAcceptedCountryCodes(), mutableOfferPayloadFields.getBankId(), mutableOfferPayloadFields.getAcceptedBankIds(), - originalOfferPayload.getVersionNr(), - originalOfferPayload.getBlockHeightAtOfferCreation(), - originalOfferPayload.getTxFee(), - originalOfferPayload.getMakerFee(), - originalOfferPayload.isCurrencyForMakerFeeBtc(), - originalOfferPayload.getBuyerSecurityDeposit(), - originalOfferPayload.getSellerSecurityDeposit(), - originalOfferPayload.getMaxTradeLimit(), - originalOfferPayload.getMaxTradePeriod(), - originalOfferPayload.isUseAutoClose(), - originalOfferPayload.isUseReOpenAfterAutoClose(), - originalOfferPayload.getLowerClosePrice(), - originalOfferPayload.getUpperClosePrice(), - originalOfferPayload.isPrivateOffer(), - originalOfferPayload.getHashOfChallenge(), + original.getVersionNr(), + original.getBlockHeightAtOfferCreation(), + original.getTxFee(), + original.getMakerFee(), + original.isCurrencyForMakerFeeBtc(), + original.getBuyerSecurityDeposit(), + original.getSellerSecurityDeposit(), + original.getMaxTradeLimit(), + original.getMaxTradePeriod(), + original.isUseAutoClose(), + original.isUseReOpenAfterAutoClose(), + original.getLowerClosePrice(), + original.getUpperClosePrice(), + original.isPrivateOffer(), + original.getHashOfChallenge(), mutableOfferPayloadFields.getExtraDataMap(), - originalOfferPayload.getProtocolVersion()); + original.getProtocolVersion()); } private Optional getFeeInUserFiatCurrency(Coin makerFee, @@ -482,7 +526,7 @@ public static Optional getInvalidMakerFeeTxErrorMessage(Offer offer, Btc } } else { errorMsg = "The maker fee tx is invalid as it does not has at least 2 outputs." + extraString + - "\nMakerFeeTx=" + makerFeeTx.toString(); + "\nMakerFeeTx=" + makerFeeTx; } if (errorMsg == null) { diff --git a/core/src/main/java/bisq/core/offer/OpenOffer.java b/core/src/main/java/bisq/core/offer/OpenOffer.java index 4c2d06c3085..5cc80f81a45 100644 --- a/core/src/main/java/bisq/core/offer/OpenOffer.java +++ b/core/src/main/java/bisq/core/offer/OpenOffer.java @@ -17,7 +17,7 @@ package bisq.core.offer; -import bisq.core.trade.Tradable; +import bisq.core.trade.model.Tradable; import bisq.network.p2p.NodeAddress; @@ -35,12 +35,11 @@ import javax.annotation.Nullable; -@EqualsAndHashCode +@EqualsAndHashCode(exclude = {"state", "timeoutTimer", "mempoolStatus"}) @Slf4j public final class OpenOffer implements Tradable { // Timeout for offer reservation during takeoffer process. If deposit tx is not completed in that time we reset the offer to AVAILABLE state. private static final long TIMEOUT = 60; - transient private Timer timeoutTimer; public enum State { AVAILABLE, @@ -54,16 +53,19 @@ public enum State { private final Offer offer; @Getter private State state; + + // TODO Not used. Could be removed? @Getter - @Setter @Nullable - private NodeAddress arbitratorNodeAddress; + private final NodeAddress arbitratorNodeAddress; + // Is set at take offer request time @Getter @Setter @Nullable private NodeAddress mediatorNodeAddress; // Added v1.2.0 + // Is set at take offer request time @Getter @Setter @Nullable @@ -76,15 +78,24 @@ public enum State { @Getter @Setter transient private long mempoolStatus = -1; + transient private Timer timeoutTimer; public OpenOffer(Offer offer) { this(offer, 0); } + public OpenOffer(Offer offer, State state) { + this.offer = offer; + this.triggerPrice = 0; + this.state = state; + arbitratorNodeAddress = null; + } + public OpenOffer(Offer offer, long triggerPrice) { this.offer = offer; this.triggerPrice = triggerPrice; state = State.AVAILABLE; + arbitratorNodeAddress = null; } /////////////////////////////////////////////////////////////////////////////////////////// @@ -131,9 +142,8 @@ public static Tradable fromProto(protobuf.OpenOffer proto) { proto.getTriggerPrice()); } - /////////////////////////////////////////////////////////////////////////////////////////// - // Getters + // Tradable /////////////////////////////////////////////////////////////////////////////////////////// @Override @@ -151,6 +161,11 @@ public String getShortId() { return offer.getShortId(); } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Misc + /////////////////////////////////////////////////////////////////////////////////////////// + public void setState(State state) { this.state = state; @@ -185,7 +200,6 @@ private void stopTimeout() { } } - @Override public String toString() { return "OpenOffer{" + diff --git a/core/src/main/java/bisq/core/offer/OpenOfferManager.java b/core/src/main/java/bisq/core/offer/OpenOfferManager.java index 7c8ddb2c653..58e21773e36 100644 --- a/core/src/main/java/bisq/core/offer/OpenOfferManager.java +++ b/core/src/main/java/bisq/core/offer/OpenOfferManager.java @@ -25,18 +25,22 @@ import bisq.core.exceptions.TradePriceOutOfToleranceException; import bisq.core.filter.FilterManager; import bisq.core.locale.Res; +import bisq.core.offer.availability.AvailabilityResult; import bisq.core.offer.availability.DisputeAgentSelection; -import bisq.core.offer.messages.OfferAvailabilityRequest; -import bisq.core.offer.messages.OfferAvailabilityResponse; -import bisq.core.offer.placeoffer.PlaceOfferModel; -import bisq.core.offer.placeoffer.PlaceOfferProtocol; +import bisq.core.offer.availability.messages.OfferAvailabilityRequest; +import bisq.core.offer.availability.messages.OfferAvailabilityResponse; +import bisq.core.offer.bisq_v1.CreateOfferService; +import bisq.core.offer.bisq_v1.MarketPriceNotAvailableException; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.offer.placeoffer.bisq_v1.PlaceOfferModel; +import bisq.core.offer.placeoffer.bisq_v1.PlaceOfferProtocol; import bisq.core.provider.price.PriceFeedService; import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; import bisq.core.support.dispute.mediation.mediator.MediatorManager; import bisq.core.support.dispute.refund.refundagent.RefundAgentManager; -import bisq.core.trade.TradableList; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.handlers.TransactionResultHandler; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.TransactionResultHandler; +import bisq.core.trade.model.TradableList; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.user.Preferences; import bisq.core.user.User; @@ -84,19 +88,15 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import lombok.Getter; - -import org.jetbrains.annotations.NotNull; +import lombok.extern.slf4j.Slf4j; import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkNotNull; +@Slf4j public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMessageListener, PersistedDataHost { - private static final Logger log = LoggerFactory.getLogger(OpenOfferManager.class); private static final long RETRY_REPUBLISH_DELAY_SEC = 10; private static final long REPUBLISH_AGAIN_AT_STARTUP_DELAY_SEC = 30; @@ -207,8 +207,9 @@ public void onUpdatedDataReceived() { cleanUpAddressEntries(); openOffers.stream() - .forEach(openOffer -> OfferUtil.getInvalidMakerFeeTxErrorMessage(openOffer.getOffer(), btcWalletService) - .ifPresent(errorMsg -> invalidOffers.add(new Tuple2<>(openOffer, errorMsg)))); + .forEach(openOffer -> + OfferUtil.getInvalidMakerFeeTxErrorMessage(openOffer.getOffer(), btcWalletService) + .ifPresent(errorMsg -> invalidOffers.add(new Tuple2<>(openOffer, errorMsg)))); } private void cleanUpAddressEntries() { @@ -238,7 +239,7 @@ public void shutDown(@Nullable Runnable completeHandler) { log.info("Remove open offers at shutDown. Number of open offers: {}", size); if (offerBookService.isBootstrapped() && size > 0) { UserThread.execute(() -> openOffers.forEach( - openOffer -> offerBookService.removeOfferAtShutDown(openOffer.getOffer().getOfferPayload()) + openOffer -> offerBookService.removeOfferAtShutDown(openOffer.getOffer().getOfferPayloadBase()) )); // Force broadcaster to send out immediately, otherwise we could have a 2 sec delay until the @@ -265,11 +266,9 @@ private void removeOpenOffers(List openOffers, @Nullable Runnable com int size = openOffers.size(); // Copy list as we remove in the loop List openOffersList = new ArrayList<>(openOffers); - openOffersList.forEach(openOffer -> removeOpenOffer(openOffer, () -> { - }, errorMessage -> { - })); + openOffersList.forEach(this::removeOpenOffer); if (completeHandler != null) - UserThread.runAfter(completeHandler, size * 200 + 500, TimeUnit.MILLISECONDS); + UserThread.runAfter(completeHandler, size * 200L + 500, TimeUnit.MILLISECONDS); } @@ -394,15 +393,14 @@ public void placeOffer(Offer offer, model, transaction -> { OpenOffer openOffer = new OpenOffer(offer, triggerPrice); - openOffers.add(openOffer); - requestPersistence(); - resultHandler.handleResult(transaction); + addOpenOfferToList(openOffer); if (!stopped) { startPeriodicRepublishOffersTimer(); startPeriodicRefreshOffersTimer(); } else { log.debug("We have stopped already. We ignore that placeOfferProtocol.placeOffer.onResult call."); } + resultHandler.handleResult(transaction); }, errorMessageHandler ); @@ -418,7 +416,7 @@ public void removeOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHa log.warn("Offer was not found in our list of open offers. We still try to remove it from the offerbook."); errorMessageHandler.handleErrorMessage("Offer was not found in our list of open offers. " + "We still try to remove it from the offerbook."); - offerBookService.removeOffer(offer.getOfferPayload(), + offerBookService.removeOffer(offer.getOfferPayloadBase(), () -> offer.setState(Offer.State.REMOVED), null); } @@ -427,26 +425,27 @@ public void removeOffer(Offer offer, ResultHandler resultHandler, ErrorMessageHa public void activateOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { - if (!offersToBeEdited.containsKey(openOffer.getId())) { - Offer offer = openOffer.getOffer(); - offerBookService.activateOffer(offer, - () -> { - openOffer.setState(OpenOffer.State.AVAILABLE); - requestPersistence(); - log.debug("activateOpenOffer, offerId={}", offer.getId()); - resultHandler.handleResult(); - }, - errorMessageHandler); - } else { + if (offersToBeEdited.containsKey(openOffer.getId())) { errorMessageHandler.handleErrorMessage("You can't activate an offer that is currently edited."); + return; } + + Offer offer = openOffer.getOffer(); + offerBookService.activateOffer(offer, + () -> { + openOffer.setState(OpenOffer.State.AVAILABLE); + requestPersistence(); + log.debug("activateOpenOffer, offerId={}", offer.getId()); + resultHandler.handleResult(); + }, + errorMessageHandler); } public void deactivateOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { Offer offer = openOffer.getOffer(); - offerBookService.deactivateOffer(offer.getOfferPayload(), + offerBookService.deactivateOffer(offer.getOfferPayloadBase(), () -> { openOffer.setState(OpenOffer.State.DEACTIVATED); requestPersistence(); @@ -456,6 +455,12 @@ public void deactivateOpenOffer(OpenOffer openOffer, errorMessageHandler); } + public void removeOpenOffer(OpenOffer openOffer) { + removeOpenOffer(openOffer, () -> { + }, error -> { + }); + } + public void removeOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { @@ -464,7 +469,7 @@ public void removeOpenOffer(OpenOffer openOffer, if (openOffer.isDeactivated()) { onRemoved(openOffer, resultHandler, offer); } else { - offerBookService.removeOffer(offer.getOfferPayload(), + offerBookService.removeOffer(offer.getOfferPayloadBase(), () -> onRemoved(openOffer, resultHandler, offer), errorMessageHandler); } @@ -508,18 +513,17 @@ public void editOpenOfferPublish(Offer editedOffer, openOffer.getOffer().setState(Offer.State.REMOVED); openOffer.setState(OpenOffer.State.CANCELED); - openOffers.remove(openOffer); + removeOpenOfferFromList(openOffer); OpenOffer editedOpenOffer = new OpenOffer(editedOffer, triggerPrice); editedOpenOffer.setState(originalState); - openOffers.add(editedOpenOffer); + addOpenOfferToList(editedOpenOffer); if (!editedOpenOffer.isDeactivated()) - republishOffer(editedOpenOffer); + maybeRepublishOffer(editedOpenOffer); offersToBeEdited.remove(openOffer.getId()); - requestPersistence(); resultHandler.handleResult(); } else { errorMessageHandler.handleErrorMessage("There is no offer with this id existing to be published."); @@ -542,26 +546,24 @@ public void editOpenOfferCancel(OpenOffer openOffer, } } - private void onRemoved(@NotNull OpenOffer openOffer, ResultHandler resultHandler, Offer offer) { + private void onRemoved(OpenOffer openOffer, ResultHandler resultHandler, Offer offer) { offer.setState(Offer.State.REMOVED); openOffer.setState(OpenOffer.State.CANCELED); - openOffers.remove(openOffer); + removeOpenOfferFromList(openOffer); closedTradableManager.add(openOffer); - log.info("onRemoved offerId={}", offer.getId()); btcWalletService.resetAddressEntriesForOpenOffer(offer.getId()); - requestPersistence(); + log.info("onRemoved offerId={}", offer.getId()); resultHandler.handleResult(); } // Close openOffer after deposit published public void closeOpenOffer(Offer offer) { getOpenOfferById(offer.getId()).ifPresent(openOffer -> { - openOffers.remove(openOffer); + removeOpenOfferFromList(openOffer); openOffer.setState(OpenOffer.State.CLOSED); - offerBookService.removeOffer(openOffer.getOffer().getOfferPayload(), + offerBookService.removeOffer(openOffer.getOffer().getOfferPayloadBase(), () -> log.trace("Successful removed offer"), log::error); - requestPersistence(); }); } @@ -632,7 +634,7 @@ private void handleOfferAvailabilityRequest(OfferAvailabilityRequest request, No Validator.nonEmptyStringOf(request.offerId); checkNotNull(request.getPubKeyRing()); } catch (Throwable t) { - errorMessage = "Message validation failed. Error=" + t.toString() + ", Message=" + request.toString(); + errorMessage = "Message validation failed. Error=" + t + ", Message=" + request; log.warn(errorMessage); sendAckMessage(request, peer, false, errorMessage); return; @@ -788,22 +790,22 @@ private void maybeUpdatePersistedOffers() { openOffersClone.forEach(originalOpenOffer -> { Offer originalOffer = originalOpenOffer.getOffer(); - OfferPayload originalOfferPayload = originalOffer.getOfferPayload(); + OfferPayload original = originalOffer.getOfferPayload().orElseThrow(); // We added CAPABILITIES with entry for Capability.MEDIATION in v1.1.6 and // Capability.REFUND_AGENT in v1.2.0 and want to rewrite a // persisted offer after the user has updated to 1.2.0 so their offer will be accepted by the network. - if (originalOfferPayload.getProtocolVersion() < Version.TRADE_PROTOCOL_VERSION || + if (original.getProtocolVersion() < Version.TRADE_PROTOCOL_VERSION || !OfferRestrictions.hasOfferMandatoryCapability(originalOffer, Capability.MEDIATION) || !OfferRestrictions.hasOfferMandatoryCapability(originalOffer, Capability.REFUND_AGENT) || - !originalOfferPayload.getOwnerNodeAddress().equals(p2PService.getAddress())) { + !original.getOwnerNodeAddress().equals(p2PService.getAddress())) { // - Capabilities changed? // We rewrite our offer with the additional capabilities entry Map updatedExtraDataMap = new HashMap<>(); if (!OfferRestrictions.hasOfferMandatoryCapability(originalOffer, Capability.MEDIATION) || !OfferRestrictions.hasOfferMandatoryCapability(originalOffer, Capability.REFUND_AGENT)) { - Map originalExtraDataMap = originalOfferPayload.getExtraDataMap(); + Map originalExtraDataMap = original.getExtraDataMap(); if (originalExtraDataMap != null) { updatedExtraDataMap.putAll(originalExtraDataMap); @@ -814,11 +816,11 @@ private void maybeUpdatePersistedOffers() { log.info("Converted offer to support new Capability.MEDIATION and Capability.REFUND_AGENT capability. id={}", originalOffer.getId()); } else { - updatedExtraDataMap = originalOfferPayload.getExtraDataMap(); + updatedExtraDataMap = original.getExtraDataMap(); } // - Protocol version changed? - int protocolVersion = originalOfferPayload.getProtocolVersion(); + int protocolVersion = original.getProtocolVersion(); if (protocolVersion < Version.TRADE_PROTOCOL_VERSION) { // We update the trade protocol version protocolVersion = Version.TRADE_PROTOCOL_VERSION; @@ -826,48 +828,48 @@ private void maybeUpdatePersistedOffers() { } // - node address changed? (due to a faulty tor dir) - NodeAddress ownerNodeAddress = originalOfferPayload.getOwnerNodeAddress(); + NodeAddress ownerNodeAddress = original.getOwnerNodeAddress(); if (!ownerNodeAddress.equals(p2PService.getAddress())) { ownerNodeAddress = p2PService.getAddress(); log.info("Updated the owner nodeaddress of offer id={}", originalOffer.getId()); } - OfferPayload updatedPayload = new OfferPayload(originalOfferPayload.getId(), - originalOfferPayload.getDate(), + OfferPayload updatedPayload = new OfferPayload(original.getId(), + original.getDate(), ownerNodeAddress, - originalOfferPayload.getPubKeyRing(), - originalOfferPayload.getDirection(), - originalOfferPayload.getPrice(), - originalOfferPayload.getMarketPriceMargin(), - originalOfferPayload.isUseMarketBasedPrice(), - originalOfferPayload.getAmount(), - originalOfferPayload.getMinAmount(), - originalOfferPayload.getBaseCurrencyCode(), - originalOfferPayload.getCounterCurrencyCode(), - originalOfferPayload.getArbitratorNodeAddresses(), - originalOfferPayload.getMediatorNodeAddresses(), - originalOfferPayload.getPaymentMethodId(), - originalOfferPayload.getMakerPaymentAccountId(), - originalOfferPayload.getOfferFeePaymentTxId(), - originalOfferPayload.getCountryCode(), - originalOfferPayload.getAcceptedCountryCodes(), - originalOfferPayload.getBankId(), - originalOfferPayload.getAcceptedBankIds(), - originalOfferPayload.getVersionNr(), - originalOfferPayload.getBlockHeightAtOfferCreation(), - originalOfferPayload.getTxFee(), - originalOfferPayload.getMakerFee(), - originalOfferPayload.isCurrencyForMakerFeeBtc(), - originalOfferPayload.getBuyerSecurityDeposit(), - originalOfferPayload.getSellerSecurityDeposit(), - originalOfferPayload.getMaxTradeLimit(), - originalOfferPayload.getMaxTradePeriod(), - originalOfferPayload.isUseAutoClose(), - originalOfferPayload.isUseReOpenAfterAutoClose(), - originalOfferPayload.getLowerClosePrice(), - originalOfferPayload.getUpperClosePrice(), - originalOfferPayload.isPrivateOffer(), - originalOfferPayload.getHashOfChallenge(), + original.getPubKeyRing(), + original.getDirection(), + original.getPrice(), + original.getMarketPriceMargin(), + original.isUseMarketBasedPrice(), + original.getAmount(), + original.getMinAmount(), + original.getBaseCurrencyCode(), + original.getCounterCurrencyCode(), + original.getArbitratorNodeAddresses(), + original.getMediatorNodeAddresses(), + original.getPaymentMethodId(), + original.getMakerPaymentAccountId(), + original.getOfferFeePaymentTxId(), + original.getCountryCode(), + original.getAcceptedCountryCodes(), + original.getBankId(), + original.getAcceptedBankIds(), + original.getVersionNr(), + original.getBlockHeightAtOfferCreation(), + original.getTxFee(), + original.getMakerFee(), + original.isCurrencyForMakerFeeBtc(), + original.getBuyerSecurityDeposit(), + original.getSellerSecurityDeposit(), + original.getMaxTradeLimit(), + original.getMaxTradePeriod(), + original.isUseAutoClose(), + original.isUseReOpenAfterAutoClose(), + original.getLowerClosePrice(), + original.getUpperClosePrice(), + original.isPrivateOffer(), + original.getHashOfChallenge(), updatedExtraDataMap, protocolVersion); @@ -878,7 +880,7 @@ private void maybeUpdatePersistedOffers() { // remove old offer originalOffer.setState(Offer.State.REMOVED); originalOpenOffer.setState(OpenOffer.State.CANCELED); - openOffers.remove(originalOpenOffer); + removeOpenOfferFromList(originalOpenOffer); // Create new Offer Offer updatedOffer = new Offer(updatedPayload); @@ -887,8 +889,7 @@ private void maybeUpdatePersistedOffers() { OpenOffer updatedOpenOffer = new OpenOffer(updatedOffer, originalOpenOffer.getTriggerPrice()); updatedOpenOffer.setState(originalOpenOfferState); - openOffers.add(updatedOpenOffer); - requestPersistence(); + addOpenOfferToList(updatedOpenOffer); log.info("Updating offer completed. id={}", originalOffer.getId()); } @@ -904,7 +905,6 @@ private void republishOffers() { if (stopped) { return; } - stopPeriodicRefreshOffersTimer(); List openOffersList = new ArrayList<>(openOffers.getList()); @@ -917,15 +917,8 @@ private void processListForRepublishOffers(List list) { } OpenOffer openOffer = list.remove(0); - if (openOffers.contains(openOffer) && !openOffer.isDeactivated()) { - // TODO It is not clear yet if it is better for the node and the network to send out all add offer - // messages in one go or to spread it over a delay. With power users who have 100-200 offers that can have - // some significant impact to user experience and the network - republishOffer(openOffer, () -> processListForRepublishOffers(list)); - - /* republishOffer(openOffer, - () -> UserThread.runAfter(() -> processListForRepublishOffers(list), - 30, TimeUnit.MILLISECONDS));*/ + if (openOffers.contains(openOffer)) { + maybeRepublishOffer(openOffer, () -> processListForRepublishOffers(list)); } else { // If the offer was removed in the meantime or if its deactivated we skip and call // processListForRepublishOffers again with the list where we removed the offer already. @@ -933,11 +926,18 @@ private void processListForRepublishOffers(List list) { } } - private void republishOffer(OpenOffer openOffer) { - republishOffer(openOffer, null); + public void maybeRepublishOffer(OpenOffer openOffer) { + maybeRepublishOffer(openOffer, null); } - private void republishOffer(OpenOffer openOffer, @Nullable Runnable completeHandler) { + private void maybeRepublishOffer(OpenOffer openOffer, @Nullable Runnable completeHandler) { + if (preventedFromPublishing(openOffer)) { + if (completeHandler != null) { + completeHandler.run(); + } + return; + } + offerBookService.addOffer(openOffer.getOffer(), () -> { if (!stopped) { @@ -996,8 +996,8 @@ private void startPeriodicRefreshOffersTimer() { 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) && !openOffer.isDeactivated()) - refreshOffer(openOffer); + if (openOffers.contains(openOffer)) + maybeRefreshOffer(openOffer); }, minDelay, maxDelay, TimeUnit.MILLISECONDS); } } else { @@ -1010,8 +1010,11 @@ private void startPeriodicRefreshOffersTimer() { log.trace("periodicRefreshOffersTimer already stated"); } - private void refreshOffer(OpenOffer openOffer) { - offerBookService.refreshTTL(openOffer.getOffer().getOfferPayload(), + private void maybeRefreshOffer(OpenOffer openOffer) { + if (preventedFromPublishing(openOffer)) { + return; + } + offerBookService.refreshTTL(openOffer.getOffer().getOfferPayloadBase(), () -> log.debug("Successful refreshed TTL for offer"), log::warn); } @@ -1028,7 +1031,7 @@ private void restart() { startPeriodicRepublishOffersTimer(); } - private void requestPersistence() { + public void requestPersistence() { persistenceManager.requestPersistence(); } @@ -1057,4 +1060,18 @@ private void stopRetryRepublishOffersTimer() { retryRepublishOffersTimer = null; } } + + private void addOpenOfferToList(OpenOffer openOffer) { + openOffers.add(openOffer); + requestPersistence(); + } + + private void removeOpenOfferFromList(OpenOffer openOffer) { + openOffers.remove(openOffer); + requestPersistence(); + } + + private boolean preventedFromPublishing(OpenOffer openOffer) { + return openOffer.isDeactivated(); + } } diff --git a/core/src/main/java/bisq/core/offer/AvailabilityResult.java b/core/src/main/java/bisq/core/offer/availability/AvailabilityResult.java similarity index 98% rename from core/src/main/java/bisq/core/offer/AvailabilityResult.java rename to core/src/main/java/bisq/core/offer/availability/AvailabilityResult.java index e4ad982163e..abf3bd33cf9 100644 --- a/core/src/main/java/bisq/core/offer/AvailabilityResult.java +++ b/core/src/main/java/bisq/core/offer/availability/AvailabilityResult.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.offer; +package bisq.core.offer.availability; public enum AvailabilityResult { UNKNOWN_FAILURE("cannot take offer for unknown reason"), diff --git a/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityModel.java b/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityModel.java index c1559cec8d3..6b75fda67dc 100644 --- a/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityModel.java +++ b/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityModel.java @@ -18,7 +18,7 @@ package bisq.core.offer.availability; import bisq.core.offer.Offer; -import bisq.core.offer.messages.OfferAvailabilityResponse; +import bisq.core.offer.availability.messages.OfferAvailabilityResponse; import bisq.core.support.dispute.mediation.mediator.MediatorManager; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.user.User; diff --git a/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityProtocol.java b/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityProtocol.java index 218abca67bb..bec32754887 100644 --- a/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityProtocol.java +++ b/core/src/main/java/bisq/core/offer/availability/OfferAvailabilityProtocol.java @@ -18,10 +18,10 @@ package bisq.core.offer.availability; import bisq.core.offer.Offer; +import bisq.core.offer.availability.messages.OfferAvailabilityResponse; +import bisq.core.offer.availability.messages.OfferMessage; import bisq.core.offer.availability.tasks.ProcessOfferAvailabilityResponse; import bisq.core.offer.availability.tasks.SendOfferAvailabilityRequest; -import bisq.core.offer.messages.OfferAvailabilityResponse; -import bisq.core.offer.messages.OfferMessage; import bisq.core.util.Validator; import bisq.network.p2p.AckMessage; diff --git a/core/src/main/java/bisq/core/offer/messages/OfferAvailabilityRequest.java b/core/src/main/java/bisq/core/offer/availability/messages/OfferAvailabilityRequest.java similarity index 98% rename from core/src/main/java/bisq/core/offer/messages/OfferAvailabilityRequest.java rename to core/src/main/java/bisq/core/offer/availability/messages/OfferAvailabilityRequest.java index 6d9d14eaf61..2b2d412b45e 100644 --- a/core/src/main/java/bisq/core/offer/messages/OfferAvailabilityRequest.java +++ b/core/src/main/java/bisq/core/offer/availability/messages/OfferAvailabilityRequest.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.offer.messages; +package bisq.core.offer.availability.messages; import bisq.network.p2p.SupportedCapabilitiesMessage; @@ -27,7 +27,7 @@ import java.util.UUID; import lombok.EqualsAndHashCode; -import lombok.Value; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import javax.annotation.Nullable; @@ -35,7 +35,7 @@ // Here we add the SupportedCapabilitiesMessage interface as that message always predates a direct connection // to the trading peer @EqualsAndHashCode(callSuper = true) -@Value +@Getter @Slf4j public final class OfferAvailabilityRequest extends OfferMessage implements SupportedCapabilitiesMessage { private final PubKeyRing pubKeyRing; diff --git a/core/src/main/java/bisq/core/offer/messages/OfferAvailabilityResponse.java b/core/src/main/java/bisq/core/offer/availability/messages/OfferAvailabilityResponse.java similarity index 97% rename from core/src/main/java/bisq/core/offer/messages/OfferAvailabilityResponse.java rename to core/src/main/java/bisq/core/offer/availability/messages/OfferAvailabilityResponse.java index 41b5aa0fcc7..5d616fe7e1b 100644 --- a/core/src/main/java/bisq/core/offer/messages/OfferAvailabilityResponse.java +++ b/core/src/main/java/bisq/core/offer/availability/messages/OfferAvailabilityResponse.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.offer.messages; +package bisq.core.offer.availability.messages; -import bisq.core.offer.AvailabilityResult; +import bisq.core.offer.availability.AvailabilityResult; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.SupportedCapabilitiesMessage; @@ -31,14 +31,14 @@ import java.util.UUID; import lombok.EqualsAndHashCode; -import lombok.Value; +import lombok.Getter; import javax.annotation.Nullable; // We add here the SupportedCapabilitiesMessage interface as that message always predates a direct connection // to the trading peer @EqualsAndHashCode(callSuper = true) -@Value +@Getter public final class OfferAvailabilityResponse extends OfferMessage implements SupportedCapabilitiesMessage { private final AvailabilityResult availabilityResult; @Nullable diff --git a/core/src/main/java/bisq/core/offer/messages/OfferMessage.java b/core/src/main/java/bisq/core/offer/availability/messages/OfferMessage.java similarity index 96% rename from core/src/main/java/bisq/core/offer/messages/OfferMessage.java rename to core/src/main/java/bisq/core/offer/availability/messages/OfferMessage.java index d72fdc4a276..2b230ef3533 100644 --- a/core/src/main/java/bisq/core/offer/messages/OfferMessage.java +++ b/core/src/main/java/bisq/core/offer/availability/messages/OfferMessage.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.offer.messages; +package bisq.core.offer.availability.messages; import bisq.network.p2p.DirectMessage; import bisq.network.p2p.UidMessage; diff --git a/core/src/main/java/bisq/core/offer/availability/tasks/ProcessOfferAvailabilityResponse.java b/core/src/main/java/bisq/core/offer/availability/tasks/ProcessOfferAvailabilityResponse.java index f6c04fa1982..3afb6fb2a3a 100644 --- a/core/src/main/java/bisq/core/offer/availability/tasks/ProcessOfferAvailabilityResponse.java +++ b/core/src/main/java/bisq/core/offer/availability/tasks/ProcessOfferAvailabilityResponse.java @@ -17,11 +17,11 @@ package bisq.core.offer.availability.tasks; -import bisq.core.offer.AvailabilityResult; import bisq.core.offer.Offer; +import bisq.core.offer.availability.AvailabilityResult; import bisq.core.offer.availability.DisputeAgentSelection; import bisq.core.offer.availability.OfferAvailabilityModel; -import bisq.core.offer.messages.OfferAvailabilityResponse; +import bisq.core.offer.availability.messages.OfferAvailabilityResponse; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/offer/availability/tasks/SendOfferAvailabilityRequest.java b/core/src/main/java/bisq/core/offer/availability/tasks/SendOfferAvailabilityRequest.java index 0dbc8e69ea4..6c0c11f40e6 100644 --- a/core/src/main/java/bisq/core/offer/availability/tasks/SendOfferAvailabilityRequest.java +++ b/core/src/main/java/bisq/core/offer/availability/tasks/SendOfferAvailabilityRequest.java @@ -19,7 +19,7 @@ import bisq.core.offer.Offer; import bisq.core.offer.availability.OfferAvailabilityModel; -import bisq.core.offer.messages.OfferAvailabilityRequest; +import bisq.core.offer.availability.messages.OfferAvailabilityRequest; import bisq.network.p2p.SendDirectMessageListener; diff --git a/core/src/main/java/bisq/core/offer/CreateOfferService.java b/core/src/main/java/bisq/core/offer/bisq_v1/CreateOfferService.java similarity index 95% rename from core/src/main/java/bisq/core/offer/CreateOfferService.java rename to core/src/main/java/bisq/core/offer/bisq_v1/CreateOfferService.java index 9f5f61dd68b..f984dd9ddff 100644 --- a/core/src/main/java/bisq/core/offer/CreateOfferService.java +++ b/core/src/main/java/bisq/core/offer/bisq_v1/CreateOfferService.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.offer; +package bisq.core.offer.bisq_v1; import bisq.core.btc.TxFeeEstimationService; import bisq.core.btc.wallet.BtcWalletService; @@ -23,6 +23,9 @@ import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; import bisq.core.monetary.Price; +import bisq.core.offer.Offer; +import bisq.core.offer.OfferDirection; +import bisq.core.offer.OfferUtil; import bisq.core.payment.PaymentAccount; import bisq.core.payment.PaymentAccountUtil; import bisq.core.provider.price.MarketPrice; @@ -37,7 +40,6 @@ import bisq.common.app.Version; import bisq.common.crypto.PubKeyRing; import bisq.common.util.Tuple2; -import bisq.common.util.Utilities; import org.bitcoinj.core.Coin; @@ -50,7 +52,6 @@ import java.util.Date; import java.util.List; import java.util.Map; -import java.util.UUID; import lombok.extern.slf4j.Slf4j; @@ -94,14 +95,8 @@ public CreateOfferService(OfferUtil offerUtil, // API /////////////////////////////////////////////////////////////////////////////////////////// - public String getRandomOfferId() { - return Utilities.getRandomPrefix(5, 8) + "-" + - UUID.randomUUID().toString() + "-" + - Version.VERSION.replace(".", ""); - } - public Offer createAndGetOffer(String offerId, - OfferPayload.Direction direction, + OfferDirection direction, String currencyCode, Coin amount, Coin minAmount, @@ -188,7 +183,7 @@ public Offer createAndGetOffer(String offerId, creationTime, makerAddress, pubKeyRing, - OfferPayload.Direction.valueOf(direction.name()), + direction, priceAsLong, marketPriceMarginParam, useMarketBasedPriceValue, @@ -228,7 +223,7 @@ public Offer createAndGetOffer(String offerId, } public Tuple2 getEstimatedFeeAndTxVsize(Coin amount, - OfferPayload.Direction direction, + OfferDirection direction, double buyerSecurityDeposit, double sellerSecurityDeposit) { Coin reservedFundsForOffer = getReservedFundsForOffer(direction, @@ -239,7 +234,7 @@ public Tuple2 getEstimatedFeeAndTxVsize(Coin amount, offerUtil.getMakerFee(amount)); } - public Coin getReservedFundsForOffer(OfferPayload.Direction direction, + public Coin getReservedFundsForOffer(OfferDirection direction, Coin amount, double buyerSecurityDeposit, double sellerSecurityDeposit) { @@ -254,7 +249,7 @@ public Coin getReservedFundsForOffer(OfferPayload.Direction direction, return reservedFundsForOffer; } - public Coin getSecurityDeposit(OfferPayload.Direction direction, + public Coin getSecurityDeposit(OfferDirection direction, Coin amount, double buyerSecurityDeposit, double sellerSecurityDeposit) { diff --git a/core/src/main/java/bisq/core/offer/MarketPriceNotAvailableException.java b/core/src/main/java/bisq/core/offer/bisq_v1/MarketPriceNotAvailableException.java similarity index 96% rename from core/src/main/java/bisq/core/offer/MarketPriceNotAvailableException.java rename to core/src/main/java/bisq/core/offer/bisq_v1/MarketPriceNotAvailableException.java index 35ee04a7941..a92e5950f07 100644 --- a/core/src/main/java/bisq/core/offer/MarketPriceNotAvailableException.java +++ b/core/src/main/java/bisq/core/offer/bisq_v1/MarketPriceNotAvailableException.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.offer; +package bisq.core.offer.bisq_v1; public class MarketPriceNotAvailableException extends Exception { public MarketPriceNotAvailableException(@SuppressWarnings("SameParameterValue") String message) { diff --git a/core/src/main/java/bisq/core/offer/MutableOfferPayloadFields.java b/core/src/main/java/bisq/core/offer/bisq_v1/MutableOfferPayloadFields.java similarity index 99% rename from core/src/main/java/bisq/core/offer/MutableOfferPayloadFields.java rename to core/src/main/java/bisq/core/offer/bisq_v1/MutableOfferPayloadFields.java index ec0fe502faf..b2025267540 100644 --- a/core/src/main/java/bisq/core/offer/MutableOfferPayloadFields.java +++ b/core/src/main/java/bisq/core/offer/bisq_v1/MutableOfferPayloadFields.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.offer; +package bisq.core.offer.bisq_v1; import java.util.List; import java.util.Map; diff --git a/core/src/main/java/bisq/core/offer/OfferPayload.java b/core/src/main/java/bisq/core/offer/bisq_v1/OfferPayload.java similarity index 67% rename from core/src/main/java/bisq/core/offer/OfferPayload.java rename to core/src/main/java/bisq/core/offer/bisq_v1/OfferPayload.java index fa4ae7440be..9a636d8daf1 100644 --- a/core/src/main/java/bisq/core/offer/OfferPayload.java +++ b/core/src/main/java/bisq/core/offer/bisq_v1/OfferPayload.java @@ -15,29 +15,22 @@ * along with Bisq. If not, see . */ -package bisq.core.offer; +package bisq.core.offer.bisq_v1; + +import bisq.core.offer.OfferDirection; +import bisq.core.offer.OfferPayloadBase; import bisq.network.p2p.NodeAddress; -import bisq.network.p2p.storage.payload.ExpirablePayload; -import bisq.network.p2p.storage.payload.ProtectedStoragePayload; -import bisq.network.p2p.storage.payload.RequiresOwnerIsOnlinePayload; import bisq.common.crypto.Hash; import bisq.common.crypto.PubKeyRing; import bisq.common.proto.ProtoUtil; import bisq.common.util.CollectionUtils; -import bisq.common.util.ExtraDataMapValidator; -import bisq.common.util.Hex; -import bisq.common.util.JsonExclude; - -import java.security.PublicKey; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import lombok.EqualsAndHashCode; @@ -53,29 +46,10 @@ // OfferPayload has about 1.4 kb. We should look into options to make it smaller but will be hard to do it in a // backward compatible way. Maybe a candidate when segwit activation is done as hardfork? -@EqualsAndHashCode +@EqualsAndHashCode(callSuper = true) @Getter @Slf4j -public final class OfferPayload implements ProtectedStoragePayload, ExpirablePayload, RequiresOwnerIsOnlinePayload { - public static final long TTL = TimeUnit.MINUTES.toMillis(9); - - /////////////////////////////////////////////////////////////////////////////////////////// - // Enum - /////////////////////////////////////////////////////////////////////////////////////////// - - public enum Direction { - BUY, - SELL; - - public static OfferPayload.Direction fromProto(protobuf.OfferPayload.Direction direction) { - return ProtoUtil.enumFromProto(OfferPayload.Direction.class, direction.name()); - } - - public static protobuf.OfferPayload.Direction toProtoMessage(Direction direction) { - return protobuf.OfferPayload.Direction.valueOf(direction.name()); - } - } - +public final class OfferPayload extends OfferPayloadBase { // Keys for extra map // Only set for fiat offers public static final String ACCOUNT_AGE_WITNESS_HASH = "accountAgeWitnessHash"; @@ -98,14 +72,6 @@ public static protobuf.OfferPayload.Direction toProtoMessage(Direction direction // Instance fields /////////////////////////////////////////////////////////////////////////////////////////// - private final String id; - private final long date; - private final NodeAddress ownerNodeAddress; - @JsonExclude - private final PubKeyRing pubKeyRing; - private final Direction direction; - // price if fixed price is used (usePercentageBasedPrice = false), otherwise 0 - private final long price; // Distance form market price if percentage based price is used (usePercentageBasedPrice = true), otherwise 0. // E.g. 0.1 -> 10%. Can be negative as well. Depending on direction the marketPriceMargin is above or below the market price. // Positive values is always the usual case where you want a better price as the market. @@ -114,13 +80,6 @@ public static protobuf.OfferPayload.Direction toProtoMessage(Direction direction private final double marketPriceMargin; // We use 2 type of prices: fixed price or price based on distance from market price private final boolean useMarketBasedPrice; - private final long amount; - private final long minAmount; - - // For fiat offer the baseCurrencyCode is BTC and the counterCurrencyCode is the fiat currency - // For altcoin offers it is the opposite. baseCurrencyCode is the altcoin and the counterCurrencyCode is BTC. - private final String baseCurrencyCode; - private final String counterCurrencyCode; @Deprecated // Not used anymore, but we cannot set it Nullable or remove it to not break backward compatibility (diff. hash) @@ -128,8 +87,7 @@ public static protobuf.OfferPayload.Direction toProtoMessage(Direction direction @Deprecated // Not used anymore, but we cannot set it Nullable or remove it to not break backward compatibility (diff. hash) private final List mediatorNodeAddresses; - private final String paymentMethodId; - private final String makerPaymentAccountId; + // Mutable property. Has to be set before offer is saved in P2P network as it changes the payload hash! @Setter @Nullable @@ -142,7 +100,6 @@ public static protobuf.OfferPayload.Direction toProtoMessage(Direction direction private final String bankId; @Nullable private final List acceptedBankIds; - private final String versionNr; private final long blockHeightAtOfferCreation; private final long txFee; private final long makerFee; @@ -167,20 +124,6 @@ public static protobuf.OfferPayload.Direction toProtoMessage(Direction direction @Nullable private final String hashOfChallenge; - // Should be only used in emergency case if we need to add data but do not want to break backward compatibility - // at the P2P network storage checks. The hash of the object will be used to verify if the data is valid. Any new - // field in a class would break that hash and therefore break the storage mechanism. - - // extraDataMap used from v0.6 on for hashOfPaymentAccount - // key ACCOUNT_AGE_WITNESS, value: hex string of hashOfPaymentAccount byte array - @Nullable - private final Map extraDataMap; - private final int protocolVersion; - - // Cache the payload hash to avoid some repeated calculations. - // Take care to calculate it only after the offerFeePaymentTxId is set. - private transient byte[] hash; - /////////////////////////////////////////////////////////////////////////////////////////// // Constructor @@ -190,7 +133,7 @@ public OfferPayload(String id, long date, NodeAddress ownerNodeAddress, PubKeyRing pubKeyRing, - Direction direction, + OfferDirection direction, long price, double marketPriceMargin, boolean useMarketBasedPrice, @@ -224,28 +167,31 @@ public OfferPayload(String id, @Nullable String hashOfChallenge, @Nullable Map extraDataMap, int protocolVersion) { - this.id = id; - this.date = date; - this.ownerNodeAddress = ownerNodeAddress; - this.pubKeyRing = pubKeyRing; - this.direction = direction; - this.price = price; + super(id, + date, + ownerNodeAddress, + pubKeyRing, + baseCurrencyCode, + counterCurrencyCode, + direction, + price, + amount, + minAmount, + paymentMethodId, + makerPaymentAccountId, + extraDataMap, + versionNr, + protocolVersion); + this.marketPriceMargin = marketPriceMargin; this.useMarketBasedPrice = useMarketBasedPrice; - this.amount = amount; - this.minAmount = minAmount; - this.baseCurrencyCode = baseCurrencyCode; - this.counterCurrencyCode = counterCurrencyCode; this.arbitratorNodeAddresses = arbitratorNodeAddresses; this.mediatorNodeAddresses = mediatorNodeAddresses; - this.paymentMethodId = paymentMethodId; - this.makerPaymentAccountId = makerPaymentAccountId; this.offerFeePaymentTxId = offerFeePaymentTxId; this.countryCode = countryCode; this.acceptedCountryCodes = acceptedCountryCodes; this.bankId = bankId; this.acceptedBankIds = acceptedBankIds; - this.versionNr = versionNr; this.blockHeightAtOfferCreation = blockHeightAtOfferCreation; this.txFee = txFee; this.makerFee = makerFee; @@ -260,11 +206,9 @@ public OfferPayload(String id, this.upperClosePrice = upperClosePrice; this.isPrivateOffer = isPrivateOffer; this.hashOfChallenge = hashOfChallenge; - this.extraDataMap = ExtraDataMapValidator.getValidatedExtraDataMap(extraDataMap); - this.protocolVersion = protocolVersion; - this.hash = null; // Do not calculate hash before offerFeePaymentTxId is set. } + @Override public byte[] getHash() { if (this.hash == null && this.offerFeePaymentTxId != null) { // A proto message can be created only after the offerFeePaymentTxId is @@ -286,7 +230,7 @@ public protobuf.StoragePayload toProtoMessage() { .setDate(date) .setOwnerNodeAddress(ownerNodeAddress.toProtoMessage()) .setPubKeyRing(pubKeyRing.toProtoMessage()) - .setDirection(Direction.toProtoMessage(direction)) + .setDirection(OfferDirection.toProtoMessage(direction)) .setPrice(price) .setMarketPriceMargin(marketPriceMargin) .setUseMarketBasedPrice(useMarketBasedPrice) @@ -345,7 +289,7 @@ public static OfferPayload fromProto(protobuf.OfferPayload proto) { proto.getDate(), NodeAddress.fromProto(proto.getOwnerNodeAddress()), PubKeyRing.fromProto(proto.getPubKeyRing()), - OfferPayload.Direction.fromProto(proto.getDirection()), + OfferDirection.fromProto(proto.getDirection()), proto.getPrice(), proto.getMarketPriceMargin(), proto.getUseMarketBasedPrice(), @@ -385,70 +329,32 @@ public static OfferPayload fromProto(protobuf.OfferPayload proto) { proto.getProtocolVersion()); } - - /////////////////////////////////////////////////////////////////////////////////////////// - // API - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public long getTTL() { - return TTL; - } - - @Override - public PublicKey getOwnerPubKey() { - return pubKeyRing.getSignaturePubKey(); - } - - // In the offer we support base and counter currency - // Fiat offers have base currency BTC and counterCurrency Fiat - // Altcoins have base currency Altcoin and counterCurrency BTC - // The rest of the app does not support yet that concept of base currency and counter currencies - // so we map here for convenience - public String getCurrencyCode() { - return getBaseCurrencyCode().equals("BTC") ? getCounterCurrencyCode() : getBaseCurrencyCode(); - } - @Override public String toString() { return "OfferPayload{" + - "\n id='" + id + '\'' + - ",\n date=" + new Date(date) + - ",\n ownerNodeAddress=" + ownerNodeAddress + - ",\n pubKeyRing=" + pubKeyRing + - ",\n direction=" + direction + - ",\n price=" + price + - ",\n marketPriceMargin=" + marketPriceMargin + - ",\n useMarketBasedPrice=" + useMarketBasedPrice + - ",\n amount=" + amount + - ",\n minAmount=" + minAmount + - ",\n baseCurrencyCode='" + baseCurrencyCode + '\'' + - ",\n counterCurrencyCode='" + counterCurrencyCode + '\'' + - ",\n paymentMethodId='" + paymentMethodId + '\'' + - ",\n makerPaymentAccountId='" + makerPaymentAccountId + '\'' + - ",\n offerFeePaymentTxId='" + offerFeePaymentTxId + '\'' + - ",\n countryCode='" + countryCode + '\'' + - ",\n acceptedCountryCodes=" + acceptedCountryCodes + - ",\n bankId='" + bankId + '\'' + - ",\n acceptedBankIds=" + acceptedBankIds + - ",\n versionNr='" + versionNr + '\'' + - ",\n blockHeightAtOfferCreation=" + blockHeightAtOfferCreation + - ",\n txFee=" + txFee + - ",\n makerFee=" + makerFee + - ",\n isCurrencyForMakerFeeBtc=" + isCurrencyForMakerFeeBtc + - ",\n buyerSecurityDeposit=" + buyerSecurityDeposit + - ",\n sellerSecurityDeposit=" + sellerSecurityDeposit + - ",\n maxTradeLimit=" + maxTradeLimit + - ",\n maxTradePeriod=" + maxTradePeriod + - ",\n useAutoClose=" + useAutoClose + - ",\n useReOpenAfterAutoClose=" + useReOpenAfterAutoClose + - ",\n lowerClosePrice=" + lowerClosePrice + - ",\n upperClosePrice=" + upperClosePrice + - ",\n isPrivateOffer=" + isPrivateOffer + - ",\n hashOfChallenge='" + hashOfChallenge + '\'' + - ",\n extraDataMap=" + extraDataMap + - ",\n protocolVersion=" + protocolVersion + - ",\n hash=" + (getHash() == null ? "null" : Hex.encode(getHash())) + - "\n}"; + "\r\n marketPriceMargin=" + marketPriceMargin + + ",\r\n useMarketBasedPrice=" + useMarketBasedPrice + + ",\r\n arbitratorNodeAddresses=" + arbitratorNodeAddresses + + ",\r\n mediatorNodeAddresses=" + mediatorNodeAddresses + + ",\r\n offerFeePaymentTxId='" + offerFeePaymentTxId + '\'' + + ",\r\n countryCode='" + countryCode + '\'' + + ",\r\n acceptedCountryCodes=" + acceptedCountryCodes + + ",\r\n bankId='" + bankId + '\'' + + ",\r\n acceptedBankIds=" + acceptedBankIds + + ",\r\n blockHeightAtOfferCreation=" + blockHeightAtOfferCreation + + ",\r\n txFee=" + txFee + + ",\r\n makerFee=" + makerFee + + ",\r\n isCurrencyForMakerFeeBtc=" + isCurrencyForMakerFeeBtc + + ",\r\n buyerSecurityDeposit=" + buyerSecurityDeposit + + ",\r\n sellerSecurityDeposit=" + sellerSecurityDeposit + + ",\r\n maxTradeLimit=" + maxTradeLimit + + ",\r\n maxTradePeriod=" + maxTradePeriod + + ",\r\n useAutoClose=" + useAutoClose + + ",\r\n useReOpenAfterAutoClose=" + useReOpenAfterAutoClose + + ",\r\n lowerClosePrice=" + lowerClosePrice + + ",\r\n upperClosePrice=" + upperClosePrice + + ",\r\n isPrivateOffer=" + isPrivateOffer + + ",\r\n hashOfChallenge='" + hashOfChallenge + '\'' + + "\r\n} " + super.toString(); } } diff --git a/core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java b/core/src/main/java/bisq/core/offer/bisq_v1/TakeOfferModel.java similarity index 99% rename from core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java rename to core/src/main/java/bisq/core/offer/bisq_v1/TakeOfferModel.java index 8e345b81424..447d1d7076f 100644 --- a/core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java +++ b/core/src/main/java/bisq/core/offer/bisq_v1/TakeOfferModel.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.offer.takeoffer; +package bisq.core.offer.bisq_v1; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.btc.model.AddressEntry; @@ -46,7 +46,7 @@ import org.jetbrains.annotations.NotNull; import static bisq.core.btc.model.AddressEntry.Context.OFFER_FUNDING; -import static bisq.core.offer.OfferPayload.Direction.SELL; +import static bisq.core.offer.OfferDirection.SELL; import static bisq.core.util.VolumeUtil.getAdjustedVolumeForHalCash; import static bisq.core.util.VolumeUtil.getRoundedFiatVolume; import static bisq.core.util.coin.CoinUtil.minCoin; diff --git a/core/src/main/java/bisq/core/offer/TriggerPriceService.java b/core/src/main/java/bisq/core/offer/bisq_v1/TriggerPriceService.java similarity index 90% rename from core/src/main/java/bisq/core/offer/TriggerPriceService.java rename to core/src/main/java/bisq/core/offer/bisq_v1/TriggerPriceService.java index 99defe325b9..744713c2579 100644 --- a/core/src/main/java/bisq/core/offer/TriggerPriceService.java +++ b/core/src/main/java/bisq/core/offer/bisq_v1/TriggerPriceService.java @@ -15,11 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.offer; +package bisq.core.offer.bisq_v1; import bisq.core.locale.CurrencyUtil; import bisq.core.monetary.Altcoin; import bisq.core.monetary.Price; +import bisq.core.offer.Offer; +import bisq.core.offer.OfferDirection; +import bisq.core.offer.OpenOffer; +import bisq.core.offer.OpenOfferManager; import bisq.core.provider.mempool.MempoolService; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; @@ -127,8 +131,8 @@ public static boolean wasTriggered(MarketPrice marketPrice, OpenOffer openOffer) return false; } - OfferPayload.Direction direction = openOffer.getOffer().getDirection(); - boolean isSellOffer = direction == OfferPayload.Direction.SELL; + OfferDirection direction = openOffer.getOffer().getDirection(); + boolean isSellOffer = direction == OfferDirection.SELL; boolean condition = isSellOffer && !cryptoCurrency || !isSellOffer && cryptoCurrency; return condition ? marketPriceAsLong < triggerPrice : @@ -136,8 +140,9 @@ public static boolean wasTriggered(MarketPrice marketPrice, OpenOffer openOffer) } private void checkPriceThreshold(MarketPrice marketPrice, OpenOffer openOffer) { + Offer offer = openOffer.getOffer(); if (wasTriggered(marketPrice, openOffer)) { - String currencyCode = openOffer.getOffer().getCurrencyCode(); + String currencyCode = offer.getCurrencyCode(); int smallestUnitExponent = CurrencyUtil.isCryptoCurrency(currencyCode) ? Altcoin.SMALLEST_UNIT_EXPONENT : Fiat.SMALLEST_UNIT_EXPONENT; @@ -146,9 +151,9 @@ private void checkPriceThreshold(MarketPrice marketPrice, OpenOffer openOffer) { log.info("Market price exceeded the trigger price of the open offer.\n" + "We deactivate the open offer with ID {}.\nCurrency: {};\nOffer direction: {};\n" + "Market price: {};\nTrigger price: {}", - openOffer.getOffer().getShortId(), + offer.getShortId(), currencyCode, - openOffer.getOffer().getDirection(), + offer.getDirection(), marketPrice.getPrice(), MathUtils.scaleDownByPowerOf10(triggerPrice, smallestUnitExponent) ); @@ -158,14 +163,16 @@ private void checkPriceThreshold(MarketPrice marketPrice, OpenOffer openOffer) { }); } else if (openOffer.getState() == OpenOffer.State.AVAILABLE) { // check the mempool if it has not been done before - if (openOffer.getMempoolStatus() < 0 && mempoolService.canRequestBeMade(openOffer.getOffer().getOfferPayload())) { - mempoolService.validateOfferMakerTx(openOffer.getOffer().getOfferPayload(), (txValidator -> { + OfferPayload offerPayload = offer.getOfferPayload().orElseThrow(); + if (openOffer.getMempoolStatus() < 0 && + mempoolService.canRequestBeMade(offerPayload)) { + mempoolService.validateOfferMakerTx(offerPayload, (txValidator -> { openOffer.setMempoolStatus(txValidator.isFail() ? 0 : 1); })); } // if the mempool indicated failure then deactivate the open offer if (openOffer.getMempoolStatus() == 0) { - log.info("Deactivating open offer {} due to mempool validation", openOffer.getOffer().getShortId()); + log.info("Deactivating open offer {} due to mempool validation", offer.getShortId()); openOfferManager.deactivateOpenOffer(openOffer, () -> { }, errorMessage -> { }); diff --git a/core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferModel.java b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/PlaceOfferModel.java similarity index 98% rename from core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferModel.java rename to core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/PlaceOfferModel.java index 0c54d733ed0..e90e4dcc00a 100644 --- a/core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferModel.java +++ b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/PlaceOfferModel.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.offer.placeoffer; +package bisq.core.offer.placeoffer.bisq_v1; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; diff --git a/core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferProtocol.java b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/PlaceOfferProtocol.java similarity index 88% rename from core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferProtocol.java rename to core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/PlaceOfferProtocol.java index cdf394435fc..b3f50a95e55 100644 --- a/core/src/main/java/bisq/core/offer/placeoffer/PlaceOfferProtocol.java +++ b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/PlaceOfferProtocol.java @@ -15,13 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.offer.placeoffer; +package bisq.core.offer.placeoffer.bisq_v1; -import bisq.core.offer.placeoffer.tasks.AddToOfferBook; -import bisq.core.offer.placeoffer.tasks.CheckNumberOfUnconfirmedTransactions; -import bisq.core.offer.placeoffer.tasks.CreateMakerFeeTx; -import bisq.core.offer.placeoffer.tasks.ValidateOffer; -import bisq.core.trade.handlers.TransactionResultHandler; +import bisq.core.offer.placeoffer.bisq_v1.tasks.AddToOfferBook; +import bisq.core.offer.placeoffer.bisq_v1.tasks.CheckNumberOfUnconfirmedTransactions; +import bisq.core.offer.placeoffer.bisq_v1.tasks.CreateMakerFeeTx; +import bisq.core.offer.placeoffer.bisq_v1.tasks.ValidateOffer; +import bisq.core.trade.bisq_v1.TransactionResultHandler; import bisq.common.handlers.ErrorMessageHandler; import bisq.common.taskrunner.TaskRunner; @@ -65,7 +65,7 @@ public void placeOffer() { log.error(errorMessage); if (model.isOfferAddedToOfferBook()) { - model.getOfferBookService().removeOffer(model.getOffer().getOfferPayload(), + model.getOfferBookService().removeOffer(model.getOffer().getOfferPayloadBase(), () -> { model.setOfferAddedToOfferBook(false); log.debug("OfferPayload removed from offer book."); diff --git a/core/src/main/java/bisq/core/offer/placeoffer/tasks/AddToOfferBook.java b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/AddToOfferBook.java similarity index 94% rename from core/src/main/java/bisq/core/offer/placeoffer/tasks/AddToOfferBook.java rename to core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/AddToOfferBook.java index 16def612ba0..f9314ef31b6 100644 --- a/core/src/main/java/bisq/core/offer/placeoffer/tasks/AddToOfferBook.java +++ b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/AddToOfferBook.java @@ -15,9 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.core.offer.placeoffer.tasks; +package bisq.core.offer.placeoffer.bisq_v1.tasks; -import bisq.core.offer.placeoffer.PlaceOfferModel; +import bisq.core.offer.placeoffer.bisq_v1.PlaceOfferModel; import bisq.common.taskrunner.Task; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/offer/placeoffer/tasks/CheckNumberOfUnconfirmedTransactions.java b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/CheckNumberOfUnconfirmedTransactions.java similarity index 85% rename from core/src/main/java/bisq/core/offer/placeoffer/tasks/CheckNumberOfUnconfirmedTransactions.java rename to core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/CheckNumberOfUnconfirmedTransactions.java index 31e8d300032..689ad265c10 100644 --- a/core/src/main/java/bisq/core/offer/placeoffer/tasks/CheckNumberOfUnconfirmedTransactions.java +++ b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/CheckNumberOfUnconfirmedTransactions.java @@ -1,7 +1,7 @@ -package bisq.core.offer.placeoffer.tasks; +package bisq.core.offer.placeoffer.bisq_v1.tasks; import bisq.core.locale.Res; -import bisq.core.offer.placeoffer.PlaceOfferModel; +import bisq.core.offer.placeoffer.bisq_v1.PlaceOfferModel; import bisq.common.taskrunner.Task; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/offer/placeoffer/tasks/CreateMakerFeeTx.java b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/CreateMakerFeeTx.java similarity index 98% rename from core/src/main/java/bisq/core/offer/placeoffer/tasks/CreateMakerFeeTx.java rename to core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/CreateMakerFeeTx.java index df697134319..eeb21bda5c7 100644 --- a/core/src/main/java/bisq/core/offer/placeoffer/tasks/CreateMakerFeeTx.java +++ b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/CreateMakerFeeTx.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.offer.placeoffer.tasks; +package bisq.core.offer.placeoffer.bisq_v1.tasks; import bisq.core.btc.exceptions.TxBroadcastException; import bisq.core.btc.model.AddressEntry; @@ -27,7 +27,7 @@ import bisq.core.dao.exceptions.DaoDisabledException; import bisq.core.dao.state.model.blockchain.TxType; import bisq.core.offer.Offer; -import bisq.core.offer.placeoffer.PlaceOfferModel; +import bisq.core.offer.placeoffer.bisq_v1.PlaceOfferModel; import bisq.core.util.FeeReceiverSelector; import bisq.common.UserThread; @@ -119,7 +119,7 @@ public void onFailure(TxBroadcastException exception) { model.isUseSavingsWallet(), offer.getTxFee()); - Transaction signedTx = model.getBsqWalletService().signTx(txWithBsqFee); + Transaction signedTx = model.getBsqWalletService().signTxAndVerifyNoDustOutputs(txWithBsqFee); WalletService.checkAllScriptSignaturesForTx(signedTx); bsqWalletService.commitTx(signedTx, TxType.PAY_TRADE_FEE); // We need to create another instance, otherwise the tx would trigger an invalid state exception diff --git a/core/src/main/java/bisq/core/offer/placeoffer/tasks/ValidateOffer.java b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/ValidateOffer.java similarity index 97% rename from core/src/main/java/bisq/core/offer/placeoffer/tasks/ValidateOffer.java rename to core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/ValidateOffer.java index 35d619feb4d..c5cc8291c12 100644 --- a/core/src/main/java/bisq/core/offer/placeoffer/tasks/ValidateOffer.java +++ b/core/src/main/java/bisq/core/offer/placeoffer/bisq_v1/tasks/ValidateOffer.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.offer.placeoffer.tasks; +package bisq.core.offer.placeoffer.bisq_v1.tasks; import bisq.core.offer.Offer; -import bisq.core.offer.placeoffer.PlaceOfferModel; -import bisq.core.trade.messages.TradeMessage; +import bisq.core.offer.placeoffer.bisq_v1.PlaceOfferModel; +import bisq.core.trade.protocol.TradeMessage; import bisq.common.taskrunner.Task; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java index e6da6be373f..9dc3f850e1b 100644 --- a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java @@ -399,10 +399,19 @@ public String getDisplayString() { return Res.get(id); } - public boolean isAsset() { + public boolean isFiat() { + return !isAltcoin(); + } + + public boolean isBlockchain() { return this.equals(BLOCK_CHAINS_INSTANT) || this.equals(BLOCK_CHAINS); } + // Includes any non btc asset, not limited to blockchain payment methods + public boolean isAltcoin() { + return isBlockchain(); + } + public static boolean hasChargebackRisk(PaymentMethod paymentMethod, List tradeCurrencies) { return tradeCurrencies.stream() .anyMatch(tradeCurrency -> hasChargebackRisk(paymentMethod, tradeCurrency.getCode())); diff --git a/core/src/main/java/bisq/core/proto/ProtoDevUtil.java b/core/src/main/java/bisq/core/proto/ProtoDevUtil.java index 6b70441a866..52af1c7e501 100644 --- a/core/src/main/java/bisq/core/proto/ProtoDevUtil.java +++ b/core/src/main/java/bisq/core/proto/ProtoDevUtil.java @@ -18,12 +18,12 @@ package bisq.core.proto; import bisq.core.btc.model.AddressEntry; -import bisq.core.support.dispute.DisputeResult; -import bisq.core.offer.AvailabilityResult; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OpenOffer; -import bisq.core.trade.Trade; +import bisq.core.offer.availability.AvailabilityResult; +import bisq.core.support.dispute.DisputeResult; +import bisq.core.trade.model.bisq_v1.Trade; import lombok.extern.slf4j.Slf4j; @@ -81,8 +81,8 @@ public static void printAllEnumsForPB() { sb.append(" enum Direction {\n"); sb.append(" PB_ERROR = 0;\n"); - for (int i = 0; i < OfferPayload.Direction.values().length; i++) { - OfferPayload.Direction s = OfferPayload.Direction.values()[i]; + for (int i = 0; i < OfferDirection.values().length; i++) { + OfferDirection s = OfferDirection.values()[i]; sb.append(" "); sb.append(s.toString()); sb.append(" = "); diff --git a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java index 21fff967377..60d3e8d05bf 100644 --- a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java +++ b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java @@ -36,9 +36,9 @@ import bisq.core.filter.Filter; import bisq.core.network.p2p.inventory.messages.GetInventoryRequest; import bisq.core.network.p2p.inventory.messages.GetInventoryResponse; -import bisq.core.offer.OfferPayload; -import bisq.core.offer.messages.OfferAvailabilityRequest; -import bisq.core.offer.messages.OfferAvailabilityResponse; +import bisq.core.offer.availability.messages.OfferAvailabilityRequest; +import bisq.core.offer.availability.messages.OfferAvailabilityResponse; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.proto.CoreProtoResolver; import bisq.core.support.dispute.arbitration.arbitrator.Arbitrator; import bisq.core.support.dispute.arbitration.messages.PeerPublishedDisputePayoutTxMessage; @@ -48,20 +48,20 @@ import bisq.core.support.dispute.messages.PeerOpenedDisputeMessage; import bisq.core.support.dispute.refund.refundagent.RefundAgent; import bisq.core.support.messages.ChatMessage; -import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage; -import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest; -import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse; -import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.messages.DepositTxMessage; -import bisq.core.trade.messages.InputsForDepositTxRequest; -import bisq.core.trade.messages.InputsForDepositTxResponse; -import bisq.core.trade.messages.MediatedPayoutTxPublishedMessage; -import bisq.core.trade.messages.MediatedPayoutTxSignatureMessage; -import bisq.core.trade.messages.PayoutTxPublishedMessage; -import bisq.core.trade.messages.PeerPublishedDelayedPayoutTxMessage; -import bisq.core.trade.messages.RefreshTradeStateRequest; -import bisq.core.trade.messages.ShareBuyerPaymentAccountMessage; -import bisq.core.trade.messages.TraderSignedWitnessMessage; +import bisq.core.trade.protocol.bisq_v1.messages.CounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.messages.MediatedPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.MediatedPayoutTxSignatureMessage; +import bisq.core.trade.protocol.bisq_v1.messages.PayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.PeerPublishedDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.RefreshTradeStateRequest; +import bisq.core.trade.protocol.bisq_v1.messages.ShareBuyerPaymentAccountMessage; +import bisq.core.trade.protocol.bisq_v1.messages.TraderSignedWitnessMessage; import bisq.network.p2p.AckMessage; import bisq.network.p2p.BundleOfEnvelopes; diff --git a/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java b/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java index f42670d76d4..b0aa0312576 100644 --- a/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java +++ b/core/src/main/java/bisq/core/proto/persistable/CorePersistenceProtoResolver.java @@ -37,7 +37,7 @@ import bisq.core.support.dispute.arbitration.ArbitrationDisputeList; import bisq.core.support.dispute.mediation.MediationDisputeList; import bisq.core.support.dispute.refund.RefundDisputeList; -import bisq.core.trade.TradableList; +import bisq.core.trade.model.TradableList; import bisq.core.trade.statistics.TradeStatistics2Store; import bisq.core.trade.statistics.TradeStatistics3Store; import bisq.core.user.PreferencesPayload; diff --git a/core/src/main/java/bisq/core/provider/mempool/MempoolService.java b/core/src/main/java/bisq/core/provider/mempool/MempoolService.java index 7894b55f089..d6348e555a6 100644 --- a/core/src/main/java/bisq/core/provider/mempool/MempoolService.java +++ b/core/src/main/java/bisq/core/provider/mempool/MempoolService.java @@ -20,8 +20,8 @@ import bisq.core.dao.DaoFacade; import bisq.core.dao.state.DaoStateService; import bisq.core.filter.FilterManager; -import bisq.core.offer.OfferPayload; -import bisq.core.trade.Trade; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.network.Socks5ProxyProvider; diff --git a/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java b/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java index 0e54e5527ca..a44b2334a76 100644 --- a/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java +++ b/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java @@ -30,8 +30,8 @@ import bisq.core.support.dispute.mediation.MediationDisputeListService; import bisq.core.support.dispute.refund.RefundDisputeListService; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.FailedTradesManager; import bisq.core.user.Preferences; import bisq.core.user.User; diff --git a/core/src/main/java/bisq/core/support/dispute/Dispute.java b/core/src/main/java/bisq/core/support/dispute/Dispute.java index 669f7d08540..5a0c3eac8f0 100644 --- a/core/src/main/java/bisq/core/support/dispute/Dispute.java +++ b/core/src/main/java/bisq/core/support/dispute/Dispute.java @@ -21,7 +21,7 @@ import bisq.core.proto.CoreProtoResolver; import bisq.core.support.SupportType; import bisq.core.support.messages.ChatMessage; -import bisq.core.trade.Contract; +import bisq.core.trade.model.bisq_v1.Contract; import bisq.common.crypto.PubKeyRing; import bisq.common.proto.ProtoUtil; diff --git a/core/src/main/java/bisq/core/support/dispute/DisputeListService.java b/core/src/main/java/bisq/core/support/dispute/DisputeListService.java index b38cf7fa4ff..d1a1a20ba10 100644 --- a/core/src/main/java/bisq/core/support/dispute/DisputeListService.java +++ b/core/src/main/java/bisq/core/support/dispute/DisputeListService.java @@ -17,7 +17,7 @@ package bisq.core.support.dispute; -import bisq.core.trade.Contract; +import bisq.core.trade.model.bisq_v1.Contract; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/support/dispute/DisputeManager.java b/core/src/main/java/bisq/core/support/dispute/DisputeManager.java index c02641b1bdc..af511766aeb 100644 --- a/core/src/main/java/bisq/core/support/dispute/DisputeManager.java +++ b/core/src/main/java/bisq/core/support/dispute/DisputeManager.java @@ -26,8 +26,8 @@ import bisq.core.locale.Res; import bisq.core.monetary.Altcoin; import bisq.core.monetary.Price; -import bisq.core.offer.OfferPayload; import bisq.core.offer.OpenOfferManager; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; import bisq.core.support.SupportManager; @@ -35,11 +35,11 @@ import bisq.core.support.dispute.messages.OpenNewDisputeMessage; import bisq.core.support.dispute.messages.PeerOpenedDisputeMessage; import bisq.core.support.messages.ChatMessage; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.TradeDataValidation; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.TradeDataValidation; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.network.p2p.BootstrapListener; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/support/dispute/agent/MultipleHolderNameDetection.java b/core/src/main/java/bisq/core/support/dispute/agent/MultipleHolderNameDetection.java index b3b35a68c59..1be96332efa 100644 --- a/core/src/main/java/bisq/core/support/dispute/agent/MultipleHolderNameDetection.java +++ b/core/src/main/java/bisq/core/support/dispute/agent/MultipleHolderNameDetection.java @@ -24,7 +24,7 @@ import bisq.core.support.dispute.DisputeList; import bisq.core.support.dispute.DisputeManager; import bisq.core.support.dispute.DisputeResult; -import bisq.core.trade.Contract; +import bisq.core.trade.model.bisq_v1.Contract; import bisq.core.user.DontShowAgainLookup; import bisq.common.crypto.Hash; diff --git a/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationManager.java b/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationManager.java index 2718da778ba..a663c966f8c 100644 --- a/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationManager.java +++ b/core/src/main/java/bisq/core/support/dispute/arbitration/ArbitrationManager.java @@ -40,11 +40,11 @@ import bisq.core.support.dispute.messages.PeerOpenedDisputeMessage; import bisq.core.support.messages.ChatMessage; import bisq.core.support.messages.SupportMessage; -import bisq.core.trade.Contract; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.network.p2p.AckMessageSourceType; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/support/dispute/mediation/MediationManager.java b/core/src/main/java/bisq/core/support/dispute/mediation/MediationManager.java index 0b941272760..52af69e1305 100644 --- a/core/src/main/java/bisq/core/support/dispute/mediation/MediationManager.java +++ b/core/src/main/java/bisq/core/support/dispute/mediation/MediationManager.java @@ -35,11 +35,11 @@ import bisq.core.support.dispute.messages.PeerOpenedDisputeMessage; import bisq.core.support.messages.ChatMessage; import bisq.core.support.messages.SupportMessage; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.protocol.DisputeProtocol; -import bisq.core.trade.protocol.ProcessModel; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.DisputeProtocol; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.network.p2p.AckMessageSourceType; import bisq.network.p2p.NodeAddress; @@ -251,7 +251,7 @@ public void onAcceptMediationResult(Trade trade, // If we have not got yet the peers signature we sign and send to the peer our signature. // Otherwise we sign and complete with the peers signature the payout tx. - if (processModel.getTradingPeer().getMediatedPayoutTxSignature() == null) { + if (processModel.getTradePeer().getMediatedPayoutTxSignature() == null) { tradeProtocol.onAcceptMediationResult(() -> { if (trade.getPayoutTx() != null) { tradeManager.closeDisputedTrade(tradeId, Trade.DisputeState.MEDIATION_CLOSED); diff --git a/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java b/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java index 90352c26475..5500da3156c 100644 --- a/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java +++ b/core/src/main/java/bisq/core/support/dispute/refund/RefundManager.java @@ -35,9 +35,9 @@ import bisq.core.support.dispute.messages.PeerOpenedDisputeMessage; import bisq.core.support.messages.ChatMessage; import bisq.core.support.messages.SupportMessage; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.network.p2p.AckMessageSourceType; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/support/traderchat/TradeChatSession.java b/core/src/main/java/bisq/core/support/traderchat/TradeChatSession.java index e69a18c3f66..32afe342d58 100644 --- a/core/src/main/java/bisq/core/support/traderchat/TradeChatSession.java +++ b/core/src/main/java/bisq/core/support/traderchat/TradeChatSession.java @@ -19,9 +19,7 @@ import bisq.core.support.SupportSession; import bisq.core.support.messages.ChatMessage; -import bisq.core.trade.Trade; - -import bisq.common.crypto.PubKeyRing; +import bisq.core.trade.model.bisq_v1.Trade; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -66,7 +64,7 @@ public ObservableList getObservableChatMessageList() { @Override public boolean chatIsOpen() { - return trade != null && trade.getState() != Trade.State.WITHDRAW_COMPLETED; + return trade != null && trade.getTradeState() != Trade.State.WITHDRAW_COMPLETED; } @Override diff --git a/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java b/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java index 1c44185f2a8..d5116e8ca39 100644 --- a/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java +++ b/core/src/main/java/bisq/core/support/traderchat/TraderChatManager.java @@ -23,10 +23,10 @@ import bisq.core.support.SupportType; import bisq.core.support.messages.ChatMessage; import bisq.core.support.messages.SupportMessage; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.FailedTradesManager; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.network.p2p.AckMessageSourceType; import bisq.network.p2p.NodeAddress; @@ -110,7 +110,8 @@ public PubKeyRing getPeerPubKeyRing(ChatMessage message) { @Override public List getAllChatMessages(String tradeId) { - return getTradeById(tradeId).map(trade -> trade.getChatMessages()).orElse(FXCollections.emptyObservableList()); + return getTradeById(tradeId).map(Trade::getChatMessages) + .orElse(FXCollections.emptyObservableList()); } @Override diff --git a/core/src/main/java/bisq/core/trade/TradeManager.java b/core/src/main/java/bisq/core/trade/TradeManager.java index 6707fde8ea7..efa39d1e701 100644 --- a/core/src/main/java/bisq/core/trade/TradeManager.java +++ b/core/src/main/java/bisq/core/trade/TradeManager.java @@ -23,23 +23,34 @@ import bisq.core.btc.wallet.BtcWalletService; import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OpenOffer; import bisq.core.offer.OpenOfferManager; import bisq.core.offer.availability.OfferAvailabilityModel; import bisq.core.provider.price.PriceFeedService; import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; import bisq.core.support.dispute.mediation.mediator.MediatorManager; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; -import bisq.core.trade.handlers.TradeResultHandler; -import bisq.core.trade.messages.InputsForDepositTxRequest; -import bisq.core.trade.protocol.MakerProtocol; -import bisq.core.trade.protocol.ProcessModel; -import bisq.core.trade.protocol.ProcessModelServiceProvider; -import bisq.core.trade.protocol.TakerProtocol; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.DumpDelayedPayoutTx; +import bisq.core.trade.bisq_v1.FailedTradesManager; +import bisq.core.trade.bisq_v1.TradeResultHandler; +import bisq.core.trade.bisq_v1.TradeTxException; +import bisq.core.trade.bisq_v1.TradeUtil; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.TradableList; +import bisq.core.trade.model.TradeModel; +import bisq.core.trade.model.bisq_v1.BuyerAsMakerTrade; +import bisq.core.trade.model.bisq_v1.BuyerAsTakerTrade; +import bisq.core.trade.model.bisq_v1.SellerAsMakerTrade; +import bisq.core.trade.model.bisq_v1.SellerAsTakerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.Provider; import bisq.core.trade.protocol.TradeProtocol; import bisq.core.trade.protocol.TradeProtocolFactory; +import bisq.core.trade.protocol.bisq_v1.MakerProtocol; +import bisq.core.trade.protocol.bisq_v1.TakerProtocol; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.core.trade.statistics.ReferralIdService; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.user.User; @@ -125,7 +136,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi @Getter private final ArbitratorManager arbitratorManager; private final MediatorManager mediatorManager; - private final ProcessModelServiceProvider processModelServiceProvider; + private final Provider provider; private final ClockWatcher clockWatcher; private final Map tradeProtocolByTradeId = new HashMap<>(); @@ -162,7 +173,7 @@ public TradeManager(User user, TradeUtil tradeUtil, ArbitratorManager arbitratorManager, MediatorManager mediatorManager, - ProcessModelServiceProvider processModelServiceProvider, + Provider provider, ClockWatcher clockWatcher, PersistenceManager> persistenceManager, ReferralIdService referralIdService, @@ -181,7 +192,7 @@ public TradeManager(User user, this.tradeUtil = tradeUtil; this.arbitratorManager = arbitratorManager; this.mediatorManager = mediatorManager; - this.processModelServiceProvider = processModelServiceProvider; + this.provider = provider; this.clockWatcher = clockWatcher; this.referralIdService = referralIdService; this.dumpDelayedPayoutTx = dumpDelayedPayoutTx; @@ -274,13 +285,9 @@ private void handleTakeOfferRequest(NodeAddress peer, InputsForDepositTxRequest getNewProcessModel(offer), UUID.randomUUID().toString()); } - TradeProtocol tradeProtocol = TradeProtocolFactory.getNewTradeProtocol(trade); - TradeProtocol prev = tradeProtocolByTradeId.put(trade.getUid(), tradeProtocol); - if (prev != null) { - log.error("We had already an entry with uid {}", trade.getUid()); - } - tradableList.add(trade); + TradeProtocol tradeProtocol = createTradeProtocol(trade); + initTradeAndProtocol(trade, tradeProtocol); ((MakerProtocol) tradeProtocol).handleTakeOfferRequest(inputsForDepositTxRequest, peer, errorMessage -> { @@ -319,7 +326,7 @@ public void onUpdatedDataReceived() { }); } - public TradeProtocol getTradeProtocol(Trade trade) { + public TradeProtocol getTradeProtocol(TradeModel trade) { String uid = trade.getUid(); if (tradeProtocolByTradeId.containsKey(uid)) { return tradeProtocolByTradeId.get(uid); @@ -340,26 +347,41 @@ public TradeProtocol getTradeProtocol(Trade trade) { /////////////////////////////////////////////////////////////////////////////////////////// private void initPersistedTrades() { - tradableList.forEach(this::initPersistedTrade); + Set toRemove = new HashSet<>(); + tradableList.forEach(tradeModel -> { + boolean valid = initPersistedTrade(tradeModel); + if (!valid) { + toRemove.add(tradeModel); + } + }); + toRemove.forEach(tradableList::remove); + if (!toRemove.isEmpty()) { + requestPersistence(); + } + persistedTradesInitialized.set(true); // We do not include failed trades as they should not be counted anyway in the trade statistics - Set allTrades = new HashSet<>(closedTradableManager.getClosedTrades()); + Set allTrades = new HashSet<>(closedTradableManager.getClosedTrades()); allTrades.addAll(tradableList.getList()); String referralId = referralIdService.getOptionalReferralId().orElse(null); boolean isTorNetworkNode = p2PService.getNetworkNode() instanceof TorNetworkNode; tradeStatisticsManager.maybeRepublishTradeStatistics(allTrades, referralId, isTorNetworkNode); } - private void initPersistedTrade(Trade trade) { - initTradeAndProtocol(trade, getTradeProtocol(trade)); - trade.updateDepositTxFromWallet(); + private boolean initPersistedTrade(TradeModel tradeModel) { + initTradeAndProtocol(tradeModel, getTradeProtocol(tradeModel)); + + if (tradeModel instanceof Trade) { + ((Trade) tradeModel).updateDepositTxFromWallet(); + } requestPersistence(); + return true; } - private void initTradeAndProtocol(Trade trade, TradeProtocol tradeProtocol) { - tradeProtocol.initialize(processModelServiceProvider, this, trade.getOffer()); - trade.initialize(processModelServiceProvider); + private void initTradeAndProtocol(TradeModel tradeModel, TradeProtocol tradeProtocol) { + tradeProtocol.initialize(provider, this, tradeModel.getOffer()); + tradeModel.initialize(provider); requestPersistence(); } @@ -398,7 +420,7 @@ public void onTakeOffer(Coin amount, String paymentAccountId, boolean useSavingsWallet, boolean isTakerApiUser, - TradeResultHandler tradeResultHandler, + TradeResultHandler tradeResultHandler, ErrorMessageHandler errorMessageHandler) { checkArgument(!wasOfferAlreadyUsedInTrade(offer.getId())); @@ -441,12 +463,7 @@ public void onTakeOffer(Coin amount, trade.getProcessModel().setFundsNeededForTradeAsLong(fundsNeededForTrade.value); trade.setTakerPaymentAccountId(paymentAccountId); - TradeProtocol tradeProtocol = TradeProtocolFactory.getNewTradeProtocol(trade); - TradeProtocol prev = tradeProtocolByTradeId.put(trade.getUid(), tradeProtocol); - if (prev != null) { - log.error("We had already an entry with uid {}", trade.getUid()); - } - tradableList.add(trade); + TradeProtocol tradeProtocol = createTradeProtocol(trade); initTradeAndProtocol(trade, tradeProtocol); @@ -460,10 +477,22 @@ public void onTakeOffer(Coin amount, requestPersistence(); } + private TradeProtocol createTradeProtocol(TradeModel tradeModel) { + TradeProtocol tradeProtocol = TradeProtocolFactory.getNewTradeProtocol(tradeModel); + TradeProtocol prev = tradeProtocolByTradeId.put(tradeModel.getUid(), tradeProtocol); + if (prev != null) { + log.error("We had already an entry with uid {}", tradeModel.getUid()); + } + if (tradeModel instanceof Trade) { + tradableList.add((Trade) tradeModel); + } + return tradeProtocol; + } + private ProcessModel getNewProcessModel(Offer offer) { return new ProcessModel(checkNotNull(offer).getId(), - processModelServiceProvider.getUser().getAccountId(), - processModelServiceProvider.getKeyRing().getPubKeyRing()); + provider.getUser().getAccountId(), + provider.getKeyRing().getPubKeyRing()); } private OfferAvailabilityModel getOfferAvailabilityModel(Offer offer, boolean isTakerApiUser) { @@ -538,14 +567,12 @@ public void onTradeCompleted(Trade trade) { /////////////////////////////////////////////////////////////////////////////////////////// public void closeDisputedTrade(String tradeId, Trade.DisputeState disputeState) { - Optional tradeOptional = getTradeById(tradeId); - if (tradeOptional.isPresent()) { - Trade trade = tradeOptional.get(); + getTradeById(tradeId).ifPresent(trade -> { trade.setDisputeState(disputeState); onTradeCompleted(trade); btcWalletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT); requestPersistence(); - } + }); } @@ -647,37 +674,6 @@ public Set getSetOfFailedOrClosedTradeIdsFromLockedInFunds() throws Trad return tradesIdSet; } - // If trade still has funds locked up it might come back from failed trades - // Aborts unfailing if the address entries needed are not available - private boolean unFailTrade(Trade trade) { - if (!recoverAddresses(trade)) { - log.warn("Failed to recover address during unFail trade"); - return false; - } - - initPersistedTrade(trade); - - if (!tradableList.contains(trade)) { - tradableList.add(trade); - } - return true; - } - - // The trade is added to pending trades if the associated address entries are AVAILABLE and - // the relevant entries are changed, otherwise it's not added and no address entries are changed - private boolean recoverAddresses(Trade trade) { - // Find addresses associated with this trade. - var entries = tradeUtil.getAvailableAddresses(trade); - if (entries == null) - return false; - - btcWalletService.recoverAddressEntry(trade.getId(), entries.first, - AddressEntry.Context.MULTI_SIG); - btcWalletService.recoverAddressEntry(trade.getId(), entries.second, - AddressEntry.Context.TRADE_PAYOUT); - return true; - } - /////////////////////////////////////////////////////////////////////////////////////////// // Getters, Utils @@ -696,21 +692,33 @@ public boolean isMyOffer(Offer offer) { } public boolean wasOfferAlreadyUsedInTrade(String offerId) { - return getTradeById(offerId).isPresent() || - failedTradesManager.getTradeById(offerId).isPresent() || - closedTradableManager.getTradableById(offerId).isPresent(); + Stream combinedStream = Stream.concat(getPendingTrades(), + failedTradesManager.getObservableList().stream()); + + combinedStream = Stream.concat(combinedStream, + closedTradableManager.getObservableList().stream()); + + return combinedStream.anyMatch(t -> t.getOffer().getId().equals(offerId)); } public boolean isBuyer(Offer offer) { - // If I am the maker, we use the OfferPayload.Direction, otherwise the mirrored direction + // If I am the maker, we use the OfferDirection, otherwise the mirrored direction if (isMyOffer(offer)) return offer.isBuyOffer(); else - return offer.getDirection() == OfferPayload.Direction.SELL; + return offer.getDirection() == OfferDirection.SELL; + } + + public Optional getTradeModelById(String tradeId) { + return getPendingTrades() + .filter(tradeModel -> tradeModel.getId().equals(tradeId)) + .findFirst(); } public Optional getTradeById(String tradeId) { - return tradableList.stream().filter(e -> e.getId().equals(tradeId)).findFirst(); + return getTradeModelById(tradeId) + .filter(tradeModel -> tradeModel instanceof Trade) + .map(tradeModel -> (Trade) tradeModel); } private void removeTrade(Trade trade) { @@ -725,9 +733,45 @@ private void addTrade(Trade trade) { } } + private Stream getPendingTrades() { + return Stream.concat(tradableList.stream(), + Stream.empty()); + } + // TODO Remove once tradableList is refactored to a final field // (part of the persistence refactor PR) private void onTradesChanged() { this.numPendingTrades.set(getObservableList().size()); } + + // If trade still has funds locked up it might come back from failed trades + // Aborts unfailing if the address entries needed are not available + private boolean unFailTrade(Trade trade) { + if (!recoverAddresses(trade)) { + log.warn("Failed to recover address during unFail trade"); + return false; + } + + initPersistedTrade(trade); + + if (!tradableList.contains(trade)) { + tradableList.add(trade); + } + return true; + } + + // The trade is added to pending trades if the associated address entries are AVAILABLE and + // the relevant entries are changed, otherwise it's not added and no address entries are changed + private boolean recoverAddresses(Trade trade) { + // Find addresses associated with this trade. + var entries = tradeUtil.getAvailableAddresses(trade); + if (entries == null) + return false; + + btcWalletService.recoverAddressEntry(trade.getId(), entries.first, + AddressEntry.Context.MULTI_SIG); + btcWalletService.recoverAddressEntry(trade.getId(), entries.second, + AddressEntry.Context.TRADE_PAYOUT); + return true; + } } diff --git a/core/src/main/java/bisq/core/trade/TradeModule.java b/core/src/main/java/bisq/core/trade/TradeModule.java index 751bd5a0eb1..a3ee4d5aab3 100644 --- a/core/src/main/java/bisq/core/trade/TradeModule.java +++ b/core/src/main/java/bisq/core/trade/TradeModule.java @@ -21,8 +21,8 @@ import bisq.core.account.sign.SignedWitnessStorageService; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.account.witness.AccountAgeWitnessStorageService; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.FailedTradesManager; import bisq.core.trade.statistics.ReferralIdService; import bisq.common.app.AppModule; diff --git a/core/src/main/java/bisq/core/trade/closed/CleanupMailboxMessages.java b/core/src/main/java/bisq/core/trade/bisq_v1/CleanupMailboxMessagesService.java similarity index 95% rename from core/src/main/java/bisq/core/trade/closed/CleanupMailboxMessages.java rename to core/src/main/java/bisq/core/trade/bisq_v1/CleanupMailboxMessagesService.java index 5e3e40810b5..c27d200408f 100644 --- a/core/src/main/java/bisq/core/trade/closed/CleanupMailboxMessages.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/CleanupMailboxMessagesService.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.closed; +package bisq.core.trade.bisq_v1; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.TradeMessage; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.TradeMessage; import bisq.network.p2p.AckMessage; import bisq.network.p2p.AckMessageSourceType; @@ -50,12 +50,12 @@ * This class must not be injected as a singleton! */ @Slf4j -public class CleanupMailboxMessages { +public class CleanupMailboxMessagesService { private final P2PService p2PService; private final MailboxMessageService mailboxMessageService; @Inject - public CleanupMailboxMessages(P2PService p2PService, MailboxMessageService mailboxMessageService) { + public CleanupMailboxMessagesService(P2PService p2PService, MailboxMessageService mailboxMessageService) { this.p2PService = p2PService; this.mailboxMessageService = mailboxMessageService; } @@ -123,7 +123,7 @@ private boolean isMyMessage(AckMessage ackMessage, Trade trade) { private boolean isPubKeyValid(DecryptedMessageWithPubKey decryptedMessageWithPubKey, Trade trade) { // We can only validate the peers pubKey if we have it already. If we are the taker we get it from the offer // Otherwise it depends on the state of the trade protocol if we have received the peers pubKeyRing already. - PubKeyRing peersPubKeyRing = trade.getProcessModel().getTradingPeer().getPubKeyRing(); + PubKeyRing peersPubKeyRing = trade.getProcessModel().getTradePeer().getPubKeyRing(); boolean isValid = true; if (peersPubKeyRing != null && !decryptedMessageWithPubKey.getSignaturePubKey().equals(peersPubKeyRing.getSignaturePubKey())) { diff --git a/core/src/main/java/bisq/core/trade/closed/ClosedTradableManager.java b/core/src/main/java/bisq/core/trade/bisq_v1/ClosedTradableManager.java similarity index 89% rename from core/src/main/java/bisq/core/trade/closed/ClosedTradableManager.java rename to core/src/main/java/bisq/core/trade/bisq_v1/ClosedTradableManager.java index 01c36beb4d1..b508d801f66 100644 --- a/core/src/main/java/bisq/core/trade/closed/ClosedTradableManager.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/ClosedTradableManager.java @@ -15,14 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.closed; +package bisq.core.trade.bisq_v1; import bisq.core.offer.Offer; import bisq.core.provider.price.PriceFeedService; -import bisq.core.trade.DumpDelayedPayoutTx; -import bisq.core.trade.Tradable; -import bisq.core.trade.TradableList; -import bisq.core.trade.Trade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.TradableList; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.crypto.KeyRing; import bisq.common.persistence.PersistenceManager; @@ -47,18 +46,18 @@ public class ClosedTradableManager implements PersistedDataHost { private final TradableList closedTradables = new TradableList<>(); private final KeyRing keyRing; private final PriceFeedService priceFeedService; - private final CleanupMailboxMessages cleanupMailboxMessages; + private final CleanupMailboxMessagesService cleanupMailboxMessagesService; private final DumpDelayedPayoutTx dumpDelayedPayoutTx; @Inject public ClosedTradableManager(KeyRing keyRing, PriceFeedService priceFeedService, PersistenceManager> persistenceManager, - CleanupMailboxMessages cleanupMailboxMessages, + CleanupMailboxMessagesService cleanupMailboxMessagesService, DumpDelayedPayoutTx dumpDelayedPayoutTx) { this.keyRing = keyRing; this.priceFeedService = priceFeedService; - this.cleanupMailboxMessages = cleanupMailboxMessages; + this.cleanupMailboxMessagesService = cleanupMailboxMessagesService; this.dumpDelayedPayoutTx = dumpDelayedPayoutTx; this.persistenceManager = persistenceManager; @@ -79,7 +78,7 @@ public void readPersisted(Runnable completeHandler) { } public void onAllServicesInitialized() { - cleanupMailboxMessages.handleTrades(getClosedTrades()); + cleanupMailboxMessagesService.handleTrades(getClosedTrades()); } public void add(Tradable tradable) { diff --git a/core/src/main/java/bisq/core/trade/closed/ClosedTradeUtil.java b/core/src/main/java/bisq/core/trade/bisq_v1/ClosedTradeUtil.java similarity index 97% rename from core/src/main/java/bisq/core/trade/closed/ClosedTradeUtil.java rename to core/src/main/java/bisq/core/trade/bisq_v1/ClosedTradeUtil.java index 50fab443dfa..7edd5965237 100644 --- a/core/src/main/java/bisq/core/trade/closed/ClosedTradeUtil.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/ClosedTradeUtil.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.closed; +package bisq.core.trade.bisq_v1; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.locale.CurrencyUtil; @@ -25,8 +25,8 @@ import bisq.core.monetary.Volume; import bisq.core.offer.Offer; import bisq.core.offer.OpenOffer; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.user.Preferences; import bisq.core.util.coin.BsqFormatter; @@ -51,9 +51,9 @@ import lombok.extern.slf4j.Slf4j; -import static bisq.core.trade.Trade.DisputeState.DISPUTE_CLOSED; -import static bisq.core.trade.Trade.DisputeState.MEDIATION_CLOSED; -import static bisq.core.trade.Trade.DisputeState.REFUND_REQUEST_CLOSED; +import static bisq.core.trade.model.bisq_v1.Trade.DisputeState.DISPUTE_CLOSED; +import static bisq.core.trade.model.bisq_v1.Trade.DisputeState.MEDIATION_CLOSED; +import static bisq.core.trade.model.bisq_v1.Trade.DisputeState.REFUND_REQUEST_CLOSED; import static bisq.core.util.AveragePriceUtil.getAveragePriceTuple; import static bisq.core.util.FormattingUtils.BTC_FORMATTER_KEY; import static bisq.core.util.FormattingUtils.formatPercentagePrice; @@ -326,7 +326,7 @@ public String getStateAsString(Tradable tradable) { } else { log.error("That must not happen. We got a pending state but we are in" + " the closed trades list. state={}", - trade.getState().name()); + trade.getTradeState().name()); return Res.get("shared.na"); } } else if (tradable instanceof OpenOffer) { diff --git a/core/src/main/java/bisq/core/trade/DumpDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/bisq_v1/DumpDelayedPayoutTx.java similarity index 93% rename from core/src/main/java/bisq/core/trade/DumpDelayedPayoutTx.java rename to core/src/main/java/bisq/core/trade/bisq_v1/DumpDelayedPayoutTx.java index 3d2785c01e2..82b18831f7a 100644 --- a/core/src/main/java/bisq/core/trade/DumpDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/DumpDelayedPayoutTx.java @@ -15,7 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.bisq_v1; + +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.TradableList; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.config.Config; import bisq.common.file.JsonFileManager; diff --git a/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java b/core/src/main/java/bisq/core/trade/bisq_v1/FailedTradesManager.java similarity index 91% rename from core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java rename to core/src/main/java/bisq/core/trade/bisq_v1/FailedTradesManager.java index 84746a2128c..295342511a6 100644 --- a/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/FailedTradesManager.java @@ -15,17 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.failed; +package bisq.core.trade.bisq_v1; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; import bisq.core.provider.price.PriceFeedService; -import bisq.core.trade.DumpDelayedPayoutTx; -import bisq.core.trade.TradableList; -import bisq.core.trade.Trade; -import bisq.core.trade.TradeUtil; -import bisq.core.trade.closed.CleanupMailboxMessages; +import bisq.core.trade.model.TradableList; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.crypto.KeyRing; import bisq.common.persistence.PersistenceManager; @@ -50,7 +47,7 @@ public class FailedTradesManager implements PersistedDataHost { private final KeyRing keyRing; private final PriceFeedService priceFeedService; private final BtcWalletService btcWalletService; - private final CleanupMailboxMessages cleanupMailboxMessages; + private final CleanupMailboxMessagesService cleanupMailboxMessagesService; private final PersistenceManager> persistenceManager; private final TradeUtil tradeUtil; private final DumpDelayedPayoutTx dumpDelayedPayoutTx; @@ -63,12 +60,12 @@ public FailedTradesManager(KeyRing keyRing, BtcWalletService btcWalletService, PersistenceManager> persistenceManager, TradeUtil tradeUtil, - CleanupMailboxMessages cleanupMailboxMessages, + CleanupMailboxMessagesService cleanupMailboxMessagesService, DumpDelayedPayoutTx dumpDelayedPayoutTx) { this.keyRing = keyRing; this.priceFeedService = priceFeedService; this.btcWalletService = btcWalletService; - this.cleanupMailboxMessages = cleanupMailboxMessages; + this.cleanupMailboxMessagesService = cleanupMailboxMessagesService; this.dumpDelayedPayoutTx = dumpDelayedPayoutTx; this.persistenceManager = persistenceManager; this.tradeUtil = tradeUtil; @@ -90,7 +87,7 @@ public void readPersisted(Runnable completeHandler) { } public void onAllServicesInitialized() { - cleanupMailboxMessages.handleTrades(failedTrades.getList()); + cleanupMailboxMessagesService.handleTrades(failedTrades.getList()); } public void add(Trade trade) { diff --git a/core/src/main/java/bisq/core/trade/TradeDataValidation.java b/core/src/main/java/bisq/core/trade/bisq_v1/TradeDataValidation.java similarity index 99% rename from core/src/main/java/bisq/core/trade/TradeDataValidation.java rename to core/src/main/java/bisq/core/trade/bisq_v1/TradeDataValidation.java index 013dcdb42ab..60dc78ae843 100644 --- a/core/src/main/java/bisq/core/trade/TradeDataValidation.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/TradeDataValidation.java @@ -15,13 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.bisq_v1; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.dao.DaoFacade; import bisq.core.offer.Offer; import bisq.core.support.SupportType; import bisq.core.support.dispute.Dispute; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.util.validation.RegexValidatorFactory; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/handlers/TradeResultHandler.java b/core/src/main/java/bisq/core/trade/bisq_v1/TradeResultHandler.java similarity index 83% rename from core/src/main/java/bisq/core/trade/handlers/TradeResultHandler.java rename to core/src/main/java/bisq/core/trade/bisq_v1/TradeResultHandler.java index aab6dc4e460..3ae8a13fba3 100644 --- a/core/src/main/java/bisq/core/trade/handlers/TradeResultHandler.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/TradeResultHandler.java @@ -15,10 +15,8 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.handlers; +package bisq.core.trade.bisq_v1; -import bisq.core.trade.Trade; - -public interface TradeResultHandler { - void handleResult(Trade trade); +public interface TradeResultHandler { + void handleResult(T trade); } diff --git a/core/src/main/java/bisq/core/trade/TradeTxException.java b/core/src/main/java/bisq/core/trade/bisq_v1/TradeTxException.java similarity index 96% rename from core/src/main/java/bisq/core/trade/TradeTxException.java rename to core/src/main/java/bisq/core/trade/bisq_v1/TradeTxException.java index cbc79660678..947257aa890 100644 --- a/core/src/main/java/bisq/core/trade/TradeTxException.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/TradeTxException.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.bisq_v1; public class TradeTxException extends Exception { public TradeTxException(String message) { diff --git a/core/src/main/java/bisq/core/trade/TradeUtil.java b/core/src/main/java/bisq/core/trade/bisq_v1/TradeUtil.java similarity index 77% rename from core/src/main/java/bisq/core/trade/TradeUtil.java rename to core/src/main/java/bisq/core/trade/bisq_v1/TradeUtil.java index a026f6ab982..3f99e7dea9b 100644 --- a/core/src/main/java/bisq/core/trade/TradeUtil.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/TradeUtil.java @@ -15,13 +15,22 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.bisq_v1; import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.filter.FilterManager; import bisq.core.locale.Res; import bisq.core.offer.Offer; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.trade.model.TradeModel; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; + +import bisq.network.p2p.NodeAddress; import bisq.common.crypto.KeyRing; +import bisq.common.handlers.ErrorMessageHandler; +import bisq.common.handlers.ResultHandler; import bisq.common.util.Tuple2; import bisq.common.util.Utilities; @@ -224,4 +233,33 @@ public String getRole(boolean isBuyerMakerAndSellerTaker, boolean isMaker, Strin : Res.get("formatter.asTaker", currencyCode, Res.get("shared.seller")); } } + + public static void applyFilter(TradeModel tradeModel, + FilterManager filterManager, + NodeAddress nodeAddress, + @Nullable PaymentAccountPayload paymentAccountPayload, + ResultHandler complete, + ErrorMessageHandler failed) { + if (filterManager.isNodeAddressBanned(nodeAddress)) { + failed.handleErrorMessage("Other trader is banned by their node address.\n" + + "tradingPeerNodeAddress=" + nodeAddress); + } else if (filterManager.isOfferIdBanned(tradeModel.getId())) { + failed.handleErrorMessage("Offer ID is banned.\n" + "Offer ID=" + tradeModel.getId()); + } else if (tradeModel.getOffer() != null && + filterManager.isCurrencyBanned(tradeModel.getOffer().getCurrencyCode())) { + failed.handleErrorMessage("Currency is banned.\n" + + "Currency code=" + tradeModel.getOffer().getCurrencyCode()); + } else if (filterManager.isPaymentMethodBanned(checkNotNull(tradeModel.getOffer()).getPaymentMethod())) { + failed.handleErrorMessage("Payment method is banned.\n" + + "Payment method=" + tradeModel.getOffer().getPaymentMethod().getId()); + } else if (paymentAccountPayload != null && filterManager.arePeersPaymentAccountDataBanned(paymentAccountPayload)) { + failed.handleErrorMessage("Other trader is banned by their trading account data.\n" + + "paymentAccountPayload=" + paymentAccountPayload.getPaymentDetails()); + } else if (filterManager.requireUpdateToNewVersionForTrading()) { + failed.handleErrorMessage("Your version of Bisq is not compatible for trading anymore. " + + "Please update to the latest Bisq version at https://bisq.network/downloads."); + } else { + complete.handleResult(); + } + } } diff --git a/core/src/main/java/bisq/core/trade/handlers/TransactionResultHandler.java b/core/src/main/java/bisq/core/trade/bisq_v1/TransactionResultHandler.java similarity index 96% rename from core/src/main/java/bisq/core/trade/handlers/TransactionResultHandler.java rename to core/src/main/java/bisq/core/trade/bisq_v1/TransactionResultHandler.java index ca3531226bf..3a9d2b42f07 100644 --- a/core/src/main/java/bisq/core/trade/handlers/TransactionResultHandler.java +++ b/core/src/main/java/bisq/core/trade/bisq_v1/TransactionResultHandler.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.handlers; +package bisq.core.trade.bisq_v1; import org.bitcoinj.core.Transaction; diff --git a/core/src/main/java/bisq/core/trade/MakerTrade.java b/core/src/main/java/bisq/core/trade/model/MakerTrade.java similarity index 95% rename from core/src/main/java/bisq/core/trade/MakerTrade.java rename to core/src/main/java/bisq/core/trade/model/MakerTrade.java index 2e0a41182dd..b911758da82 100644 --- a/core/src/main/java/bisq/core/trade/MakerTrade.java +++ b/core/src/main/java/bisq/core/trade/model/MakerTrade.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model; public interface MakerTrade { } diff --git a/core/src/main/java/bisq/core/trade/TakerTrade.java b/core/src/main/java/bisq/core/trade/model/TakerTrade.java similarity index 95% rename from core/src/main/java/bisq/core/trade/TakerTrade.java rename to core/src/main/java/bisq/core/trade/model/TakerTrade.java index a6d82ac8406..bb163a6051a 100644 --- a/core/src/main/java/bisq/core/trade/TakerTrade.java +++ b/core/src/main/java/bisq/core/trade/model/TakerTrade.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model; public interface TakerTrade { } diff --git a/core/src/main/java/bisq/core/trade/Tradable.java b/core/src/main/java/bisq/core/trade/model/Tradable.java similarity index 96% rename from core/src/main/java/bisq/core/trade/Tradable.java rename to core/src/main/java/bisq/core/trade/model/Tradable.java index e9b3f331931..fbb21d085ef 100644 --- a/core/src/main/java/bisq/core/trade/Tradable.java +++ b/core/src/main/java/bisq/core/trade/model/Tradable.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model; import bisq.core.offer.Offer; diff --git a/core/src/main/java/bisq/core/trade/TradableList.java b/core/src/main/java/bisq/core/trade/model/TradableList.java similarity index 93% rename from core/src/main/java/bisq/core/trade/TradableList.java rename to core/src/main/java/bisq/core/trade/model/TradableList.java index c3a668708ad..bcbf659e86e 100644 --- a/core/src/main/java/bisq/core/trade/TradableList.java +++ b/core/src/main/java/bisq/core/trade/model/TradableList.java @@ -15,11 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.OpenOffer; import bisq.core.proto.CoreProtoResolver; +import bisq.core.trade.model.bisq_v1.BuyerAsMakerTrade; +import bisq.core.trade.model.bisq_v1.BuyerAsTakerTrade; +import bisq.core.trade.model.bisq_v1.SellerAsMakerTrade; +import bisq.core.trade.model.bisq_v1.SellerAsTakerTrade; import bisq.common.proto.ProtoUtil; import bisq.common.proto.ProtobufferRuntimeException; diff --git a/core/src/main/java/bisq/core/trade/model/TradeModel.java b/core/src/main/java/bisq/core/trade/model/TradeModel.java new file mode 100644 index 00000000000..04104c8c6a1 --- /dev/null +++ b/core/src/main/java/bisq/core/trade/model/TradeModel.java @@ -0,0 +1,111 @@ +package bisq.core.trade.model; + +import bisq.core.offer.Offer; +import bisq.core.trade.protocol.ProtocolModel; +import bisq.core.trade.protocol.Provider; +import bisq.core.trade.protocol.TradePeer; + +import bisq.network.p2p.NodeAddress; + +import bisq.common.taskrunner.Model; +import bisq.common.util.Utilities; + +import javafx.beans.property.ReadOnlyStringProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + +import java.util.Date; + +import lombok.Getter; +import lombok.Setter; + +import javax.annotation.Nullable; + +public abstract class TradeModel implements Tradable, Model { + @Getter + protected final String uid; + protected final Offer offer; + @Getter + @Setter + @Nullable + protected NodeAddress tradingPeerNodeAddress; + @Getter + @Setter + protected long takeOfferDate; + @Nullable + @Getter + protected String errorMessage; + transient final private StringProperty errorMessageProperty = new SimpleStringProperty(); + + + public TradeModel(String uid, Offer offer) { + this(uid, offer, new Date().getTime(), null, null); + } + + public TradeModel(String uid, + Offer offer, + long takeOfferDate, + @Nullable NodeAddress tradingPeerNodeAddress, + @Nullable String errorMessage) { + this.uid = uid; + this.offer = offer; + this.tradingPeerNodeAddress = tradingPeerNodeAddress; + this.takeOfferDate = takeOfferDate; + setErrorMessage(errorMessage); + } + + public void initialize(Provider serviceProvider) { + } + + public abstract boolean isCompleted(); + + public abstract ProtocolModel getTradeProtocolModel(); + + public abstract TradeState getTradeState(); + + public abstract TradePhase getTradePhase(); + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Tradable implementation + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public Offer getOffer() { + return offer; + } + + @Override + public Date getDate() { + return new Date(takeOfferDate); + } + + @Override + public String getId() { + return offer.getId(); + } + + @Override + public String getShortId() { + return Utilities.getShortId(getId()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Setters + /////////////////////////////////////////////////////////////////////////////////////////// + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + errorMessageProperty.set(errorMessage); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Getters + /////////////////////////////////////////////////////////////////////////////////////////// + + public ReadOnlyStringProperty errorMessageProperty() { + return errorMessageProperty; + } +} diff --git a/core/src/main/java/bisq/core/trade/model/TradePhase.java b/core/src/main/java/bisq/core/trade/model/TradePhase.java new file mode 100644 index 00000000000..fdc1b54f38f --- /dev/null +++ b/core/src/main/java/bisq/core/trade/model/TradePhase.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 bisq.core.trade.model; + +public interface TradePhase { + enum Phase implements TradePhase { + DEFAULT + } + + int ordinal(); + + String name(); +} diff --git a/core/src/main/java/bisq/core/trade/model/TradeState.java b/core/src/main/java/bisq/core/trade/model/TradeState.java new file mode 100644 index 00000000000..f1e777bae14 --- /dev/null +++ b/core/src/main/java/bisq/core/trade/model/TradeState.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 bisq.core.trade.model; + +public interface TradeState { + default TradePhase getTradePhase() { + return TradePhase.Phase.DEFAULT; + } + + int ordinal(); + + String name(); +} diff --git a/core/src/main/java/bisq/core/trade/BuyerAsMakerTrade.java b/core/src/main/java/bisq/core/trade/model/bisq_v1/BuyerAsMakerTrade.java similarity index 96% rename from core/src/main/java/bisq/core/trade/BuyerAsMakerTrade.java rename to core/src/main/java/bisq/core/trade/model/bisq_v1/BuyerAsMakerTrade.java index 3a0005f8247..8ab3777d3e6 100644 --- a/core/src/main/java/bisq/core/trade/BuyerAsMakerTrade.java +++ b/core/src/main/java/bisq/core/trade/model/bisq_v1/BuyerAsMakerTrade.java @@ -15,12 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model.bisq_v1; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; import bisq.core.proto.CoreProtoResolver; -import bisq.core.trade.protocol.ProcessModel; +import bisq.core.trade.model.MakerTrade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/BuyerAsTakerTrade.java b/core/src/main/java/bisq/core/trade/model/bisq_v1/BuyerAsTakerTrade.java similarity index 96% rename from core/src/main/java/bisq/core/trade/BuyerAsTakerTrade.java rename to core/src/main/java/bisq/core/trade/model/bisq_v1/BuyerAsTakerTrade.java index 2ccf0fb3cb9..165f3d67c13 100644 --- a/core/src/main/java/bisq/core/trade/BuyerAsTakerTrade.java +++ b/core/src/main/java/bisq/core/trade/model/bisq_v1/BuyerAsTakerTrade.java @@ -15,12 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model.bisq_v1; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; import bisq.core.proto.CoreProtoResolver; -import bisq.core.trade.protocol.ProcessModel; +import bisq.core.trade.model.TakerTrade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/BuyerTrade.java b/core/src/main/java/bisq/core/trade/model/bisq_v1/BuyerTrade.java similarity index 96% rename from core/src/main/java/bisq/core/trade/BuyerTrade.java rename to core/src/main/java/bisq/core/trade/model/bisq_v1/BuyerTrade.java index 82f38cf9c16..9b0917f273f 100644 --- a/core/src/main/java/bisq/core/trade/BuyerTrade.java +++ b/core/src/main/java/bisq/core/trade/model/bisq_v1/BuyerTrade.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model.bisq_v1; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.trade.protocol.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/Contract.java b/core/src/main/java/bisq/core/trade/model/bisq_v1/Contract.java similarity index 99% rename from core/src/main/java/bisq/core/trade/Contract.java rename to core/src/main/java/bisq/core/trade/model/bisq_v1/Contract.java index d32b1c83722..4af1e2bea5a 100644 --- a/core/src/main/java/bisq/core/trade/Contract.java +++ b/core/src/main/java/bisq/core/trade/model/bisq_v1/Contract.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model.bisq_v1; import bisq.core.locale.CurrencyUtil; import bisq.core.monetary.Price; import bisq.core.monetary.Volume; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.payment.payload.PaymentMethod; import bisq.core.proto.CoreProtoResolver; diff --git a/core/src/main/java/bisq/core/trade/SellerAsMakerTrade.java b/core/src/main/java/bisq/core/trade/model/bisq_v1/SellerAsMakerTrade.java similarity index 96% rename from core/src/main/java/bisq/core/trade/SellerAsMakerTrade.java rename to core/src/main/java/bisq/core/trade/model/bisq_v1/SellerAsMakerTrade.java index ccbf66a0f6c..47f672cb402 100644 --- a/core/src/main/java/bisq/core/trade/SellerAsMakerTrade.java +++ b/core/src/main/java/bisq/core/trade/model/bisq_v1/SellerAsMakerTrade.java @@ -15,12 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model.bisq_v1; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; import bisq.core.proto.CoreProtoResolver; -import bisq.core.trade.protocol.ProcessModel; +import bisq.core.trade.model.MakerTrade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/SellerAsTakerTrade.java b/core/src/main/java/bisq/core/trade/model/bisq_v1/SellerAsTakerTrade.java similarity index 96% rename from core/src/main/java/bisq/core/trade/SellerAsTakerTrade.java rename to core/src/main/java/bisq/core/trade/model/bisq_v1/SellerAsTakerTrade.java index 11fb6c281d0..470354f2d10 100644 --- a/core/src/main/java/bisq/core/trade/SellerAsTakerTrade.java +++ b/core/src/main/java/bisq/core/trade/model/bisq_v1/SellerAsTakerTrade.java @@ -15,12 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model.bisq_v1; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; import bisq.core.proto.CoreProtoResolver; -import bisq.core.trade.protocol.ProcessModel; +import bisq.core.trade.model.TakerTrade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/SellerTrade.java b/core/src/main/java/bisq/core/trade/model/bisq_v1/SellerTrade.java similarity index 97% rename from core/src/main/java/bisq/core/trade/SellerTrade.java rename to core/src/main/java/bisq/core/trade/model/bisq_v1/SellerTrade.java index a87c18ddee9..2284b2baaa3 100644 --- a/core/src/main/java/bisq/core/trade/SellerTrade.java +++ b/core/src/main/java/bisq/core/trade/model/bisq_v1/SellerTrade.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model.bisq_v1; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.locale.CurrencyUtil; import bisq.core.offer.Offer; -import bisq.core.trade.protocol.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/Trade.java b/core/src/main/java/bisq/core/trade/model/bisq_v1/Trade.java similarity index 92% rename from core/src/main/java/bisq/core/trade/Trade.java rename to core/src/main/java/bisq/core/trade/model/bisq_v1/Trade.java index 447f8b52ea2..9d18616b9ab 100644 --- a/core/src/main/java/bisq/core/trade/Trade.java +++ b/core/src/main/java/bisq/core/trade/model/bisq_v1/Trade.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade; +package bisq.core.trade.model.bisq_v1; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.locale.CurrencyUtil; @@ -28,8 +28,13 @@ import bisq.core.support.dispute.mediation.MediationResultState; import bisq.core.support.dispute.refund.RefundResultState; import bisq.core.support.messages.ChatMessage; -import bisq.core.trade.protocol.ProcessModel; -import bisq.core.trade.protocol.ProcessModelServiceProvider; +import bisq.core.trade.model.TradeModel; +import bisq.core.trade.model.TradePhase; +import bisq.core.trade.model.TradeState; +import bisq.core.trade.protocol.ProtocolModel; +import bisq.core.trade.protocol.Provider; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; import bisq.core.trade.txproof.AssetTxProofResult; import bisq.core.util.VolumeUtil; @@ -37,7 +42,6 @@ import bisq.common.crypto.PubKeyRing; import bisq.common.proto.ProtoUtil; -import bisq.common.taskrunner.Model; import bisq.common.util.Utilities; import com.google.protobuf.ByteString; @@ -55,11 +59,8 @@ import javafx.beans.property.IntegerProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; -import javafx.beans.property.ReadOnlyStringProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.property.SimpleStringProperty; -import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -83,13 +84,13 @@ * stored in the task model. */ @Slf4j -public abstract class Trade implements Tradable, Model { +public abstract class Trade extends TradeModel { /////////////////////////////////////////////////////////////////////////////////////////// // Enums /////////////////////////////////////////////////////////////////////////////////////////// - public enum State { + public enum State implements TradeState { // #################### Phase PREPARATION // When trade protocol starts no funds are on stake PREPARATION(Phase.INIT), @@ -160,19 +161,16 @@ public enum State { // Alternatively the maker could have seen the payout tx earlier before he received the PAYOUT_TX_PUBLISHED_MSG BUYER_SAW_PAYOUT_TX_IN_NETWORK(Phase.PAYOUT_PUBLISHED), - // #################### Phase WITHDRAWN WITHDRAW_COMPLETED(Phase.WITHDRAWN); - @NotNull - public Phase getPhase() { + public Phase getTradePhase() { return phase; } - @NotNull private final Phase phase; - State(@NotNull Phase phase) { + State(Phase phase) { this.phase = phase; } @@ -188,13 +186,13 @@ public static protobuf.Trade.State toProtoMessage(Trade.State state) { // We allow a state change only if the phase is the next phase or if we do not change the phase by the // state change (e.g. detail change inside the same phase) public boolean isValidTransitionTo(State newState) { - Phase newPhase = newState.getPhase(); - Phase currentPhase = this.getPhase(); + Phase newPhase = newState.getTradePhase(); + Phase currentPhase = this.getTradePhase(); return currentPhase.isValidTransitionTo(newPhase) || newPhase.equals(currentPhase); } } - public enum Phase { + public enum Phase implements TradePhase { INIT, TAKER_FEE_PUBLISHED, DEPOSIT_PUBLISHED, @@ -208,13 +206,13 @@ public static Trade.Phase fromProto(protobuf.Trade.Phase phase) { return ProtoUtil.enumFromProto(Trade.Phase.class, phase.name()); } - public static protobuf.Trade.Phase toProtoMessage(Trade.Phase phase) { + public static protobuf.Trade.Phase toProtoMessage(Phase phase) { return protobuf.Trade.Phase.valueOf(phase.name()); } // We allow a phase change only if the phase a future phase (we cannot limit it to next phase as we have cases where // we skip a phase as it is only relevant to one role -> states and phases need a redesign ;-( ) - public boolean isValidTransitionTo(Phase newPhase) { + public boolean isValidTransitionTo(Trade.Phase newPhase) { // this is current phase return newPhase.ordinal() > this.ordinal(); } @@ -289,21 +287,12 @@ public static protobuf.Trade.TradePeriodState toProtoMessage(Trade.TradePeriodSt @Getter private final ProcessModel processModel; @Getter - private final Offer offer; - @Getter private final boolean isCurrencyForTakerFeeBtc; @Getter private final long txFeeAsLong; @Getter private final long takerFeeAsLong; - // Added in 1.5.1 - @Getter - private final String uid; - - @Setter - private long takeOfferDate; - // Mutable @Nullable @Getter @@ -322,10 +311,6 @@ public static protobuf.Trade.TradePeriodState toProtoMessage(Trade.TradePeriodSt private long tradeAmountAsLong; @Setter private long tradePrice; - @Nullable - @Getter - private NodeAddress tradingPeerNodeAddress; - @Getter private State state = State.PREPARATION; @Getter private DisputeState disputeState = DisputeState.NO_DISPUTE; @@ -374,8 +359,7 @@ public static protobuf.Trade.TradePeriodState toProtoMessage(Trade.TradePeriodSt @Getter @Setter private String takerPaymentAccountId; - @Nullable - private String errorMessage; + @Getter @Setter @Nullable @@ -396,7 +380,6 @@ public static protobuf.Trade.TradePeriodState toProtoMessage(Trade.TradePeriodSt transient final private ObjectProperty statePhaseProperty = new SimpleObjectProperty<>(state.phase); transient final private ObjectProperty disputeStateProperty = new SimpleObjectProperty<>(disputeState); transient final private ObjectProperty tradePeriodStateProperty = new SimpleObjectProperty<>(tradePeriodState); - transient final private StringProperty errorMessageProperty = new SimpleStringProperty(); // Mutable @Nullable @@ -477,7 +460,7 @@ protected Trade(Offer offer, BtcWalletService btcWalletService, ProcessModel processModel, String uid) { - this.offer = offer; + super(uid, offer); this.txFee = txFee; this.takerFee = takerFee; this.isCurrencyForTakerFeeBtc = isCurrencyForTakerFeeBtc; @@ -486,11 +469,9 @@ protected Trade(Offer offer, this.refundAgentNodeAddress = refundAgentNodeAddress; this.btcWalletService = btcWalletService; this.processModel = processModel; - this.uid = uid; txFeeAsLong = txFee.value; takerFeeAsLong = takerFee.value; - takeOfferDate = new Date().getTime(); } @@ -521,8 +502,8 @@ protected Trade(Offer offer, processModel, uid); this.tradePrice = tradePrice; - this.tradingPeerNodeAddress = tradingPeerNodeAddress; + setTradingPeerNodeAddress(tradingPeerNodeAddress); setTradeAmount(tradeAmount); } @@ -627,7 +608,7 @@ public static Trade fromProto(Trade trade, protobuf.Trade proto, CoreProtoResolv // API /////////////////////////////////////////////////////////////////////////////////////////// - public void initialize(ProcessModelServiceProvider serviceProvider) { + public void initialize(Provider serviceProvider) { serviceProvider.getArbitratorManager().getDisputeAgentByNodeAddress(arbitratorNodeAddress).ifPresent(arbitrator -> { arbitratorBtcPubKey = arbitrator.getBtcPubKey(); arbitratorPubKeyRing = arbitrator.getPubKeyRing(); @@ -648,7 +629,7 @@ public void initialize(ProcessModelServiceProvider serviceProvider) { /////////////////////////////////////////////////////////////////////////////////////////// // The deserialized tx has not actual confidence data, so we need to get the fresh one from the wallet. - void updateDepositTxFromWallet() { + public void updateDepositTxFromWallet() { if (getDepositTx() != null) applyDepositTx(processModel.getTradeWalletService().getWalletTx(getDepositTx().getTxId())); } @@ -721,13 +702,32 @@ public boolean mediationResultAppliedPenaltyToSeller() { /////////////////////////////////////////////////////////////////////////////////////////// - // Model implementation + // TradeModel implementation /////////////////////////////////////////////////////////////////////////////////////////// @Override public void onComplete() { } + @Override + public State getTradeState() { + return state; + } + + @Override + public Phase getTradePhase() { + return state.getTradePhase(); + } + + @Override + public ProtocolModel getTradeProtocolModel() { + return processModel; + } + + @Override + public boolean isCompleted() { + return isWithdrawn(); + } /////////////////////////////////////////////////////////////////////////////////////////// // Abstract @@ -755,7 +755,7 @@ public void setState(State state) { // We don't want to log at startup the setState calls from all persisted trades log.info("Set new state at {} (id={}): {}", this.getClass().getSimpleName(), getShortId(), state); } - if (state.getPhase().ordinal() < this.state.getPhase().ordinal()) { + if (state.getTradePhase().ordinal() < this.state.getTradePhase().ordinal()) { String message = "We got a state change to a previous phase.\n" + "Old state is: " + this.state + ". New state is: " + state; log.warn(message); @@ -763,7 +763,7 @@ public void setState(State state) { this.state = state; stateProperty.set(state); - statePhaseProperty.set(state.getPhase()); + statePhaseProperty.set(state.getTradePhase()); } public void setDisputeState(DisputeState disputeState) { @@ -786,13 +786,6 @@ public void setTradePeriodState(TradePeriodState tradePeriodState) { tradePeriodStateProperty.set(tradePeriodState); } - public void setTradingPeerNodeAddress(NodeAddress tradingPeerNodeAddress) { - if (tradingPeerNodeAddress == null) - log.error("tradingPeerAddress=null"); - else - this.tradingPeerNodeAddress = tradingPeerNodeAddress; - } - public void setTradeAmount(Coin tradeAmount) { this.tradeAmount = tradeAmount; tradeAmountAsLong = tradeAmount.value; @@ -805,11 +798,6 @@ public void setPayoutTx(Transaction payoutTx) { payoutTxId = payoutTx.getTxId().toString(); } - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - errorMessageProperty.set(errorMessage); - } - public void setAssetTxProofResult(@Nullable AssetTxProofResult assetTxProofResult) { this.assetTxProofResult = assetTxProofResult; assetTxProofResultUpdateProperty.set(assetTxProofResultUpdateProperty.get() + 1); @@ -820,14 +808,6 @@ public void setAssetTxProofResult(@Nullable AssetTxProofResult assetTxProofResul // Getter /////////////////////////////////////////////////////////////////////////////////////////// - public Date getTakeOfferDate() { - return new Date(takeOfferDate); - } - - public Phase getPhase() { - return state.getPhase(); - } - @Nullable public Volume getTradeVolume() { try { @@ -857,16 +837,16 @@ public Date getMaxTradePeriodDate() { } private long getMaxTradePeriod() { - return getOffer().getPaymentMethod().getMaxTradePeriod(); + return offer.getPaymentMethod().getMaxTradePeriod(); } private long getTradeStartTime() { long now = System.currentTimeMillis(); long startTime; Transaction depositTx = getDepositTx(); - if (depositTx != null && getTakeOfferDate() != null) { + if (depositTx != null && getDate() != null) { if (depositTx.getConfidence().getDepthInBlocks() > 0) { - final long tradeTime = getTakeOfferDate().getTime(); + final long tradeTime = getDate().getTime(); // Use tx.getIncludedInBestChainAt() when available, otherwise use tx.getUpdateTime() long blockTime = depositTx.getIncludedInBestChainAt() != null ? depositTx.getIncludedInBestChainAt().getTime() @@ -896,15 +876,15 @@ public boolean hasFailed() { } public boolean isInPreparation() { - return getState().getPhase().ordinal() == Phase.INIT.ordinal(); + return getTradePhase().ordinal() == Phase.INIT.ordinal(); } public boolean isTakerFeePublished() { - return getState().getPhase().ordinal() >= Phase.TAKER_FEE_PUBLISHED.ordinal(); + return getTradePhase().ordinal() >= Phase.TAKER_FEE_PUBLISHED.ordinal(); } public boolean isDepositPublished() { - return getState().getPhase().ordinal() >= Phase.DEPOSIT_PUBLISHED.ordinal(); + return getTradePhase().ordinal() >= Phase.DEPOSIT_PUBLISHED.ordinal(); } public boolean isFundsLockedIn() { @@ -938,23 +918,23 @@ public boolean isFundsLockedIn() { } public boolean isDepositConfirmed() { - return getState().getPhase().ordinal() >= Phase.DEPOSIT_CONFIRMED.ordinal(); + return getTradePhase().ordinal() >= Phase.DEPOSIT_CONFIRMED.ordinal(); } public boolean isFiatSent() { - return getState().getPhase().ordinal() >= Phase.FIAT_SENT.ordinal(); + return getTradePhase().ordinal() >= Phase.FIAT_SENT.ordinal(); } public boolean isFiatReceived() { - return getState().getPhase().ordinal() >= Phase.FIAT_RECEIVED.ordinal(); + return getTradePhase().ordinal() >= Phase.FIAT_RECEIVED.ordinal(); } public boolean isPayoutPublished() { - return getState().getPhase().ordinal() >= Phase.PAYOUT_PUBLISHED.ordinal() || isWithdrawn(); + return getTradePhase().ordinal() >= Phase.PAYOUT_PUBLISHED.ordinal() || isWithdrawn(); } public boolean isWithdrawn() { - return getState().getPhase().ordinal() == Phase.WITHDRAWN.ordinal(); + return getTradePhase().ordinal() == Phase.WITHDRAWN.ordinal(); } public ReadOnlyObjectProperty stateProperty() { @@ -989,25 +969,6 @@ public ReadOnlyObjectProperty tradeVolumeProperty() { return tradeVolumeProperty; } - public ReadOnlyStringProperty errorMessageProperty() { - return errorMessageProperty; - } - - @Override - public Date getDate() { - return getTakeOfferDate(); - } - - @Override - public String getId() { - return offer.getId(); - } - - @Override - public String getShortId() { - return offer.getShortId(); - } - public Price getTradePrice() { return Price.valueOf(offer.getCurrencyCode(), tradePrice); } @@ -1030,11 +991,6 @@ public boolean hasErrorMessage() { return getErrorMessage() != null && !getErrorMessage().isEmpty(); } - @Nullable - public String getErrorMessage() { - return errorMessageProperty.get(); - } - public boolean isTxChainInvalid() { return offer.getOfferFeePaymentTxId() == null || getTakerFeeTxId() == null || @@ -1153,7 +1109,6 @@ public String toString() { ",\n statePhaseProperty=" + statePhaseProperty + ",\n disputeStateProperty=" + disputeStateProperty + ",\n tradePeriodStateProperty=" + tradePeriodStateProperty + - ",\n errorMessageProperty=" + errorMessageProperty + ",\n depositTx=" + depositTx + ",\n delayedPayoutTx=" + delayedPayoutTx + ",\n payoutTx=" + payoutTx + diff --git a/core/src/main/java/bisq/core/trade/protocol/FluentProtocol.java b/core/src/main/java/bisq/core/trade/protocol/FluentProtocol.java index 2d79f9ed7e8..b1ca476ba6d 100644 --- a/core/src/main/java/bisq/core/trade/protocol/FluentProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/FluentProtocol.java @@ -17,8 +17,9 @@ package bisq.core.trade.protocol; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.TradeMessage; +import bisq.core.trade.model.TradeModel; +import bisq.core.trade.model.TradePhase; +import bisq.core.trade.model.TradeState; import bisq.network.p2p.NodeAddress; @@ -42,8 +43,7 @@ // taskRunner and the optional runnable. public class FluentProtocol { - - interface Event { + public interface Event { String name(); } @@ -61,7 +61,7 @@ protected FluentProtocol condition(Condition condition) { return this; } - protected FluentProtocol setup(Setup setup) { + public FluentProtocol setup(Setup setup) { this.setup = setup; return this; } @@ -98,14 +98,14 @@ public FluentProtocol executeTasks() { NodeAddress peer = condition.getPeer(); if (peer != null) { - tradeProtocol.processModel.setTempTradingPeerNodeAddress(peer); - tradeProtocol.processModel.getTradeManager().requestPersistence(); + tradeProtocol.protocolModel.setTempTradingPeerNodeAddress(peer); + tradeProtocol.protocolModel.getTradeManager().requestPersistence(); } TradeMessage message = condition.getMessage(); if (message != null) { - tradeProtocol.processModel.setTradeMessage(message); - tradeProtocol.processModel.getTradeManager().requestPersistence(); + tradeProtocol.protocolModel.setTradeMessage(message); + tradeProtocol.protocolModel.getTradeManager().requestPersistence(); } TradeTaskRunner taskRunner = setup.getTaskRunner(message, condition.getEvent()); @@ -146,10 +146,10 @@ public Result info(String info) { } } - private final Set expectedPhases = new HashSet<>(); - private final Set expectedStates = new HashSet<>(); + private final Set expectedPhases = new HashSet<>(); + private final Set expectedStates = new HashSet<>(); private final Set preConditions = new HashSet<>(); - private final Trade trade; + private final TradeModel tradeModel; @Nullable private Result result; @@ -166,29 +166,29 @@ public Result info(String info) { private Runnable preConditionFailedHandler; - public Condition(Trade trade) { - this.trade = trade; + public Condition(TradeModel tradeModel) { + this.tradeModel = tradeModel; } - public Condition phase(Trade.Phase expectedPhase) { + public Condition phase(TradePhase expectedPhase) { checkArgument(result == null); this.expectedPhases.add(expectedPhase); return this; } - public Condition anyPhase(Trade.Phase... expectedPhases) { + public Condition anyPhase(TradePhase... expectedPhases) { checkArgument(result == null); this.expectedPhases.addAll(Set.of(expectedPhases)); return this; } - public Condition state(Trade.State state) { + public Condition state(TradeState state) { checkArgument(result == null); this.expectedStates.add(state); return this; } - public Condition anyState(Trade.State... states) { + public Condition anyState(TradeState... states) { checkArgument(result == null); this.expectedStates.addAll(Set.of(states)); return this; @@ -228,10 +228,10 @@ public Condition preCondition(boolean preCondition, Runnable conditionFailedHand public Result getResult() { if (result == null) { - boolean isTradeIdValid = message == null || isTradeIdValid(trade.getId(), message); + boolean isTradeIdValid = message == null || isTradeIdValid(tradeModel.getId(), message); if (!isTradeIdValid) { String info = MessageFormat.format("TradeId does not match tradeId in message, TradeId={0}, tradeId in message={1}", - trade.getId(), message.getTradeId()); + tradeModel.getId(), message.getTradeId()); result = Result.INVALID_TRADE_ID.info(info); return result; } @@ -252,7 +252,7 @@ public Result getResult() { boolean allPreConditionsMet = preConditions.stream().allMatch(e -> e); if (!allPreConditionsMet) { String info = MessageFormat.format("PreConditions not met. preConditions={0}, this={1}, tradeId={2}", - preConditions, this, trade.getId()); + preConditions, this, tradeModel.getId()); result = Result.INVALID_PRE_CONDITION.info(info); if (preConditionFailedHandler != null) { @@ -271,7 +271,7 @@ private Result getPhaseResult() { return Result.VALID; } - boolean isPhaseValid = expectedPhases.stream().anyMatch(e -> e == trade.getPhase()); + boolean isPhaseValid = expectedPhases.stream().anyMatch(e -> e == tradeModel.getTradePhase()); String trigger = message != null ? message.getClass().getSimpleName() : event != null ? @@ -280,9 +280,9 @@ private Result getPhaseResult() { if (isPhaseValid) { String info = MessageFormat.format("We received a {0} at phase {1} and state {2}, tradeId={3}", trigger, - trade.getPhase(), - trade.getState(), - trade.getId()); + tradeModel.getTradePhase(), + tradeModel.getTradeState(), + tradeModel.getId()); log.info(info); return Result.VALID.info(info); } else { @@ -292,9 +292,9 @@ private Result getPhaseResult() { "Expected phases={1},\nTrade phase={2},\nTrade state= {3},\ntradeId={4}", trigger, expectedPhases, - trade.getPhase(), - trade.getState(), - trade.getId()); + tradeModel.getTradePhase(), + tradeModel.getTradeState(), + tradeModel.getId()); return Result.INVALID_PHASE.info(info); } } @@ -304,7 +304,7 @@ private Result getStateResult() { return Result.VALID; } - boolean isStateValid = expectedStates.stream().anyMatch(e -> e == trade.getState()); + boolean isStateValid = expectedStates.stream().anyMatch(e -> e == tradeModel.getTradeState()); String trigger = message != null ? message.getClass().getSimpleName() : event != null ? @@ -313,8 +313,8 @@ private Result getStateResult() { if (isStateValid) { String info = MessageFormat.format("We received a {0} at state {1}, tradeId={2}", trigger, - trade.getState(), - trade.getId()); + tradeModel.getTradeState(), + tradeModel.getId()); log.info(info); return Result.VALID.info(info); } else { @@ -322,8 +322,8 @@ private Result getStateResult() { "Expected states={1}, Trade state= {2}, tradeId={3}", trigger, expectedStates, - trade.getState(), - trade.getId()); + tradeModel.getTradeState(), + tradeModel.getId()); return Result.INVALID_STATE.info(info); } } @@ -337,21 +337,21 @@ private Result getStateResult() { @Slf4j public static class Setup { private final TradeProtocol tradeProtocol; - private final Trade trade; + private final TradeModel tradeModel; @Getter - private Class>[] tasks; + private Class>[] tasks; @Getter private int timeoutSec; @Nullable private TradeTaskRunner taskRunner; - public Setup(TradeProtocol tradeProtocol, Trade trade) { + public Setup(TradeProtocol tradeProtocol, TradeModel tradeModel) { this.tradeProtocol = tradeProtocol; - this.trade = trade; + this.tradeModel = tradeModel; } @SafeVarargs - public final Setup tasks(Class>... tasks) { + public final Setup tasks(Class>... tasks) { this.tasks = tasks; return this; } @@ -369,11 +369,11 @@ public Setup using(TradeTaskRunner taskRunner) { public TradeTaskRunner getTaskRunner(@Nullable TradeMessage message, @Nullable Event event) { if (taskRunner == null) { if (message != null) { - taskRunner = new TradeTaskRunner(trade, + taskRunner = new TradeTaskRunner(tradeModel, () -> tradeProtocol.handleTaskRunnerSuccess(message), errorMessage -> tradeProtocol.handleTaskRunnerFault(message, errorMessage)); } else if (event != null) { - taskRunner = new TradeTaskRunner(trade, + taskRunner = new TradeTaskRunner(tradeModel, () -> tradeProtocol.handleTaskRunnerSuccess(event), errorMessage -> tradeProtocol.handleTaskRunnerFault(event, errorMessage)); } else { diff --git a/core/src/main/java/bisq/core/trade/protocol/ProtocolModel.java b/core/src/main/java/bisq/core/trade/protocol/ProtocolModel.java new file mode 100644 index 00000000000..7c6f6b23aba --- /dev/null +++ b/core/src/main/java/bisq/core/trade/protocol/ProtocolModel.java @@ -0,0 +1,28 @@ +package bisq.core.trade.protocol; + +import bisq.core.offer.Offer; +import bisq.core.trade.TradeManager; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.P2PService; + +import bisq.common.proto.persistable.PersistablePayload; +import bisq.common.taskrunner.Model; + +public interface ProtocolModel extends Model, PersistablePayload { + void applyTransient(Provider provider, TradeManager tradeManager, Offer offer); + + P2PService getP2PService(); + + T getTradePeer(); + + void setTempTradingPeerNodeAddress(NodeAddress nodeAddress); + + NodeAddress getTempTradingPeerNodeAddress(); + + TradeManager getTradeManager(); + + void setTradeMessage(TradeMessage tradeMessage); + + NodeAddress getMyNodeAddress(); +} diff --git a/core/src/main/java/bisq/core/trade/protocol/ProcessModelServiceProvider.java b/core/src/main/java/bisq/core/trade/protocol/Provider.java similarity index 72% rename from core/src/main/java/bisq/core/trade/protocol/ProcessModelServiceProvider.java rename to core/src/main/java/bisq/core/trade/protocol/Provider.java index 37600eccaf3..273285efe19 100644 --- a/core/src/main/java/bisq/core/trade/protocol/ProcessModelServiceProvider.java +++ b/core/src/main/java/bisq/core/trade/protocol/Provider.java @@ -21,9 +21,11 @@ import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.TradeWalletService; +import bisq.core.btc.wallet.WalletsManager; import bisq.core.dao.DaoFacade; import bisq.core.filter.FilterManager; import bisq.core.offer.OpenOfferManager; +import bisq.core.provider.fee.FeeService; import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; import bisq.core.support.dispute.mediation.mediator.MediatorManager; import bisq.core.support.dispute.refund.refundagent.RefundAgentManager; @@ -40,12 +42,13 @@ import lombok.Getter; @Getter -public class ProcessModelServiceProvider { +public class Provider { private final OpenOfferManager openOfferManager; private final P2PService p2PService; private final BtcWalletService btcWalletService; private final BsqWalletService bsqWalletService; private final TradeWalletService tradeWalletService; + private final WalletsManager walletsManager; private final DaoFacade daoFacade; private final ReferralIdService referralIdService; private final User user; @@ -56,29 +59,33 @@ public class ProcessModelServiceProvider { private final MediatorManager mediatorManager; private final RefundAgentManager refundAgentManager; private final KeyRing keyRing; + private final FeeService feeService; @Inject - public ProcessModelServiceProvider(OpenOfferManager openOfferManager, - P2PService p2PService, - BtcWalletService btcWalletService, - BsqWalletService bsqWalletService, - TradeWalletService tradeWalletService, - DaoFacade daoFacade, - ReferralIdService referralIdService, - User user, - FilterManager filterManager, - AccountAgeWitnessService accountAgeWitnessService, - TradeStatisticsManager tradeStatisticsManager, - ArbitratorManager arbitratorManager, - MediatorManager mediatorManager, - RefundAgentManager refundAgentManager, - KeyRing keyRing) { + public Provider(OpenOfferManager openOfferManager, + P2PService p2PService, + BtcWalletService btcWalletService, + BsqWalletService bsqWalletService, + TradeWalletService tradeWalletService, + WalletsManager walletsManager, + DaoFacade daoFacade, + ReferralIdService referralIdService, + User user, + FilterManager filterManager, + AccountAgeWitnessService accountAgeWitnessService, + TradeStatisticsManager tradeStatisticsManager, + ArbitratorManager arbitratorManager, + MediatorManager mediatorManager, + RefundAgentManager refundAgentManager, + KeyRing keyRing, + FeeService feeService) { this.openOfferManager = openOfferManager; this.p2PService = p2PService; this.btcWalletService = btcWalletService; this.bsqWalletService = bsqWalletService; this.tradeWalletService = tradeWalletService; + this.walletsManager = walletsManager; this.daoFacade = daoFacade; this.referralIdService = referralIdService; this.user = user; @@ -89,5 +96,6 @@ public ProcessModelServiceProvider(OpenOfferManager openOfferManager, this.mediatorManager = mediatorManager; this.refundAgentManager = refundAgentManager; this.keyRing = keyRing; + this.feeService = feeService; } } diff --git a/core/src/main/java/bisq/core/trade/messages/TradeMessage.java b/core/src/main/java/bisq/core/trade/protocol/TradeMessage.java similarity index 97% rename from core/src/main/java/bisq/core/trade/messages/TradeMessage.java rename to core/src/main/java/bisq/core/trade/protocol/TradeMessage.java index e90cbb02657..2854365099c 100644 --- a/core/src/main/java/bisq/core/trade/messages/TradeMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/TradeMessage.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol; import bisq.network.p2p.UidMessage; diff --git a/core/src/main/java/bisq/core/trade/protocol/TradePeer.java b/core/src/main/java/bisq/core/trade/protocol/TradePeer.java new file mode 100644 index 00000000000..81b134fbb62 --- /dev/null +++ b/core/src/main/java/bisq/core/trade/protocol/TradePeer.java @@ -0,0 +1,27 @@ +/* + * 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 bisq.core.trade.protocol; + +import bisq.common.crypto.PubKeyRing; +import bisq.common.proto.persistable.PersistablePayload; + +public interface TradePeer extends PersistablePayload { + PubKeyRing getPubKeyRing(); + + void setPubKeyRing(PubKeyRing pubKeyRing); +} diff --git a/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java b/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java index 2135aecec8a..549439e61b7 100644 --- a/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/TradeProtocol.java @@ -18,11 +18,9 @@ package bisq.core.trade.protocol; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; -import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage; -import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.messages.TradeMessage; +import bisq.core.trade.model.TradeModel; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.network.p2p.AckMessage; import bisq.network.p2p.AckMessageSourceType; @@ -44,6 +42,7 @@ import java.util.Collections; import java.util.concurrent.TimeUnit; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import javax.annotation.Nullable; @@ -51,8 +50,9 @@ @Slf4j public abstract class TradeProtocol implements DecryptedDirectMessageListener, DecryptedMailboxListener { - protected final ProcessModel processModel; - protected final Trade trade; + @Getter + protected final ProtocolModel protocolModel; + protected final TradeModel tradeModel; private Timer timeoutTimer; @@ -60,9 +60,9 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D // Constructor /////////////////////////////////////////////////////////////////////////////////////////// - public TradeProtocol(Trade trade) { - this.trade = trade; - this.processModel = trade.getProcessModel(); + public TradeProtocol(TradeModel tradeModel) { + this.tradeModel = tradeModel; + this.protocolModel = tradeModel.getTradeProtocolModel(); } @@ -70,18 +70,18 @@ public TradeProtocol(Trade trade) { // API /////////////////////////////////////////////////////////////////////////////////////////// - public void initialize(ProcessModelServiceProvider serviceProvider, TradeManager tradeManager, Offer offer) { - processModel.applyTransient(serviceProvider, tradeManager, offer); + public void initialize(Provider serviceProvider, TradeManager tradeManager, Offer offer) { + protocolModel.applyTransient(serviceProvider, tradeManager, offer); onInitialized(); } protected void onInitialized() { - if (!trade.isWithdrawn()) { - processModel.getP2PService().addDecryptedDirectMessageListener(this); + if (!tradeModel.isCompleted()) { + protocolModel.getP2PService().addDecryptedDirectMessageListener(this); } - MailboxMessageService mailboxMessageService = processModel.getP2PService().getMailboxMessageService(); - // We delay a bit here as the trade gets updated from the wallet to update the trade + MailboxMessageService mailboxMessageService = protocolModel.getP2PService().getMailboxMessageService(); + // We delay a bit here as the tradeModel gets updated from the wallet to update the tradeModel // state (deposit confirmed) and that happens after our method is called. // TODO To fix that in a better way we would need to change the order of some routines // from the TradeManager, but as we are close to a release I dont want to risk a bigger @@ -145,32 +145,33 @@ private void handleMailboxCollection(Collection coll } private void handleMailboxMessage(MailboxMessage mailboxMessage) { + ProtocolModel protocolModel = tradeModel.getTradeProtocolModel(); if (mailboxMessage instanceof TradeMessage) { TradeMessage tradeMessage = (TradeMessage) mailboxMessage; - // We only remove here if we have already completed the trade. + // We only remove here if we have already completed the tradeModel. // Otherwise removal is done after successfully applied the task runner. - if (trade.isWithdrawn()) { - processModel.getP2PService().getMailboxMessageService().removeMailboxMsg(mailboxMessage); - log.info("Remove {} from the P2P network as trade is already completed.", + if (tradeModel.isCompleted()) { + protocolModel.getP2PService().getMailboxMessageService().removeMailboxMsg(mailboxMessage); + log.info("Remove {} from the P2P network as tradeModel is already completed.", tradeMessage.getClass().getSimpleName()); return; } onMailboxMessage(tradeMessage, mailboxMessage.getSenderNodeAddress()); } else if (mailboxMessage instanceof AckMessage) { AckMessage ackMessage = (AckMessage) mailboxMessage; - if (!trade.isWithdrawn()) { - // We only apply the msg if we have not already completed the trade + if (!tradeModel.isCompleted()) { + // We only apply the msg if we have not already completed the tradeModel onAckMessage(ackMessage, mailboxMessage.getSenderNodeAddress()); } // In any case we remove the msg - processModel.getP2PService().getMailboxMessageService().removeMailboxMsg(ackMessage); + protocolModel.getP2PService().getMailboxMessageService().removeMailboxMsg(ackMessage); log.info("Remove {} from the P2P network.", ackMessage.getClass().getSimpleName()); } } public void removeMailboxMessageAfterProcessing(TradeMessage tradeMessage) { if (tradeMessage instanceof MailboxMessage) { - processModel.getP2PService().getMailboxMessageService().removeMailboxMsg((MailboxMessage) tradeMessage); + protocolModel.getP2PService().getMailboxMessageService().removeMailboxMsg((MailboxMessage) tradeMessage); log.info("Remove {} from the P2P network.", tradeMessage.getClass().getSimpleName()); } } @@ -208,16 +209,20 @@ protected FluentProtocol given(FluentProtocol.Condition condition) { } protected FluentProtocol.Condition phase(Trade.Phase expectedPhase) { - return new FluentProtocol.Condition(trade).phase(expectedPhase); + return new FluentProtocol.Condition(tradeModel).phase(expectedPhase); } protected FluentProtocol.Condition anyPhase(Trade.Phase... expectedPhases) { - return new FluentProtocol.Condition(trade).anyPhase(expectedPhases); + return new FluentProtocol.Condition(tradeModel).anyPhase(expectedPhases); + } + + protected FluentProtocol.Condition preCondition(boolean preCondition) { + return new FluentProtocol.Condition(tradeModel).preCondition(preCondition); } @SafeVarargs - public final FluentProtocol.Setup tasks(Class>... tasks) { - return new FluentProtocol.Setup(this, trade).tasks(tasks); + public final FluentProtocol.Setup tasks(Class>... tasks) { + return new FluentProtocol.Setup(this, tradeModel).tasks(tasks); } @@ -225,26 +230,10 @@ public final FluentProtocol.Setup tasks(Class>... tasks) { // ACK msg /////////////////////////////////////////////////////////////////////////////////////////// - private void onAckMessage(AckMessage ackMessage, NodeAddress peer) { - // We handle the ack for CounterCurrencyTransferStartedMessage and DepositTxAndDelayedPayoutTxMessage - // as we support automatic re-send of the msg in case it was not ACKed after a certain time - if (ackMessage.getSourceMsgClassName().equals(CounterCurrencyTransferStartedMessage.class.getSimpleName())) { - processModel.setPaymentStartedAckMessage(ackMessage); - } else if (ackMessage.getSourceMsgClassName().equals(DepositTxAndDelayedPayoutTxMessage.class.getSimpleName())) { - processModel.setDepositTxSentAckMessage(ackMessage); - } - - if (ackMessage.isSuccess()) { - log.info("Received AckMessage for {} from {} with tradeId {} and uid {}", - ackMessage.getSourceMsgClassName(), peer, trade.getId(), ackMessage.getSourceUid()); - } else { - log.warn("Received AckMessage with error state for {} from {} with tradeId {} and errorMessage={}", - ackMessage.getSourceMsgClassName(), peer, trade.getId(), ackMessage.getErrorMessage()); - } - } + abstract protected void onAckMessage(AckMessage ackMessage, NodeAddress peer); protected void sendAckMessage(TradeMessage message, boolean result, @Nullable String errorMessage) { - PubKeyRing peersPubKeyRing = processModel.getTradingPeer().getPubKeyRing(); + PubKeyRing peersPubKeyRing = protocolModel.getTradePeer().getPubKeyRing(); if (peersPubKeyRing == null) { log.error("We cannot send the ACK message as peersPubKeyRing is null"); return; @@ -252,21 +241,21 @@ protected void sendAckMessage(TradeMessage message, boolean result, @Nullable St String tradeId = message.getTradeId(); String sourceUid = message.getUid(); - AckMessage ackMessage = new AckMessage(processModel.getMyNodeAddress(), + AckMessage ackMessage = new AckMessage(protocolModel.getMyNodeAddress(), AckMessageSourceType.TRADE_MESSAGE, message.getClass().getSimpleName(), sourceUid, tradeId, result, errorMessage); - // If there was an error during offer verification, the tradingPeerNodeAddress of the trade might not be set yet. - // We can find the peer's node address in the processModel's tempTradingPeerNodeAddress in that case. - NodeAddress peer = trade.getTradingPeerNodeAddress() != null ? - trade.getTradingPeerNodeAddress() : - processModel.getTempTradingPeerNodeAddress(); + // If there was an error during offer verification, the tradingPeerNodeAddress of the tradeModel might not be set yet. + // We can find the peer's node address in the protocolModel's tempTradingPeerNodeAddress in that case. + NodeAddress peer = tradeModel.getTradingPeerNodeAddress() != null ? + tradeModel.getTradingPeerNodeAddress() : + protocolModel.getTempTradingPeerNodeAddress(); log.info("Send AckMessage for {} to peer {}. tradeId={}, sourceUid={}", ackMessage.getSourceMsgClassName(), peer, tradeId, sourceUid); - processModel.getP2PService().getMailboxMessageService().sendEncryptedMailboxMessage( + protocolModel.getP2PService().getMailboxMessageService().sendEncryptedMailboxMessage( peer, peersPubKeyRing, ackMessage, @@ -302,10 +291,10 @@ protected void startTimeout(long timeoutSec) { timeoutTimer = UserThread.runAfter(() -> { log.error("Timeout reached. TradeID={}, state={}, timeoutSec={}", - trade.getId(), trade.stateProperty().get(), timeoutSec); - trade.setErrorMessage("Timeout reached. Protocol did not complete in " + timeoutSec + " sec."); + tradeModel.getId(), tradeModel.getTradeState(), timeoutSec); + tradeModel.setErrorMessage("Timeout reached. Protocol did not complete in " + timeoutSec + " sec."); - processModel.getTradeManager().requestPersistence(); + protocolModel.getTradeManager().requestPersistence(); cleanup(); }, timeoutSec); } @@ -345,8 +334,8 @@ protected void handleTaskRunnerFault(FluentProtocol.Event event, String errorMes private boolean isPubKeyValid(DecryptedMessageWithPubKey message) { // We can only validate the peers pubKey if we have it already. If we are the taker we get it from the offer - // Otherwise it depends on the state of the trade protocol if we have received the peers pubKeyRing already. - PubKeyRing peersPubKeyRing = processModel.getTradingPeer().getPubKeyRing(); + // Otherwise it depends on the state of the tradeModel protocol if we have received the peers pubKeyRing already. + PubKeyRing peersPubKeyRing = protocolModel.getTradePeer().getPubKeyRing(); boolean isValid = true; if (peersPubKeyRing != null && !message.getSignaturePubKey().equals(peersPubKeyRing.getSignaturePubKey())) { @@ -362,7 +351,7 @@ private boolean isPubKeyValid(DecryptedMessageWithPubKey message) { /////////////////////////////////////////////////////////////////////////////////////////// private void handleTaskRunnerSuccess(@Nullable TradeMessage message, String source) { - log.info("TaskRunner successfully completed. Triggered from {}, tradeId={}", source, trade.getId()); + log.info("TaskRunner successfully completed. Triggered from {}, tradeId={}", source, tradeModel.getId()); if (message != null) { sendAckMessage(message, true, null); @@ -385,11 +374,11 @@ void handleTaskRunnerFault(@Nullable TradeMessage message, String source, String private boolean isMyMessage(NetworkEnvelope message) { if (message instanceof TradeMessage) { TradeMessage tradeMessage = (TradeMessage) message; - return tradeMessage.getTradeId().equals(trade.getId()); + return tradeMessage.getTradeId().equals(tradeModel.getId()); } else if (message instanceof AckMessage) { AckMessage ackMessage = (AckMessage) message; return ackMessage.getSourceType() == AckMessageSourceType.TRADE_MESSAGE && - ackMessage.getSourceId().equals(trade.getId()); + ackMessage.getSourceId().equals(tradeModel.getId()); } else { return false; } diff --git a/core/src/main/java/bisq/core/trade/protocol/TradeProtocolFactory.java b/core/src/main/java/bisq/core/trade/protocol/TradeProtocolFactory.java index fe521e99186..4c4dcf89ec9 100644 --- a/core/src/main/java/bisq/core/trade/protocol/TradeProtocolFactory.java +++ b/core/src/main/java/bisq/core/trade/protocol/TradeProtocolFactory.java @@ -17,24 +17,28 @@ package bisq.core.trade.protocol; -import bisq.core.trade.BuyerAsMakerTrade; -import bisq.core.trade.BuyerAsTakerTrade; -import bisq.core.trade.SellerAsMakerTrade; -import bisq.core.trade.SellerAsTakerTrade; -import bisq.core.trade.Trade; +import bisq.core.trade.model.TradeModel; +import bisq.core.trade.model.bisq_v1.BuyerAsMakerTrade; +import bisq.core.trade.model.bisq_v1.BuyerAsTakerTrade; +import bisq.core.trade.model.bisq_v1.SellerAsMakerTrade; +import bisq.core.trade.model.bisq_v1.SellerAsTakerTrade; +import bisq.core.trade.protocol.bisq_v1.BuyerAsMakerProtocol; +import bisq.core.trade.protocol.bisq_v1.BuyerAsTakerProtocol; +import bisq.core.trade.protocol.bisq_v1.SellerAsMakerProtocol; +import bisq.core.trade.protocol.bisq_v1.SellerAsTakerProtocol; public class TradeProtocolFactory { - public static TradeProtocol getNewTradeProtocol(Trade trade) { - if (trade instanceof BuyerAsMakerTrade) { - return new BuyerAsMakerProtocol((BuyerAsMakerTrade) trade); - } else if (trade instanceof BuyerAsTakerTrade) { - return new BuyerAsTakerProtocol((BuyerAsTakerTrade) trade); - } else if (trade instanceof SellerAsMakerTrade) { - return new SellerAsMakerProtocol((SellerAsMakerTrade) trade); - } else if (trade instanceof SellerAsTakerTrade) { - return new SellerAsTakerProtocol((SellerAsTakerTrade) trade); + public static TradeProtocol getNewTradeProtocol(TradeModel tradeModel) { + if (tradeModel instanceof BuyerAsMakerTrade) { + return new BuyerAsMakerProtocol((BuyerAsMakerTrade) tradeModel); + } else if (tradeModel instanceof BuyerAsTakerTrade) { + return new BuyerAsTakerProtocol((BuyerAsTakerTrade) tradeModel); + } else if (tradeModel instanceof SellerAsMakerTrade) { + return new SellerAsMakerProtocol((SellerAsMakerTrade) tradeModel); + } else if (tradeModel instanceof SellerAsTakerTrade) { + return new SellerAsTakerProtocol((SellerAsTakerTrade) tradeModel); } else { - throw new IllegalStateException("Trade not of expected type. Trade=" + trade); + throw new IllegalStateException("Trade not of expected type. Trade=" + tradeModel); } } } diff --git a/core/src/main/java/bisq/core/trade/protocol/TradeTaskRunner.java b/core/src/main/java/bisq/core/trade/protocol/TradeTaskRunner.java index fef4ff490d6..78171d9038c 100644 --- a/core/src/main/java/bisq/core/trade/protocol/TradeTaskRunner.java +++ b/core/src/main/java/bisq/core/trade/protocol/TradeTaskRunner.java @@ -17,16 +17,22 @@ package bisq.core.trade.protocol; -import bisq.core.trade.Trade; +import bisq.core.trade.model.TradeModel; import bisq.common.handlers.ErrorMessageHandler; import bisq.common.handlers.ResultHandler; import bisq.common.taskrunner.TaskRunner; -public class TradeTaskRunner extends TaskRunner { +public class TradeTaskRunner extends TaskRunner { - public TradeTaskRunner(Trade sharedModel, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + public TradeTaskRunner(TradeModel sharedModel, + ResultHandler resultHandler, + ErrorMessageHandler errorMessageHandler) { + super(sharedModel, getSharedModelClass(sharedModel), resultHandler, errorMessageHandler); + } + + static Class getSharedModelClass(TradeModel sharedModel) { //noinspection unchecked - super(sharedModel, (Class) sharedModel.getClass().getSuperclass().getSuperclass(), resultHandler, errorMessageHandler); + return (Class) sharedModel.getClass().getSuperclass().getSuperclass(); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/BuyerAsMakerProtocol.java similarity index 74% rename from core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/BuyerAsMakerProtocol.java index 4bff4a9c6e5..16d47b59b3c 100644 --- a/core/src/main/java/bisq/core/trade/protocol/BuyerAsMakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/BuyerAsMakerProtocol.java @@ -15,29 +15,30 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; - -import bisq.core.trade.BuyerAsMakerTrade; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest; -import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.messages.InputsForDepositTxRequest; -import bisq.core.trade.messages.PayoutTxPublishedMessage; -import bisq.core.trade.protocol.tasks.ApplyFilter; -import bisq.core.trade.protocol.tasks.TradeTask; -import bisq.core.trade.protocol.tasks.buyer.BuyerFinalizesDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest; -import bisq.core.trade.protocol.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse; -import bisq.core.trade.protocol.tasks.buyer.BuyerSetupDepositTxListener; -import bisq.core.trade.protocol.tasks.buyer.BuyerSignsDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.buyer.BuyerVerifiesPreparedDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.buyer_as_maker.BuyerAsMakerCreatesAndSignsDepositTx; -import bisq.core.trade.protocol.tasks.buyer_as_maker.BuyerAsMakerSendsInputsForDepositTxResponse; -import bisq.core.trade.protocol.tasks.maker.MakerCreateAndSignContract; -import bisq.core.trade.protocol.tasks.maker.MakerProcessesInputsForDepositTxRequest; -import bisq.core.trade.protocol.tasks.maker.MakerRemovesOpenOffer; -import bisq.core.trade.protocol.tasks.maker.MakerSetsLockTime; -import bisq.core.trade.protocol.tasks.maker.MakerVerifyTakerFeePayment; +package bisq.core.trade.protocol.bisq_v1; + +import bisq.core.trade.model.bisq_v1.BuyerAsMakerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.TradeTaskRunner; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.messages.PayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.ApplyFilter; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerFinalizesDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSetupDepositTxListener; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSignsDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerVerifiesPreparedDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_maker.BuyerAsMakerCreatesAndSignsDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_maker.BuyerAsMakerSendsInputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerCreateAndSignContract; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerProcessesInputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerRemovesOpenOffer; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerSetsLockTime; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerVerifyTakerFeePayment; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/BuyerAsTakerProtocol.java similarity index 74% rename from core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/BuyerAsTakerProtocol.java index 2731385f145..a99e4be0809 100644 --- a/core/src/main/java/bisq/core/trade/protocol/BuyerAsTakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/BuyerAsTakerProtocol.java @@ -15,34 +15,34 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; +package bisq.core.trade.protocol.bisq_v1; import bisq.core.offer.Offer; -import bisq.core.trade.BuyerAsTakerTrade; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest; -import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.messages.InputsForDepositTxResponse; -import bisq.core.trade.messages.PayoutTxPublishedMessage; -import bisq.core.trade.messages.TradeMessage; -import bisq.core.trade.protocol.tasks.ApplyFilter; -import bisq.core.trade.protocol.tasks.TradeTask; -import bisq.core.trade.protocol.tasks.buyer.BuyerFinalizesDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest; -import bisq.core.trade.protocol.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse; -import bisq.core.trade.protocol.tasks.buyer.BuyerSetupDepositTxListener; -import bisq.core.trade.protocol.tasks.buyer.BuyerSignsDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.buyer.BuyerVerifiesPreparedDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerCreatesDepositTxInputs; -import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerSendsDepositTxMessage; -import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerSignsDepositTx; -import bisq.core.trade.protocol.tasks.taker.CreateTakerFeeTx; -import bisq.core.trade.protocol.tasks.taker.TakerProcessesInputsForDepositTxResponse; -import bisq.core.trade.protocol.tasks.taker.TakerPublishFeeTx; -import bisq.core.trade.protocol.tasks.taker.TakerSendInputsForDepositTxRequest; -import bisq.core.trade.protocol.tasks.taker.TakerVerifyAndSignContract; -import bisq.core.trade.protocol.tasks.taker.TakerVerifyMakerFeePayment; +import bisq.core.trade.model.bisq_v1.BuyerAsTakerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.messages.PayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.ApplyFilter; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerFinalizesDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSetupDepositTxListener; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSignsDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerVerifiesPreparedDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_taker.BuyerAsTakerCreatesDepositTxInputs; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_taker.BuyerAsTakerSendsDepositTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_taker.BuyerAsTakerSignsDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.CreateTakerFeeTx; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerProcessesInputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerPublishFeeTx; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerSendInputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerVerifyAndSignContract; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerVerifyMakerFeePayment; import bisq.network.p2p.NodeAddress; @@ -64,7 +64,7 @@ public BuyerAsTakerProtocol(BuyerAsTakerTrade trade) { super(trade); Offer offer = checkNotNull(trade.getOffer()); - processModel.getTradingPeer().setPubKeyRing(offer.getPubKeyRing()); + processModel.getTradePeer().setPubKeyRing(offer.getPubKeyRing()); } diff --git a/core/src/main/java/bisq/core/trade/protocol/BuyerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/BuyerProtocol.java similarity index 85% rename from core/src/main/java/bisq/core/trade/protocol/BuyerProtocol.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/BuyerProtocol.java index 2a920b84961..858cada6c85 100644 --- a/core/src/main/java/bisq/core/trade/protocol/BuyerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/BuyerProtocol.java @@ -15,25 +15,27 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; - -import bisq.core.trade.BuyerTrade; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest; -import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.messages.PayoutTxPublishedMessage; -import bisq.core.trade.messages.TradeMessage; -import bisq.core.trade.protocol.tasks.ApplyFilter; -import bisq.core.trade.protocol.tasks.TradeTask; -import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness; -import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.protocol.tasks.buyer.BuyerProcessPayoutTxPublishedMessage; -import bisq.core.trade.protocol.tasks.buyer.BuyerSendCounterCurrencyTransferStartedMessage; -import bisq.core.trade.protocol.tasks.buyer.BuyerSendsShareBuyerPaymentAccountMessage; -import bisq.core.trade.protocol.tasks.buyer.BuyerSetupDepositTxListener; -import bisq.core.trade.protocol.tasks.buyer.BuyerSetupPayoutTxListener; -import bisq.core.trade.protocol.tasks.buyer.BuyerSignPayoutTx; -import bisq.core.trade.protocol.tasks.buyer.BuyerVerifiesFinalDelayedPayoutTx; +package bisq.core.trade.protocol.bisq_v1; + +import bisq.core.trade.model.bisq_v1.BuyerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.FluentProtocol; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.TradeTaskRunner; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.PayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.ApplyFilter; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; +import bisq.core.trade.protocol.bisq_v1.tasks.VerifyPeersAccountAgeWitness; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerProcessDepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerProcessPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSendCounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSendsShareBuyerPaymentAccountMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSetupDepositTxListener; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSetupPayoutTxListener; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSignPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerVerifiesFinalDelayedPayoutTx; import bisq.network.p2p.NodeAddress; @@ -106,7 +108,7 @@ protected void handle(DepositTxAndDelayedPayoutTxMessage message, NodeAddress pe expect(anyPhase(Trade.Phase.TAKER_FEE_PUBLISHED, Trade.Phase.DEPOSIT_PUBLISHED) .with(message) .from(peer) - .preCondition(trade.getDepositTx() == null || processModel.getTradingPeer().getPaymentAccountPayload() == null, + .preCondition(trade.getDepositTx() == null || processModel.getTradePeer().getPaymentAccountPayload() == null, () -> { log.warn("We received a DepositTxAndDelayedPayoutTxMessage but we have already processed the deposit and " + "delayed payout tx so we ignore the message. This can happen if the ACK message to the peer did not " + diff --git a/core/src/main/java/bisq/core/trade/protocol/DisputeProtocol.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/DisputeProtocol.java similarity index 71% rename from core/src/main/java/bisq/core/trade/protocol/DisputeProtocol.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/DisputeProtocol.java index 23807c96f56..ee549e1cde5 100644 --- a/core/src/main/java/bisq/core/trade/protocol/DisputeProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/DisputeProtocol.java @@ -15,26 +15,33 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; - -import bisq.core.trade.Trade; -import bisq.core.trade.messages.MediatedPayoutTxPublishedMessage; -import bisq.core.trade.messages.MediatedPayoutTxSignatureMessage; -import bisq.core.trade.messages.PeerPublishedDelayedPayoutTxMessage; -import bisq.core.trade.messages.TradeMessage; -import bisq.core.trade.protocol.tasks.ApplyFilter; -import bisq.core.trade.protocol.tasks.ProcessPeerPublishedDelayedPayoutTxMessage; -import bisq.core.trade.protocol.tasks.arbitration.PublishedDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.arbitration.SendPeerPublishedDelayedPayoutTxMessage; -import bisq.core.trade.protocol.tasks.mediation.BroadcastMediatedPayoutTx; -import bisq.core.trade.protocol.tasks.mediation.FinalizeMediatedPayoutTx; -import bisq.core.trade.protocol.tasks.mediation.ProcessMediatedPayoutSignatureMessage; -import bisq.core.trade.protocol.tasks.mediation.ProcessMediatedPayoutTxPublishedMessage; -import bisq.core.trade.protocol.tasks.mediation.SendMediatedPayoutSignatureMessage; -import bisq.core.trade.protocol.tasks.mediation.SendMediatedPayoutTxPublishedMessage; -import bisq.core.trade.protocol.tasks.mediation.SetupMediatedPayoutTxListener; -import bisq.core.trade.protocol.tasks.mediation.SignMediatedPayoutTx; - +package bisq.core.trade.protocol.bisq_v1; + +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.FluentProtocol; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.TradeProtocol; +import bisq.core.trade.protocol.TradeTaskRunner; +import bisq.core.trade.protocol.bisq_v1.messages.CounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.MediatedPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.MediatedPayoutTxSignatureMessage; +import bisq.core.trade.protocol.bisq_v1.messages.PeerPublishedDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.tasks.ApplyFilter; +import bisq.core.trade.protocol.bisq_v1.tasks.ProcessPeerPublishedDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.arbitration.PublishedDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.arbitration.SendPeerPublishedDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.mediation.BroadcastMediatedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.mediation.FinalizeMediatedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.mediation.ProcessMediatedPayoutSignatureMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.mediation.ProcessMediatedPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.mediation.SendMediatedPayoutSignatureMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.mediation.SendMediatedPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.mediation.SetupMediatedPayoutTxListener; +import bisq.core.trade.protocol.bisq_v1.tasks.mediation.SignMediatedPayoutTx; + +import bisq.network.p2p.AckMessage; import bisq.network.p2p.NodeAddress; import bisq.common.handlers.ErrorMessageHandler; @@ -45,6 +52,9 @@ @Slf4j public class DisputeProtocol extends TradeProtocol { + protected Trade trade; + protected final ProcessModel processModel; + enum DisputeEvent implements FluentProtocol.Event { MEDIATION_RESULT_ACCEPTED, MEDIATION_RESULT_REJECTED, @@ -53,6 +63,31 @@ enum DisputeEvent implements FluentProtocol.Event { public DisputeProtocol(Trade trade) { super(trade); + this.trade = trade; + this.processModel = trade.getProcessModel(); + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // TradeProtocol implementation + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected void onAckMessage(AckMessage ackMessage, NodeAddress peer) { + // We handle the ack for CounterCurrencyTransferStartedMessage and DepositTxAndDelayedPayoutTxMessage + // as we support automatic re-send of the msg in case it was not ACKed after a certain time + if (ackMessage.getSourceMsgClassName().equals(CounterCurrencyTransferStartedMessage.class.getSimpleName())) { + processModel.setPaymentStartedAckMessage(ackMessage); + } else if (ackMessage.getSourceMsgClassName().equals(DepositTxAndDelayedPayoutTxMessage.class.getSimpleName())) { + processModel.setDepositTxSentAckMessage(ackMessage); + } + + if (ackMessage.isSuccess()) { + log.info("Received AckMessage for {} from {} with tradeId {} and uid {}", + ackMessage.getSourceMsgClassName(), peer, tradeModel.getId(), ackMessage.getSourceUid()); + } else { + log.warn("Received AckMessage with error state for {} from {} with tradeId {} and errorMessage={}", + ackMessage.getSourceMsgClassName(), peer, tradeModel.getId(), ackMessage.getErrorMessage()); + } } @@ -67,7 +102,7 @@ public void onAcceptMediationResult(ResultHandler resultHandler, ErrorMessageHan Trade.Phase.FIAT_SENT, Trade.Phase.FIAT_RECEIVED) .with(event) - .preCondition(trade.getProcessModel().getTradingPeer().getMediatedPayoutTxSignature() == null, + .preCondition(trade.getProcessModel().getTradePeer().getMediatedPayoutTxSignature() == null, () -> errorMessageHandler.handleErrorMessage("We have received already the signature from the peer.")) .preCondition(trade.getPayoutTx() == null, () -> errorMessageHandler.handleErrorMessage("Payout tx is already published."))) diff --git a/core/src/main/java/bisq/core/trade/protocol/MakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/MakerProtocol.java similarity index 89% rename from core/src/main/java/bisq/core/trade/protocol/MakerProtocol.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/MakerProtocol.java index 349e677a702..7c1b3299d77 100644 --- a/core/src/main/java/bisq/core/trade/protocol/MakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/MakerProtocol.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; +package bisq.core.trade.protocol.bisq_v1; -import bisq.core.trade.messages.InputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxRequest; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/SellerAsMakerProtocol.java similarity index 76% rename from core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/SellerAsMakerProtocol.java index 524ab346917..53a7722f300 100644 --- a/core/src/main/java/bisq/core/trade/protocol/SellerAsMakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/SellerAsMakerProtocol.java @@ -15,30 +15,31 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; - - -import bisq.core.trade.SellerAsMakerTrade; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage; -import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse; -import bisq.core.trade.messages.DepositTxMessage; -import bisq.core.trade.messages.InputsForDepositTxRequest; -import bisq.core.trade.messages.TradeMessage; -import bisq.core.trade.protocol.tasks.ApplyFilter; -import bisq.core.trade.protocol.tasks.TradeTask; -import bisq.core.trade.protocol.tasks.maker.MakerCreateAndSignContract; -import bisq.core.trade.protocol.tasks.maker.MakerProcessesInputsForDepositTxRequest; -import bisq.core.trade.protocol.tasks.maker.MakerRemovesOpenOffer; -import bisq.core.trade.protocol.tasks.maker.MakerSetsLockTime; -import bisq.core.trade.protocol.tasks.maker.MakerVerifyTakerFeePayment; -import bisq.core.trade.protocol.tasks.seller.SellerCreatesDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest; -import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerCreatesUnsignedDepositTx; -import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerFinalizesDepositTx; -import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerProcessDepositTxMessage; -import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerSendsInputsForDepositTxResponse; +package bisq.core.trade.protocol.bisq_v1; + + +import bisq.core.trade.model.bisq_v1.SellerAsMakerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.TradeTaskRunner; +import bisq.core.trade.protocol.bisq_v1.messages.CounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.ApplyFilter; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerCreateAndSignContract; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerProcessesInputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerRemovesOpenOffer; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerSetsLockTime; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerVerifyTakerFeePayment; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerCreatesDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSignsDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker.SellerAsMakerCreatesUnsignedDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker.SellerAsMakerFinalizesDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker.SellerAsMakerProcessDepositTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker.SellerAsMakerSendsInputsForDepositTxResponse; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/SellerAsTakerProtocol.java similarity index 77% rename from core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/SellerAsTakerProtocol.java index 7e807d137a1..4cacf30098d 100644 --- a/core/src/main/java/bisq/core/trade/protocol/SellerAsTakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/SellerAsTakerProtocol.java @@ -15,29 +15,29 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; +package bisq.core.trade.protocol.bisq_v1; import bisq.core.offer.Offer; -import bisq.core.trade.SellerAsTakerTrade; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage; -import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse; -import bisq.core.trade.messages.InputsForDepositTxResponse; -import bisq.core.trade.messages.TradeMessage; -import bisq.core.trade.protocol.tasks.ApplyFilter; -import bisq.core.trade.protocol.tasks.TradeTask; -import bisq.core.trade.protocol.tasks.seller.SellerCreatesDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest; -import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerCreatesDepositTxInputs; -import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerSignsDepositTx; -import bisq.core.trade.protocol.tasks.taker.CreateTakerFeeTx; -import bisq.core.trade.protocol.tasks.taker.TakerProcessesInputsForDepositTxResponse; -import bisq.core.trade.protocol.tasks.taker.TakerPublishFeeTx; -import bisq.core.trade.protocol.tasks.taker.TakerSendInputsForDepositTxRequest; -import bisq.core.trade.protocol.tasks.taker.TakerVerifyAndSignContract; -import bisq.core.trade.protocol.tasks.taker.TakerVerifyMakerFeePayment; +import bisq.core.trade.model.bisq_v1.SellerAsTakerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.bisq_v1.messages.CounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.ApplyFilter; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerCreatesDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSignsDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_taker.SellerAsTakerCreatesDepositTxInputs; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_taker.SellerAsTakerSignsDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.CreateTakerFeeTx; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerProcessesInputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerPublishFeeTx; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerSendInputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerVerifyAndSignContract; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerVerifyMakerFeePayment; import bisq.network.p2p.NodeAddress; @@ -58,7 +58,7 @@ public class SellerAsTakerProtocol extends SellerProtocol implements TakerProtoc public SellerAsTakerProtocol(SellerAsTakerTrade trade) { super(trade); Offer offer = checkNotNull(trade.getOffer()); - processModel.getTradingPeer().setPubKeyRing(offer.getPubKeyRing()); + processModel.getTradePeer().setPubKeyRing(offer.getPubKeyRing()); } diff --git a/core/src/main/java/bisq/core/trade/protocol/SellerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/SellerProtocol.java similarity index 82% rename from core/src/main/java/bisq/core/trade/protocol/SellerProtocol.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/SellerProtocol.java index ef5f83b0d34..68a587e6e46 100644 --- a/core/src/main/java/bisq/core/trade/protocol/SellerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/SellerProtocol.java @@ -15,27 +15,29 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; - -import bisq.core.trade.SellerTrade; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage; -import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse; -import bisq.core.trade.messages.ShareBuyerPaymentAccountMessage; -import bisq.core.trade.messages.TradeMessage; -import bisq.core.trade.protocol.tasks.ApplyFilter; -import bisq.core.trade.protocol.tasks.TradeTask; -import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness; -import bisq.core.trade.protocol.tasks.seller.SellerBroadcastPayoutTx; -import bisq.core.trade.protocol.tasks.seller.SellerFinalizesDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.seller.SellerProcessCounterCurrencyTransferStartedMessage; -import bisq.core.trade.protocol.tasks.seller.SellerProcessDelayedPayoutTxSignatureResponse; -import bisq.core.trade.protocol.tasks.seller.SellerProcessShareBuyerPaymentAccountMessage; -import bisq.core.trade.protocol.tasks.seller.SellerPublishesDepositTx; -import bisq.core.trade.protocol.tasks.seller.SellerPublishesTradeStatistics; -import bisq.core.trade.protocol.tasks.seller.SellerSendPayoutTxPublishedMessage; -import bisq.core.trade.protocol.tasks.seller.SellerSendsDepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.protocol.tasks.seller.SellerSignAndFinalizePayoutTx; +package bisq.core.trade.protocol.bisq_v1; + +import bisq.core.trade.model.bisq_v1.SellerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.FluentProtocol; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.TradeTaskRunner; +import bisq.core.trade.protocol.bisq_v1.messages.CounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.messages.ShareBuyerPaymentAccountMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.ApplyFilter; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; +import bisq.core.trade.protocol.bisq_v1.tasks.VerifyPeersAccountAgeWitness; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerBroadcastPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerFinalizesDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerProcessCounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerProcessDelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerProcessShareBuyerPaymentAccountMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerPublishesDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerPublishesTradeStatistics; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSendPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSendsDepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSignAndFinalizePayoutTx; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/protocol/TakerProtocol.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/TakerProtocol.java similarity index 90% rename from core/src/main/java/bisq/core/trade/protocol/TakerProtocol.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/TakerProtocol.java index 249d0ac73bd..b02b7cba91d 100644 --- a/core/src/main/java/bisq/core/trade/protocol/TakerProtocol.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/TakerProtocol.java @@ -15,7 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; +package bisq.core.trade.protocol.bisq_v1; + +import bisq.core.trade.protocol.FluentProtocol; public interface TakerProtocol { void onTakeOffer(); diff --git a/core/src/main/java/bisq/core/trade/messages/CounterCurrencyTransferStartedMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/CounterCurrencyTransferStartedMessage.java similarity index 99% rename from core/src/main/java/bisq/core/trade/messages/CounterCurrencyTransferStartedMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/CounterCurrencyTransferStartedMessage.java index 30811f56f72..9da43cae45d 100644 --- a/core/src/main/java/bisq/core/trade/messages/CounterCurrencyTransferStartedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/CounterCurrencyTransferStartedMessage.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DelayedPayoutTxSignatureRequest.java similarity index 97% rename from core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DelayedPayoutTxSignatureRequest.java index 81afad3caf5..7674a50fe8a 100644 --- a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DelayedPayoutTxSignatureRequest.java @@ -15,7 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; + +import bisq.core.trade.protocol.TradeMessage; import bisq.network.p2p.DirectMessage; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DelayedPayoutTxSignatureResponse.java similarity index 97% rename from core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DelayedPayoutTxSignatureResponse.java index ad3767a3ab9..f9c81d9c2a3 100644 --- a/core/src/main/java/bisq/core/trade/messages/DelayedPayoutTxSignatureResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DelayedPayoutTxSignatureResponse.java @@ -15,7 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; + +import bisq.core.trade.protocol.TradeMessage; import bisq.network.p2p.DirectMessage; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/messages/DepositTxAndDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DepositTxAndDelayedPayoutTxMessage.java similarity index 99% rename from core/src/main/java/bisq/core/trade/messages/DepositTxAndDelayedPayoutTxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DepositTxAndDelayedPayoutTxMessage.java index 8297ee92d55..0ed88a22c46 100644 --- a/core/src/main/java/bisq/core/trade/messages/DepositTxAndDelayedPayoutTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DepositTxAndDelayedPayoutTxMessage.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.proto.CoreProtoResolver; diff --git a/core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DepositTxMessage.java similarity index 97% rename from core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DepositTxMessage.java index 631f1a9ca2d..465eb05e1a9 100644 --- a/core/src/main/java/bisq/core/trade/messages/DepositTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/DepositTxMessage.java @@ -15,7 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; + +import bisq.core.trade.protocol.TradeMessage; import bisq.network.p2p.DirectMessage; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/messages/InputsForDepositTxRequest.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/InputsForDepositTxRequest.java similarity index 98% rename from core/src/main/java/bisq/core/trade/messages/InputsForDepositTxRequest.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/InputsForDepositTxRequest.java index 63197dbaba6..d6cf92ab3d4 100644 --- a/core/src/main/java/bisq/core/trade/messages/InputsForDepositTxRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/InputsForDepositTxRequest.java @@ -15,11 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.core.btc.model.RawTransactionInput; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.proto.CoreProtoResolver; +import bisq.core.trade.protocol.TradeMessage; import bisq.network.p2p.DirectMessage; import bisq.network.p2p.NodeAddress; @@ -182,8 +183,7 @@ public static InputsForDepositTxRequest fromProto(protobuf.InputsForDepositTxReq CoreProtoResolver coreProtoResolver, int messageVersion) { List rawTransactionInputs = proto.getRawTransactionInputsList().stream() - .map(rawTransactionInput -> new RawTransactionInput(rawTransactionInput.getIndex(), - rawTransactionInput.getParentTransaction().toByteArray(), rawTransactionInput.getValue())) + .map(RawTransactionInput::fromProto) .collect(Collectors.toList()); List acceptedArbitratorNodeAddresses = proto.getAcceptedArbitratorNodeAddressesList().stream() .map(NodeAddress::fromProto).collect(Collectors.toList()); diff --git a/core/src/main/java/bisq/core/trade/messages/InputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/InputsForDepositTxResponse.java similarity index 99% rename from core/src/main/java/bisq/core/trade/messages/InputsForDepositTxResponse.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/InputsForDepositTxResponse.java index 72305028f7d..fca8d0569df 100644 --- a/core/src/main/java/bisq/core/trade/messages/InputsForDepositTxResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/InputsForDepositTxResponse.java @@ -15,11 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.core.btc.model.RawTransactionInput; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.proto.CoreProtoResolver; +import bisq.core.trade.protocol.TradeMessage; import bisq.network.p2p.DirectMessage; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/messages/MediatedPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/MediatedPayoutTxPublishedMessage.java similarity index 98% rename from core/src/main/java/bisq/core/trade/messages/MediatedPayoutTxPublishedMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/MediatedPayoutTxPublishedMessage.java index 444b6af804f..83e03b19619 100644 --- a/core/src/main/java/bisq/core/trade/messages/MediatedPayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/MediatedPayoutTxPublishedMessage.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/messages/MediatedPayoutTxSignatureMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/MediatedPayoutTxSignatureMessage.java similarity index 98% rename from core/src/main/java/bisq/core/trade/messages/MediatedPayoutTxSignatureMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/MediatedPayoutTxSignatureMessage.java index bc7cc84571e..eecd3e82e64 100644 --- a/core/src/main/java/bisq/core/trade/messages/MediatedPayoutTxSignatureMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/MediatedPayoutTxSignatureMessage.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/messages/PayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/PayoutTxPublishedMessage.java similarity index 98% rename from core/src/main/java/bisq/core/trade/messages/PayoutTxPublishedMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/PayoutTxPublishedMessage.java index 86ed851ba8e..2b89fee4cce 100644 --- a/core/src/main/java/bisq/core/trade/messages/PayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/PayoutTxPublishedMessage.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.core.account.sign.SignedWitness; diff --git a/core/src/main/java/bisq/core/trade/messages/PeerPublishedDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/PeerPublishedDelayedPayoutTxMessage.java similarity index 98% rename from core/src/main/java/bisq/core/trade/messages/PeerPublishedDelayedPayoutTxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/PeerPublishedDelayedPayoutTxMessage.java index d93a32737bd..4cf815df56b 100644 --- a/core/src/main/java/bisq/core/trade/messages/PeerPublishedDelayedPayoutTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/PeerPublishedDelayedPayoutTxMessage.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/messages/RefreshTradeStateRequest.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/RefreshTradeStateRequest.java similarity index 97% rename from core/src/main/java/bisq/core/trade/messages/RefreshTradeStateRequest.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/RefreshTradeStateRequest.java index c6abcd67ee1..5efc83c79aa 100644 --- a/core/src/main/java/bisq/core/trade/messages/RefreshTradeStateRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/RefreshTradeStateRequest.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.network.p2p.NodeAddress; diff --git a/core/src/main/java/bisq/core/trade/messages/ShareBuyerPaymentAccountMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/ShareBuyerPaymentAccountMessage.java similarity index 98% rename from core/src/main/java/bisq/core/trade/messages/ShareBuyerPaymentAccountMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/ShareBuyerPaymentAccountMessage.java index 6401d499478..3814b7ee985 100644 --- a/core/src/main/java/bisq/core/trade/messages/ShareBuyerPaymentAccountMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/ShareBuyerPaymentAccountMessage.java @@ -32,7 +32,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.proto.CoreProtoResolver; diff --git a/core/src/main/java/bisq/core/trade/messages/TradeMailboxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/TradeMailboxMessage.java similarity index 92% rename from core/src/main/java/bisq/core/trade/messages/TradeMailboxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/TradeMailboxMessage.java index 705c0b12ed3..f5237d085c5 100644 --- a/core/src/main/java/bisq/core/trade/messages/TradeMailboxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/TradeMailboxMessage.java @@ -15,7 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; + +import bisq.core.trade.protocol.TradeMessage; import bisq.network.p2p.mailbox.MailboxMessage; diff --git a/core/src/main/java/bisq/core/trade/messages/TraderSignedWitnessMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/TraderSignedWitnessMessage.java similarity index 98% rename from core/src/main/java/bisq/core/trade/messages/TraderSignedWitnessMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/TraderSignedWitnessMessage.java index c2bbde53b37..51f811dd66a 100644 --- a/core/src/main/java/bisq/core/trade/messages/TraderSignedWitnessMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/messages/TraderSignedWitnessMessage.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.messages; +package bisq.core.trade.protocol.bisq_v1.messages; import bisq.core.account.sign.SignedWitness; diff --git a/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/model/ProcessModel.java similarity index 95% rename from core/src/main/java/bisq/core/trade/protocol/ProcessModel.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/model/ProcessModel.java index b22d478b2df..c321912485e 100644 --- a/core/src/main/java/bisq/core/trade/protocol/ProcessModel.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/model/ProcessModel.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; +package bisq.core.trade.protocol.bisq_v1.model; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.btc.model.RawTransactionInput; @@ -33,10 +33,12 @@ import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; import bisq.core.support.dispute.mediation.mediator.MediatorManager; import bisq.core.support.dispute.refund.refundagent.RefundAgentManager; -import bisq.core.trade.MakerTrade; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; -import bisq.core.trade.messages.TradeMessage; +import bisq.core.trade.model.MakerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.ProtocolModel; +import bisq.core.trade.protocol.Provider; +import bisq.core.trade.protocol.TradeMessage; import bisq.core.trade.statistics.ReferralIdService; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.user.User; @@ -49,8 +51,6 @@ import bisq.common.crypto.KeyRing; import bisq.common.crypto.PubKeyRing; import bisq.common.proto.ProtoUtil; -import bisq.common.proto.persistable.PersistablePayload; -import bisq.common.taskrunner.Model; import com.google.protobuf.ByteString; @@ -77,19 +77,19 @@ /** * This is the base model for the trade protocol. It is persisted with the trade (non transient fields). - * It uses the {@link ProcessModelServiceProvider} for access to domain services. + * It uses the {@link Provider} for access to domain services. */ @Getter @Slf4j -public class ProcessModel implements Model, PersistablePayload { +public class ProcessModel implements ProtocolModel { public static byte[] hashOfPaymentAccountPayload(PaymentAccountPayload paymentAccountPayload) { return Hash.getRipemd160hash(checkNotNull(paymentAccountPayload).toProtoMessage().toByteArray()); } // Transient/Immutable (net set in constructor so they are not final, but at init) - transient private ProcessModelServiceProvider provider; + transient private Provider provider; transient private TradeManager tradeManager; transient private Offer offer; @@ -115,7 +115,6 @@ public static byte[] hashOfPaymentAccountPayload(PaymentAccountPayload paymentAc @Getter transient private Transaction depositTx; - // Persistable Immutable private final TradingPeer tradingPeer; private final String offerId; @@ -181,7 +180,7 @@ public ProcessModel(String offerId, String accountId, PubKeyRing pubKeyRing, Tra this.tradingPeer = tradingPeer != null ? tradingPeer : new TradingPeer(); } - public void applyTransient(ProcessModelServiceProvider provider, + public void applyTransient(Provider provider, TradeManager tradeManager, Offer offer) { this.offer = offer; @@ -260,6 +259,11 @@ public static ProcessModel fromProto(protobuf.ProcessModel proto, CoreProtoResol public void onComplete() { } + @Override + public TradingPeer getTradePeer() { + return tradingPeer; + } + public void setTakeOfferFeeTx(Transaction takeOfferFeeTx) { this.takeOfferFeeTx = takeOfferFeeTx; takeOfferFeeTxId = takeOfferFeeTx.getTxId().toString(); @@ -289,11 +293,12 @@ public Transaction resolveTakeOfferFeeTx(Trade trade) { return takeOfferFeeTx; } + @Override public NodeAddress getMyNodeAddress() { return getP2PService().getAddress(); } - void setPaymentStartedAckMessage(AckMessage ackMessage) { + public void setPaymentStartedAckMessage(AckMessage ackMessage) { MessageState messageState = ackMessage.isSuccess() ? MessageState.ACKNOWLEDGED : MessageState.FAILED; @@ -307,7 +312,7 @@ public void setPaymentStartedMessageState(MessageState paymentStartedMessageStat } } - void setDepositTxSentAckMessage(AckMessage ackMessage) { + public void setDepositTxSentAckMessage(AckMessage ackMessage) { MessageState messageState = ackMessage.isSuccess() ? MessageState.ACKNOWLEDGED : MessageState.FAILED; @@ -321,10 +326,6 @@ public void setDepositTxMessageState(MessageState messageState) { } } - void witnessDebugLog(Trade trade) { - getAccountAgeWitnessService().getAccountAgeWitnessUtils().witnessDebugLog(trade, null); - } - /////////////////////////////////////////////////////////////////////////////////////////// // Delegates diff --git a/core/src/main/java/bisq/core/trade/protocol/TradingPeer.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/model/TradingPeer.java similarity index 97% rename from core/src/main/java/bisq/core/trade/protocol/TradingPeer.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/model/TradingPeer.java index ebd37a24eab..192c0d9707d 100644 --- a/core/src/main/java/bisq/core/trade/protocol/TradingPeer.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/model/TradingPeer.java @@ -15,15 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol; +package bisq.core.trade.protocol.bisq_v1.model; import bisq.core.btc.model.RawTransactionInput; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.proto.CoreProtoResolver; +import bisq.core.trade.protocol.TradePeer; import bisq.common.crypto.PubKeyRing; import bisq.common.proto.ProtoUtil; -import bisq.common.proto.persistable.PersistablePayload; import com.google.protobuf.ByteString; import com.google.protobuf.Message; @@ -44,7 +44,7 @@ @Slf4j @Getter @Setter -public final class TradingPeer implements PersistablePayload { +public final class TradingPeer implements TradePeer { // Transient/Mutable // Added in v1.2.0 @Setter diff --git a/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/ApplyFilter.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/ApplyFilter.java new file mode 100644 index 00000000000..00574843118 --- /dev/null +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/ApplyFilter.java @@ -0,0 +1,63 @@ +/* + * 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 bisq.core.trade.protocol.bisq_v1.tasks; + +import bisq.core.filter.FilterManager; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.trade.bisq_v1.TradeUtil; +import bisq.core.trade.model.bisq_v1.Trade; + +import bisq.network.p2p.NodeAddress; + +import bisq.common.taskrunner.TaskRunner; + +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Nullable; + +import static com.google.common.base.Preconditions.checkNotNull; + +@Slf4j +public class ApplyFilter extends TradeTask { + public ApplyFilter(TaskRunner taskHandler, Trade trade) { + super(taskHandler, trade); + } + + @Override + protected void run() { + try { + runInterceptHook(); + + NodeAddress nodeAddress = checkNotNull(processModel.getTempTradingPeerNodeAddress()); + @Nullable + PaymentAccountPayload paymentAccountPayload = processModel.getTradePeer().getPaymentAccountPayload(); + + FilterManager filterManager = processModel.getFilterManager(); + + TradeUtil.applyFilter(trade, + filterManager, + nodeAddress, + paymentAccountPayload, + this::complete, + this::failed); + } catch (Throwable t) { + failed(t); + } + } +} + diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/BroadcastPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/BroadcastPayoutTx.java similarity index 97% rename from core/src/main/java/bisq/core/trade/protocol/tasks/BroadcastPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/BroadcastPayoutTx.java index df3b8df2c63..a75613e9c04 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/BroadcastPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/BroadcastPayoutTx.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks; +package bisq.core.trade.protocol.bisq_v1.tasks; import bisq.core.btc.exceptions.TxBroadcastException; import bisq.core.btc.wallet.TxBroadcaster; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java similarity index 92% rename from core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java index aab0bb5a3b9..999b98ca293 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/ProcessPeerPublishedDelayedPayoutTxMessage.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks; +package bisq.core.trade.protocol.bisq_v1.tasks; import bisq.core.btc.wallet.WalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.PeerPublishedDelayedPayoutTxMessage; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.PeerPublishedDelayedPayoutTxMessage; import bisq.core.util.Validator; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/SendMailboxMessageTask.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/SendMailboxMessageTask.java similarity index 93% rename from core/src/main/java/bisq/core/trade/protocol/tasks/SendMailboxMessageTask.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/SendMailboxMessageTask.java index b4eb80cf3db..7368553a464 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/SendMailboxMessageTask.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/SendMailboxMessageTask.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks; +package bisq.core.trade.protocol.bisq_v1.tasks; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.TradeMailboxMessage; -import bisq.core.trade.messages.TradeMessage; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.bisq_v1.messages.TradeMailboxMessage; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.SendMailboxMessageListener; @@ -57,7 +57,7 @@ protected void run() { processModel.getP2PService().getMailboxMessageService().sendEncryptedMailboxMessage( peersNodeAddress, - processModel.getTradingPeer().getPubKeyRing(), + processModel.getTradePeer().getPubKeyRing(), message, new SendMailboxMessageListener() { @Override diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/SetupPayoutTxListener.java similarity index 97% rename from core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/SetupPayoutTxListener.java index 5d925ae41c2..090c723d449 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/SetupPayoutTxListener.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/SetupPayoutTxListener.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks; +package bisq.core.trade.protocol.bisq_v1.tasks; import bisq.core.btc.listeners.AddressConfidenceListener; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.UserThread; import bisq.common.taskrunner.TaskRunner; @@ -95,7 +95,7 @@ private void applyConfidence(TransactionConfidence confidence) { BtcWalletService.printTx("payoutTx received from network", walletTx); setState(); } else { - log.info("We had the payout tx already set. tradeId={}, state={}", trade.getId(), trade.getState()); + log.info("We had the payout tx already set. tradeId={}, state={}", trade.getId(), trade.getTradeState()); } processModel.getBtcWalletService().resetCoinLockedInMultiSigAddressEntry(trade.getId()); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/TradeTask.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/TradeTask.java similarity index 88% rename from core/src/main/java/bisq/core/trade/protocol/tasks/TradeTask.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/TradeTask.java index 332b571f747..61a2f4a0534 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/TradeTask.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/TradeTask.java @@ -15,10 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks; +package bisq.core.trade.protocol.bisq_v1.tasks; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.ProcessModel; +import bisq.core.trade.model.TradeModel; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; import bisq.common.taskrunner.Task; import bisq.common.taskrunner.TaskRunner; @@ -26,7 +27,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j -public abstract class TradeTask extends Task { +public abstract class TradeTask extends Task { protected final ProcessModel processModel; protected final Trade trade; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/VerifyPeersAccountAgeWitness.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/VerifyPeersAccountAgeWitness.java similarity index 93% rename from core/src/main/java/bisq/core/trade/protocol/tasks/VerifyPeersAccountAgeWitness.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/VerifyPeersAccountAgeWitness.java index 68ea2d9eeba..74dcf65309c 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/VerifyPeersAccountAgeWitness.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/VerifyPeersAccountAgeWitness.java @@ -15,14 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks; +package bisq.core.trade.protocol.bisq_v1.tasks; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.locale.CurrencyUtil; import bisq.core.offer.Offer; import bisq.core.payment.payload.PaymentAccountPayload; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.TradingPeer; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; import bisq.common.crypto.PubKeyRing; import bisq.common.taskrunner.TaskRunner; @@ -53,7 +53,7 @@ protected void run() { } AccountAgeWitnessService accountAgeWitnessService = processModel.getAccountAgeWitnessService(); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); PaymentAccountPayload peersPaymentAccountPayload = checkNotNull(tradingPeer.getPaymentAccountPayload(), "Peers peersPaymentAccountPayload must not be null"); PubKeyRing peersPubKeyRing = checkNotNull(tradingPeer.getPubKeyRing(), "peersPubKeyRing must not be null"); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/arbitration/PublishedDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/arbitration/PublishedDelayedPayoutTx.java similarity index 93% rename from core/src/main/java/bisq/core/trade/protocol/tasks/arbitration/PublishedDelayedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/arbitration/PublishedDelayedPayoutTx.java index b35e1f53a62..93f0f69536a 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/arbitration/PublishedDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/arbitration/PublishedDelayedPayoutTx.java @@ -15,14 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.arbitration; +package bisq.core.trade.protocol.bisq_v1.tasks.arbitration; import bisq.core.btc.exceptions.TxBroadcastException; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.TxBroadcaster; import bisq.core.btc.wallet.WalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/arbitration/SendPeerPublishedDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/arbitration/SendPeerPublishedDelayedPayoutTxMessage.java similarity index 83% rename from core/src/main/java/bisq/core/trade/protocol/tasks/arbitration/SendPeerPublishedDelayedPayoutTxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/arbitration/SendPeerPublishedDelayedPayoutTxMessage.java index cdc995c612c..c2aa5e6b1dc 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/arbitration/SendPeerPublishedDelayedPayoutTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/arbitration/SendPeerPublishedDelayedPayoutTxMessage.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.arbitration; +package bisq.core.trade.protocol.bisq_v1.tasks.arbitration; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.PeerPublishedDelayedPayoutTxMessage; -import bisq.core.trade.messages.TradeMailboxMessage; -import bisq.core.trade.protocol.tasks.SendMailboxMessageTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.PeerPublishedDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.TradeMailboxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.SendMailboxMessageTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerFinalizesDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerFinalizesDelayedPayoutTx.java similarity index 86% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerFinalizesDelayedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerFinalizesDelayedPayoutTx.java index 30824a14d74..a4f27592ebd 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerFinalizesDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerFinalizesDelayedPayoutTx.java @@ -1,9 +1,9 @@ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; import bisq.common.util.Utilities; @@ -37,10 +37,10 @@ protected void run() { checkArgument(Arrays.equals(buyerMultiSigPubKey, btcWalletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()), "buyerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id); - byte[] sellerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey(); + byte[] sellerMultiSigPubKey = processModel.getTradePeer().getMultiSigPubKey(); byte[] buyerSignature = processModel.getDelayedPayoutTxSignature(); - byte[] sellerSignature = processModel.getTradingPeer().getDelayedPayoutTxSignature(); + byte[] sellerSignature = processModel.getTradePeer().getDelayedPayoutTxSignature(); Transaction signedDelayedPayoutTx = processModel.getTradeWalletService().finalizeUnconnectedDelayedPayoutTx( preparedDelayedPayoutTx, diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java similarity index 86% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java index 19cdb957f79..0e0d0c04557 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerProcessDelayedPayoutTxSignatureRequest.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.util.Validator; import bisq.common.taskrunner.TaskRunner; @@ -46,7 +46,7 @@ protected void run() { byte[] delayedPayoutTxAsBytes = checkNotNull(request.getDelayedPayoutTx()); Transaction preparedDelayedPayoutTx = processModel.getBtcWalletService().getTxFromSerializedTx(delayedPayoutTxAsBytes); processModel.setPreparedDelayedPayoutTx(preparedDelayedPayoutTx); - processModel.getTradingPeer().setDelayedPayoutTxSignature(checkNotNull(request.getDelayedPayoutTxSellerSignature())); + processModel.getTradePeer().setDelayedPayoutTxSignature(checkNotNull(request.getDelayedPayoutTxSellerSignature())); // When we receive that message the taker has published the taker fee, so we apply it to the trade. // The takerFeeTx was sent in the first message. It should be part of DelayedPayoutTxSignatureRequest diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java similarity index 86% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java index 7e6149bc26f..7fb1cfe9212 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerProcessDepositTxAndDelayedPayoutTxMessage.java @@ -15,17 +15,17 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletService; import bisq.core.payment.payload.PaymentAccountPayload; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.protocol.ProcessModel; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.util.Validator; import bisq.common.crypto.Hash; @@ -40,6 +40,8 @@ import lombok.extern.slf4j.Slf4j; +import static bisq.core.trade.model.bisq_v1.Trade.State.BUYER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG; +import static bisq.core.trade.model.bisq_v1.Trade.State.BUYER_SAW_DEPOSIT_TX_IN_NETWORK; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; @@ -84,7 +86,7 @@ protected void run() { checkArgument(Arrays.equals(sellerPaymentAccountPayloadHash, peersPaymentAccountPayloadHash), "Hash of payment account is invalid"); - processModel.getTradingPeer().setPaymentAccountPayload(sellerPaymentAccountPayload); + processModel.getTradePeer().setPaymentAccountPayload(sellerPaymentAccountPayload); contract.setPaymentAccountPayloads(sellerPaymentAccountPayload, processModel.getPaymentAccountPayload(trade), processModel.getPubKeyRing()); @@ -105,8 +107,8 @@ protected void run() { } // If we got already the confirmation we don't want to apply an earlier state - if (trade.getState().ordinal() < Trade.State.BUYER_SAW_DEPOSIT_TX_IN_NETWORK.ordinal()) { - trade.setState(Trade.State.BUYER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG); + if (trade.getTradeState().ordinal() < BUYER_SAW_DEPOSIT_TX_IN_NETWORK.ordinal()) { + trade.setState(BUYER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG); } processModel.getBtcWalletService().swapTradeEntryToAvailableEntry(trade.getId(), diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java similarity index 92% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java index 5b546201afb..e01e118fcd8 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerProcessPayoutTxPublishedMessage.java @@ -15,14 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; import bisq.core.account.sign.SignedWitness; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.PayoutTxPublishedMessage; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.PayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.util.Validator; import bisq.common.taskrunner.TaskRunner; @@ -44,7 +44,6 @@ public BuyerProcessPayoutTxPublishedMessage(TaskRunner taskHandler, Trade protected void run() { try { runInterceptHook(); - log.debug("current trade state " + trade.getState()); PayoutTxPublishedMessage message = (PayoutTxPublishedMessage) processModel.getTradeMessage(); Validator.checkTradeId(processModel.getOfferId(), message); checkNotNull(message); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java similarity index 91% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java index b594d646ce2..a5bc12088c8 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSendCounterCurrencyTransferStartedMessage.java @@ -15,15 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; import bisq.core.btc.model.AddressEntry; import bisq.core.network.MessageState; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage; -import bisq.core.trade.messages.TradeMailboxMessage; -import bisq.core.trade.messages.TradeMessage; -import bisq.core.trade.protocol.tasks.SendMailboxMessageTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.bisq_v1.messages.CounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.TradeMailboxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.SendMailboxMessageTask; import bisq.common.Timer; import bisq.common.UserThread; @@ -35,6 +35,8 @@ import lombok.extern.slf4j.Slf4j; +import static bisq.core.trade.model.bisq_v1.Trade.State.BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG; + /** * We send the seller the BuyerSendCounterCurrencyTransferStartedMessage. * We wait to receive a ACK message back and resend the message @@ -83,8 +85,8 @@ protected TradeMailboxMessage getTradeMailboxMessage(String tradeId) { @Override protected void setStateSent() { - if (trade.getState().ordinal() < Trade.State.BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG.ordinal()) { - trade.setStateIfValidTransitionTo(Trade.State.BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG); + if (trade.getTradeState().ordinal() < BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG.ordinal()) { + trade.setStateIfValidTransitionTo(BUYER_SENT_FIAT_PAYMENT_INITIATED_MSG); } processModel.getTradeManager().requestPersistence(); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java similarity index 91% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java index 5b9702798bb..1f56c3dd69a 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSendsDelayedPayoutTxSignatureResponse.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.SendDirectMessageListener; @@ -59,7 +59,7 @@ protected void run() { message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid()); processModel.getP2PService().sendEncryptedDirectMessage( peersNodeAddress, - processModel.getTradingPeer().getPubKeyRing(), + processModel.getTradePeer().getPubKeyRing(), message, new SendDirectMessageListener() { @Override diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsShareBuyerPaymentAccountMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSendsShareBuyerPaymentAccountMessage.java similarity index 93% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsShareBuyerPaymentAccountMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSendsShareBuyerPaymentAccountMessage.java index 9076f809c5e..92edf3c56d6 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSendsShareBuyerPaymentAccountMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSendsShareBuyerPaymentAccountMessage.java @@ -32,15 +32,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; import bisq.core.network.MessageState; import bisq.core.payment.payload.PaymentAccountPayload; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.ShareBuyerPaymentAccountMessage; -import bisq.core.trade.messages.TradeMailboxMessage; -import bisq.core.trade.messages.TradeMessage; -import bisq.core.trade.protocol.tasks.SendMailboxMessageTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.bisq_v1.messages.ShareBuyerPaymentAccountMessage; +import bisq.core.trade.protocol.bisq_v1.messages.TradeMailboxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.SendMailboxMessageTask; import bisq.common.Timer; import bisq.common.UserThread; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSetupDepositTxListener.java similarity index 98% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSetupDepositTxListener.java index 9c6bfa2b744..3c0ea6a6ae5 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupDepositTxListener.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSetupDepositTxListener.java @@ -15,13 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; import bisq.core.btc.listeners.AddressConfidenceListener; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.UserThread; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupPayoutTxListener.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSetupPayoutTxListener.java similarity index 89% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupPayoutTxListener.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSetupPayoutTxListener.java index c58ce41ef16..6aa2f3a46b3 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSetupPayoutTxListener.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSetupPayoutTxListener.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.SetupPayoutTxListener; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.SetupPayoutTxListener; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSignPayoutTx.java similarity index 92% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSignPayoutTx.java index 70dd1b8074a..1dba0f91694 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSignPayoutTx.java @@ -15,13 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -60,7 +60,7 @@ protected void run() { String buyerPayoutAddressString = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.TRADE_PAYOUT).getAddressString(); - final String sellerPayoutAddressString = processModel.getTradingPeer().getPayoutAddressString(); + final String sellerPayoutAddressString = processModel.getTradePeer().getPayoutAddressString(); DeterministicKey buyerMultiSigKeyPair = walletService.getMultiSigKeyPair(id, processModel.getMyMultiSigPubKey()); @@ -68,7 +68,7 @@ protected void run() { checkArgument(Arrays.equals(buyerMultiSigPubKey, walletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()), "buyerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id); - byte[] sellerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey(); + byte[] sellerMultiSigPubKey = processModel.getTradePeer().getMultiSigPubKey(); byte[] payoutTxSignature = processModel.getTradeWalletService().buyerSignsPayoutTx( trade.getDepositTx(), diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSignsDelayedPayoutTx.java similarity index 92% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSignsDelayedPayoutTx.java index cab7fc896ba..c2e9e891aae 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerSignsDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerSignsDelayedPayoutTx.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -60,7 +60,7 @@ protected void run() { checkArgument(Arrays.equals(buyerMultiSigPubKey, btcWalletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()), "buyerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id); - byte[] sellerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey(); + byte[] sellerMultiSigPubKey = processModel.getTradePeer().getMultiSigPubKey(); byte[] delayedPayoutTxSignature = processModel.getTradeWalletService().signDelayedPayoutTx( preparedDelayedPayoutTx, preparedDepositTx, diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesFinalDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerVerifiesFinalDelayedPayoutTx.java similarity index 90% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesFinalDelayedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerVerifiesFinalDelayedPayoutTx.java index b2a5eaf1b32..0cca5d82e68 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesFinalDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerVerifiesFinalDelayedPayoutTx.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; -import bisq.core.trade.Trade; -import bisq.core.trade.TradeDataValidation; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.bisq_v1.TradeDataValidation; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java similarity index 89% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java index 5f259b55740..dc536ffa9c9 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer/BuyerVerifiesPreparedDelayedPayoutTx.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer; -import bisq.core.trade.Trade; -import bisq.core.trade.TradeDataValidation; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.bisq_v1.TradeDataValidation; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -64,7 +64,7 @@ protected void run() { private boolean isDepositTxNonMalleable() { var buyerInputs = checkNotNull(processModel.getRawTransactionInputs()); - var sellerInputs = checkNotNull(processModel.getTradingPeer().getRawTransactionInputs()); + var sellerInputs = checkNotNull(processModel.getTradePeer().getRawTransactionInputs()); return buyerInputs.stream().allMatch(processModel.getTradeWalletService()::isP2WH) && sellerInputs.stream().allMatch(processModel.getTradeWalletService()::isP2WH); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java similarity index 93% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java index 5a7ad8d919f..e42a2b53713 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_maker/BuyerAsMakerCreatesAndSignsDepositTx.java @@ -15,16 +15,16 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer_as_maker; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_maker; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.model.PreparedDepositTxAndMakerInputs; import bisq.core.btc.model.RawTransactionInput; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -56,7 +56,7 @@ protected void run() { BtcWalletService walletService = processModel.getBtcWalletService(); String id = processModel.getOffer().getId(); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); Offer offer = checkNotNull(trade.getOffer()); Coin makerInputAmount = offer.getBuyerSecurityDeposit(); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java similarity index 88% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java index 85de45cf248..19890288090 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_maker/BuyerAsMakerSendsInputsForDepositTxResponse.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer_as_maker; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_maker; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.maker.MakerSendsInputsForDepositTxResponse; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerSendsInputsForDepositTxResponse; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java similarity index 92% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java index 0277ca7b76b..b5198c494a5 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_taker/BuyerAsTakerCreatesDepositTxInputs.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer_as_taker; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_taker; import bisq.core.btc.model.InputsAndChangeOutput; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java similarity index 91% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java index ab03ece48a2..a28bde602e4 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_taker/BuyerAsTakerSendsDepositTxMessage.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer_as_taker; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_taker; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DepositTxMessage; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.SendDirectMessageListener; @@ -53,7 +53,7 @@ protected void run() { message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid()); processModel.getP2PService().sendEncryptedDirectMessage( peersNodeAddress, - processModel.getTradingPeer().getPubKeyRing(), + processModel.getTradePeer().getPubKeyRing(), message, new SendDirectMessageListener() { @Override diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java similarity index 93% rename from core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java index c195059b193..dfb06bace8b 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/buyer_as_taker/BuyerAsTakerSignsDepositTx.java @@ -15,15 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.buyer_as_taker; +package bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_taker; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.model.RawTransactionInput; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.crypto.Hash; import bisq.common.taskrunner.TaskRunner; @@ -77,7 +77,7 @@ protected void run() { Coin msOutputAmount = offer.getBuyerSecurityDeposit().add(offer.getSellerSecurityDeposit()).add(trade.getTxFee()) .add(checkNotNull(trade.getTradeAmount())); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); byte[] buyerMultiSigPubKey = processModel.getMyMultiSigPubKey(); checkArgument(Arrays.equals(buyerMultiSigPubKey, buyerMultiSigAddressEntry.getPubKey()), "buyerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerCreateAndSignContract.java similarity index 86% rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerCreateAndSignContract.java index 1801d7b1edc..dbf64b85c72 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerCreateAndSignContract.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerCreateAndSignContract.java @@ -15,16 +15,18 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.maker; +package bisq.core.trade.protocol.bisq_v1.tasks.maker; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.BuyerAsMakerTrade; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.ProcessModel; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.offer.Offer; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.trade.model.bisq_v1.BuyerAsMakerTrade; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.network.p2p.NodeAddress; @@ -49,15 +51,15 @@ protected void run() { runInterceptHook(); String takerFeeTxId = checkNotNull(processModel.getTakeOfferFeeTxId()); - TradingPeer taker = processModel.getTradingPeer(); + TradingPeer taker = processModel.getTradePeer(); boolean isBuyerMakerAndSellerTaker = trade instanceof BuyerAsMakerTrade; NodeAddress buyerNodeAddress = isBuyerMakerAndSellerTaker ? processModel.getMyNodeAddress() : processModel.getTempTradingPeerNodeAddress(); NodeAddress sellerNodeAddress = isBuyerMakerAndSellerTaker ? processModel.getTempTradingPeerNodeAddress() : processModel.getMyNodeAddress(); BtcWalletService walletService = processModel.getBtcWalletService(); - String id = processModel.getOffer().getId(); - + Offer offer = processModel.getOffer(); + String id = offer.getId(); AddressEntry makerAddressEntry = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG); byte[] makerMultiSigPubKey = makerAddressEntry.getPubKey(); @@ -67,9 +69,10 @@ protected void run() { byte[] hashOfTakersPaymentAccountPayload = taker.getHashOfPaymentAccountPayload(); String makersPaymentMethodId = checkNotNull(processModel.getPaymentAccountPayload(trade)).getPaymentMethodId(); String takersPaymentMethodId = checkNotNull(taker.getPaymentMethodId()); + OfferPayload offerPayload = offer.getOfferPayload().orElseThrow(); Contract contract = new Contract( - processModel.getOffer().getOfferPayload(), + offerPayload, checkNotNull(trade.getTradeAmount()).value, trade.getTradePrice().getValue(), takerFeeTxId, diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessesInputsForDepositTxRequest.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerProcessesInputsForDepositTxRequest.java similarity index 94% rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessesInputsForDepositTxRequest.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerProcessesInputsForDepositTxRequest.java index e112627aba7..e59a5008465 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerProcessesInputsForDepositTxRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerProcessesInputsForDepositTxRequest.java @@ -15,15 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.maker; +package bisq.core.trade.protocol.bisq_v1.tasks.maker; import bisq.core.exceptions.TradePriceOutOfToleranceException; import bisq.core.offer.Offer; import bisq.core.support.dispute.mediation.mediator.Mediator; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.InputsForDepositTxRequest; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.user.User; import bisq.network.p2p.NodeAddress; @@ -57,7 +57,7 @@ protected void run() { checkNotNull(request); checkTradeId(processModel.getOfferId(), request); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); // 1.7.0: We do not expect the payment account anymore but in case peer has not updated we still process it. Optional.ofNullable(request.getTakerPaymentAccountPayload()) diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerRemovesOpenOffer.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerRemovesOpenOffer.java similarity index 89% rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerRemovesOpenOffer.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerRemovesOpenOffer.java index 6fe8c587698..843f2d5d4da 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerRemovesOpenOffer.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerRemovesOpenOffer.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.maker; +package bisq.core.trade.protocol.bisq_v1.tasks.maker; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerSendsInputsForDepositTxResponse.java similarity index 94% rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerSendsInputsForDepositTxResponse.java index 44b338fffe6..0233e177995 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSendsInputsForDepositTxResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerSendsInputsForDepositTxResponse.java @@ -15,14 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.maker; +package bisq.core.trade.protocol.bisq_v1.tasks.maker; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.InputsForDepositTxResponse; -import bisq.core.trade.protocol.ProcessModel; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.SendDirectMessageListener; @@ -103,7 +103,7 @@ protected void run() { message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid()); processModel.getP2PService().sendEncryptedDirectMessage( peersNodeAddress, - processModel.getTradingPeer().getPubKeyRing(), + processModel.getTradePeer().getPubKeyRing(), message, new SendDirectMessageListener() { @Override diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerSetsLockTime.java similarity index 89% rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerSetsLockTime.java index fde4359becd..089bbec587c 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerSetsLockTime.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.maker; +package bisq.core.trade.protocol.bisq_v1.tasks.maker; import bisq.core.btc.wallet.Restrictions; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.config.Config; import bisq.common.taskrunner.TaskRunner; @@ -41,7 +41,7 @@ protected void run() { // For regtest dev environment we use 5 blocks int delay = Config.baseCurrencyNetwork().isRegtest() ? 5 : - Restrictions.getLockTime(processModel.getOffer().getPaymentMethod().isAsset()); + Restrictions.getLockTime(processModel.getOffer().getPaymentMethod().isBlockchain()); long lockTime = processModel.getBtcWalletService().getBestChainHeight() + delay; log.info("lockTime={}, delay={}", lockTime, delay); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerVerifyTakerFeePayment.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerVerifyTakerFeePayment.java similarity index 89% rename from core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerVerifyTakerFeePayment.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerVerifyTakerFeePayment.java index 0c8a5fa67b8..6a70e2b61c8 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerVerifyTakerFeePayment.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/maker/MakerVerifyTakerFeePayment.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.maker; +package bisq.core.trade.protocol.bisq_v1.tasks.maker; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/BroadcastMediatedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/BroadcastMediatedPayoutTx.java similarity index 89% rename from core/src/main/java/bisq/core/trade/protocol/tasks/mediation/BroadcastMediatedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/BroadcastMediatedPayoutTx.java index 7ebfa20ce53..cbdcbc1bca2 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/BroadcastMediatedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/BroadcastMediatedPayoutTx.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.mediation; +package bisq.core.trade.protocol.bisq_v1.tasks.mediation; import bisq.core.support.dispute.mediation.MediationResultState; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.BroadcastPayoutTx; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.BroadcastPayoutTx; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/FinalizeMediatedPayoutTx.java similarity index 94% rename from core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/FinalizeMediatedPayoutTx.java index 875b78f7af4..4a6e4395af7 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/FinalizeMediatedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/FinalizeMediatedPayoutTx.java @@ -15,15 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.mediation; +package bisq.core.trade.protocol.bisq_v1.tasks.mediation; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -52,7 +52,7 @@ protected void run() { Transaction depositTx = checkNotNull(trade.getDepositTx()); String tradeId = trade.getId(); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); BtcWalletService walletService = processModel.getBtcWalletService(); Offer offer = checkNotNull(trade.getOffer(), "offer must not be null"); Coin tradeAmount = checkNotNull(trade.getTradeAmount(), "tradeAmount must not be null"); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java similarity index 83% rename from core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java index ba0aad72043..b04324eef73 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/ProcessMediatedPayoutSignatureMessage.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.mediation; +package bisq.core.trade.protocol.bisq_v1.tasks.mediation; import bisq.core.support.dispute.mediation.MediationResultState; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.MediatedPayoutTxSignatureMessage; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.MediatedPayoutTxSignatureMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.util.Validator; import bisq.common.taskrunner.TaskRunner; @@ -39,12 +39,11 @@ public ProcessMediatedPayoutSignatureMessage(TaskRunner taskHandler, Trad protected void run() { try { runInterceptHook(); - log.debug("current trade state " + trade.getState()); MediatedPayoutTxSignatureMessage message = (MediatedPayoutTxSignatureMessage) processModel.getTradeMessage(); Validator.checkTradeId(processModel.getOfferId(), message); checkNotNull(message); - processModel.getTradingPeer().setMediatedPayoutTxSignature(checkNotNull(message.getTxSignature())); + processModel.getTradePeer().setMediatedPayoutTxSignature(checkNotNull(message.getTxSignature())); // update to the latest peer address of our peer if the message is correct trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress()); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java similarity index 93% rename from core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java index cb06ed645e8..08a2b65c361 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/ProcessMediatedPayoutTxPublishedMessage.java @@ -15,14 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.mediation; +package bisq.core.trade.protocol.bisq_v1.tasks.mediation; -import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletService; import bisq.core.support.dispute.mediation.MediationResultState; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.MediatedPayoutTxPublishedMessage; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.MediatedPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.util.Validator; import bisq.common.UserThread; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutSignatureMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SendMediatedPayoutSignatureMessage.java similarity index 94% rename from core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutSignatureMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SendMediatedPayoutSignatureMessage.java index 51ff7267f93..e29b85267d1 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutSignatureMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SendMediatedPayoutSignatureMessage.java @@ -15,13 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.mediation; +package bisq.core.trade.protocol.bisq_v1.tasks.mediation; import bisq.core.support.dispute.mediation.MediationResultState; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.MediatedPayoutTxSignatureMessage; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.MediatedPayoutTxSignatureMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.P2PService; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java similarity index 89% rename from core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java index f03baace1bb..a29217d4f1f 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SendMediatedPayoutTxPublishedMessage.java @@ -15,13 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.mediation; +package bisq.core.trade.protocol.bisq_v1.tasks.mediation; import bisq.core.support.dispute.mediation.MediationResultState; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.MediatedPayoutTxPublishedMessage; -import bisq.core.trade.messages.TradeMailboxMessage; -import bisq.core.trade.protocol.tasks.SendMailboxMessageTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.MediatedPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.TradeMailboxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.SendMailboxMessageTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SetupMediatedPayoutTxListener.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SetupMediatedPayoutTxListener.java similarity index 90% rename from core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SetupMediatedPayoutTxListener.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SetupMediatedPayoutTxListener.java index dc0b60b314a..86cc22fb8e0 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SetupMediatedPayoutTxListener.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SetupMediatedPayoutTxListener.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.mediation; +package bisq.core.trade.protocol.bisq_v1.tasks.mediation; import bisq.core.support.dispute.mediation.MediationResultState; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.SetupPayoutTxListener; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.SetupPayoutTxListener; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SignMediatedPayoutTx.java similarity index 93% rename from core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SignMediatedPayoutTx.java index 6699d832003..7738bf72447 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/mediation/SignMediatedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/mediation/SignMediatedPayoutTx.java @@ -15,15 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.mediation; +package bisq.core.trade.protocol.bisq_v1.tasks.mediation; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -50,7 +50,7 @@ protected void run() { try { runInterceptHook(); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); if (processModel.getMediatedPayoutTxSignature() != null) { log.warn("processModel.getTxSignatureFromMediation is already set"); } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerBroadcastPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerBroadcastPayoutTx.java similarity index 88% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerBroadcastPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerBroadcastPayoutTx.java index d0a0f6c20d2..238056c346b 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerBroadcastPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerBroadcastPayoutTx.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.BroadcastPayoutTx; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.BroadcastPayoutTx; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerCreatesDelayedPayoutTx.java similarity index 91% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerCreatesDelayedPayoutTx.java index a466f112643..0d255924383 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerCreatesDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerCreatesDelayedPayoutTx.java @@ -15,13 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; import bisq.core.btc.wallet.TradeWalletService; import bisq.core.dao.governance.param.Param; -import bisq.core.trade.Trade; -import bisq.core.trade.TradeDataValidation; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.bisq_v1.TradeDataValidation; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerFinalizesDelayedPayoutTx.java similarity index 88% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerFinalizesDelayedPayoutTx.java index 2683e526026..e3150f6c5d2 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerFinalizesDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerFinalizesDelayedPayoutTx.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; import bisq.common.util.Utilities; @@ -49,13 +49,13 @@ protected void run() { BtcWalletService btcWalletService = processModel.getBtcWalletService(); String id = processModel.getOffer().getId(); - byte[] buyerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey(); + byte[] buyerMultiSigPubKey = processModel.getTradePeer().getMultiSigPubKey(); byte[] sellerMultiSigPubKey = processModel.getMyMultiSigPubKey(); checkArgument(Arrays.equals(sellerMultiSigPubKey, btcWalletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()), "sellerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id); - byte[] buyerSignature = processModel.getTradingPeer().getDelayedPayoutTxSignature(); + byte[] buyerSignature = processModel.getTradePeer().getDelayedPayoutTxSignature(); byte[] sellerSignature = processModel.getDelayedPayoutTxSignature(); Transaction signedDelayedPayoutTx = processModel.getTradeWalletService().finalizeDelayedPayoutTx( diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java similarity index 87% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java index 7dc721d935e..43f2b8b3b0a 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerProcessCounterCurrencyTransferStartedMessage.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.CounterCurrencyTransferStartedMessage; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.CounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.util.Validator; import bisq.common.taskrunner.TaskRunner; @@ -39,12 +39,11 @@ public SellerProcessCounterCurrencyTransferStartedMessage(TaskRunner task protected void run() { try { runInterceptHook(); - log.debug("current trade state " + trade.getState()); CounterCurrencyTransferStartedMessage message = (CounterCurrencyTransferStartedMessage) processModel.getTradeMessage(); Validator.checkTradeId(processModel.getOfferId(), message); checkNotNull(message); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); tradingPeer.setPayoutAddressString(Validator.nonEmptyStringOf(message.getBuyerPayoutAddress())); tradingPeer.setSignature(checkNotNull(message.getBuyerSignature())); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java similarity index 84% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java index 33d60965a44..0b1360859d7 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerProcessDelayedPayoutTxSignatureResponse.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DelayedPayoutTxSignatureResponse; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -42,7 +42,7 @@ protected void run() { checkNotNull(response); checkTradeId(processModel.getOfferId(), response); - processModel.getTradingPeer().setDelayedPayoutTxSignature(checkNotNull(response.getDelayedPayoutTxBuyerSignature())); + processModel.getTradePeer().setDelayedPayoutTxSignature(checkNotNull(response.getDelayedPayoutTxBuyerSignature())); processModel.getTradeWalletService().sellerAddsBuyerWitnessesToDepositTx( processModel.getDepositTx(), diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessShareBuyerPaymentAccountMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerProcessShareBuyerPaymentAccountMessage.java similarity index 90% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessShareBuyerPaymentAccountMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerProcessShareBuyerPaymentAccountMessage.java index dc20761aaea..6d7250aff19 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerProcessShareBuyerPaymentAccountMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerProcessShareBuyerPaymentAccountMessage.java @@ -32,14 +32,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; import bisq.core.payment.payload.PaymentAccountPayload; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.ShareBuyerPaymentAccountMessage; -import bisq.core.trade.protocol.ProcessModel; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.ShareBuyerPaymentAccountMessage; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.crypto.Sig; import bisq.common.taskrunner.TaskRunner; @@ -75,7 +75,7 @@ protected void run() { checkArgument(Arrays.equals(buyerPaymentAccountPayloadHash, peersPaymentAccountPayloadHash), "Hash of payment account is invalid"); - processModel.getTradingPeer().setPaymentAccountPayload(buyerPaymentAccountPayload); + processModel.getTradePeer().setPaymentAccountPayload(buyerPaymentAccountPayload); checkNotNull(contract).setPaymentAccountPayloads(buyerPaymentAccountPayload, processModel.getPaymentAccountPayload(trade), processModel.getPubKeyRing()); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerPublishesDepositTx.java similarity index 94% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerPublishesDepositTx.java index 1afae6dad39..4be5e257b97 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerPublishesDepositTx.java @@ -15,13 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; import bisq.core.btc.exceptions.TxBroadcastException; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.TxBroadcaster; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesTradeStatistics.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerPublishesTradeStatistics.java similarity index 91% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesTradeStatistics.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerPublishesTradeStatistics.java index 89b6ac5a14a..d3bff19ef05 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerPublishesTradeStatistics.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerPublishesTradeStatistics.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.trade.statistics.TradeStatistics3; import bisq.network.p2p.network.TorNetworkNode; @@ -50,7 +50,7 @@ protected void run() { // The peer as buyer does not publish anymore with v.1.4.0 (where Capability.TRADE_STATISTICS_3 was added) String referralId = processModel.getReferralIdService().getOptionalReferralId().orElse(null); - boolean isTorNetworkNode = model.getProcessModel().getP2PService().getNetworkNode() instanceof TorNetworkNode; + boolean isTorNetworkNode = processModel.getP2PService().getNetworkNode() instanceof TorNetworkNode; TradeStatistics3 tradeStatistics = TradeStatistics3.from(trade, referralId, isTorNetworkNode); if (tradeStatistics.isValid()) { log.info("Publishing trade statistics"); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java similarity index 91% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java index 58cfe2da58b..bde55550223 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSendDelayedPayoutTxSignatureRequest.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DelayedPayoutTxSignatureRequest; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.DelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.SendDirectMessageListener; @@ -60,7 +60,7 @@ protected void run() { message.getClass().getSimpleName(), peersNodeAddress, message.getTradeId(), message.getUid()); processModel.getP2PService().sendEncryptedDirectMessage( peersNodeAddress, - processModel.getTradingPeer().getPubKeyRing(), + processModel.getTradePeer().getPubKeyRing(), message, new SendDirectMessageListener() { @Override diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendPayoutTxPublishedMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSendPayoutTxPublishedMessage.java similarity index 92% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendPayoutTxPublishedMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSendPayoutTxPublishedMessage.java index be6990835dc..ae65e10da65 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendPayoutTxPublishedMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSendPayoutTxPublishedMessage.java @@ -15,14 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; import bisq.core.account.sign.SignedWitness; import bisq.core.account.witness.AccountAgeWitnessService; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.PayoutTxPublishedMessage; -import bisq.core.trade.messages.TradeMailboxMessage; -import bisq.core.trade.protocol.tasks.SendMailboxMessageTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.PayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.messages.TradeMailboxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.SendMailboxMessageTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java similarity index 95% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java index b20b9654c9c..dc08270b6e8 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSendsDepositTxAndDelayedPayoutTxMessage.java @@ -15,15 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; import bisq.core.network.MessageState; import bisq.core.payment.payload.PaymentAccountPayload; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.messages.TradeMailboxMessage; -import bisq.core.trade.messages.TradeMessage; -import bisq.core.trade.protocol.tasks.SendMailboxMessageTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.TradeMessage; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.messages.TradeMailboxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.SendMailboxMessageTask; import bisq.common.Timer; import bisq.common.UserThread; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSignAndFinalizePayoutTx.java similarity index 94% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSignAndFinalizePayoutTx.java index d6b0babc655..47a553de4cc 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignAndFinalizePayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSignAndFinalizePayoutTx.java @@ -15,14 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -52,7 +52,7 @@ protected void run() { checkNotNull(trade.getTradeAmount(), "trade.getTradeAmount() must not be null"); Offer offer = trade.getOffer(); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); BtcWalletService walletService = processModel.getBtcWalletService(); String id = processModel.getOffer().getId(); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSignsDelayedPayoutTx.java similarity index 92% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSignsDelayedPayoutTx.java index adabac92ebf..909ccc101cd 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller/SellerSignsDelayedPayoutTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller/SellerSignsDelayedPayoutTx.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller; +package bisq.core.trade.protocol.bisq_v1.tasks.seller; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -59,7 +59,7 @@ protected void run() { checkArgument(Arrays.equals(sellerMultiSigPubKey, btcWalletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG).getPubKey()), "sellerMultiSigPubKey from AddressEntry must match the one from the trade data. trade id =" + id); - byte[] buyerMultiSigPubKey = processModel.getTradingPeer().getMultiSigPubKey(); + byte[] buyerMultiSigPubKey = processModel.getTradePeer().getMultiSigPubKey(); byte[] delayedPayoutTxSignature = processModel.getTradeWalletService().signDelayedPayoutTx( preparedDelayedPayoutTx, diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java similarity index 94% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java index b382fd01edb..fa215a8db29 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerCreatesUnsignedDepositTx.java @@ -15,16 +15,16 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller_as_maker; +package bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.model.PreparedDepositTxAndMakerInputs; import bisq.core.btc.model.RawTransactionInput; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.crypto.Hash; import bisq.common.taskrunner.TaskRunner; @@ -55,7 +55,7 @@ protected void run() { BtcWalletService walletService = processModel.getBtcWalletService(); String id = processModel.getOffer().getId(); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); Offer offer = checkNotNull(trade.getOffer()); // params diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java similarity index 88% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java index 3902668f82e..fb42b6a6f74 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerFinalizesDepositTx.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller_as_maker; +package bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -39,11 +39,11 @@ protected void run() { try { runInterceptHook(); - byte[] takersRawPreparedDepositTx = checkNotNull(processModel.getTradingPeer().getPreparedDepositTx()); + byte[] takersRawPreparedDepositTx = checkNotNull(processModel.getTradePeer().getPreparedDepositTx()); byte[] myRawPreparedDepositTx = checkNotNull(processModel.getPreparedDepositTx()); Transaction takersDepositTx = processModel.getBtcWalletService().getTxFromSerializedTx(takersRawPreparedDepositTx); Transaction myDepositTx = processModel.getBtcWalletService().getTxFromSerializedTx(myRawPreparedDepositTx); - int numTakersInputs = checkNotNull(processModel.getTradingPeer().getRawTransactionInputs()).size(); + int numTakersInputs = checkNotNull(processModel.getTradePeer().getRawTransactionInputs()).size(); processModel.getTradeWalletService().sellerAsMakerFinalizesDepositTx(myDepositTx, takersDepositTx, numTakersInputs); processModel.setDepositTx(myDepositTx); diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java similarity index 84% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java index 0433347f84f..1e6d8162cc8 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerProcessDepositTxMessage.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller_as_maker; +package bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.DepositTxMessage; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.DepositTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.util.Validator; import bisq.common.taskrunner.TaskRunner; @@ -38,12 +38,11 @@ public SellerAsMakerProcessDepositTxMessage(TaskRunner taskHandler, Trade protected void run() { try { runInterceptHook(); - log.debug("current trade state " + trade.getState()); DepositTxMessage message = (DepositTxMessage) processModel.getTradeMessage(); Validator.checkTradeId(processModel.getOfferId(), message); checkNotNull(message); - processModel.getTradingPeer().setPreparedDepositTx(checkNotNull(message.getDepositTxWithoutWitnesses())); + processModel.getTradePeer().setPreparedDepositTx(checkNotNull(message.getDepositTxWithoutWitnesses())); trade.setTradingPeerNodeAddress(processModel.getTempTradingPeerNodeAddress()); // When we receive that message the taker has published the taker fee, so we apply it to the trade. diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java similarity index 90% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java index e22d7b3dc5c..b2bd8b3ac89 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_maker/SellerAsMakerSendsInputsForDepositTxResponse.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller_as_maker; +package bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.maker.MakerSendsInputsForDepositTxResponse; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerSendsInputsForDepositTxResponse; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java similarity index 93% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java index 7aa4118e6e9..452f4ecc681 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_taker/SellerAsTakerCreatesDepositTxInputs.java @@ -15,12 +15,12 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller_as_taker; +package bisq.core.trade.protocol.bisq_v1.tasks.seller_as_taker; import bisq.core.btc.model.InputsAndChangeOutput; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java similarity index 90% rename from core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java index 52d93e25c62..638e91a44c7 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/seller_as_taker/SellerAsTakerSignsDepositTx.java @@ -15,16 +15,16 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.seller_as_taker; +package bisq.core.trade.protocol.bisq_v1.tasks.seller_as_taker; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.model.RawTransactionInput; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; @@ -75,7 +75,7 @@ protected void run() { Coin msOutputAmount = offer.getBuyerSecurityDeposit().add(offer.getSellerSecurityDeposit()).add(trade.getTxFee()) .add(checkNotNull(trade.getTradeAmount())); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); Transaction depositTx = processModel.getTradeWalletService().takerSignsDepositTx( true, @@ -95,7 +95,7 @@ protected void run() { } catch (Throwable t) { Contract contract = trade.getContract(); if (contract != null) - contract.printDiff(processModel.getTradingPeer().getContractAsJson()); + contract.printDiff(processModel.getTradePeer().getContractAsJson()); failed(t); } } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/CreateTakerFeeTx.java similarity index 96% rename from core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/CreateTakerFeeTx.java index e6468020083..de0f55e074d 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/CreateTakerFeeTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/CreateTakerFeeTx.java @@ -15,15 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.taker; +package bisq.core.trade.protocol.bisq_v1.tasks.taker; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.TradeWalletService; import bisq.core.btc.wallet.WalletService; import bisq.core.dao.exceptions.DaoDisabledException; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.util.FeeReceiverSelector; import bisq.common.taskrunner.TaskRunner; @@ -88,7 +88,7 @@ protected void run() { processModel.getFundsNeededForTrade(), processModel.isUseSavingsWallet(), trade.getTxFee()); - transaction = processModel.getBsqWalletService().signTx(txWithBsqFee); + transaction = processModel.getBsqWalletService().signTxAndVerifyNoDustOutputs(txWithBsqFee); WalletService.checkAllScriptSignaturesForTx(transaction); } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerProcessesInputsForDepositTxResponse.java similarity index 92% rename from core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerProcessesInputsForDepositTxResponse.java index ada1866d359..f91ac655c53 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerProcessesInputsForDepositTxResponse.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerProcessesInputsForDepositTxResponse.java @@ -15,13 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.taker; +package bisq.core.trade.protocol.bisq_v1.tasks.taker; import bisq.core.btc.wallet.Restrictions; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.InputsForDepositTxResponse; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.config.Config; import bisq.common.taskrunner.TaskRunner; @@ -49,7 +49,7 @@ protected void run() { checkTradeId(processModel.getOfferId(), response); checkNotNull(response); - TradingPeer tradingPeer = processModel.getTradingPeer(); + TradingPeer tradingPeer = processModel.getTradePeer(); // 1.7.0: We do not expect the payment account anymore but in case peer has not updated we still process it. Optional.ofNullable(response.getMakerPaymentAccountPayload()) @@ -70,7 +70,7 @@ protected void run() { long lockTime = response.getLockTime(); if (Config.baseCurrencyNetwork().isMainnet()) { int myLockTime = processModel.getBtcWalletService().getBestChainHeight() + - Restrictions.getLockTime(processModel.getOffer().getPaymentMethod().isAsset()); + Restrictions.getLockTime(processModel.getOffer().getPaymentMethod().isBlockchain()); // We allow a tolerance of 3 blocks as BestChainHeight might be a bit different on maker and taker in case a new // block was just found checkArgument(Math.abs(lockTime - myLockTime) <= 3, diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerPublishFeeTx.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerPublishFeeTx.java similarity index 96% rename from core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerPublishFeeTx.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerPublishFeeTx.java index 6324f74e000..45f467980de 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerPublishFeeTx.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerPublishFeeTx.java @@ -15,15 +15,15 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.taker; +package bisq.core.trade.protocol.bisq_v1.tasks.taker; import bisq.core.btc.exceptions.TxBroadcastException; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.TradeWalletService; import bisq.core.btc.wallet.TxBroadcaster; import bisq.core.dao.state.model.blockchain.TxType; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerSendInputsForDepositTxRequest.java similarity index 95% rename from core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerSendInputsForDepositTxRequest.java index 695971db4d3..ba7c683be84 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerSendInputsForDepositTxRequest.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerSendInputsForDepositTxRequest.java @@ -15,14 +15,14 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.taker; +package bisq.core.trade.protocol.bisq_v1.tasks.taker; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Trade; -import bisq.core.trade.messages.InputsForDepositTxRequest; -import bisq.core.trade.protocol.ProcessModel; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.messages.InputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.core.user.User; import bisq.network.p2p.NodeAddress; @@ -142,7 +142,7 @@ protected void run() { processModel.getP2PService().sendEncryptedDirectMessage( trade.getTradingPeerNodeAddress(), - processModel.getTradingPeer().getPubKeyRing(), + processModel.getTradePeer().getPubKeyRing(), request, new SendDirectMessageListener() { public void onArrived() { diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerVerifyAndSignContract.java similarity index 85% rename from core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerVerifyAndSignContract.java index 7812eec9390..29392b77a2d 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerVerifyAndSignContract.java @@ -15,16 +15,18 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.taker; +package bisq.core.trade.protocol.bisq_v1.tasks.taker; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Contract; -import bisq.core.trade.SellerAsTakerTrade; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.ProcessModel; -import bisq.core.trade.protocol.TradingPeer; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.offer.Offer; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.SellerAsTakerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.model.ProcessModel; +import bisq.core.trade.protocol.bisq_v1.model.TradingPeer; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.network.p2p.NodeAddress; @@ -54,7 +56,7 @@ protected void run() { runInterceptHook(); String takerFeeTxId = checkNotNull(processModel.getTakeOfferFeeTxId()); - TradingPeer maker = processModel.getTradingPeer(); + TradingPeer maker = processModel.getTradePeer(); boolean isBuyerMakerAndSellerTaker = trade instanceof SellerAsTakerTrade; NodeAddress buyerNodeAddress = isBuyerMakerAndSellerTaker ? @@ -65,7 +67,8 @@ protected void run() { processModel.getTempTradingPeerNodeAddress(); BtcWalletService walletService = processModel.getBtcWalletService(); - String id = processModel.getOffer().getId(); + Offer offer = processModel.getOffer(); + String id = offer.getId(); AddressEntry takerPayoutAddressEntry = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.TRADE_PAYOUT); String takerPayoutAddressString = takerPayoutAddressEntry.getAddressString(); AddressEntry takerMultiSigAddressEntry = walletService.getOrCreateAddressEntry(id, AddressEntry.Context.MULTI_SIG); @@ -80,8 +83,9 @@ protected void run() { String takersPaymentMethodId = checkNotNull(processModel.getPaymentAccountPayload(trade)).getPaymentMethodId(); Coin tradeAmount = checkNotNull(trade.getTradeAmount()); + OfferPayload offerPayload = offer.getOfferPayload().orElseThrow(); Contract contract = new Contract( - processModel.getOffer().getOfferPayload(), + offerPayload, tradeAmount.value, trade.getTradePrice().getValue(), takerFeeTxId, @@ -108,8 +112,8 @@ protected void run() { ); String contractAsJson = Utilities.objectToJson(contract); - if (!contractAsJson.equals(processModel.getTradingPeer().getContractAsJson())) { - contract.printDiff(processModel.getTradingPeer().getContractAsJson()); + if (!contractAsJson.equals(processModel.getTradePeer().getContractAsJson())) { + contract.printDiff(processModel.getTradePeer().getContractAsJson()); failed("Contracts are not matching"); } diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyMakerFeePayment.java b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerVerifyMakerFeePayment.java similarity index 90% rename from core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyMakerFeePayment.java rename to core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerVerifyMakerFeePayment.java index 7d8d208d4d7..941cb6e73f6 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/taker/TakerVerifyMakerFeePayment.java +++ b/core/src/main/java/bisq/core/trade/protocol/bisq_v1/tasks/taker/TakerVerifyMakerFeePayment.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.trade.protocol.tasks.taker; +package bisq.core.trade.protocol.bisq_v1.tasks.taker; -import bisq.core.trade.Trade; -import bisq.core.trade.protocol.tasks.TradeTask; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.tasks.TradeTask; import bisq.common.taskrunner.TaskRunner; diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/ApplyFilter.java b/core/src/main/java/bisq/core/trade/protocol/tasks/ApplyFilter.java deleted file mode 100644 index f3a2d341593..00000000000 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/ApplyFilter.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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 bisq.core.trade.protocol.tasks; - -import bisq.core.filter.FilterManager; -import bisq.core.payment.payload.PaymentAccountPayload; -import bisq.core.trade.Trade; - -import bisq.network.p2p.NodeAddress; - -import bisq.common.taskrunner.TaskRunner; - -import lombok.extern.slf4j.Slf4j; - -import javax.annotation.Nullable; - -import static com.google.common.base.Preconditions.checkNotNull; - -@Slf4j -public class ApplyFilter extends TradeTask { - public ApplyFilter(TaskRunner taskHandler, Trade trade) { - super(taskHandler, trade); - } - - @Override - protected void run() { - try { - runInterceptHook(); - - NodeAddress nodeAddress = checkNotNull(processModel.getTempTradingPeerNodeAddress()); - @Nullable - PaymentAccountPayload paymentAccountPayload = processModel.getTradingPeer().getPaymentAccountPayload(); - - FilterManager filterManager = processModel.getFilterManager(); - if (filterManager.isNodeAddressBanned(nodeAddress)) { - failed("Other trader is banned by their node address.\n" + - "tradingPeerNodeAddress=" + nodeAddress); - } else if (filterManager.isOfferIdBanned(trade.getId())) { - failed("Offer ID is banned.\n" + - "Offer ID=" + trade.getId()); - } else if (trade.getOffer() != null && filterManager.isCurrencyBanned(trade.getOffer().getCurrencyCode())) { - failed("Currency is banned.\n" + - "Currency code=" + trade.getOffer().getCurrencyCode()); - } else if (filterManager.isPaymentMethodBanned(checkNotNull(trade.getOffer()).getPaymentMethod())) { - failed("Payment method is banned.\n" + - "Payment method=" + trade.getOffer().getPaymentMethod().getId()); - } else if (paymentAccountPayload != null && filterManager.arePeersPaymentAccountDataBanned(paymentAccountPayload)) { - failed("Other trader is banned by their trading account data.\n" + - "paymentAccountPayload=" + paymentAccountPayload.getPaymentDetails()); - } else if (filterManager.requireUpdateToNewVersionForTrading()) { - failed("Your version of Bisq is not compatible for trading anymore. " + - "Please update to the latest Bisq version at https://bisq.network/downloads."); - } else { - complete(); - } - } catch (Throwable t) { - failed(t); - } - } -} - diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2.java index 864b08f9677..207930f8d63 100644 --- a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2.java +++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics2.java @@ -22,8 +22,9 @@ import bisq.core.monetary.Price; import bisq.core.monetary.Volume; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; -import bisq.core.trade.Trade; +import bisq.core.offer.OfferDirection; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.util.VolumeUtil; import bisq.network.p2p.NodeAddress; @@ -53,7 +54,8 @@ import java.util.Map; import java.util.Optional; -import lombok.Value; +import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -67,7 +69,8 @@ */ @Deprecated @Slf4j -@Value +@EqualsAndHashCode +@Getter public final class TradeStatistics2 implements ProcessOncePersistableNetworkPayload, PersistableNetworkPayload, CapabilityRequiringPayload, Comparable { @@ -93,7 +96,8 @@ public static TradeStatistics2 from(Trade trade, Offer offer = trade.getOffer(); checkNotNull(offer, "offer must not ne null"); checkNotNull(trade.getTradeAmount(), "trade.getTradeAmount() must not ne null"); - return new TradeStatistics2(offer.getOfferPayload(), + OfferPayload offerPayload = offer.getOfferPayload().orElseThrow(); + return new TradeStatistics2(offerPayload, trade.getTradePrice(), trade.getTradeAmount(), trade.getDate(), @@ -106,7 +110,7 @@ public static TradeStatistics2 from(Trade trade, @SuppressWarnings("SpellCheckingInspection") public static final String REFUND_AGENT_ADDRESS = "refAddr"; - private final OfferPayload.Direction direction; + private final OfferDirection direction; private final String baseCurrency; private final String counterCurrency; private final String offerPaymentMethod; @@ -165,7 +169,7 @@ public TradeStatistics2(OfferPayload offerPayload, // PROTO BUFFER /////////////////////////////////////////////////////////////////////////////////////////// - public TradeStatistics2(OfferPayload.Direction direction, + public TradeStatistics2(OfferDirection direction, String baseCurrency, String counterCurrency, String offerPaymentMethod, @@ -209,7 +213,7 @@ public byte[] createHash() { private protobuf.TradeStatistics2.Builder getBuilder() { final protobuf.TradeStatistics2.Builder builder = protobuf.TradeStatistics2.newBuilder() - .setDirection(OfferPayload.Direction.toProtoMessage(direction)) + .setDirection(OfferDirection.toProtoMessage(direction)) .setBaseCurrency(baseCurrency) .setCounterCurrency(counterCurrency) .setPaymentMethodId(offerPaymentMethod) @@ -239,7 +243,7 @@ public protobuf.PersistableNetworkPayload toProtoMessage() { public static TradeStatistics2 fromProto(protobuf.TradeStatistics2 proto) { return new TradeStatistics2( - OfferPayload.Direction.fromProto(proto.getDirection()), + OfferDirection.fromProto(proto.getDirection()), proto.getBaseCurrency(), proto.getCounterCurrency(), proto.getPaymentMethodId(), diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java index fee029654b6..6ab1d0c4389 100644 --- a/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java +++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatistics3.java @@ -22,8 +22,8 @@ import bisq.core.monetary.Price; import bisq.core.monetary.Volume; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; -import bisq.core.trade.Trade; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.util.VolumeUtil; import bisq.network.p2p.NodeAddress; @@ -107,7 +107,7 @@ public static TradeStatistics3 from(Trade trade, trade.getTradePrice().getValue(), trade.getTradeAmountAsLong(), offer.getPaymentMethod().getId(), - trade.getTakeOfferDate().getTime(), + trade.getDate().getTime(), truncatedMediatorNodeAddress, truncatedRefundAgentNodeAddress, extraDataMap); diff --git a/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java b/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java index 044018c018b..6f78023dfe5 100644 --- a/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java +++ b/core/src/main/java/bisq/core/trade/statistics/TradeStatisticsManager.java @@ -21,8 +21,9 @@ import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; import bisq.core.provider.price.PriceFeedService; -import bisq.core.trade.BuyerTrade; -import bisq.core.trade.Trade; +import bisq.core.trade.model.TradeModel; +import bisq.core.trade.model.bisq_v1.BuyerTrade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.network.p2p.P2PService; import bisq.network.p2p.storage.P2PDataStorage; @@ -167,46 +168,49 @@ private void maybeDumpStatistics() { jsonFileManager.writeToDiscThreaded(Utilities.objectToJson(array), "trade_statistics"); } - public void maybeRepublishTradeStatistics(Set trades, + public void maybeRepublishTradeStatistics(Set trades, @Nullable String referralId, boolean isTorNetworkNode) { long ts = System.currentTimeMillis(); Set hashes = tradeStatistics3StorageService.getMapOfAllData().keySet(); - trades.forEach(trade -> { - if (trade instanceof BuyerTrade) { - log.debug("Trade: {} is a buyer trade, we only republish we have been seller.", - trade.getShortId()); - return; - } - - TradeStatistics3 tradeStatistics3 = TradeStatistics3.from(trade, referralId, isTorNetworkNode); - boolean hasTradeStatistics3 = hashes.contains(new P2PDataStorage.ByteArray(tradeStatistics3.getHash())); - if (hasTradeStatistics3) { - log.debug("Trade: {}. We have already a tradeStatistics matching the hash of tradeStatistics3.", - trade.getShortId()); - return; - } - - // If we did not find a TradeStatistics3 we look up if we find a TradeStatistics3 converted from - // TradeStatistics2 where we used the original hash, which is not the native hash of the - // TradeStatistics3 but of TradeStatistics2. - TradeStatistics2 tradeStatistics2 = TradeStatistics2.from(trade, referralId, isTorNetworkNode); - boolean hasTradeStatistics2 = hashes.contains(new P2PDataStorage.ByteArray(tradeStatistics2.getHash())); - if (hasTradeStatistics2) { - log.debug("Trade: {}. We have already a tradeStatistics matching the hash of tradeStatistics2. ", - trade.getShortId()); - return; - } - - if (!tradeStatistics3.isValid()) { - log.warn("Trade: {}. Trade statistics is invalid. We do not publish it.", tradeStatistics3); - return; - } - - log.info("Trade: {}. We republish tradeStatistics3 as we did not find it in the existing trade statistics. ", - trade.getShortId()); - p2PService.addPersistableNetworkPayload(tradeStatistics3, true); - }); + trades.stream() + .filter(tradable -> tradable instanceof Trade) + .forEach(tradable -> { + Trade trade = (Trade) tradable; + if (trade instanceof BuyerTrade) { + log.debug("Trade: {} is a buyer trade, we only republish we have been seller.", + trade.getShortId()); + return; + } + + TradeStatistics3 tradeStatistics3 = TradeStatistics3.from(trade, referralId, isTorNetworkNode); + boolean hasTradeStatistics3 = hashes.contains(new P2PDataStorage.ByteArray(tradeStatistics3.getHash())); + if (hasTradeStatistics3) { + log.debug("Trade: {}. We have already a tradeStatistics matching the hash of tradeStatistics3.", + trade.getShortId()); + return; + } + + // If we did not find a TradeStatistics3 we look up if we find a TradeStatistics3 converted from + // TradeStatistics2 where we used the original hash, which is not the native hash of the + // TradeStatistics3 but of TradeStatistics2. + TradeStatistics2 tradeStatistics2 = TradeStatistics2.from(trade, referralId, isTorNetworkNode); + boolean hasTradeStatistics2 = hashes.contains(new P2PDataStorage.ByteArray(tradeStatistics2.getHash())); + if (hasTradeStatistics2) { + log.debug("Trade: {}. We have already a tradeStatistics matching the hash of tradeStatistics2. ", + trade.getShortId()); + return; + } + + if (!tradeStatistics3.isValid()) { + log.warn("Trade: {}. Trade statistics is invalid. We do not publish it.", tradeStatistics3); + return; + } + + log.info("Trade: {}. We republish tradeStatistics3 as we did not find it in the existing trade statistics. ", + trade.getShortId()); + p2PService.addPersistableNetworkPayload(tradeStatistics3, true); + }); log.info("maybeRepublishTradeStatistics took {} ms. Number of tradeStatistics: {}. Number of own trades: {}", System.currentTimeMillis() - ts, hashes.size(), trades.size()); } diff --git a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofModel.java b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofModel.java index 6d386437bed..79191d3968b 100644 --- a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofModel.java +++ b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofModel.java @@ -20,14 +20,12 @@ import bisq.core.monetary.Volume; import bisq.core.payment.payload.AssetsAccountPayload; import bisq.core.payment.payload.PaymentAccountPayload; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.txproof.AssetTxProofModel; import bisq.core.user.AutoConfirmSettings; import bisq.common.app.DevEnv; -import org.bitcoinj.core.Coin; - import com.google.common.annotations.VisibleForTesting; import java.util.Date; diff --git a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java index 2d0efe887d4..04eefabd9e9 100644 --- a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java +++ b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java @@ -22,7 +22,7 @@ import bisq.core.support.dispute.Dispute; import bisq.core.support.dispute.mediation.MediationManager; import bisq.core.support.dispute.refund.RefundManager; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.txproof.AssetTxProofRequestsPerTrade; import bisq.core.trade.txproof.AssetTxProofResult; import bisq.core.user.AutoConfirmSettings; diff --git a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java index 469b1b4fc49..14f126554d2 100644 --- a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java +++ b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java @@ -22,12 +22,13 @@ import bisq.core.locale.Res; import bisq.core.support.dispute.mediation.MediationManager; import bisq.core.support.dispute.refund.RefundManager; -import bisq.core.trade.SellerTrade; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; -import bisq.core.trade.protocol.SellerProtocol; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.FailedTradesManager; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.SellerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.SellerProtocol; import bisq.core.trade.txproof.AssetTxProofResult; import bisq.core.trade.txproof.AssetTxProofService; import bisq.core.user.AutoConfirmSettings; @@ -181,7 +182,7 @@ private void onP2pNetworkAndWalletReady() { // We listen on new trades ObservableList tradableList = tradeManager.getObservableList(); - tradableList.addListener((ListChangeListener) c -> { + tradableList.addListener((ListChangeListener) c -> { c.next(); if (c.wasAdded()) { processTrades(c.getAddedSubList()); @@ -192,7 +193,7 @@ private void onP2pNetworkAndWalletReady() { processTrades(tradableList); } - private void processTrades(List trades) { + private void processTrades(List trades) { trades.stream() .filter(trade -> trade instanceof SellerTrade) .map(trade -> (SellerTrade) trade) @@ -204,7 +205,7 @@ private void processTrades(List trades) { // Basic requirements are fulfilled. // We process further if we are in the expected state or register a listener private void processTradeOrAddListener(SellerTrade trade) { - if (isExpectedTradeState(trade.getState())) { + if (isExpectedTradeState(trade.getTradeState())) { startRequestsIfValid(trade); } else { // We are expecting SELLER_RECEIVED_FIAT_PAYMENT_INITIATED_MSG in the future, so listen on changes @@ -372,7 +373,9 @@ private boolean wasTxKeyReUsed(Trade trade, List activeTrades) { // We need to prevent that a user tries to scam by reusing a txKey and txHash of a previous XMR trade with // the same user (same address) and same amount. We check only for the txKey as a same txHash but different // txKey is not possible to get a valid result at proof. - Stream failedAndOpenTrades = Stream.concat(activeTrades.stream(), failedTradesManager.getObservableList().stream()); + Stream failedAndOpenTrades = Stream.concat( + activeTrades.stream(), + failedTradesManager.getObservableList().stream()); Stream closedTrades = closedTradableManager.getObservableList().stream() .filter(tradable -> tradable instanceof Trade) .map(tradable -> (Trade) tradable); diff --git a/core/src/main/java/bisq/core/util/Validator.java b/core/src/main/java/bisq/core/util/Validator.java index 52da4927745..98cb013c712 100644 --- a/core/src/main/java/bisq/core/util/Validator.java +++ b/core/src/main/java/bisq/core/util/Validator.java @@ -17,7 +17,7 @@ package bisq.core.util; -import bisq.core.trade.messages.TradeMessage; +import bisq.core.trade.protocol.TradeMessage; import org.bitcoinj.core.Coin; diff --git a/core/src/main/java/bisq/core/util/coin/CoinUtil.java b/core/src/main/java/bisq/core/util/coin/CoinUtil.java index 3f8b16bda0f..616f33907c6 100644 --- a/core/src/main/java/bisq/core/util/coin/CoinUtil.java +++ b/core/src/main/java/bisq/core/util/coin/CoinUtil.java @@ -96,14 +96,22 @@ public static Coin getPercentOfAmountAsCoin(double percent, Coin amount) { * @param amount the amount of BTC to trade * @return the maker fee for the given trade amount, or {@code null} if the amount is {@code null} */ - @Nullable public static Coin getMakerFee(boolean isCurrencyForMakerFeeBtc, @Nullable Coin amount) { - if (amount != null) { - Coin feePerBtc = getFeePerBtc(FeeService.getMakerFeePerBtc(isCurrencyForMakerFeeBtc), amount); - return maxCoin(feePerBtc, FeeService.getMinMakerFee(isCurrencyForMakerFeeBtc)); - } else { - return null; + Coin minMakerFee = FeeService.getMinMakerFee(isCurrencyForMakerFeeBtc); + if (amount == null) { + return minMakerFee; } + Coin feePerBtc = getFeePerBtc(FeeService.getMakerFeePerBtc(isCurrencyForMakerFeeBtc), amount); + return maxCoin(feePerBtc, minMakerFee); + } + + public static Coin getTakerFee(boolean isCurrencyForTakerFeeBtc, @Nullable Coin amount) { + Coin minTakerFee = FeeService.getMinTakerFee(isCurrencyForTakerFeeBtc); + if (amount == null) { + return minTakerFee; + } + Coin feePerBtc = getFeePerBtc(FeeService.getTakerFeePerBtc(isCurrencyForTakerFeeBtc), amount); + return maxCoin(feePerBtc, minTakerFee); } /** diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index d6106e5559e..168224faedd 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -2835,7 +2835,7 @@ popup.reportError={0}\n\nTo help us to improve the software please report this b The above error message will be copied to the clipboard when you click either of the buttons below.\n\ It will make debugging easier if you include the bisq.log file by pressing "Open log file", saving a copy, and attaching it to your bug report. -popup.error.tryRestart=Please try to restart your application and check your network connection to see if you can resolve the issue. +popup.error.tryRestart=Please restart your application and check your network connection to see if you can resolve the issue. popup.error.takeOfferRequestFailed=An error occurred when someone tried to take one of your offers:\n{0} error.spvFileCorrupted=An error occurred when reading the SPV chain file.\nIt might be that the SPV chain file is corrupted.\n\nError message: {0}\n\nDo you want to delete it and start a resync? diff --git a/core/src/test/java/bisq/core/account/witness/AccountAgeWitnessServiceTest.java b/core/src/test/java/bisq/core/account/witness/AccountAgeWitnessServiceTest.java index cf47c712d4b..a3df97d74c1 100644 --- a/core/src/test/java/bisq/core/account/witness/AccountAgeWitnessServiceTest.java +++ b/core/src/test/java/bisq/core/account/witness/AccountAgeWitnessServiceTest.java @@ -21,7 +21,7 @@ import bisq.core.account.sign.SignedWitnessService; import bisq.core.filter.FilterManager; import bisq.core.locale.CountryUtil; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.payment.ChargeBackRisk; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.payment.payload.PaymentMethod; @@ -31,7 +31,7 @@ import bisq.core.support.dispute.DisputeResult; import bisq.core.support.dispute.arbitration.TraderDataItem; import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; -import bisq.core.trade.Contract; +import bisq.core.trade.model.bisq_v1.Contract; import bisq.network.p2p.P2PService; import bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService; diff --git a/core/src/test/java/bisq/core/offer/OfferMaker.java b/core/src/test/java/bisq/core/offer/OfferMaker.java index aa9d294c2e2..2e89ec24fb1 100644 --- a/core/src/test/java/bisq/core/offer/OfferMaker.java +++ b/core/src/test/java/bisq/core/offer/OfferMaker.java @@ -17,6 +17,8 @@ package bisq.core.offer; +import bisq.core.offer.bisq_v1.OfferPayload; + import com.natpryce.makeiteasy.Instantiator; import com.natpryce.makeiteasy.Maker; import com.natpryce.makeiteasy.Property; @@ -30,7 +32,7 @@ public class OfferMaker { public static final Property amount = new Property<>(); public static final Property baseCurrencyCode = new Property<>(); public static final Property counterCurrencyCode = new Property<>(); - public static final Property direction = new Property<>(); + public static final Property direction = new Property<>(); public static final Property useMarketBasedPrice = new Property<>(); public static final Property marketPriceMargin = new Property<>(); public static final Property id = new Property<>(); @@ -40,7 +42,7 @@ public class OfferMaker { 0L, null, null, - lookup.valueOf(direction, OfferPayload.Direction.BUY), + lookup.valueOf(direction, OfferDirection.BUY), lookup.valueOf(price, 100000L), lookup.valueOf(marketPriceMargin, 0.0), lookup.valueOf(useMarketBasedPrice, false), diff --git a/core/src/test/java/bisq/core/offer/OfferTest.java b/core/src/test/java/bisq/core/offer/OfferTest.java index 9300c01574e..4d2b03ff7b4 100644 --- a/core/src/test/java/bisq/core/offer/OfferTest.java +++ b/core/src/test/java/bisq/core/offer/OfferTest.java @@ -17,6 +17,8 @@ package bisq.core.offer; +import bisq.core.offer.bisq_v1.OfferPayload; + import org.junit.Test; import static org.junit.Assert.assertFalse; diff --git a/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java b/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java index 63b4e406bb6..800ebc5b950 100644 --- a/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java +++ b/core/src/test/java/bisq/core/offer/OpenOfferManagerTest.java @@ -1,7 +1,8 @@ package bisq.core.offer; import bisq.core.api.CoreContext; -import bisq.core.trade.TradableList; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.trade.model.TradableList; import bisq.network.p2p.P2PService; import bisq.network.p2p.peers.PeerManager; @@ -68,7 +69,8 @@ public void testStartEditOfferForActiveOffer() { null, null, null, - persistenceManager); + persistenceManager + ); AtomicBoolean startEditOfferSuccessful = new AtomicBoolean(false); @@ -115,7 +117,8 @@ public void testStartEditOfferForDeactivatedOffer() { null, null, null, - persistenceManager); + persistenceManager + ); AtomicBoolean startEditOfferSuccessful = new AtomicBoolean(false); @@ -155,7 +158,8 @@ public void testStartEditOfferForOfferThatIsCurrentlyEdited() { null, null, null, - persistenceManager); + persistenceManager + ); AtomicBoolean startEditOfferSuccessful = new AtomicBoolean(false); diff --git a/core/src/test/java/bisq/core/trade/TradableListTest.java b/core/src/test/java/bisq/core/trade/TradableListTest.java index e6a41bca6ae..5933fc0faf0 100644 --- a/core/src/test/java/bisq/core/trade/TradableListTest.java +++ b/core/src/test/java/bisq/core/trade/TradableListTest.java @@ -18,8 +18,9 @@ package bisq.core.trade; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; import bisq.core.offer.OpenOffer; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.trade.model.TradableList; import org.junit.Test; diff --git a/core/src/test/java/bisq/core/util/ProtoUtilTest.java b/core/src/test/java/bisq/core/util/ProtoUtilTest.java index dee3b4a2490..1f11899bde5 100644 --- a/core/src/test/java/bisq/core/util/ProtoUtilTest.java +++ b/core/src/test/java/bisq/core/util/ProtoUtilTest.java @@ -17,12 +17,11 @@ package bisq.core.util; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OpenOffer; import bisq.common.proto.ProtoUtil; -import protobuf.OfferPayload; - import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -34,10 +33,10 @@ public class ProtoUtilTest { //TODO Use NetworkProtoResolver, PersistenceProtoResolver or ProtoResolver which are all in bisq.common. @Test public void testEnum() { - OfferPayload.Direction direction = OfferPayload.Direction.SELL; - OfferPayload.Direction direction2 = OfferPayload.Direction.BUY; - OfferPayload.Direction realDirection = getDirection(direction); - OfferPayload.Direction realDirection2 = getDirection(direction2); + OfferDirection direction = OfferDirection.SELL; + OfferDirection direction2 = OfferDirection.BUY; + OfferDirection realDirection = getDirection(direction); + OfferDirection realDirection2 = getDirection(direction2); assertEquals("SELL", realDirection.name()); assertEquals("BUY", realDirection2.name()); } @@ -63,7 +62,7 @@ public void testUnknownEnumFix() { } } - public static OfferPayload.Direction getDirection(OfferPayload.Direction direction) { - return OfferPayload.Direction.valueOf(direction.name()); + public static OfferDirection getDirection(OfferDirection direction) { + return OfferDirection.valueOf(direction.name()); } } diff --git a/daemon/src/main/java/bisq/daemon/grpc/GrpcErrorMessageHandler.java b/daemon/src/main/java/bisq/daemon/grpc/GrpcErrorMessageHandler.java index 4c139e17094..d5e33036eac 100644 --- a/daemon/src/main/java/bisq/daemon/grpc/GrpcErrorMessageHandler.java +++ b/daemon/src/main/java/bisq/daemon/grpc/GrpcErrorMessageHandler.java @@ -134,7 +134,7 @@ private AvailabilityResult getAvailabilityResult(String errorMessage) { } private String getAvailabilityResultDescription(AvailabilityResult proto) { - return bisq.core.offer.AvailabilityResult.fromProto(proto).description(); + return bisq.core.offer.availability.AvailabilityResult.fromProto(proto).description(); } private boolean takeOfferWasCalled() { diff --git a/daemon/src/main/java/bisq/daemon/grpc/GrpcTradesService.java b/daemon/src/main/java/bisq/daemon/grpc/GrpcTradesService.java index 7ffea95e6a5..62ca94ebbfc 100644 --- a/daemon/src/main/java/bisq/daemon/grpc/GrpcTradesService.java +++ b/daemon/src/main/java/bisq/daemon/grpc/GrpcTradesService.java @@ -19,7 +19,7 @@ import bisq.core.api.CoreApi; import bisq.core.api.model.TradeInfo; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.proto.grpc.ConfirmPaymentReceivedReply; import bisq.proto.grpc.ConfirmPaymentReceivedRequest; diff --git a/desktop/src/main/java/bisq/desktop/components/PeerInfoIcon.java b/desktop/src/main/java/bisq/desktop/components/PeerInfoIcon.java index d3ae4b4fba4..19fbbf08655 100644 --- a/desktop/src/main/java/bisq/desktop/components/PeerInfoIcon.java +++ b/desktop/src/main/java/bisq/desktop/components/PeerInfoIcon.java @@ -23,7 +23,7 @@ import bisq.core.alert.PrivateNotificationManager; import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.network.p2p.NodeAddress; diff --git a/desktop/src/main/java/bisq/desktop/components/PeerInfoIconSmall.java b/desktop/src/main/java/bisq/desktop/components/PeerInfoIconSmall.java index 4fa2a2b2a65..943312bec2c 100644 --- a/desktop/src/main/java/bisq/desktop/components/PeerInfoIconSmall.java +++ b/desktop/src/main/java/bisq/desktop/components/PeerInfoIconSmall.java @@ -3,7 +3,7 @@ import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.alert.PrivateNotificationManager; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.network.p2p.NodeAddress; diff --git a/desktop/src/main/java/bisq/desktop/components/PeerInfoIconTrading.java b/desktop/src/main/java/bisq/desktop/components/PeerInfoIconTrading.java index fa063a2bf60..796f7144b79 100644 --- a/desktop/src/main/java/bisq/desktop/components/PeerInfoIconTrading.java +++ b/desktop/src/main/java/bisq/desktop/components/PeerInfoIconTrading.java @@ -23,7 +23,7 @@ import bisq.core.locale.Res; import bisq.core.offer.Offer; import bisq.core.payment.payload.PaymentMethod; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.network.p2p.NodeAddress; @@ -40,7 +40,10 @@ import javax.annotation.Nullable; -import static bisq.desktop.util.Colors.*; +import static bisq.desktop.util.Colors.AVATAR_BLUE; +import static bisq.desktop.util.Colors.AVATAR_GREEN; +import static bisq.desktop.util.Colors.AVATAR_ORANGE; +import static bisq.desktop.util.Colors.AVATAR_RED; import static com.google.common.base.Preconditions.checkNotNull; @Slf4j diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/AssetsForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/AssetsForm.java index 2933099ee19..faac61551c8 100644 --- a/desktop/src/main/java/bisq/desktop/components/paymentmethods/AssetsForm.java +++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/AssetsForm.java @@ -236,7 +236,8 @@ public TradeCurrency fromString(String s) { ((AutocompleteComboBox) currencyComboBox).setOnChangeConfirmed(e -> { addressInputTextField.resetValidation(); addressInputTextField.validate(); - paymentAccount.setSingleTradeCurrency(currencyComboBox.getSelectionModel().getSelectedItem()); + TradeCurrency tradeCurrency = currencyComboBox.getSelectionModel().getSelectedItem(); + paymentAccount.setSingleTradeCurrency(tradeCurrency); updateFromInputs(); }); } diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/PaymentMethodForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/PaymentMethodForm.java index 3aa4ba93633..df2a8fd2d33 100644 --- a/desktop/src/main/java/bisq/desktop/components/paymentmethods/PaymentMethodForm.java +++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/PaymentMethodForm.java @@ -34,7 +34,7 @@ import bisq.core.locale.Res; import bisq.core.locale.TradeCurrency; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.payment.AssetAccount; import bisq.core.payment.PaymentAccount; import bisq.core.payment.payload.PaymentMethod; @@ -187,14 +187,14 @@ else if (!paymentAccount.getTradeCurrencies().isEmpty() && paymentAccount.getTra Res.get("payment.maxPeriodAndLimitCrypto", getTimeText(hours), formatter.formatCoinWithCode(Coin.valueOf(accountAgeWitnessService.getMyTradeLimit( - paymentAccount, tradeCurrency.getCode(), OfferPayload.Direction.BUY)))) + paymentAccount, tradeCurrency.getCode(), OfferDirection.BUY)))) : Res.get("payment.maxPeriodAndLimit", getTimeText(hours), formatter.formatCoinWithCode(Coin.valueOf(accountAgeWitnessService.getMyTradeLimit( - paymentAccount, tradeCurrency.getCode(), OfferPayload.Direction.BUY))), + paymentAccount, tradeCurrency.getCode(), OfferDirection.BUY))), formatter.formatCoinWithCode(Coin.valueOf(accountAgeWitnessService.getMyTradeLimit( - paymentAccount, tradeCurrency.getCode(), OfferPayload.Direction.SELL))), + paymentAccount, tradeCurrency.getCode(), OfferDirection.SELL))), DisplayUtils.formatAccountAge(accountAge)); return limitationsText; } diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/SwiftForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/SwiftForm.java index 769cf10dd15..13c6bcd2641 100644 --- a/desktop/src/main/java/bisq/desktop/components/paymentmethods/SwiftForm.java +++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/SwiftForm.java @@ -19,7 +19,6 @@ import bisq.desktop.components.AutoTooltipButton; import bisq.desktop.components.AutoTooltipCheckBox; import bisq.desktop.components.InputTextField; -import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.main.overlays.windows.SwiftPaymentDetails; import bisq.desktop.util.GUIUtil; import bisq.desktop.util.Layout; @@ -33,7 +32,7 @@ import bisq.core.payment.SwiftAccount; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.payment.payload.SwiftAccountPayload; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.util.coin.CoinFormatter; import bisq.core.util.validation.InputValidator; diff --git a/desktop/src/main/java/bisq/desktop/main/MainView.java b/desktop/src/main/java/bisq/desktop/main/MainView.java index 9b3f23ab903..4fad3f78701 100644 --- a/desktop/src/main/java/bisq/desktop/main/MainView.java +++ b/desktop/src/main/java/bisq/desktop/main/MainView.java @@ -364,7 +364,9 @@ protected Tooltip computeValue() { setupBadge(portfolioButtonWithBadge, model.getNumPendingTrades(), model.getShowPendingTradesNotification()); setupBadge(supportButtonWithBadge, model.getNumOpenSupportTickets(), model.getShowOpenSupportTicketsNotification()); + setupBadge(settingsButtonWithBadge, new SimpleStringProperty(Res.get("shared.new")), model.getShowSettingsUpdatesNotification()); + settingsButtonWithBadge.getStyleClass().add("new"); navigation.addListener((viewPath, data) -> { if (viewPath.size() != 2 || viewPath.indexOf(MainView.class) != 0) diff --git a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java index 7f29647f862..d1f3f1aeaf3 100644 --- a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java @@ -245,34 +245,35 @@ public void onSetupComplete() { if (newValue) { tradeManager.applyTradePeriodState(); - tradeManager.getObservableList().forEach(trade -> { - Date maxTradePeriodDate = trade.getMaxTradePeriodDate(); - String key; - switch (trade.getTradePeriodState()) { - case FIRST_HALF: - break; - case SECOND_HALF: - key = "displayHalfTradePeriodOver" + trade.getId(); - if (DontShowAgainLookup.showAgain(key)) { - DontShowAgainLookup.dontShowAgain(key, true); - new Popup().warning(Res.get("popup.warning.tradePeriod.halfReached", - trade.getShortId(), - DisplayUtils.formatDateTime(maxTradePeriodDate))) - .show(); + tradeManager.getObservableList() + .forEach(trade -> { + Date maxTradePeriodDate = trade.getMaxTradePeriodDate(); + String key; + switch (trade.getTradePeriodState()) { + case FIRST_HALF: + break; + case SECOND_HALF: + key = "displayHalfTradePeriodOver" + trade.getId(); + if (DontShowAgainLookup.showAgain(key)) { + DontShowAgainLookup.dontShowAgain(key, true); + new Popup().warning(Res.get("popup.warning.tradePeriod.halfReached", + trade.getShortId(), + DisplayUtils.formatDateTime(maxTradePeriodDate))) + .show(); + } + break; + case TRADE_PERIOD_OVER: + key = "displayTradePeriodOver" + trade.getId(); + if (DontShowAgainLookup.showAgain(key)) { + DontShowAgainLookup.dontShowAgain(key, true); + new Popup().warning(Res.get("popup.warning.tradePeriod.ended", + trade.getShortId(), + DisplayUtils.formatDateTime(maxTradePeriodDate))) + .show(); + } + break; } - break; - case TRADE_PERIOD_OVER: - key = "displayTradePeriodOver" + trade.getId(); - if (DontShowAgainLookup.showAgain(key)) { - DontShowAgainLookup.dontShowAgain(key, true); - new Popup().warning(Res.get("popup.warning.tradePeriod.ended", - trade.getShortId(), - DisplayUtils.formatDateTime(maxTradePeriodDate))) - .show(); - } - break; - } - }); + }); } }); @@ -813,9 +814,6 @@ public ObservableList getPriceFeedComboBoxItems() { return marketPricePresentation.getPriceFeedComboBoxItems(); } - // We keep daoPresentation and accountPresentation support even it is not used atm. But if we add a new feature and - // add a badge again it will be needed. - @SuppressWarnings({"unused"}) public BooleanProperty getShowDaoUpdatesNotification() { return daoPresentation.getShowDaoUpdatesNotification(); } diff --git a/desktop/src/main/java/bisq/desktop/main/PriceUtil.java b/desktop/src/main/java/bisq/desktop/main/PriceUtil.java index 7901c4689cc..f28ed99f015 100644 --- a/desktop/src/main/java/bisq/desktop/main/PriceUtil.java +++ b/desktop/src/main/java/bisq/desktop/main/PriceUtil.java @@ -26,7 +26,7 @@ import bisq.core.monetary.Altcoin; import bisq.core.monetary.Price; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.statistics.TradeStatisticsManager; @@ -139,7 +139,7 @@ public boolean hasMarketPrice(Offer offer) { } public Optional getMarketBasedPrice(Offer offer, - OfferPayload.Direction direction) { + OfferDirection direction) { if (offer.isUseMarketBasedPrice()) { return Optional.of(offer.getMarketPriceMargin()); } @@ -169,7 +169,7 @@ public Optional getMarketBasedPrice(Offer offer, public Optional calculatePercentage(Offer offer, double marketPrice, - OfferPayload.Direction direction) { + OfferDirection direction) { // If the offer did not use % price we calculate % from current market price String currencyCode = offer.getCurrencyCode(); Price price = offer.getPrice(); @@ -179,7 +179,7 @@ public Optional calculatePercentage(Offer offer, long priceAsLong = checkNotNull(price).getValue(); double scaled = MathUtils.scaleDownByPowerOf10(priceAsLong, precision); double value; - if (direction == OfferPayload.Direction.SELL) { + if (direction == OfferDirection.SELL) { if (CurrencyUtil.isFiatCurrency(currencyCode)) { if (marketPrice == 0) { return Optional.empty(); diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/altcoinaccounts/AltCoinAccountsDataModel.java b/desktop/src/main/java/bisq/desktop/main/account/content/altcoinaccounts/AltCoinAccountsDataModel.java index 04883b53aca..da91488357a 100644 --- a/desktop/src/main/java/bisq/desktop/main/account/content/altcoinaccounts/AltCoinAccountsDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/account/content/altcoinaccounts/AltCoinAccountsDataModel.java @@ -87,7 +87,7 @@ protected void activate() { private void fillAndSortPaymentAccounts() { if (user.getPaymentAccounts() != null) { paymentAccounts.setAll(user.getPaymentAccounts().stream() - .filter(paymentAccount -> paymentAccount.getPaymentMethod().isAsset()) + .filter(paymentAccount -> paymentAccount.getPaymentMethod().isBlockchain()) .collect(Collectors.toList())); paymentAccounts.sort(Comparator.comparing(PaymentAccount::getAccountName)); } @@ -127,17 +127,17 @@ public void onSaveNewAccount(PaymentAccount paymentAccount) { } public boolean onDeleteAccount(PaymentAccount paymentAccount) { - boolean isPaymentAccountUsed = openOfferManager.getObservableList().stream() - .filter(o -> o.getOffer().getMakerPaymentAccountId().equals(paymentAccount.getId())) - .findAny() - .isPresent(); - isPaymentAccountUsed = isPaymentAccountUsed || tradeManager.getObservableList().stream() - .filter(t -> t.getOffer().getMakerPaymentAccountId().equals(paymentAccount.getId()) || - paymentAccount.getId().equals(t.getTakerPaymentAccountId())) - .findAny() - .isPresent(); - if (!isPaymentAccountUsed) + boolean usedInOpenOffers = openOfferManager.getObservableList().stream() + .anyMatch(openOffer -> openOffer.getOffer().getMakerPaymentAccountId().equals(paymentAccount.getId())); + + boolean usedInTrades = tradeManager.getObservableList().stream() + .anyMatch(trade -> trade.getOffer().getMakerPaymentAccountId().equals(paymentAccount.getId()) || + paymentAccount.getId().equals(trade.getTakerPaymentAccountId())); + boolean isPaymentAccountUsed = usedInOpenOffers || usedInTrades; + + if (!isPaymentAccountUsed) { user.removePaymentAccount(paymentAccount); + } return isPaymentAccountUsed; } diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsDataModel.java b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsDataModel.java index 0a45a883847..f3c30abc368 100644 --- a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsDataModel.java @@ -88,7 +88,7 @@ protected void activate() { private void fillAndSortPaymentAccounts() { if (user.getPaymentAccounts() != null) { List list = user.getPaymentAccounts().stream() - .filter(paymentAccount -> !paymentAccount.getPaymentMethod().isAsset()) + .filter(paymentAccount -> paymentAccount.getPaymentMethod().isFiat()) .collect(Collectors.toList()); paymentAccounts.setAll(list); paymentAccounts.sort(Comparator.comparing(PaymentAccount::getAccountName)); @@ -134,13 +134,17 @@ public void onSaveNewAccount(PaymentAccount paymentAccount) { } public boolean onDeleteAccount(PaymentAccount paymentAccount) { - boolean isPaymentAccountUsed = openOfferManager.getObservableList().stream() - .anyMatch(o -> o.getOffer().getMakerPaymentAccountId().equals(paymentAccount.getId())); - isPaymentAccountUsed = isPaymentAccountUsed || tradeManager.getObservableList().stream() - .anyMatch(t -> t.getOffer().getMakerPaymentAccountId().equals(paymentAccount.getId()) || - paymentAccount.getId().equals(t.getTakerPaymentAccountId())); - if (!isPaymentAccountUsed) + boolean usedInOpenOffers = openOfferManager.getObservableList().stream() + .anyMatch(openOffer -> openOffer.getOffer().getMakerPaymentAccountId().equals(paymentAccount.getId())); + + boolean usedInTrades = tradeManager.getObservableList().stream() + .anyMatch(trade -> trade.getOffer().getMakerPaymentAccountId().equals(paymentAccount.getId()) || + paymentAccount.getId().equals(trade.getTakerPaymentAccountId())); + boolean isPaymentAccountUsed = usedInOpenOffers || usedInTrades; + + if (!isPaymentAccountUsed) { user.removePaymentAccount(paymentAccount); + } return isPaymentAccountUsed; } diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java index 3e6d3a61805..baf3dd625f5 100644 --- a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java +++ b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java @@ -42,7 +42,9 @@ import bisq.desktop.components.paymentmethods.NationalBankForm; import bisq.desktop.components.paymentmethods.NeftForm; import bisq.desktop.components.paymentmethods.NequiForm; +import bisq.desktop.components.paymentmethods.PaxumForm; import bisq.desktop.components.paymentmethods.PaymentMethodForm; +import bisq.desktop.components.paymentmethods.PayseraForm; import bisq.desktop.components.paymentmethods.PaytmForm; import bisq.desktop.components.paymentmethods.PerfectMoneyForm; import bisq.desktop.components.paymentmethods.PixForm; @@ -59,8 +61,6 @@ import bisq.desktop.components.paymentmethods.SwiftForm; import bisq.desktop.components.paymentmethods.SwishForm; import bisq.desktop.components.paymentmethods.TransferwiseForm; -import bisq.desktop.components.paymentmethods.PayseraForm; -import bisq.desktop.components.paymentmethods.PaxumForm; import bisq.desktop.components.paymentmethods.USPostalMoneyOrderForm; import bisq.desktop.components.paymentmethods.UpholdForm; import bisq.desktop.components.paymentmethods.UpiForm; @@ -84,6 +84,7 @@ import bisq.desktop.util.validation.IBANValidator; import bisq.desktop.util.validation.InteracETransferValidator; import bisq.desktop.util.validation.JapanBankTransferValidator; +import bisq.desktop.util.validation.LengthValidator; import bisq.desktop.util.validation.MoneyBeamValidator; import bisq.desktop.util.validation.PerfectMoneyValidator; import bisq.desktop.util.validation.PopmoneyValidator; @@ -94,7 +95,6 @@ import bisq.desktop.util.validation.USPostalMoneyOrderValidator; import bisq.desktop.util.validation.UpholdValidator; import bisq.desktop.util.validation.WeChatPayValidator; -import bisq.desktop.util.validation.LengthValidator; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.locale.Res; @@ -418,7 +418,7 @@ protected void addNewAccount() { paymentMethodComboBox.setVisibleRowCount(11); paymentMethodComboBox.setPrefWidth(250); List list = PaymentMethod.getPaymentMethods().stream() - .filter(paymentMethod -> !paymentMethod.isAsset()) + .filter(PaymentMethod::isFiat) .sorted() .collect(Collectors.toList()); paymentMethodComboBox.setItems(FXCollections.observableArrayList(list)); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/bonding/reputation/MyReputationView.java b/desktop/src/main/java/bisq/desktop/main/dao/bonding/reputation/MyReputationView.java index 764d073abb3..787a31cf0e8 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/bonding/reputation/MyReputationView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/bonding/reputation/MyReputationView.java @@ -38,8 +38,8 @@ import bisq.core.dao.governance.bond.reputation.MyBondedReputation; import bisq.core.locale.Res; import bisq.core.user.Preferences; -import bisq.core.util.coin.BsqFormatter; import bisq.core.util.ParsingUtils; +import bisq.core.util.coin.BsqFormatter; import bisq.core.util.validation.HexStringValidator; import bisq.core.util.validation.IntegerValidator; @@ -217,14 +217,14 @@ protected void deactivate() { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onUpdateBalances(Coin availableConfirmedBalance, + public void onUpdateBalances(Coin availableBalance, Coin availableNonBsqBalance, Coin unverifiedBalance, Coin unconfirmedChangeBalance, Coin lockedForVotingBalance, Coin lockupBondsBalance, Coin unlockingBondsBalance) { - bsqValidator.setAvailableBalance(availableConfirmedBalance); + bsqValidator.setAvailableBalance(availableBalance); } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java index 0d95572770b..e0c4ec30be5 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java @@ -176,7 +176,7 @@ protected void activate() { assetService.updateAssetStates(); updateList(); - onUpdateAvailableConfirmedBalance(bsqWalletService.getAvailableConfirmedBalance()); + onUpdateAvailableBalance(bsqWalletService.getAvailableBalance()); payFeeButton.setOnAction((event) -> { Coin listingFee = getListingFee(); @@ -235,7 +235,7 @@ protected void deactivate() { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onUpdateBalances(Coin availableConfirmedBalance, + public void onUpdateBalances(Coin availableBalance, Coin availableNonBsqBalance, Coin unverifiedBalance, Coin unconfirmedChangeBalance, @@ -243,7 +243,7 @@ public void onUpdateBalances(Coin availableConfirmedBalance, Coin lockupBondsBalance, Coin unlockingBondsBalance) { - onUpdateAvailableConfirmedBalance(availableConfirmedBalance); + onUpdateAvailableBalance(availableBalance); } @@ -278,8 +278,8 @@ private void createListeners() { }; } - private void onUpdateAvailableConfirmedBalance(Coin availableConfirmedBalance) { - bsqValidator.setAvailableBalance(availableConfirmedBalance); + private void onUpdateAvailableBalance(Coin availableBalance) { + bsqValidator.setAvailableBalance(availableBalance); updateButtonState(); } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java index d1dbc15d75d..3a0de6d79b2 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java @@ -164,7 +164,7 @@ protected void activate() { proofOfBurnService.getUpdateFlag().addListener(updateListener); bsqWalletService.addBsqBalanceListener(this); - onUpdateAvailableConfirmedBalance(bsqWalletService.getAvailableConfirmedBalance()); + onUpdateAvailableBalance(bsqWalletService.getAvailableBalance()); burnButton.setOnAction((event) -> { Coin amount = getAmountFee(); @@ -216,14 +216,14 @@ protected void deactivate() { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onUpdateBalances(Coin availableConfirmedBalance, + public void onUpdateBalances(Coin availableBalance, Coin availableNonBsqBalance, Coin unverifiedBalance, Coin unconfirmedChangeBalance, Coin lockedForVotingBalance, Coin lockupBondsBalance, Coin unlockingBondsBalance) { - onUpdateAvailableConfirmedBalance(availableConfirmedBalance); + onUpdateAvailableBalance(availableBalance); } @@ -255,8 +255,8 @@ private void createListeners() { updateListener = observable -> updateList(); } - private void onUpdateAvailableConfirmedBalance(Coin availableConfirmedBalance) { - bsqValidator.setAvailableBalance(availableConfirmedBalance); + private void onUpdateAvailableBalance(Coin availableBalance) { + bsqValidator.setAvailableBalance(availableBalance); updateButtonState(); } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/make/MakeProposalView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/make/MakeProposalView.java index 5b1a467968e..e82b6c22a53 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/make/MakeProposalView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/make/MakeProposalView.java @@ -51,8 +51,8 @@ import bisq.core.dao.state.model.governance.Role; import bisq.core.locale.Res; import bisq.core.util.FormattingUtils; -import bisq.core.util.coin.BsqFormatter; import bisq.core.util.ParsingUtils; +import bisq.core.util.coin.BsqFormatter; import bisq.core.util.coin.CoinFormatter; import bisq.asset.Asset; @@ -291,7 +291,7 @@ private void publishMyProposal(ProposalType type) { checkNotNull(proposalDisplay.bondedRoleTypeComboBox, "proposalDisplay.bondedRoleTypeComboBox must not be null"); BondedRoleType bondedRoleType = proposalDisplay.bondedRoleTypeComboBox.getSelectionModel().getSelectedItem(); long requiredBond = daoFacade.getRequiredBond(bondedRoleType); - long availableBalance = bsqWalletService.getAvailableConfirmedBalance().value; + long availableBalance = bsqWalletService.getAvailableBalance().value; if (requiredBond > availableBalance) { long missing = requiredBond - availableBalance; diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java index d8763a94c68..1a53aa4090c 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java @@ -222,7 +222,7 @@ protected void activate() { stakeInputTextField.textProperty().addListener(stakeListener); voteButton.setOnAction(e -> onVote()); - onUpdateBalances(bsqWalletService.getAvailableConfirmedBalance(), + onUpdateBalances(bsqWalletService.getAvailableBalance(), bsqWalletService.getAvailableNonBsqBalance(), bsqWalletService.getUnverifiedBalance(), bsqWalletService.getUnconfirmedChangeBalance(), @@ -272,7 +272,7 @@ protected void deactivate() { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onUpdateBalances(Coin availableConfirmedBalance, + public void onUpdateBalances(Coin availableBalance, Coin availableNonBsqBalance, Coin unverifiedBalance, Coin unconfirmedChangeBalance, @@ -281,7 +281,7 @@ public void onUpdateBalances(Coin availableConfirmedBalance, Coin unlockingBondsBalance) { Coin blindVoteFee = BlindVoteConsensus.getFee(daoStateService, daoStateService.getChainHeight()); if (isBlindVotePhaseButNotLastBlock()) { - Coin availableForVoting = availableConfirmedBalance.subtract(blindVoteFee); + Coin availableForVoting = availableBalance.subtract(blindVoteFee); if (availableForVoting.isNegative()) availableForVoting = Coin.valueOf(0); stakeInputTextField.setPromptText(Res.get("dao.proposal.myVote.stake.prompt", diff --git a/desktop/src/main/java/bisq/desktop/main/dao/wallet/BsqBalanceUtil.java b/desktop/src/main/java/bisq/desktop/main/dao/wallet/BsqBalanceUtil.java index 5c0ce109ae7..db95d762e22 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/wallet/BsqBalanceUtil.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/wallet/BsqBalanceUtil.java @@ -135,7 +135,7 @@ public void onUpdateBalances(Coin availableBalance, private void triggerUpdate() { - onUpdateBalances(bsqWalletService.getAvailableConfirmedBalance(), + onUpdateBalances(bsqWalletService.getAvailableBalance(), bsqWalletService.getAvailableNonBsqBalance(), bsqWalletService.getUnverifiedBalance(), bsqWalletService.getUnconfirmedChangeBalance(), diff --git a/desktop/src/main/java/bisq/desktop/main/dao/wallet/send/BsqSendView.java b/desktop/src/main/java/bisq/desktop/main/dao/wallet/send/BsqSendView.java index 15c52cde891..1f4f51eb335 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/wallet/send/BsqSendView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/wallet/send/BsqSendView.java @@ -242,14 +242,14 @@ protected void deactivate() { } @Override - public void onUpdateBalances(Coin availableConfirmedBalance, + public void onUpdateBalances(Coin availableBalance, Coin availableNonBsqBalance, Coin unverifiedBalance, Coin unconfirmedChangeBalance, Coin lockedForVotingBalance, Coin lockupBondsBalance, Coin unlockingBondsBalance) { - updateBsqValidator(availableConfirmedBalance); + updateBsqValidator(availableBalance); updateBtcValidator(availableNonBsqBalance); setSendBtcGroupVisibleState(availableNonBsqBalance.isPositive()); @@ -260,15 +260,15 @@ public void fillFromTradeData(Tuple2 tuple) { receiversAddressInputTextField.setText(tuple.second); } - private void updateBsqValidator(Coin availableConfirmedBalance) { - bsqValidator.setAvailableBalance(availableConfirmedBalance); + private void updateBsqValidator(Coin availableBalance) { + bsqValidator.setAvailableBalance(availableBalance); boolean isValid = bsqAddressValidator.validate(receiversAddressInputTextField.getText()).isValid && bsqValidator.validate(amountInputTextField.getText()).isValid; sendBsqButton.setDisable(!isValid); } - private void updateBtcValidator(Coin availableConfirmedBalance) { - btcValidator.setMaxValue(availableConfirmedBalance); + private void updateBtcValidator(Coin availableBalance) { + btcValidator.setMaxValue(availableBalance); boolean isValid = btcAddressValidator.validate(receiversBtcAddressInputTextField.getText()).isValid && btcValidator.validate(btcAmountInputTextField.getText()).isValid; sendBtcButton.setDisable(!isValid); @@ -309,7 +309,7 @@ private void onSendBsq() { Transaction preparedSendTx = bsqWalletService.getPreparedSendBsqTx(receiversAddressString, receiverAmount, bsqUtxoCandidates); Transaction txWithBtcFee = btcWalletService.completePreparedSendBsqTx(preparedSendTx); - Transaction signedTx = bsqWalletService.signTx(txWithBtcFee); + Transaction signedTx = bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); Coin miningFee = signedTx.getFee(); int txVsize = signedTx.getVsize(); showPublishTxPopup(receiverAmount, @@ -359,11 +359,11 @@ private void setBsqUtxoCandidates(Set candidates) { amountInputTextField.refreshValidation(); } - // We have used input selection it is the sum of our selected inputs, otherwise the availableConfirmedBalance + // We have used input selection it is the sum of our selected inputs, otherwise the availableBalance private Coin getSpendableBsqBalance() { return bsqUtxoCandidates != null ? Coin.valueOf(bsqUtxoCandidates.stream().mapToLong(e -> e.getValue().value).sum()) : - bsqWalletService.getAvailableConfirmedBalance(); + bsqWalletService.getAvailableBalance(); } private void setSendBtcGroupVisibleState(boolean visible) { @@ -438,7 +438,7 @@ private void onSendBtc() { try { Transaction preparedSendTx = bsqWalletService.getPreparedSendBtcTx(receiversAddressString, receiverAmount, btcUtxoCandidates); Transaction txWithBtcFee = btcWalletService.completePreparedSendBsqTx(preparedSendTx); - Transaction signedTx = bsqWalletService.signTx(txWithBtcFee); + Transaction signedTx = bsqWalletService.signTxAndVerifyNoDustOutputs(txWithBtcFee); Coin miningFee = signedTx.getFee(); if (miningFee.getValue() >= receiverAmount.getValue()) diff --git a/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxListItem.java index a3d2bdd7834..3e5a15c223e 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxListItem.java @@ -140,21 +140,21 @@ class BsqTxListItem extends TxConfidenceListItem { this.bsqFormatter = null; } - public TxType getTxType() { + TxType getTxType() { return daoFacade.getTx(txId) .flatMap(tx -> daoFacade.getOptionalTxType(tx.getId())) .orElse(confirmations == 0 ? TxType.UNVERIFIED : TxType.UNDEFINED_TX_TYPE); } - public boolean isWithdrawalToBTCWallet() { + boolean isWithdrawalToBTCWallet() { return withdrawalToBTCWallet; } - public String getDateAsString() { + String getDateAsString() { return DisplayUtils.formatDateTime(date); } - public String getAmountAsString() { + String getAmountAsString() { return bsqFormatter.formatCoin(amount); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxView.java b/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxView.java index 22c6f5ef92b..301e3620d82 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/wallet/tx/BsqTxView.java @@ -268,7 +268,7 @@ protected void deactivate() { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onUpdateBalances(Coin availableConfirmedBalance, + public void onUpdateBalances(Coin availableBalance, Coin availableNonBsqBalance, Coin unverifiedBalance, Coin unconfirmedChangeBalance, @@ -464,7 +464,7 @@ public void updateItem(final BsqTxListItem item, boolean empty) { } private void addInformationColumn() { - TableColumn column = new AutoTooltipTableColumn<>(Res.get("shared.information")); + TableColumn column = new AutoTooltipTableColumn<>(Res.get("shared.details")); column.setCellValueFactory(item -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setMinWidth(160); column.setCellFactory( @@ -481,7 +481,7 @@ public TableCell call(TableColumn 0 && isValidType(txType)) { @@ -523,7 +523,6 @@ public void updateItem(final BsqTxListItem item, boolean empty) { setGraphic(field); } } else { - if (item.isWithdrawalToBTCWallet()) labelString = Res.get("dao.tx.withdrawnFromWallet"); @@ -539,7 +538,6 @@ public void updateItem(final BsqTxListItem item, boolean empty) { }; } }); - tableView.getColumns().add(column); } diff --git a/desktop/src/main/java/bisq/desktop/main/debug/DebugView.java b/desktop/src/main/java/bisq/desktop/main/debug/DebugView.java index 89d0acbf090..6e5613df315 100644 --- a/desktop/src/main/java/bisq/desktop/main/debug/DebugView.java +++ b/desktop/src/main/java/bisq/desktop/main/debug/DebugView.java @@ -23,56 +23,56 @@ import bisq.core.offer.availability.tasks.ProcessOfferAvailabilityResponse; import bisq.core.offer.availability.tasks.SendOfferAvailabilityRequest; -import bisq.core.offer.placeoffer.tasks.AddToOfferBook; -import bisq.core.offer.placeoffer.tasks.CreateMakerFeeTx; -import bisq.core.offer.placeoffer.tasks.ValidateOffer; -import bisq.core.trade.protocol.tasks.ApplyFilter; -import bisq.core.trade.protocol.tasks.VerifyPeersAccountAgeWitness; -import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest; -import bisq.core.trade.protocol.tasks.buyer.BuyerProcessDepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.protocol.tasks.buyer.BuyerProcessPayoutTxPublishedMessage; -import bisq.core.trade.protocol.tasks.buyer.BuyerSendCounterCurrencyTransferStartedMessage; -import bisq.core.trade.protocol.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse; -import bisq.core.trade.protocol.tasks.buyer.BuyerSetupDepositTxListener; -import bisq.core.trade.protocol.tasks.buyer.BuyerSetupPayoutTxListener; -import bisq.core.trade.protocol.tasks.buyer.BuyerSignPayoutTx; -import bisq.core.trade.protocol.tasks.buyer.BuyerSignsDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.buyer.BuyerVerifiesFinalDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.buyer.BuyerVerifiesPreparedDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.buyer_as_maker.BuyerAsMakerCreatesAndSignsDepositTx; -import bisq.core.trade.protocol.tasks.buyer_as_maker.BuyerAsMakerSendsInputsForDepositTxResponse; -import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerCreatesDepositTxInputs; -import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerSendsDepositTxMessage; -import bisq.core.trade.protocol.tasks.buyer_as_taker.BuyerAsTakerSignsDepositTx; -import bisq.core.trade.protocol.tasks.maker.MakerCreateAndSignContract; -import bisq.core.trade.protocol.tasks.maker.MakerProcessesInputsForDepositTxRequest; -import bisq.core.trade.protocol.tasks.maker.MakerRemovesOpenOffer; -import bisq.core.trade.protocol.tasks.maker.MakerSetsLockTime; -import bisq.core.trade.protocol.tasks.maker.MakerVerifyTakerFeePayment; -import bisq.core.trade.protocol.tasks.seller.SellerBroadcastPayoutTx; -import bisq.core.trade.protocol.tasks.seller.SellerCreatesDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.seller.SellerFinalizesDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.seller.SellerProcessCounterCurrencyTransferStartedMessage; -import bisq.core.trade.protocol.tasks.seller.SellerProcessDelayedPayoutTxSignatureResponse; -import bisq.core.trade.protocol.tasks.seller.SellerPublishesDepositTx; -import bisq.core.trade.protocol.tasks.seller.SellerPublishesTradeStatistics; -import bisq.core.trade.protocol.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest; -import bisq.core.trade.protocol.tasks.seller.SellerSendPayoutTxPublishedMessage; -import bisq.core.trade.protocol.tasks.seller.SellerSendsDepositTxAndDelayedPayoutTxMessage; -import bisq.core.trade.protocol.tasks.seller.SellerSignAndFinalizePayoutTx; -import bisq.core.trade.protocol.tasks.seller.SellerSignsDelayedPayoutTx; -import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerCreatesUnsignedDepositTx; -import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerFinalizesDepositTx; -import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerProcessDepositTxMessage; -import bisq.core.trade.protocol.tasks.seller_as_maker.SellerAsMakerSendsInputsForDepositTxResponse; -import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerCreatesDepositTxInputs; -import bisq.core.trade.protocol.tasks.seller_as_taker.SellerAsTakerSignsDepositTx; -import bisq.core.trade.protocol.tasks.taker.CreateTakerFeeTx; -import bisq.core.trade.protocol.tasks.taker.TakerProcessesInputsForDepositTxResponse; -import bisq.core.trade.protocol.tasks.taker.TakerPublishFeeTx; -import bisq.core.trade.protocol.tasks.taker.TakerSendInputsForDepositTxRequest; -import bisq.core.trade.protocol.tasks.taker.TakerVerifyAndSignContract; -import bisq.core.trade.protocol.tasks.taker.TakerVerifyMakerFeePayment; +import bisq.core.offer.placeoffer.bisq_v1.tasks.AddToOfferBook; +import bisq.core.offer.placeoffer.bisq_v1.tasks.CreateMakerFeeTx; +import bisq.core.offer.placeoffer.bisq_v1.tasks.ValidateOffer; +import bisq.core.trade.protocol.bisq_v1.tasks.ApplyFilter; +import bisq.core.trade.protocol.bisq_v1.tasks.VerifyPeersAccountAgeWitness; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerProcessDelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerProcessDepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerProcessPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSendCounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSendsDelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSetupDepositTxListener; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSetupPayoutTxListener; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSignPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerSignsDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerVerifiesFinalDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer.BuyerVerifiesPreparedDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_maker.BuyerAsMakerCreatesAndSignsDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_maker.BuyerAsMakerSendsInputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_taker.BuyerAsTakerCreatesDepositTxInputs; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_taker.BuyerAsTakerSendsDepositTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.buyer_as_taker.BuyerAsTakerSignsDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerCreateAndSignContract; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerProcessesInputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerRemovesOpenOffer; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerSetsLockTime; +import bisq.core.trade.protocol.bisq_v1.tasks.maker.MakerVerifyTakerFeePayment; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerBroadcastPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerCreatesDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerFinalizesDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerProcessCounterCurrencyTransferStartedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerProcessDelayedPayoutTxSignatureResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerPublishesDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerPublishesTradeStatistics; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSendDelayedPayoutTxSignatureRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSendPayoutTxPublishedMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSendsDepositTxAndDelayedPayoutTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSignAndFinalizePayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller.SellerSignsDelayedPayoutTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker.SellerAsMakerCreatesUnsignedDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker.SellerAsMakerFinalizesDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker.SellerAsMakerProcessDepositTxMessage; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_maker.SellerAsMakerSendsInputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_taker.SellerAsTakerCreatesDepositTxInputs; +import bisq.core.trade.protocol.bisq_v1.tasks.seller_as_taker.SellerAsTakerSignsDepositTx; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.CreateTakerFeeTx; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerProcessesInputsForDepositTxResponse; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerPublishFeeTx; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerSendInputsForDepositTxRequest; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerVerifyAndSignContract; +import bisq.core.trade.protocol.bisq_v1.tasks.taker.TakerVerifyMakerFeePayment; import bisq.common.taskrunner.Task; import bisq.common.util.Tuple2; diff --git a/desktop/src/main/java/bisq/desktop/main/funds/locked/LockedListItem.java b/desktop/src/main/java/bisq/desktop/main/funds/locked/LockedListItem.java index a2d80382dc2..e7f483078dd 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/locked/LockedListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/locked/LockedListItem.java @@ -25,7 +25,7 @@ import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletService; import bisq.core.locale.Res; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.util.coin.CoinFormatter; import org.bitcoinj.core.Address; diff --git a/desktop/src/main/java/bisq/desktop/main/funds/locked/LockedView.java b/desktop/src/main/java/bisq/desktop/main/funds/locked/LockedView.java index db459d0515b..45544d09e48 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/locked/LockedView.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/locked/LockedView.java @@ -33,9 +33,9 @@ import bisq.core.locale.Res; import bisq.core.offer.OpenOffer; import bisq.core.offer.OpenOfferManager; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; import bisq.core.util.coin.CoinFormatter; diff --git a/desktop/src/main/java/bisq/desktop/main/funds/reserved/ReservedView.java b/desktop/src/main/java/bisq/desktop/main/funds/reserved/ReservedView.java index 4d5db041feb..ab42a4fd745 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/reserved/ReservedView.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/reserved/ReservedView.java @@ -33,9 +33,9 @@ import bisq.core.locale.Res; import bisq.core.offer.OpenOffer; import bisq.core.offer.OpenOfferManager; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; import bisq.core.util.coin.CoinFormatter; diff --git a/desktop/src/main/java/bisq/desktop/main/funds/transactions/DisplayedTransactions.java b/desktop/src/main/java/bisq/desktop/main/funds/transactions/DisplayedTransactions.java index 0606299547d..a94466f9cc4 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/transactions/DisplayedTransactions.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/transactions/DisplayedTransactions.java @@ -18,7 +18,7 @@ package bisq.desktop.main.funds.transactions; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.trade.Tradable; +import bisq.core.trade.model.Tradable; import org.bitcoinj.core.Transaction; diff --git a/desktop/src/main/java/bisq/desktop/main/funds/transactions/DummyTransactionAwareTradable.java b/desktop/src/main/java/bisq/desktop/main/funds/transactions/DummyTransactionAwareTradable.java index 74b24037abc..a5ee768e53f 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/transactions/DummyTransactionAwareTradable.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/transactions/DummyTransactionAwareTradable.java @@ -17,7 +17,7 @@ package bisq.desktop.main.funds.transactions; -import bisq.core.trade.Tradable; +import bisq.core.trade.model.Tradable; import org.bitcoinj.core.Transaction; diff --git a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TradableRepository.java b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TradableRepository.java index e58221dac11..fc16630cb68 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TradableRepository.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TradableRepository.java @@ -18,10 +18,10 @@ package bisq.desktop.main.funds.transactions; import bisq.core.offer.OpenOfferManager; -import bisq.core.trade.Tradable; import bisq.core.trade.TradeManager; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.FailedTradesManager; +import bisq.core.trade.model.Tradable; import javax.inject.Inject; import javax.inject.Singleton; @@ -48,7 +48,7 @@ public class TradableRepository { this.failedTradesManager = failedTradesManager; } - Set getAll() { + public Set getAll() { return ImmutableSet.builder() .addAll(openOfferManager.getObservableList()) .addAll(tradeManager.getObservableList()) diff --git a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareOpenOffer.java b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareOpenOffer.java index fd59a7dc1ae..4a4368b01a8 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareOpenOffer.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareOpenOffer.java @@ -19,7 +19,7 @@ import bisq.core.offer.Offer; import bisq.core.offer.OpenOffer; -import bisq.core.trade.Tradable; +import bisq.core.trade.model.Tradable; import org.bitcoinj.core.Transaction; @@ -36,7 +36,7 @@ public boolean isRelatedToTransaction(Transaction transaction) { String txId = transaction.getTxId().toString(); - return paymentTxId.equals(txId); + return paymentTxId != null && paymentTxId.equals(txId); } public Tradable asTradable() { diff --git a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTradable.java b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTradable.java index 199e01590f4..b00c283d96e 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTradable.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTradable.java @@ -17,7 +17,7 @@ package bisq.desktop.main.funds.transactions; -import bisq.core.trade.Tradable; +import bisq.core.trade.model.Tradable; import org.bitcoinj.core.Transaction; diff --git a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTradableFactory.java b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTradableFactory.java index 86b7699e2e1..3c699d9a0f0 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTradableFactory.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTradableFactory.java @@ -21,8 +21,8 @@ import bisq.core.offer.OpenOffer; import bisq.core.support.dispute.arbitration.ArbitrationManager; import bisq.core.support.dispute.refund.RefundManager; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.TradeModel; import bisq.common.crypto.PubKeyRing; @@ -48,17 +48,17 @@ public class TransactionAwareTradableFactory { this.pubKeyRing = pubKeyRing; } - TransactionAwareTradable create(Tradable delegate) { - if (delegate instanceof OpenOffer) { - return new TransactionAwareOpenOffer((OpenOffer) delegate); - } else if (delegate instanceof Trade) { - return new TransactionAwareTrade((Trade) delegate, + TransactionAwareTradable create(Tradable tradable) { + if (tradable instanceof OpenOffer) { + return new TransactionAwareOpenOffer((OpenOffer) tradable); + } else if (tradable instanceof TradeModel) { + return new TransactionAwareTrade((TradeModel) tradable, arbitrationManager, refundManager, btcWalletService, pubKeyRing); } else { - return new DummyTransactionAwareTradable(delegate); + return new DummyTransactionAwareTradable(tradable); } } } diff --git a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTrade.java b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTrade.java index 9d0ab09ef28..27d80adf3dd 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTrade.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionAwareTrade.java @@ -22,9 +22,10 @@ import bisq.core.support.dispute.Dispute; import bisq.core.support.dispute.arbitration.ArbitrationManager; import bisq.core.support.dispute.refund.RefundManager; -import bisq.core.trade.Contract; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.TradeModel; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.crypto.PubKeyRing; @@ -43,18 +44,18 @@ @Slf4j class TransactionAwareTrade implements TransactionAwareTradable { - private final Trade trade; + private final TradeModel tradeModel; private final ArbitrationManager arbitrationManager; private final RefundManager refundManager; private final BtcWalletService btcWalletService; private final PubKeyRing pubKeyRing; - TransactionAwareTrade(Trade trade, + TransactionAwareTrade(TradeModel tradeModel, ArbitrationManager arbitrationManager, RefundManager refundManager, BtcWalletService btcWalletService, PubKeyRing pubKeyRing) { - this.trade = trade; + this.tradeModel = tradeModel; this.arbitrationManager = arbitrationManager; this.refundManager = refundManager; this.btcWalletService = btcWalletService; @@ -66,19 +67,30 @@ public boolean isRelatedToTransaction(Transaction transaction) { Sha256Hash hash = transaction.getTxId(); String txId = hash.toString(); - boolean isTakerOfferFeeTx = txId.equals(trade.getTakerFeeTxId()); - boolean isOfferFeeTx = isOfferFeeTx(txId); - boolean isDepositTx = isDepositTx(hash); - boolean isPayoutTx = isPayoutTx(hash); - boolean isDisputedPayoutTx = isDisputedPayoutTx(txId); - boolean isDelayedPayoutTx = transaction.getLockTime() != 0 && isDelayedPayoutTx(txId); - boolean isRefundPayoutTx = isRefundPayoutTx(txId); + boolean tradeRelated = false; + if (tradeModel instanceof Trade) { + Trade trade = (Trade) tradeModel; + boolean isTakerOfferFeeTx = txId.equals(trade.getTakerFeeTxId()); + boolean isOfferFeeTx = isOfferFeeTx(txId); + boolean isDepositTx = isDepositTx(hash); + boolean isPayoutTx = isPayoutTx(hash); + boolean isDisputedPayoutTx = isDisputedPayoutTx(txId); + boolean isDelayedPayoutTx = transaction.getLockTime() != 0 && isDelayedPayoutTx(txId); + boolean isRefundPayoutTx = isRefundPayoutTx(trade, txId); + tradeRelated = isTakerOfferFeeTx || + isOfferFeeTx || + isDepositTx || + isPayoutTx || + isDisputedPayoutTx || + isDelayedPayoutTx || + isRefundPayoutTx; + } - return isTakerOfferFeeTx || isOfferFeeTx || isDepositTx || isPayoutTx || - isDisputedPayoutTx || isDelayedPayoutTx || isRefundPayoutTx; + return tradeRelated; } private boolean isPayoutTx(Sha256Hash txId) { + Trade trade = (Trade) tradeModel; return Optional.ofNullable(trade.getPayoutTx()) .map(Transaction::getTxId) .map(hash -> hash.equals(txId)) @@ -86,6 +98,7 @@ private boolean isPayoutTx(Sha256Hash txId) { } private boolean isDepositTx(Sha256Hash txId) { + Trade trade = (Trade) tradeModel; return Optional.ofNullable(trade.getDepositTx()) .map(Transaction::getTxId) .map(hash -> hash.equals(txId)) @@ -93,17 +106,17 @@ private boolean isDepositTx(Sha256Hash txId) { } private boolean isOfferFeeTx(String txId) { - return Optional.ofNullable(trade.getOffer()) + return Optional.ofNullable(tradeModel.getOffer()) .map(Offer::getOfferFeePaymentTxId) .map(paymentTxId -> paymentTxId.equals(txId)) .orElse(false); } private boolean isDisputedPayoutTx(String txId) { - String delegateId = trade.getId(); + String delegateId = tradeModel.getId(); ObservableList disputes = arbitrationManager.getDisputesAsObservableList(); - boolean isAnyDisputeRelatedToThis = arbitrationManager.getDisputedTradeIds().contains(trade.getId()); + boolean isAnyDisputeRelatedToThis = arbitrationManager.getDisputedTradeIds().contains(tradeModel.getId()); return isAnyDisputeRelatedToThis && disputes.stream() .anyMatch(dispute -> { @@ -142,8 +155,8 @@ boolean isDelayedPayoutTx(String txId) { }); } - private boolean isRefundPayoutTx(String txId) { - String tradeId = trade.getId(); + private boolean isRefundPayoutTx(Trade trade, String txId) { + String tradeId = tradeModel.getId(); ObservableList disputes = refundManager.getDisputesAsObservableList(); boolean isAnyDisputeRelatedToThis = refundManager.getDisputedTradeIds().contains(tradeId); @@ -173,6 +186,6 @@ private boolean isRefundPayoutTx(String txId) { @Override public Tradable asTradable() { - return trade; + return tradeModel; } } diff --git a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionsListItem.java b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionsListItem.java index f977c80f788..b1ef640fdce 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionsListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionsListItem.java @@ -30,8 +30,8 @@ import bisq.core.locale.Res; import bisq.core.offer.Offer; import bisq.core.offer.OpenOffer; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.util.coin.CoinFormatter; import org.bitcoinj.core.Coin; diff --git a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionsView.java b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionsView.java index 3a2d3e1ba2e..1fffc1a55c2 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionsView.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/transactions/TransactionsView.java @@ -33,8 +33,8 @@ import bisq.core.btc.wallet.BtcWalletService; import bisq.core.locale.Res; import bisq.core.offer.OpenOffer; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.network.p2p.P2PService; @@ -85,8 +85,6 @@ @FxmlView public class TransactionsView extends ActivatableView { - - @FXML TableView tableView; @FXML diff --git a/desktop/src/main/java/bisq/desktop/main/funds/withdrawal/WithdrawalView.java b/desktop/src/main/java/bisq/desktop/main/funds/withdrawal/WithdrawalView.java index 1af8806df29..35dbd66154d 100644 --- a/desktop/src/main/java/bisq/desktop/main/funds/withdrawal/WithdrawalView.java +++ b/desktop/src/main/java/bisq/desktop/main/funds/withdrawal/WithdrawalView.java @@ -40,8 +40,8 @@ import bisq.core.btc.wallet.Restrictions; import bisq.core.locale.Res; import bisq.core.provider.fee.FeeService; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.DontShowAgainLookup; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; diff --git a/desktop/src/main/java/bisq/desktop/main/market/MarketView.java b/desktop/src/main/java/bisq/desktop/main/market/MarketView.java index 4aa94894f8e..66f9d66171f 100644 --- a/desktop/src/main/java/bisq/desktop/main/market/MarketView.java +++ b/desktop/src/main/java/bisq/desktop/main/market/MarketView.java @@ -35,7 +35,7 @@ import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.trade.statistics.TradeStatistics3; import bisq.core.trade.statistics.TradeStatistics3StorageService; import bisq.core.util.FormattingUtils; @@ -211,8 +211,8 @@ private String getAllTradesWithReferralId() { private String getAllOffersWithReferralId() { List list = offerBook.getOfferBookListItems().stream() .map(OfferBookListItem::getOffer) - .filter(offer -> offer.getOfferPayload().getExtraDataMap() != null) - .filter(offer -> offer.getOfferPayload().getExtraDataMap().get(OfferPayload.REFERRAL_ID) != null) + .filter(offer -> offer.getExtraDataMap() != null) + .filter(offer -> offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID) != null) .map(offer -> { StringBuilder sb = new StringBuilder(); sb.append("Offer ID: ").append(offer.getId()).append("\n") @@ -221,7 +221,7 @@ private String getAllOffersWithReferralId() { .append("Price: ").append(FormattingUtils.formatPrice(offer.getPrice())).append("\n") .append("Amount: ").append(DisplayUtils.formatAmount(offer, formatter)).append(" BTC\n") .append("Payment method: ").append(Res.get(offer.getPaymentMethod().getId())).append("\n") - .append("ReferralID: ").append(offer.getOfferPayload().getExtraDataMap().get(OfferPayload.REFERRAL_ID)); + .append("ReferralID: ").append(offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID)); return sb.toString(); }) .collect(Collectors.toList()); diff --git a/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartView.java b/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartView.java index e17ecd20214..c15860f3852 100644 --- a/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartView.java +++ b/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartView.java @@ -37,7 +37,7 @@ import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.util.FormattingUtils; import bisq.core.util.VolumeUtil; import bisq.core.util.coin.CoinFormatter; @@ -164,8 +164,8 @@ public void initialize() { VBox.setMargin(chartPane, new Insets(0, 0, 5, 0)); - Tuple4, VBox, Button, Label> tupleBuy = getOfferTable(OfferPayload.Direction.BUY); - Tuple4, VBox, Button, Label> tupleSell = getOfferTable(OfferPayload.Direction.SELL); + Tuple4, VBox, Button, Label> tupleBuy = getOfferTable(OfferDirection.BUY); + Tuple4, VBox, Button, Label> tupleSell = getOfferTable(OfferDirection.SELL); buyOfferTableView = tupleBuy.first; sellOfferTableView = tupleSell.first; @@ -181,8 +181,8 @@ public void initialize() { VBox.setMargin(bottomHBox, new Insets(-5, 0, 0, 0)); HBox.setHgrow(tupleBuy.second, Priority.ALWAYS); HBox.setHgrow(tupleSell.second, Priority.ALWAYS); - tupleBuy.second.setUserData(OfferPayload.Direction.BUY.name()); - tupleSell.second.setUserData(OfferPayload.Direction.SELL.name()); + tupleBuy.second.setUserData(OfferDirection.BUY.name()); + tupleSell.second.setUserData(OfferDirection.SELL.name()); bottomHBox.getChildren().addAll(tupleBuy.second, tupleSell.second); root.getChildren().addAll(currencyComboBoxTuple.first, chartPane, bottomHBox); @@ -250,7 +250,7 @@ public Number fromString(String string) { }); if (CurrencyUtil.isCryptoCurrency(code)) { - if (bottomHBox.getChildren().size() == 2 && bottomHBox.getChildren().get(0).getUserData().equals(OfferPayload.Direction.BUY.name())) { + if (bottomHBox.getChildren().size() == 2 && bottomHBox.getChildren().get(0).getUserData().equals(OfferDirection.BUY.name())) { bottomHBox.getChildren().get(0).toFront(); reverseTableColumns(); } @@ -263,7 +263,7 @@ public Number fromString(String string) { priceColumnLabel.set(Res.get("shared.priceWithCur", Res.getBaseCurrencyCode())); } else { - if (bottomHBox.getChildren().size() == 2 && bottomHBox.getChildren().get(0).getUserData().equals(OfferPayload.Direction.SELL.name())) { + if (bottomHBox.getChildren().size() == 2 && bottomHBox.getChildren().get(0).getUserData().equals(OfferDirection.SELL.name())) { bottomHBox.getChildren().get(0).toFront(); reverseTableColumns(); } @@ -459,7 +459,7 @@ private List> filterRight(List, VBox, Button, Label> getOfferTable(OfferPayload.Direction direction) { + private Tuple4, VBox, Button, Label> getOfferTable(OfferDirection direction) { TableView tableView = new TableView<>(); tableView.setMinHeight(initialOfferTableViewHeight); tableView.setPrefHeight(initialOfferTableViewHeight); @@ -605,7 +605,7 @@ public void updateItem(final OfferListItem offerListItem, boolean empty) { } }); - boolean isSellOffer = direction == OfferPayload.Direction.SELL; + boolean isSellOffer = direction == OfferDirection.SELL; // trader avatar TableColumn avatarColumn = new AutoTooltipTableColumn<>(isSellOffer ? diff --git a/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModel.java b/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModel.java index 68178818580..1c9c275d789 100644 --- a/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModel.java @@ -35,7 +35,7 @@ import bisq.core.locale.TradeCurrency; import bisq.core.monetary.Price; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.provider.price.PriceFeedService; import bisq.core.user.Preferences; import bisq.core.util.VolumeUtil; @@ -120,7 +120,7 @@ class OfferBookChartViewModel extends ActivatableViewModel { list.addAll(c.getAddedSubList()); if (list.stream() .map(OfferBookListItem::getOffer) - .anyMatch(e -> e.getOfferPayload().getCurrencyCode().equals(selectedTradeCurrencyProperty.get().getCode()))) + .anyMatch(e -> e.getCurrencyCode().equals(selectedTradeCurrencyProperty.get().getCode()))) updateChartData(); } @@ -308,7 +308,7 @@ private void updateChartData() { List allBuyOffers = offerBookListItems.stream() .map(OfferBookListItem::getOffer) .filter(e -> e.getCurrencyCode().equals(selectedTradeCurrencyProperty.get().getCode()) - && e.getDirection().equals(OfferPayload.Direction.BUY)) + && e.getDirection().equals(OfferDirection.BUY)) .sorted(buyOfferSortComparator) .collect(Collectors.toList()); @@ -332,12 +332,12 @@ private void updateChartData() { maxPlacesForBuyVolume.set(formatVolume(offer, false).length()); } - buildChartAndTableEntries(allBuyOffers, OfferPayload.Direction.BUY, buyData, topBuyOfferList); + buildChartAndTableEntries(allBuyOffers, OfferDirection.BUY, buyData, topBuyOfferList); List allSellOffers = offerBookListItems.stream() .map(OfferBookListItem::getOffer) .filter(e -> e.getCurrencyCode().equals(selectedTradeCurrencyProperty.get().getCode()) - && e.getDirection().equals(OfferPayload.Direction.SELL)) + && e.getDirection().equals(OfferDirection.SELL)) .sorted(sellOfferSortComparator) .collect(Collectors.toList()); @@ -359,11 +359,11 @@ private void updateChartData() { maxPlacesForSellVolume.set(formatVolume(offer, false).length()); } - buildChartAndTableEntries(allSellOffers, OfferPayload.Direction.SELL, sellData, topSellOfferList); + buildChartAndTableEntries(allSellOffers, OfferDirection.SELL, sellData, topSellOfferList); } private void buildChartAndTableEntries(List sortedList, - OfferPayload.Direction direction, + OfferDirection direction, List> data, ObservableList offerTableList) { data.clear(); @@ -378,12 +378,12 @@ private void buildChartAndTableEntries(List sortedList, double priceAsDouble = (double) price.getValue() / LongMath.pow(10, price.smallestUnitExponent()); if (CurrencyUtil.isCryptoCurrency(getCurrencyCode())) { - if (direction.equals(OfferPayload.Direction.SELL)) + if (direction.equals(OfferDirection.SELL)) data.add(0, new XYChart.Data<>(priceAsDouble, accumulatedAmount)); else data.add(new XYChart.Data<>(priceAsDouble, accumulatedAmount)); } else { - if (direction.equals(OfferPayload.Direction.BUY)) + if (direction.equals(OfferDirection.BUY)) data.add(0, new XYChart.Data<>(priceAsDouble, accumulatedAmount)); else data.add(new XYChart.Data<>(priceAsDouble, accumulatedAmount)); diff --git a/desktop/src/main/java/bisq/desktop/main/market/spread/SpreadViewModel.java b/desktop/src/main/java/bisq/desktop/main/market/spread/SpreadViewModel.java index 545c9478365..dd86703b0a7 100644 --- a/desktop/src/main/java/bisq/desktop/main/market/spread/SpreadViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/market/spread/SpreadViewModel.java @@ -27,7 +27,7 @@ import bisq.core.monetary.Altcoin; import bisq.core.monetary.Price; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; import bisq.core.util.FormattingUtils; @@ -139,13 +139,13 @@ private void update(ObservableList offerBookListItems) { for (String key : offersByCurrencyMap.keySet()) { List offers = offersByCurrencyMap.get(key); - final boolean isFiatCurrency = (offers.size() > 0 && !offers.get(0).getPaymentMethod().isAsset()); + boolean isFiatCurrency = (offers.size() > 0 && offers.get(0).getPaymentMethod().isFiat()); List uniqueOffers = offers.stream().filter(distinctByKey(Offer::getId)).collect(Collectors.toList()); List buyOffers = uniqueOffers .stream() - .filter(e -> e.getDirection().equals(OfferPayload.Direction.BUY)) + .filter(e -> e.getDirection().equals(OfferDirection.BUY)) .sorted((o1, o2) -> { long a = o1.getPrice() != null ? o1.getPrice().getValue() : 0; long b = o2.getPrice() != null ? o2.getPrice().getValue() : 0; @@ -162,7 +162,7 @@ private void update(ObservableList offerBookListItems) { List sellOffers = uniqueOffers .stream() - .filter(e -> e.getDirection().equals(OfferPayload.Direction.SELL)) + .filter(e -> e.getDirection().equals(OfferDirection.SELL)) .sorted((o1, o2) -> { long a = o1.getPrice() != null ? o1.getPrice().getValue() : 0; long b = o2.getPrice() != null ? o2.getPrice().getValue() : 0; diff --git a/desktop/src/main/java/bisq/desktop/main/offer/BuyOfferView.java b/desktop/src/main/java/bisq/desktop/main/offer/BuyOfferView.java index 47675d68223..f473ec71461 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/BuyOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/BuyOfferView.java @@ -21,7 +21,7 @@ import bisq.desktop.common.view.FxmlView; import bisq.desktop.common.view.ViewLoader; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; import bisq.core.user.Preferences; import bisq.core.user.User; @@ -46,6 +46,6 @@ public BuyOfferView(ViewLoader viewLoader, arbitratorManager, user, p2PService, - OfferPayload.Direction.BUY); + OfferDirection.BUY); } } diff --git a/desktop/src/main/java/bisq/desktop/main/offer/OfferView.java b/desktop/src/main/java/bisq/desktop/main/offer/OfferView.java index e071b6967b8..dc9238e4573 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/OfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/OfferView.java @@ -22,9 +22,9 @@ import bisq.desktop.common.view.View; import bisq.desktop.common.view.ViewLoader; import bisq.desktop.main.MainView; -import bisq.desktop.main.offer.createoffer.CreateOfferView; +import bisq.desktop.main.offer.bisq_v1.createoffer.CreateOfferView; +import bisq.desktop.main.offer.bisq_v1.takeoffer.TakeOfferView; import bisq.desktop.main.offer.offerbook.OfferBookView; -import bisq.desktop.main.offer.takeoffer.TakeOfferView; import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.util.GUIUtil; @@ -34,7 +34,8 @@ import bisq.core.locale.Res; import bisq.core.locale.TradeCurrency; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; +import bisq.core.payment.payload.PaymentMethod; import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; import bisq.core.user.Preferences; import bisq.core.user.User; @@ -66,7 +67,7 @@ public abstract class OfferView extends ActivatableView { private final Preferences preferences; private final User user; private final P2PService p2PService; - private final OfferPayload.Direction direction; + private final OfferDirection direction; private final ArbitratorManager arbitratorManager; private Offer offer; @@ -75,6 +76,7 @@ public abstract class OfferView extends ActivatableView { private Navigation.Listener navigationListener; private ChangeListener tabChangeListener; private ListChangeListener tabListChangeListener; + private OfferView.OfferActionHandler offerActionHandler; protected OfferView(ViewLoader viewLoader, Navigation navigation, @@ -82,7 +84,7 @@ protected OfferView(ViewLoader viewLoader, ArbitratorManager arbitratorManager, User user, P2PService p2PService, - OfferPayload.Direction direction) { + OfferDirection direction) { this.viewLoader = viewLoader; this.navigation = navigation; this.preferences = preferences; @@ -128,11 +130,34 @@ else if (removedTabs.get(0).getContent().equals(takeOfferPane)) onTakeOfferViewRemoved(); } }; + + + offerActionHandler = new OfferActionHandler() { + @Override + public void onCreateOffer(TradeCurrency tradeCurrency, PaymentMethod paymentMethod) { + if (createOfferViewOpen) { + root.getTabs().remove(createOfferTab); + } + if (canCreateOrTakeOffer(tradeCurrency)) { + openCreateOffer(tradeCurrency, paymentMethod); + } + } + + @Override + public void onTakeOffer(Offer offer) { + if (takeOfferViewOpen) { + root.getTabs().remove(takeOfferTab); + } + if (canCreateOrTakeOffer(CurrencyUtil.getTradeCurrency(offer.getCurrencyCode()).get())) { + openTakeOffer(offer); + } + } + }; } @Override protected void activate() { - Optional tradeCurrencyOptional = (this.direction == OfferPayload.Direction.SELL) ? + Optional tradeCurrencyOptional = (this.direction == OfferDirection.SELL) ? CurrencyUtil.getTradeCurrency(preferences.getSellScreenCurrencyCode()) : CurrencyUtil.getTradeCurrency(preferences.getBuyScreenCurrencyCode()); tradeCurrency = tradeCurrencyOptional.orElseGet(GlobalSettings::getDefaultTradeCurrency); @@ -150,7 +175,7 @@ protected void deactivate() { root.getTabs().removeListener(tabListChangeListener); } - private String getCreateOfferTabName() { + private String getCreateOfferTabName(Class viewClass) { return Res.get("offerbook.createOffer").toUpperCase(); } @@ -162,7 +187,7 @@ private void loadView(Class viewClass) { TabPane tabPane = root; tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS); View view; - boolean isBuy = direction == OfferPayload.Direction.BUY; + boolean isBuy = direction == OfferDirection.BUY; if (viewClass == OfferBookView.class && offerBookView == null) { view = viewLoader.load(viewClass); @@ -173,28 +198,6 @@ private void loadView(Class viewClass) { tabPane.getTabs().add(offerBookTab); offerBookView = (OfferBookView) view; offerBookView.onTabSelected(true); - - OfferActionHandler offerActionHandler = new OfferActionHandler() { - @Override - public void onCreateOffer(TradeCurrency tradeCurrency) { - if (createOfferViewOpen) { - tabPane.getTabs().remove(createOfferTab); - } - if (canCreateOrTakeOffer()) { - openCreateOffer(tradeCurrency); - } - } - - @Override - public void onTakeOffer(Offer offer) { - if (takeOfferViewOpen) { - tabPane.getTabs().remove(takeOfferTab); - } - if (canCreateOrTakeOffer()) { - openTakeOffer(offer); - } - } - }; offerBookView.setOfferActionHandler(offerActionHandler); offerBookView.setDirection(direction); } else if (viewClass == CreateOfferView.class && createOfferView == null) { @@ -202,9 +205,9 @@ public void onTakeOffer(Offer offer) { // CreateOffer and TakeOffer must not be cached by ViewLoader as we cannot use a view multiple times // in different graphs createOfferView = (CreateOfferView) view; - createOfferView.initWithData(direction, tradeCurrency); + createOfferView.initWithData(direction, tradeCurrency, offerActionHandler); createOfferPane = createOfferView.getRoot(); - createOfferTab = new Tab(getCreateOfferTabName()); + createOfferTab = new Tab(getCreateOfferTabName(viewClass)); createOfferTab.setClosable(true); // close handler from close on create offer action createOfferView.setCloseHandler(() -> tabPane.getTabs().remove(createOfferTab)); @@ -228,9 +231,9 @@ public void onTakeOffer(Offer offer) { } } - protected boolean canCreateOrTakeOffer() { + protected boolean canCreateOrTakeOffer(TradeCurrency tradeCurrency) { return GUIUtil.isBootstrappedOrShowPopup(p2PService) && - GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation); + GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation, tradeCurrency); } private void showNoArbitratorForUserLocaleWarning() { @@ -246,20 +249,20 @@ private String getArbitrationLanguages() { return arbitratorManager.getObservableMap().values().stream() .flatMap(arbitrator -> arbitrator.getLanguageCodes().stream()) .distinct() - .map(languageCode -> LanguageUtil.getDisplayName(languageCode)) + .map(LanguageUtil::getDisplayName) .collect(Collectors.joining(", ")); } private void openTakeOffer(Offer offer) { - OfferView.this.takeOfferViewOpen = true; - OfferView.this.offer = offer; - OfferView.this.navigation.navigateTo(MainView.class, OfferView.this.getClass(), TakeOfferView.class); + this.takeOfferViewOpen = true; + this.offer = offer; + this.navigation.navigateTo(MainView.class, this.getClass(), TakeOfferView.class); } - private void openCreateOffer(TradeCurrency tradeCurrency) { - OfferView.this.createOfferViewOpen = true; - OfferView.this.tradeCurrency = tradeCurrency; - OfferView.this.navigation.navigateTo(MainView.class, OfferView.this.getClass(), CreateOfferView.class); + private void openCreateOffer(TradeCurrency tradeCurrency, PaymentMethod paymentMethod) { + this.createOfferViewOpen = true; + this.tradeCurrency = tradeCurrency; + this.navigation.navigateTo(MainView.class, this.getClass(), CreateOfferView.class); } private void onCreateOfferViewRemoved() { @@ -285,7 +288,7 @@ private void onTakeOfferViewRemoved() { } public interface OfferActionHandler { - void onCreateOffer(TradeCurrency tradeCurrency); + void onCreateOffer(TradeCurrency tradeCurrency, PaymentMethod paymentMethod); void onTakeOffer(Offer offer); } diff --git a/desktop/src/main/java/bisq/desktop/main/offer/SellOfferView.java b/desktop/src/main/java/bisq/desktop/main/offer/SellOfferView.java index d88fb8c9dd9..bbd16178149 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/SellOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/SellOfferView.java @@ -21,7 +21,7 @@ import bisq.desktop.common.view.FxmlView; import bisq.desktop.common.view.ViewLoader; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; import bisq.core.user.Preferences; import bisq.core.user.User; @@ -46,6 +46,6 @@ public SellOfferView(ViewLoader viewLoader, arbitratorManager, user, p2PService, - OfferPayload.Direction.SELL); + OfferDirection.SELL); } } diff --git a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/MutableOfferDataModel.java similarity index 96% rename from desktop/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/MutableOfferDataModel.java index 3f2a733168b..407d889b743 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/MutableOfferDataModel.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer; +package bisq.desktop.main.offer.bisq_v1; import bisq.desktop.Navigation; import bisq.desktop.util.DisplayUtils; @@ -33,15 +33,15 @@ import bisq.core.locale.TradeCurrency; import bisq.core.monetary.Price; import bisq.core.monetary.Volume; -import bisq.core.offer.CreateOfferService; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; import bisq.core.offer.OpenOfferManager; +import bisq.core.offer.bisq_v1.CreateOfferService; import bisq.core.payment.PaymentAccount; import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.PriceFeedService; -import bisq.core.trade.handlers.TransactionResultHandler; +import bisq.core.trade.bisq_v1.TransactionResultHandler; import bisq.core.trade.statistics.TradeStatistics3; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.core.user.Preferences; @@ -60,8 +60,6 @@ import org.bitcoinj.core.Coin; import org.bitcoinj.core.Transaction; -import com.google.inject.Inject; - import javax.inject.Named; import javafx.beans.property.BooleanProperty; @@ -84,7 +82,9 @@ import java.util.Comparator; import java.util.Date; import java.util.HashSet; +import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -113,7 +113,7 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs private final BalanceListener btcBalanceListener; private final SetChangeListener paymentAccountsChangeListener; - protected OfferPayload.Direction direction; + protected OfferDirection direction; protected TradeCurrency tradeCurrency; protected final StringProperty tradeCurrencyCode = new SimpleStringProperty(); protected final BooleanProperty useMarketBasedPrice = new SimpleBooleanProperty(); @@ -149,7 +149,6 @@ public abstract class MutableOfferDataModel extends OfferDataModel implements Bs // Constructor, lifecycle /////////////////////////////////////////////////////////////////////////////////////////// - @Inject public MutableOfferDataModel(CreateOfferService createOfferService, OpenOfferManager openOfferManager, OfferUtil offerUtil, @@ -179,7 +178,7 @@ public MutableOfferDataModel(CreateOfferService createOfferService, this.navigation = navigation; this.tradeStatisticsManager = tradeStatisticsManager; - offerId = createOfferService.getRandomOfferId(); + offerId = OfferUtil.getRandomOfferId(); shortOfferId = Utilities.getShortId(offerId); addressEntry = btcWalletService.getOrCreateAddressEntry(offerId, AddressEntry.Context.OFFER_FUNDING); @@ -229,7 +228,7 @@ private void removeListeners() { /////////////////////////////////////////////////////////////////////////////////////////// // called before activate() - public boolean initWithData(OfferPayload.Direction direction, TradeCurrency tradeCurrency) { + public boolean initWithData(OfferDirection direction, TradeCurrency tradeCurrency) { this.direction = direction; this.tradeCurrency = tradeCurrency; @@ -352,8 +351,8 @@ private void setSuggestedSecurityDeposit(PaymentAccount paymentAccount) { return; } // Get average historic prices over for the prior trade period equaling the lock time - var blocksRange = Restrictions.getLockTime(paymentAccount.getPaymentMethod().isAsset()); - var startDate = new Date(System.currentTimeMillis() - blocksRange * 10 * 60000); + var blocksRange = Restrictions.getLockTime(paymentAccount.getPaymentMethod().isBlockchain()); + var startDate = new Date(System.currentTimeMillis() - blocksRange * 10L * 60000); var sortedRangeData = tradeStatisticsManager.getObservableTradeStatisticsSet().stream() .filter(e -> e.getCurrency().equals(getTradeCurrency().getCode())) .filter(e -> e.getDate().compareTo(startDate) >= 0) @@ -423,7 +422,7 @@ void onCurrencySelected(TradeCurrency tradeCurrency) { } @Override - public void onUpdateBalances(Coin availableConfirmedBalance, + public void onUpdateBalances(Coin availableBalance, Coin availableNonBsqBalance, Coin unverifiedBalance, Coin unconfirmedChangeBalance, @@ -471,16 +470,16 @@ boolean isMinAmountLessOrEqualAmount() { return true; } - OfferPayload.Direction getDirection() { + OfferDirection getDirection() { return direction; } boolean isSellOffer() { - return direction == OfferPayload.Direction.SELL; + return direction == OfferDirection.SELL; } boolean isBuyOffer() { - return direction == OfferPayload.Direction.BUY; + return direction == OfferDirection.BUY; } AddressEntry getAddressEntry() { @@ -627,11 +626,15 @@ void swapTradeToSavings() { } private void fillPaymentAccounts() { - if (user.getPaymentAccounts() != null) - paymentAccounts.setAll(new HashSet<>(user.getPaymentAccounts())); + paymentAccounts.setAll(new HashSet<>(getUserPaymentAccounts())); paymentAccounts.sort(comparing(PaymentAccount::getAccountName)); } + private Set getUserPaymentAccounts() { + return Objects.requireNonNull(user.getPaymentAccounts()).stream() + .collect(Collectors.toSet()); + } + protected void setAmount(Coin amount) { this.amount.set(amount); } @@ -769,7 +772,7 @@ boolean isBsqForFeeAvailable() { boolean canPlaceOffer() { return GUIUtil.isBootstrappedOrShowPopup(p2PService) && - GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation); + GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation, tradeCurrency); } public boolean isMinBuyerSecurityDeposit() { diff --git a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferView.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/MutableOfferView.java similarity index 98% rename from desktop/src/main/java/bisq/desktop/main/offer/MutableOfferView.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/MutableOfferView.java index f0f42d5e5d1..1e803c1da61 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/MutableOfferView.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer; +package bisq.desktop.main.offer.bisq_v1; import bisq.desktop.Navigation; import bisq.desktop.common.view.ActivatableViewAndModel; @@ -35,6 +35,7 @@ import bisq.desktop.main.dao.DaoView; import bisq.desktop.main.dao.wallet.BsqWalletView; import bisq.desktop.main.dao.wallet.receive.BsqReceiveView; +import bisq.desktop.main.offer.OfferView; import bisq.desktop.main.overlays.notifications.Notification; import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.main.overlays.windows.OfferDetailsWindow; @@ -48,7 +49,7 @@ import bisq.core.locale.Res; import bisq.core.locale.TradeCurrency; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.payment.FasterPaymentsAccount; import bisq.core.payment.PaymentAccount; import bisq.core.payment.payload.PaymentMethod; @@ -116,6 +117,8 @@ import java.util.List; import java.util.concurrent.TimeUnit; +import lombok.Setter; + import org.jetbrains.annotations.NotNull; import static bisq.core.payment.payload.PaymentMethod.HAL_CASH_ID; @@ -170,13 +173,16 @@ public abstract class MutableOfferView> exten protected int gridRow = 0; private final List editOfferElements = new ArrayList<>(); - private HashMap paymentAccountWarningDisplayed = new HashMap<>(); + private final HashMap paymentAccountWarningDisplayed = new HashMap<>(); private boolean clearXchangeWarningDisplayed, fasterPaymentsWarningDisplayed, isActivated; private InfoInputTextField marketBasedPriceInfoInputTextField, volumeInfoInputTextField, buyerSecurityDepositInfoInputTextField, triggerPriceInfoInputTextField; private AutoTooltipSlideToggleButton tradeFeeInBtcToggle, tradeFeeInBsqToggle; private Text xIcon, fakeXIcon; + @Setter + private OfferView.OfferActionHandler offerActionHandler; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, lifecycle @@ -290,16 +296,20 @@ protected void deactivate() { /////////////////////////////////////////////////////////////////////////////////////////// public void onTabSelected(boolean isSelected) { - if (isSelected && !model.getDataModel().isTabSelected) + if (isSelected && !model.getDataModel().isTabSelected) { doActivate(); - else + } else { deactivate(); + } isActivated = isSelected; model.getDataModel().onTabSelected(isSelected); } - public void initWithData(OfferPayload.Direction direction, TradeCurrency tradeCurrency) { + public void initWithData(OfferDirection direction, TradeCurrency tradeCurrency, + OfferView.OfferActionHandler offerActionHandler) { + this.offerActionHandler = offerActionHandler; + boolean result = model.initWithData(direction, tradeCurrency); if (!result) { @@ -312,7 +322,7 @@ public void initWithData(OfferPayload.Direction direction, TradeCurrency tradeCu }).show(); } - if (direction == OfferPayload.Direction.BUY) { + if (direction == OfferDirection.BUY) { placeOfferButton.setId("buy-button-big"); placeOfferButton.updateText(Res.get("createOffer.placeOfferButton", Res.get("shared.buy"))); } else { @@ -348,7 +358,7 @@ private void onPlaceOffer() { Offer offer = model.createAndGetOffer(); if (!DevEnv.isDevMode()) { offerDetailsWindow.onPlaceOffer(() -> - model.onPlaceOffer(offer, offerDetailsWindow::hide)) + model.onPlaceOffer(offer, offerDetailsWindow::hide)) .show(offer); } else { balanceSubscription.unsubscribe(); @@ -1524,8 +1534,8 @@ private GridPane createInfoPopover() { addPayInfoEntry(infoGridPane, i++, Res.getWithCol("shared.tradeAmount"), model.tradeAmount.get()); addPayInfoEntry(infoGridPane, i++, Res.getWithCol("shared.yourSecurityDeposit"), model.getSecurityDepositInfo()); - addPayInfoEntry(infoGridPane, i++, Res.get("createOffer.fundsBox.offerFee"), model.getTradeFee()); - addPayInfoEntry(infoGridPane, i++, Res.get("createOffer.fundsBox.networkFee"), model.getTxFee()); + addPayInfoEntry(infoGridPane, i++, Res.getWithCol("createOffer.fundsBox.offerFee"), model.getTradeFee()); + addPayInfoEntry(infoGridPane, i++, Res.getWithCol("createOffer.fundsBox.networkFee"), model.getTxFee()); Separator separator = new Separator(); separator.setOrientation(Orientation.HORIZONTAL); separator.getStyleClass().add("offer-separator"); diff --git a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/MutableOfferViewModel.java similarity index 97% rename from desktop/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/MutableOfferViewModel.java index 4e7ea068e3b..5c37f033ffd 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/MutableOfferViewModel.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer; +package bisq.desktop.main.offer.bisq_v1; import bisq.desktop.Navigation; import bisq.desktop.common.model.ActivatableWithDataModel; @@ -45,7 +45,7 @@ import bisq.core.monetary.Price; import bisq.core.monetary.Volume; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferRestrictions; import bisq.core.offer.OfferUtil; import bisq.core.payment.PaymentAccount; @@ -70,7 +70,6 @@ import org.bitcoinj.core.Coin; import org.bitcoinj.utils.Fiat; -import javax.inject.Inject; import javax.inject.Named; import javafx.scene.control.ComboBox; @@ -194,7 +193,6 @@ public abstract class MutableOfferViewModel ext // Constructor, lifecycle /////////////////////////////////////////////////////////////////////////////////////////// - @Inject public MutableOfferViewModel(M dataModel, FiatVolumeValidator fiatVolumeValidator, FiatPriceValidator fiatPriceValidator, @@ -268,7 +266,7 @@ protected void deactivate() { } private void addBindings() { - if (dataModel.getDirection() == OfferPayload.Direction.BUY) { + if (dataModel.getDirection() == OfferDirection.BUY) { volumeDescriptionLabel.bind(createStringBinding( () -> Res.get("createOffer.amountPriceBox.buy.volumeDescription", dataModel.getTradeCurrencyCode().get()), dataModel.getTradeCurrencyCode())); @@ -337,9 +335,9 @@ private void createListeners() { try { double priceAsDouble = ParsingUtils.parseNumberStringToDouble(price.get()); double relation = priceAsDouble / marketPriceAsDouble; - final OfferPayload.Direction compareDirection = CurrencyUtil.isCryptoCurrency(currencyCode) ? - OfferPayload.Direction.SELL : - OfferPayload.Direction.BUY; + final OfferDirection compareDirection = CurrencyUtil.isCryptoCurrency(currencyCode) ? + OfferDirection.SELL : + OfferDirection.BUY; double percentage = dataModel.getDirection() == compareDirection ? 1 - relation : relation - 1; percentage = MathUtils.roundDouble(percentage, 4); dataModel.setMarketPriceMargin(percentage); @@ -373,9 +371,9 @@ private void createListeners() { percentage = MathUtils.roundDouble(percentage, 4); double marketPriceAsDouble = marketPrice.getPrice(); final boolean isCryptoCurrency = CurrencyUtil.isCryptoCurrency(currencyCode); - final OfferPayload.Direction compareDirection = isCryptoCurrency ? - OfferPayload.Direction.SELL : - OfferPayload.Direction.BUY; + final OfferDirection compareDirection = isCryptoCurrency ? + OfferDirection.SELL : + OfferDirection.BUY; double factor = dataModel.getDirection() == compareDirection ? 1 - percentage : 1 + percentage; @@ -512,11 +510,11 @@ private void applyMakerFee() { isTradeFeeVisible.setValue(true); tradeFee.set(getFormatterForMakerFee().formatCoin(makerFeeAsCoin)); - tradeFeeInBtcWithFiat.set(FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + tradeFeeInBtcWithFiat.set(OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.getMakerFeeInBtc(), true, btcFormatter)); - tradeFeeInBsqWithFiat.set(FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + tradeFeeInBsqWithFiat.set(OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.getMakerFeeInBsq(), false, bsqFormatter)); @@ -583,14 +581,14 @@ private void removeListeners() { // API /////////////////////////////////////////////////////////////////////////////////////////// - boolean initWithData(OfferPayload.Direction direction, TradeCurrency tradeCurrency) { + boolean initWithData(OfferDirection direction, TradeCurrency tradeCurrency) { boolean result = dataModel.initWithData(direction, tradeCurrency); if (dataModel.paymentAccount != null) btcValidator.setMaxValue(dataModel.paymentAccount.getPaymentMethod().getMaxTradeLimitAsCoin(dataModel.getTradeCurrencyCode().get())); btcValidator.setMaxTradeLimit(Coin.valueOf(dataModel.getMaxTradeLimit())); btcValidator.setMinValue(Restrictions.getMinTradeAmount()); - final boolean isBuy = dataModel.getDirection() == OfferPayload.Direction.BUY; + final boolean isBuy = dataModel.getDirection() == OfferDirection.BUY; amountDescription = Res.get("createOffer.amountPriceBox.amountDescription", isBuy ? Res.get("shared.buy") : Res.get("shared.sell")); @@ -983,7 +981,7 @@ CoinFormatter getBtcFormatter() { } public boolean isSellOffer() { - return dataModel.getDirection() == OfferPayload.Direction.SELL; + return dataModel.getDirection() == OfferDirection.SELL; } public TradeCurrency getTradeCurrency() { @@ -991,7 +989,7 @@ public TradeCurrency getTradeCurrency() { } public String getTradeAmount() { - return FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.getAmount().get(), true, btcFormatter); @@ -1008,7 +1006,7 @@ public String getSecurityDepositPopOverLabel(String depositInBTC) { } public String getSecurityDepositInfo() { - return FeeUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, dataModel.getSecurityDeposit(), dataModel.getAmount().get(), true, @@ -1024,7 +1022,7 @@ public String getSecurityDepositWithCode() { public String getTradeFee() { if (dataModel.isCurrencyForMakerFeeBtc()) { - return FeeUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, dataModel.getMakerFeeInBtc(), dataModel.getAmount().get(), true, @@ -1033,7 +1031,7 @@ public String getTradeFee() { } else { // For BSQ we use the fiat equivalent only. Calculating the % value would require to // calculate the BTC value of the BSQ fee and use that... - return FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.getMakerFeeInBsq(), false, bsqFormatter); @@ -1050,12 +1048,12 @@ public String getMakerFeePercentage() { public String getTotalToPayInfo() { if (dataModel.isCurrencyForMakerFeeBtc()) { - return FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.totalToPayAsCoin.get(), true, btcFormatter); } else { - return FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.totalToPayAsCoin.get(), true, btcFormatter) + " + " + getTradeFee(); @@ -1075,7 +1073,7 @@ public String getFundsStructure() { } public String getTxFee() { - return FeeUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, dataModel.getTxFee(), dataModel.getAmount().get(), true, @@ -1235,7 +1233,7 @@ private void validateAndSetBuyerSecurityDepositToModel() { private void maybeShowMakeOfferToUnsignedAccountWarning() { if (!makeOfferFromUnsignedAccountWarningDisplayed && - dataModel.getDirection() == OfferPayload.Direction.SELL && + dataModel.getDirection() == OfferDirection.SELL && PaymentMethod.hasChargebackRisk(dataModel.getPaymentAccount().getPaymentMethod(), dataModel.getTradeCurrency().getCode())) { Coin checkAmount = dataModel.getMinAmount().get() == null ? dataModel.getAmount().get() : dataModel.getMinAmount().get(); if (checkAmount != null && !checkAmount.isGreaterThan(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT)) { diff --git a/desktop/src/main/java/bisq/desktop/main/offer/OfferDataModel.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/OfferDataModel.java similarity index 98% rename from desktop/src/main/java/bisq/desktop/main/offer/OfferDataModel.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/OfferDataModel.java index c502050751e..15320c7760b 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/OfferDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/OfferDataModel.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer; +package bisq.desktop.main.offer.bisq_v1; import bisq.desktop.common.model.ActivatableDataModel; diff --git a/desktop/src/main/java/bisq/desktop/main/offer/FeeUtil.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/OfferViewModelUtil.java similarity index 92% rename from desktop/src/main/java/bisq/desktop/main/offer/FeeUtil.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/OfferViewModelUtil.java index 92698c91baa..6ce76791dd9 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/FeeUtil.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/OfferViewModelUtil.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer; +package bisq.desktop.main.offer.bisq_v1; import bisq.desktop.util.DisplayUtils; import bisq.desktop.util.GUIUtil; @@ -32,7 +32,8 @@ import java.util.Optional; -public class FeeUtil { +// Shared utils for ViewModels +public class OfferViewModelUtil { public static String getTradeFeeWithFiatEquivalent(OfferUtil offerUtil, Coin tradeFee, boolean isCurrencyForMakerFeeBtc, @@ -66,15 +67,15 @@ public static String getTradeFeeWithFiatEquivalentAndPercentage(OfferUtil offerU " " + Res.get("guiUtil.ofTradeAmount"); } return offerUtil.getFeeInUserFiatCurrency(tradeFee, - isCurrencyForMakerFeeBtc, - formatter) + isCurrencyForMakerFeeBtc, + formatter) .map(VolumeUtil::formatAverageVolumeWithCode) .map(feeInFiat -> Res.get("feeOptionWindow.btcFeeWithFiatAndPercentage", feeAsBtc, feeInFiat, percentage)) .orElseGet(() -> Res.get("feeOptionWindow.btcFeeWithPercentage", feeAsBtc, percentage)); } else { // For BSQ we use the fiat equivalent only. Calculating the % value would be more effort. // We could calculate the BTC value if the BSQ fee and use that... - return FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, tradeFee, false, formatter); diff --git a/desktop/src/main/java/bisq/desktop/main/offer/OfferViewUtil.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/OfferViewUtil.java similarity index 89% rename from desktop/src/main/java/bisq/desktop/main/offer/OfferViewUtil.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/OfferViewUtil.java index dfd6a375803..f5aff0937d7 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/OfferViewUtil.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/OfferViewUtil.java @@ -15,15 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer; +package bisq.desktop.main.offer.bisq_v1; import javafx.scene.control.Label; import javafx.geometry.Insets; -/** - * Reusable methods for CreateOfferView, TakeOfferView or other related views - */ +// Shared utils for Views public class OfferViewUtil { public static Label createPopOverLabel(String text) { final Label label = new Label(text); diff --git a/desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferDataModel.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferDataModel.java similarity index 94% rename from desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferDataModel.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferDataModel.java index 0bec3dcfd8a..0b7e4423c81 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferDataModel.java @@ -19,17 +19,17 @@ see . */ -package bisq.desktop.main.offer.createoffer; +package bisq.desktop.main.offer.bisq_v1.createoffer; import bisq.desktop.Navigation; -import bisq.desktop.main.offer.MutableOfferDataModel; +import bisq.desktop.main.offer.bisq_v1.MutableOfferDataModel; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.offer.CreateOfferService; import bisq.core.offer.OfferUtil; import bisq.core.offer.OpenOfferManager; +import bisq.core.offer.bisq_v1.CreateOfferService; import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.statistics.TradeStatisticsManager; diff --git a/desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferView.fxml b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferView.fxml similarity index 96% rename from desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferView.fxml rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferView.fxml index 4d419ff1f9b..679aefc9887 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferView.fxml +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferView.fxml @@ -18,6 +18,6 @@ --> - diff --git a/desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferView.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferView.java similarity index 93% rename from desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferView.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferView.java index 1f326ebc714..0ad84c2c006 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferView.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer.createoffer; +package bisq.desktop.main.offer.bisq_v1.createoffer; import bisq.desktop.Navigation; import bisq.desktop.common.view.FxmlView; -import bisq.desktop.main.offer.MutableOfferView; +import bisq.desktop.main.offer.bisq_v1.MutableOfferView; import bisq.desktop.main.overlays.windows.OfferDetailsWindow; import bisq.core.user.Preferences; @@ -33,7 +33,6 @@ @FxmlView public class CreateOfferView extends MutableOfferView { - @Inject private CreateOfferView(CreateOfferViewModel model, Navigation navigation, diff --git a/desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModel.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferViewModel.java similarity index 96% rename from desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModel.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferViewModel.java index 62fef3ac7ee..c3700608f34 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferViewModel.java @@ -15,11 +15,11 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer.createoffer; +package bisq.desktop.main.offer.bisq_v1.createoffer; import bisq.desktop.Navigation; import bisq.desktop.common.model.ViewModel; -import bisq.desktop.main.offer.MutableOfferViewModel; +import bisq.desktop.main.offer.bisq_v1.MutableOfferViewModel; import bisq.desktop.util.validation.AltcoinValidator; import bisq.desktop.util.validation.BsqValidator; import bisq.desktop.util.validation.BtcValidator; diff --git a/desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferDataModel.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferDataModel.java similarity index 97% rename from desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferDataModel.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferDataModel.java index 1e49d56937c..c5914b0869b 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferDataModel.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer.takeoffer; +package bisq.desktop.main.offer.bisq_v1.takeoffer; import bisq.desktop.Navigation; -import bisq.desktop.main.offer.OfferDataModel; +import bisq.desktop.main.offer.bisq_v1.OfferDataModel; import bisq.desktop.main.offer.offerbook.OfferBook; import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.util.GUIUtil; @@ -36,8 +36,9 @@ import bisq.core.monetary.Price; import bisq.core.monetary.Volume; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.payment.PaymentAccount; import bisq.core.payment.PaymentAccountUtil; import bisq.core.payment.payload.PaymentMethod; @@ -45,7 +46,8 @@ import bisq.core.provider.mempool.MempoolService; import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.TradeManager; -import bisq.core.trade.handlers.TradeResultHandler; +import bisq.core.trade.bisq_v1.TradeResultHandler; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.core.user.User; import bisq.core.util.VolumeUtil; @@ -217,7 +219,7 @@ void initWithData(Offer offer) { this.amount.set(Coin.valueOf(Math.min(offer.getAmount().value, getMaxTradeLimit()))); - securityDeposit = offer.getDirection() == OfferPayload.Direction.SELL ? + securityDeposit = offer.getDirection() == OfferDirection.SELL ? getBuyerSecurityDeposit() : getSellerSecurityDeposit(); @@ -255,7 +257,8 @@ void initWithData(Offer offer) { }); mempoolStatus.setValue(-1); - mempoolService.validateOfferMakerTx(offer.getOfferPayload(), (txValidator -> { + OfferPayload offerPayload = offer.getOfferPayload().orElseThrow(); + mempoolService.validateOfferMakerTx(offerPayload, (txValidator -> { mempoolStatus.setValue(txValidator.isFail() ? 0 : 1); if (txValidator.isFail()) { mempoolStatusText = txValidator.toString(); @@ -312,7 +315,7 @@ public void onClose(boolean removeOffer) { // errorMessageHandler is used only in the check availability phase. As soon we have a trade we write the error msg in the trade object as we want to // have it persisted as well. - void onTakeOffer(TradeResultHandler tradeResultHandler) { + void onTakeOffer(TradeResultHandler tradeResultHandler) { checkNotNull(txFeeFromFeeService, "txFeeFromFeeService must not be null"); checkNotNull(getTakerFee(), "takerFee must not be null"); @@ -421,7 +424,7 @@ void fundFromSavingsWallet() { // Getters /////////////////////////////////////////////////////////////////////////////////////////// - OfferPayload.Direction getDirection() { + OfferDirection getDirection() { return offer.getDirection(); } @@ -460,7 +463,7 @@ long getMaxTradeLimit() { } boolean canTakeOffer() { - return GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation) && + return GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation, paymentAccount.getSelectedTradeCurrency()) && GUIUtil.isBootstrappedOrShowPopup(p2PService); } @@ -525,11 +528,11 @@ void calculateTotalToPay() { } boolean isBuyOffer() { - return getDirection() == OfferPayload.Direction.BUY; + return getDirection() == OfferDirection.BUY; } boolean isSellOffer() { - return getDirection() == OfferPayload.Direction.SELL; + return getDirection() == OfferDirection.SELL; } boolean isCryptoCurrency() { @@ -590,7 +593,6 @@ boolean isAmountLargerThanOfferAmount() { } boolean wouldCreateDustForMaker() { - //noinspection SimplifiableIfStatement boolean result; if (amount.get() != null && offer != null) { Coin customAmount = offer.getAmount().subtract(amount.get()); @@ -673,7 +675,7 @@ public Coin getUsableBsqBalance() { // we have to keep a minimum amount of BSQ == bitcoin dust limit // otherwise there would be dust violations for change UTXOs // essentially means the minimum usable balance of BSQ is 5.46 - Coin usableBsqBalance = bsqWalletService.getAvailableConfirmedBalance().subtract(Restrictions.getMinNonDustOutput()); + Coin usableBsqBalance = bsqWalletService.getAvailableBalance().subtract(Restrictions.getMinNonDustOutput()); if (usableBsqBalance.isNegative()) usableBsqBalance = Coin.ZERO; return usableBsqBalance; diff --git a/desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferView.fxml b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferView.fxml similarity index 96% rename from desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferView.fxml rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferView.fxml index af183ce5696..79ec2cbad47 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferView.fxml +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferView.fxml @@ -18,7 +18,7 @@ --> - diff --git a/desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferView.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferView.java similarity index 99% rename from desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferView.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferView.java index caeab48c27c..3eb24820233 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferView.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer.takeoffer; +package bisq.desktop.main.offer.bisq_v1.takeoffer; import bisq.desktop.Navigation; import bisq.desktop.common.view.ActivatableViewAndModel; @@ -37,7 +37,7 @@ import bisq.desktop.main.funds.FundsView; import bisq.desktop.main.funds.withdrawal.WithdrawalView; import bisq.desktop.main.offer.OfferView; -import bisq.desktop.main.offer.OfferViewUtil; +import bisq.desktop.main.offer.bisq_v1.OfferViewUtil; import bisq.desktop.main.overlays.notifications.Notification; import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.main.overlays.windows.GenericMessageWindow; @@ -52,7 +52,7 @@ import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.payment.FasterPaymentsAccount; import bisq.core.payment.PaymentAccount; import bisq.core.payment.payload.PaymentMethod; @@ -163,7 +163,7 @@ public class TakeOfferView extends ActivatableViewAndModel paymentAccountWarningDisplayed = new HashMap<>(); + private final HashMap paymentAccountWarningDisplayed = new HashMap<>(); private boolean offerDetailsWindowDisplayed, clearXchangeWarningDisplayed, fasterPaymentsWarningDisplayed, takeOfferFromUnsignedAccountWarningDisplayed, cashByMailWarningDisplayed; private SimpleBooleanProperty errorPopupDisplayed; @@ -354,7 +354,7 @@ public void initWithData(Offer offer) { model.initWithData(offer); priceAsPercentageInputBox.setVisible(offer.isUseMarketBasedPrice()); - if (model.getOffer().getDirection() == OfferPayload.Direction.SELL) { + if (model.getOffer().getDirection() == OfferDirection.SELL) { takeOfferButton.setId("buy-button-big"); takeOfferButton.updateText(Res.get("takeOffer.takeOfferButton", Res.get("shared.buy"))); nextButton.setId("buy-button"); @@ -691,7 +691,7 @@ private void addSubscriptions() { errorMessageSubscription = EasyBind.subscribe(model.errorMessage, newValue -> { if (newValue != null) { - new Popup().error(Res.get("takeOffer.error.message", model.errorMessage.get()) + + new Popup().error(Res.get("takeOffer.error.message", model.errorMessage.get()) + "\n\n" + Res.get("popup.error.tryRestart")) .onClose(() -> { errorPopupDisplayed.set(true); @@ -734,7 +734,7 @@ private void addSubscriptions() { } else if (newValue && model.getTrade() != null && !model.getTrade().hasFailed()) { String key = "takeOfferSuccessInfo"; if (DontShowAgainLookup.showAgain(key)) { - UserThread.runAfter(() -> new Popup().headLine(Res.get("takeOffer.success.headline")) + new Popup().headLine(Res.get("takeOffer.success.headline")) .feedback(Res.get("takeOffer.success.info")) .actionButtonTextWithGoTo("navigation.portfolio.pending") .dontShowAgainId(key) @@ -745,7 +745,7 @@ private void addSubscriptions() { close(); }) .onClose(this::close) - .show(), 1); + .show(); } else { close(); } @@ -966,6 +966,7 @@ private void showFeeOption() { private void addOfferAvailabilityLabel() { offerAvailabilityBusyAnimation = new BusyAnimation(false); offerAvailabilityLabel = new AutoTooltipLabel(Res.get("takeOffer.fundsBox.isOfferAvailable")); + HBox.setMargin(offerAvailabilityLabel, new Insets(6, 0, 0, 0)); buttonBox.getChildren().addAll(offerAvailabilityBusyAnimation, offerAvailabilityLabel); } diff --git a/desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferViewModel.java b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferViewModel.java similarity index 94% rename from desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferViewModel.java rename to desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferViewModel.java index 6c8a9e76ebd..1376b9baec0 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bisq_v1/takeoffer/TakeOfferViewModel.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer.takeoffer; +package bisq.desktop.main.offer.bisq_v1.takeoffer; import bisq.desktop.Navigation; import bisq.desktop.common.model.ActivatableWithDataModel; @@ -23,7 +23,7 @@ import bisq.desktop.main.MainView; import bisq.desktop.main.funds.FundsView; import bisq.desktop.main.funds.deposit.DepositView; -import bisq.desktop.main.offer.FeeUtil; +import bisq.desktop.main.offer.bisq_v1.OfferViewModelUtil; import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.util.DisplayUtils; import bisq.desktop.util.GUIUtil; @@ -35,13 +35,13 @@ import bisq.core.locale.Res; import bisq.core.monetary.Price; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferRestrictions; import bisq.core.offer.OfferUtil; import bisq.core.payment.PaymentAccount; import bisq.core.payment.payload.PaymentMethod; import bisq.core.provider.fee.FeeService; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.util.FormattingUtils; import bisq.core.util.VolumeUtil; import bisq.core.util.coin.BsqFormatter; @@ -264,8 +264,8 @@ boolean fundFromSavingsWallet() { return true; } else { new Popup().warning(Res.get("shared.notEnoughFunds", - btcFormatter.formatCoinWithCode(dataModel.getTotalToPayAsCoin().get()), - btcFormatter.formatCoinWithCode(dataModel.getTotalAvailableBalance()))) + btcFormatter.formatCoinWithCode(dataModel.getTotalToPayAsCoin().get()), + btcFormatter.formatCoinWithCode(dataModel.getTotalAvailableBalance()))) .actionButtonTextWithGoTo("navigation.funds.depositFunds") .onAction(() -> navigation.navigateTo(MainView.class, FundsView.class, DepositView.class)) .show(); @@ -288,11 +288,11 @@ private void applyTakerFee() { isTradeFeeVisible.setValue(true); tradeFee.set(getFormatterForTakerFee().formatCoin(takerFeeAsCoin)); - tradeFeeInBtcWithFiat.set(FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + tradeFeeInBtcWithFiat.set(OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.getTakerFeeInBtc(), true, btcFormatter)); - tradeFeeInBsqWithFiat.set(FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + tradeFeeInBsqWithFiat.set(OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.getTakerFeeInBsq(), false, bsqFormatter)); @@ -348,16 +348,16 @@ void onFocusOutAmountTextField(boolean oldValue, boolean newValue, String userIn amountValidationResult.set(new InputValidator.ValidationResult(false, Res.get("takeOffer.validation.amountLargerThanOfferAmountMinusFee"))); } else if (btcValidator.getMaxTradeLimit() != null && btcValidator.getMaxTradeLimit().value == OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT.value) { - if (dataModel.getDirection() == OfferPayload.Direction.BUY) { + if (dataModel.getDirection() == OfferDirection.BUY) { new Popup().information(Res.get("popup.warning.tradeLimitDueAccountAgeRestriction.seller", - btcFormatter.formatCoinWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT), - Res.get("offerbook.warning.newVersionAnnouncement"))) + btcFormatter.formatCoinWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT), + Res.get("offerbook.warning.newVersionAnnouncement"))) .width(900) .show(); } else { new Popup().information(Res.get("popup.warning.tradeLimitDueAccountAgeRestriction.buyer", - btcFormatter.formatCoinWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT), - Res.get("offerbook.warning.newVersionAnnouncement"))) + btcFormatter.formatCoinWithCode(OfferRestrictions.TOLERATED_SMALL_TRADE_AMOUNT), + Res.get("offerbook.warning.newVersionAnnouncement"))) .width(900) .show(); } @@ -420,7 +420,7 @@ private void applyOfferState(Offer.State state) { private void applyTradeErrorMessage(@Nullable String errorMessage) { if (errorMessage != null) { String appendMsg = ""; - switch (trade.getState().getPhase()) { + switch (trade.getTradePhase()) { case INIT: appendMsg = Res.get("takeOffer.error.noFundsLost"); break; @@ -478,7 +478,7 @@ private void updateButtonDisableState() { private void addBindings() { volume.bind(createStringBinding(() -> VolumeUtil.formatVolume(dataModel.volume.get()), dataModel.volume)); - if (dataModel.getDirection() == OfferPayload.Direction.SELL) { + if (dataModel.getDirection() == OfferDirection.SELL) { volumeDescriptionLabel.set(Res.get("createOffer.amountPriceBox.buy.volumeDescription", dataModel.getCurrencyCode())); } else { volumeDescriptionLabel.set(Res.get("createOffer.amountPriceBox.sell.volumeDescription", dataModel.getCurrencyCode())); @@ -642,11 +642,11 @@ CoinFormatter getBtcFormatter() { } boolean isSeller() { - return dataModel.getDirection() == OfferPayload.Direction.BUY; + return dataModel.getDirection() == OfferDirection.BUY; } public boolean isSellingToAnUnsignedAccount(Offer offer) { - if (offer.getDirection() == OfferPayload.Direction.BUY && + if (offer.getDirection() == OfferDirection.BUY && PaymentMethod.hasChargebackRisk(offer.getPaymentMethod(), offer.getCurrencyCode())) { // considered risky when either UNSIGNED, PEER_INITIAL, or BANNED (see #5343) return accountAgeWitnessService.getSignState(offer) == AccountAgeWitnessService.SignState.UNSIGNED || @@ -685,14 +685,14 @@ public String getAmountDescription() { } String getTradeAmount() { - return FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.getAmount().get(), true, btcFormatter); } public String getSecurityDepositInfo() { - return FeeUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, dataModel.getSecurityDeposit(), dataModel.getAmount().get(), true, @@ -707,7 +707,7 @@ public String getSecurityDepositWithCode() { public String getTradeFee() { if (dataModel.isCurrencyForTakerFeeBtc()) { - return FeeUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, dataModel.getTakerFeeInBtc(), dataModel.getAmount().get(), true, @@ -716,7 +716,7 @@ public String getTradeFee() { } else { // For BSQ we use the fiat equivalent only. Calculating the % value would require to // calculate the BTC value of the BSQ fee and use that... - return FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.getTakerFeeInBsq(), false, bsqFormatter); @@ -733,12 +733,12 @@ public String getTakerFeePercentage() { public String getTotalToPayInfo() { if (dataModel.isCurrencyForTakerFeeBtc()) { - return FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.totalToPayAsCoin.get(), true, btcFormatter); } else { - return FeeUtil.getTradeFeeWithFiatEquivalent(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalent(offerUtil, dataModel.totalToPayAsCoin.get(), true, btcFormatter) + " + " + getTradeFee(); @@ -746,7 +746,7 @@ public String getTotalToPayInfo() { } public String getTxFee() { - return FeeUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, + return OfferViewModelUtil.getTradeFeeWithFiatEquivalentAndPercentage(offerUtil, dataModel.getTotalTxFee(), dataModel.getAmount().get(), true, diff --git a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBook.java b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBook.java index 1632e6f35b3..fa248845b8b 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBook.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBook.java @@ -39,7 +39,7 @@ import lombok.extern.slf4j.Slf4j; -import static bisq.core.offer.OfferPayload.Direction.BUY; +import static bisq.core.offer.OfferDirection.BUY; /** * Holds and manages the unsorted and unfiltered offerbook list (except for banned offers) of both buy and sell offers. @@ -57,6 +57,7 @@ public class OfferBook { private final Map sellOfferCountMap = new HashMap<>(); private final FilterManager filterManager; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// @@ -139,7 +140,7 @@ public void removeOffer(Offer offer) { offer.setState(Offer.State.REMOVED); offer.cancelAvailabilityRequest(); - P2PDataStorage.ByteArray hashOfPayload = new P2PDataStorage.ByteArray(offer.getOfferPayload().getHash()); + P2PDataStorage.ByteArray hashOfPayload = new P2PDataStorage.ByteArray(offer.getOfferPayloadHash()); if (log.isDebugEnabled()) { // TODO delete debug stmt in future PR. log.debug("onRemoved: id = {}\n" @@ -164,7 +165,6 @@ public void removeOffer(Offer offer) { } OfferBookListItem candidate = candidateWithMatchingPayloadHash.get(); - // Remove the candidate only if the candidate's offer payload the hash matches the // onRemoved hashOfPayload parameter. We may receive add/remove messages out of // order from the API's 'editoffer' method, and use the offer payload hash to @@ -201,7 +201,7 @@ public void fillOfferBookListItems() { // Investigate why.... offerBookListItems.clear(); offerBookListItems.addAll(offerBookService.getOffers().stream() - .filter(o -> isOfferAllowed(o)) + .filter(this::isOfferAllowed) .map(OfferBookListItem::new) .collect(Collectors.toList())); diff --git a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookListItem.java b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookListItem.java index 2c56defd383..ff0f08cbc3d 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookListItem.java @@ -66,7 +66,7 @@ public class OfferBookListItem { public OfferBookListItem(Offer offer) { this.offer = offer; - this.hashOfPayload = new P2PDataStorage.ByteArray(offer.getOfferPayload().getHash()); + this.hashOfPayload = new P2PDataStorage.ByteArray(offer.getOfferPayloadHash()); } public WitnessAgeData getWitnessAgeData(AccountAgeWitnessService accountAgeWitnessService, diff --git a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookView.java b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookView.java index c6f8b40ebf2..88ebd00fbe7 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookView.java @@ -53,8 +53,8 @@ import bisq.core.locale.TradeCurrency; import bisq.core.monetary.Price; import bisq.core.offer.Offer; -import bisq.core.offer.OfferFilter; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; +import bisq.core.offer.OfferFilterService; import bisq.core.offer.OfferRestrictions; import bisq.core.payment.PaymentAccount; import bisq.core.payment.payload.PaymentMethod; @@ -265,7 +265,7 @@ public void initialize() { if (price2 == null || price1 == null) { return 0; } - if (model.getDirection() == OfferPayload.Direction.SELL) { + if (model.getDirection() == OfferDirection.SELL) { return price1.compareTo(price2); } else { return price2.compareTo(price1); @@ -277,7 +277,7 @@ public void initialize() { paymentMethodColumn.setComparator(Comparator.comparing(o -> Res.get(o.getOffer().getPaymentMethod().getId()))); avatarColumn.setComparator(Comparator.comparing(o -> model.getNumTrades(o.getOffer()))); depositColumn.setComparator(Comparator.comparing(item -> { - boolean isSellOffer = item.getOffer().getDirection() == OfferPayload.Direction.SELL; + boolean isSellOffer = item.getOffer().getDirection() == OfferDirection.SELL; Coin deposit = isSellOffer ? item.getOffer().getBuyerSecurityDeposit() : item.getOffer().getSellerSecurityDeposit(); @@ -314,7 +314,7 @@ public void initialize() { protected void activate() { currencyComboBox.setCellFactory(GUIUtil.getTradeCurrencyCellFactory(Res.get("shared.oneOffer"), Res.get("shared.multipleOffers"), - (model.getDirection() == OfferPayload.Direction.BUY ? model.getSellOfferCounts() : model.getBuyOfferCounts()))); + (model.getDirection() == OfferDirection.BUY ? model.getSellOfferCounts() : model.getBuyOfferCounts()))); currencyComboBox.setConverter(new CurrencyStringConverter(currencyComboBox)); currencyComboBox.getEditor().getStyleClass().add("combo-box-editor-bold"); @@ -536,38 +536,38 @@ public void enableCreateOfferButton() { createOfferButton.setDisable(false); } - public void setDirection(OfferPayload.Direction direction) { + public void setDirection(OfferDirection direction) { model.initWithDirection(direction); ImageView iconView = new ImageView(); createOfferButton.setGraphic(iconView); - iconView.setId(direction == OfferPayload.Direction.SELL ? "image-sell-white" : "image-buy-white"); - createOfferButton.setId(direction == OfferPayload.Direction.SELL ? "sell-button-big" : "buy-button-big"); - avatarColumn.setTitle(direction == OfferPayload.Direction.SELL ? Res.get("shared.buyerUpperCase") : Res.get("shared.sellerUpperCase")); + iconView.setId(direction == OfferDirection.SELL ? "image-sell-white" : "image-buy-white"); + createOfferButton.setId(direction == OfferDirection.SELL ? "sell-button-big" : "buy-button-big"); + avatarColumn.setTitle(direction == OfferDirection.SELL ? Res.get("shared.buyerUpperCase") : Res.get("shared.sellerUpperCase")); setDirectionTitles(); } private void setDirectionTitles() { TradeCurrency selectedTradeCurrency = model.getSelectedTradeCurrency(); if (selectedTradeCurrency != null) { - OfferPayload.Direction direction = model.getDirection(); + OfferDirection direction = model.getDirection(); String offerButtonText; String code = selectedTradeCurrency.getCode(); if (model.showAllTradeCurrenciesProperty.get()) { - offerButtonText = direction == OfferPayload.Direction.BUY ? + offerButtonText = direction == OfferDirection.BUY ? Res.get("offerbook.createOfferToBuy", Res.getBaseCurrencyCode()) : Res.get("offerbook.createOfferToSell", Res.getBaseCurrencyCode()); } else if (selectedTradeCurrency instanceof FiatCurrency) { - offerButtonText = direction == OfferPayload.Direction.BUY ? + offerButtonText = direction == OfferDirection.BUY ? Res.get("offerbook.createOfferToBuy.withFiat", Res.getBaseCurrencyCode(), code) : Res.get("offerbook.createOfferToSell.forFiat", Res.getBaseCurrencyCode(), code); } else { - offerButtonText = direction == OfferPayload.Direction.BUY ? + offerButtonText = direction == OfferDirection.BUY ? Res.get("offerbook.createOfferToBuy.withCrypto", code, Res.getBaseCurrencyCode()) : Res.get("offerbook.createOfferToSell.forCrypto", code, Res.getBaseCurrencyCode()); @@ -590,13 +590,15 @@ public void onTabSelected(boolean isSelected) { private void onCreateOffer() { if (model.canCreateOrTakeOffer()) { + PaymentMethod selectedPaymentMethod = model.selectedPaymentMethod; + TradeCurrency selectedTradeCurrency = model.getSelectedTradeCurrency(); if (!model.hasPaymentAccountForCurrency()) { new Popup().headLine(Res.get("offerbook.warning.noTradingAccountForCurrency.headline")) .instruction(Res.get("offerbook.warning.noTradingAccountForCurrency.msg")) .actionButtonText(Res.get("offerbook.yesCreateOffer")) .onAction(() -> { createOfferButton.setDisable(true); - offerActionHandler.onCreateOffer(model.getSelectedTradeCurrency()); + offerActionHandler.onCreateOffer(selectedTradeCurrency, selectedPaymentMethod); }) .secondaryActionButtonText(Res.get("offerbook.setupNewAccount")) .onSecondaryAction(() -> { @@ -609,11 +611,11 @@ private void onCreateOffer() { } createOfferButton.setDisable(true); - offerActionHandler.onCreateOffer(model.getSelectedTradeCurrency()); + offerActionHandler.onCreateOffer(selectedTradeCurrency, selectedPaymentMethod); } } - private void onShowInfo(Offer offer, OfferFilter.Result result) { + private void onShowInfo(Offer offer, OfferFilterService.Result result) { switch (result) { case VALID: break; @@ -673,7 +675,7 @@ private void onShowInfo(Offer offer, OfferFilter.Result result) { private void onTakeOffer(Offer offer) { if (model.canCreateOrTakeOffer()) { - if (offer.getDirection() == OfferPayload.Direction.SELL && + if (offer.getDirection() == OfferDirection.SELL && offer.getPaymentMethod().getId().equals(PaymentMethod.CASH_DEPOSIT.getId())) { new Popup().confirmation(Res.get("popup.info.cashDepositInfo", offer.getBankId())) .actionButtonText(Res.get("popup.info.cashDepositInfo.confirm")) @@ -934,15 +936,16 @@ public void updateItem(final OfferBookListItem item, boolean empty) { if (item != null && !empty) { - if (model.isOfferBanned(item.getOffer())) { + Offer offer = item.getOffer(); + if (model.isOfferBanned(offer)) { setGraphic(new AutoTooltipLabel(model.getPaymentMethod(item))); } else { - if (item.getOffer().isXmrAutoConf()) { + if (offer.isXmrAutoConf()) { field = new HyperlinkWithIcon(model.getPaymentMethod(item), AwesomeIcon.ROCKET); } else { field = new HyperlinkWithIcon(model.getPaymentMethod(item)); } - field.setOnAction(event -> offerDetailsWindow.show(item.getOffer())); + field.setOnAction(event -> offerDetailsWindow.show(offer)); field.setTooltip(new Tooltip(model.getPaymentMethodToolTip(item))); setGraphic(field); } @@ -981,7 +984,7 @@ public TableCell call( public void updateItem(final OfferBookListItem item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { - var isSellOffer = item.getOffer().getDirection() == OfferPayload.Direction.SELL; + var isSellOffer = item.getOffer().getDirection() == OfferDirection.SELL; var deposit = isSellOffer ? item.getOffer().getBuyerSecurityDeposit() : item.getOffer().getSellerSecurityDeposit(); if (deposit == null) { @@ -1021,7 +1024,7 @@ public TableCell call(TableColumn() { final ImageView iconView = new ImageView(); final AutoTooltipButton button = new AutoTooltipButton(); - OfferFilter.Result canTakeOfferResult = null; + OfferFilterService.Result canTakeOfferResult = null; { button.setGraphic(iconView); @@ -1040,7 +1043,7 @@ public void updateItem(final OfferBookListItem item, boolean empty) { boolean myOffer = model.isMyOffer(offer); if (tableRow != null) { - canTakeOfferResult = model.offerFilter.canTakeOffer(offer, false); + canTakeOfferResult = model.offerFilterService.canTakeOffer(offer, false); tableRow.setOpacity(canTakeOfferResult.isValid() || myOffer ? 1 : 0.4); if (myOffer) { @@ -1070,17 +1073,17 @@ public void updateItem(final OfferBookListItem item, boolean empty) { button.setStyle(CssTheme.isDarkTheme() ? "-fx-text-fill: white" : "-fx-text-fill: #444444"); button.setOnAction(e -> onRemoveOpenOffer(offer)); } else { - boolean isSellOffer = offer.getDirection() == OfferPayload.Direction.SELL; + boolean isSellOffer = offer.getDirection() == OfferDirection.SELL; iconView.setId(isSellOffer ? "image-buy-white" : "image-sell-white"); button.setId(isSellOffer ? "buy-button" : "sell-button"); button.setStyle("-fx-text-fill: white"); if (isSellOffer) { title = CurrencyUtil.isFiatCurrency(offer.getCurrencyCode()) ? - Res.get("offerbook.takeOfferToBuy", offer.getOfferPayload().getBaseCurrencyCode()) : + Res.get("offerbook.takeOfferToBuy", offer.getBaseCurrencyCode()) : Res.get("offerbook.takeOfferToSell", offer.getCurrencyCode()); } else { title = CurrencyUtil.isFiatCurrency(offer.getCurrencyCode()) ? - Res.get("offerbook.takeOfferToSell", offer.getOfferPayload().getBaseCurrencyCode()) : + Res.get("offerbook.takeOfferToSell", offer.getBaseCurrencyCode()) : Res.get("offerbook.takeOfferToBuy", offer.getCurrencyCode()); } button.setTooltip(new Tooltip(Res.get("offerbook.takeOfferButton.tooltip", model.getDirectionLabelTooltip(offer)))); @@ -1089,7 +1092,7 @@ public void updateItem(final OfferBookListItem item, boolean empty) { if (!myOffer) { if (canTakeOfferResult == null) { - canTakeOfferResult = model.offerFilter.canTakeOffer(offer, false); + canTakeOfferResult = model.offerFilterService.canTakeOffer(offer, false); } if (!canTakeOfferResult.isValid()) { diff --git a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookViewModel.java b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookViewModel.java index ee78f2796b5..5583b5e0f0a 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/offerbook/OfferBookViewModel.java @@ -38,15 +38,15 @@ import bisq.core.monetary.Price; import bisq.core.monetary.Volume; import bisq.core.offer.Offer; -import bisq.core.offer.OfferFilter; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; +import bisq.core.offer.OfferFilterService; import bisq.core.offer.OpenOfferManager; import bisq.core.payment.PaymentAccount; import bisq.core.payment.PaymentAccountUtil; import bisq.core.payment.payload.PaymentMethod; import bisq.core.provider.price.PriceFeedService; -import bisq.core.trade.Trade; -import bisq.core.trade.closed.ClosedTradableManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.core.user.User; import bisq.core.util.FormattingUtils; @@ -106,7 +106,7 @@ class OfferBookViewModel extends ActivatableViewModel { final AccountAgeWitnessService accountAgeWitnessService; private final Navigation navigation; private final PriceUtil priceUtil; - final OfferFilter offerFilter; + final OfferFilterService offerFilterService; private final CoinFormatter btcFormatter; private final BsqFormatter bsqFormatter; @@ -117,7 +117,7 @@ class OfferBookViewModel extends ActivatableViewModel { private TradeCurrency selectedTradeCurrency; private final ObservableList allTradeCurrencies = FXCollections.observableArrayList(); - private OfferPayload.Direction direction; + private OfferDirection direction; final StringProperty tradeCurrencyCode = new SimpleStringProperty(); @@ -152,7 +152,7 @@ public OfferBookViewModel(User user, AccountAgeWitnessService accountAgeWitnessService, Navigation navigation, PriceUtil priceUtil, - OfferFilter offerFilter, + OfferFilterService offerFilterService, @Named(FormattingUtils.BTC_FORMATTER_KEY) CoinFormatter btcFormatter, BsqFormatter bsqFormatter) { super(); @@ -168,7 +168,7 @@ public OfferBookViewModel(User user, this.accountAgeWitnessService = accountAgeWitnessService; this.navigation = navigation; this.priceUtil = priceUtil; - this.offerFilter = offerFilter; + this.offerFilterService = offerFilterService; this.btcFormatter = btcFormatter; this.bsqFormatter = bsqFormatter; @@ -215,7 +215,7 @@ public OfferBookViewModel(User user, protected void activate() { filteredItems.addListener(filterItemsListener); - String code = direction == OfferPayload.Direction.BUY ? preferences.getBuyScreenCurrencyCode() : preferences.getSellScreenCurrencyCode(); + String code = direction == OfferDirection.BUY ? preferences.getBuyScreenCurrencyCode() : preferences.getSellScreenCurrencyCode(); if (code != null && !code.isEmpty() && !isShowAllEntry(code) && CurrencyUtil.getTradeCurrency(code).isPresent()) { showAllTradeCurrenciesProperty.set(false); @@ -251,7 +251,7 @@ protected void deactivate() { // API /////////////////////////////////////////////////////////////////////////////////////////// - void initWithDirection(OfferPayload.Direction direction) { + void initWithDirection(OfferDirection direction) { this.direction = direction; } @@ -279,7 +279,7 @@ else if (!showAllEntry) { setMarketPriceFeedCurrency(); filterOffers(); - if (direction == OfferPayload.Direction.BUY) + if (direction == OfferDirection.BUY) preferences.setBuyScreenCurrencyCode(code); else preferences.setSellScreenCurrencyCode(code); @@ -341,7 +341,7 @@ boolean isMyOffer(Offer offer) { return openOfferManager.isMyOffer(offer); } - OfferPayload.Direction getDirection() { + OfferDirection getDirection() { return direction; } @@ -566,7 +566,7 @@ boolean hasPaymentAccountForCurrency() { } boolean canCreateOrTakeOffer() { - return GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation) && + return GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation, selectedTradeCurrency) && GUIUtil.isChainHeightSyncedWithinToleranceOrShowPopup(walletsSetup) && GUIUtil.isBootstrappedOrShowPopup(p2PService); } @@ -600,11 +600,11 @@ private Predicate getOffersMatchingMyAccountsPredicate() { // This code duplicates code in the view at the button column. We need there the different results for // display in popups so we cannot replace that with the predicate. Any change need to be applied in both // places. - return offerBookListItem -> offerFilter.canTakeOffer(offerBookListItem.getOffer(), false).isValid(); + return offerBookListItem -> offerFilterService.canTakeOffer(offerBookListItem.getOffer(), false).isValid(); } boolean isOfferBanned(Offer offer) { - return offerFilter.isOfferBanned(offer); + return offerFilterService.isOfferBanned(offer); } private boolean isShowAllEntry(String id) { @@ -647,11 +647,11 @@ public String getMakerFeeAsString(Offer offer) { bsqFormatter.formatCoinWithCode(offer.getMakerFee()); } - private static String getDirectionWithCodeDetailed(OfferPayload.Direction direction, String currencyCode) { + private static String getDirectionWithCodeDetailed(OfferDirection direction, String currencyCode) { if (CurrencyUtil.isFiatCurrency(currencyCode)) - return (direction == OfferPayload.Direction.BUY) ? Res.get("shared.buyingBTCWith", currencyCode) : Res.get("shared.sellingBTCFor", currencyCode); + return (direction == OfferDirection.BUY) ? Res.get("shared.buyingBTCWith", currencyCode) : Res.get("shared.sellingBTCFor", currencyCode); else - return (direction == OfferPayload.Direction.SELL) ? Res.get("shared.buyingCurrency", currencyCode) : Res.get("shared.sellingCurrency", currencyCode); + return (direction == OfferDirection.SELL) ? Res.get("shared.buyingCurrency", currencyCode) : Res.get("shared.sellingCurrency", currencyCode); } public String formatDepositString(Coin deposit, long amount) { @@ -667,7 +667,7 @@ private TradeCurrency getEditEntryForCurrency() { return new CryptoCurrency(GUIUtil.EDIT_FLAG, ""); } - private PaymentMethod getShowAllEntryForPaymentMethod() { + PaymentMethod getShowAllEntryForPaymentMethod() { return PaymentMethod.getDummyPaymentMethod(GUIUtil.SHOW_ALL_FLAG); } } diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/editor/PeerInfoWithTagEditor.java b/desktop/src/main/java/bisq/desktop/main/overlays/editor/PeerInfoWithTagEditor.java index e0aa0938661..b6f26c0dd29 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/editor/PeerInfoWithTagEditor.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/editor/PeerInfoWithTagEditor.java @@ -25,7 +25,7 @@ import bisq.core.locale.GlobalSettings; import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.common.UserThread; @@ -251,7 +251,7 @@ private void addContent() { UserThread.runAfter(() -> { PubKeyRing peersPubKeyRing = null; if (trade != null) { - peersPubKeyRing = trade.getProcessModel().getTradingPeer().getPubKeyRing(); + peersPubKeyRing = trade.getProcessModel().getTradePeer().getPubKeyRing(); } else if (offer != null) { peersPubKeyRing = offer.getPubKeyRing(); } diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/notifications/NotificationCenter.java b/desktop/src/main/java/bisq/desktop/main/overlays/notifications/NotificationCenter.java index 994a9768675..b86f87a82da 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/notifications/NotificationCenter.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/notifications/NotificationCenter.java @@ -29,11 +29,11 @@ import bisq.core.locale.Res; import bisq.core.support.dispute.mediation.MediationManager; import bisq.core.support.dispute.refund.RefundManager; -import bisq.core.trade.BuyerTrade; -import bisq.core.trade.MakerTrade; -import bisq.core.trade.SellerTrade; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; +import bisq.core.trade.model.MakerTrade; +import bisq.core.trade.model.bisq_v1.BuyerTrade; +import bisq.core.trade.model.bisq_v1.SellerTrade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.DontShowAgainLookup; import bisq.core.user.Preferences; diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/BsqEmptyWalletWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/BsqEmptyWalletWindow.java index 493f983ec4a..0d287d40d44 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/BsqEmptyWalletWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/BsqEmptyWalletWindow.java @@ -60,7 +60,7 @@ private void addContent() { gridPane.getColumnConstraints().remove(1); addTopLabelTextField(gridPane, ++rowIndex, Res.get("emptyWalletWindow.balance"), - bsqFormatter.formatCoinWithCode(bsqWalletService.getAvailableConfirmedBalance()), 10); + bsqFormatter.formatCoinWithCode(bsqWalletService.getAvailableBalance()), 10); addTopLabelTextField(gridPane, ++rowIndex, Res.get("emptyWalletWindow.bsq.btcBalance"), bsqFormatter.formatBTCWithCode(bsqWalletService.getAvailableNonBsqBalance().value), 10); diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/BtcEmptyWalletWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/BtcEmptyWalletWindow.java index 9d5c77b650e..12c675e2f47 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/BtcEmptyWalletWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/BtcEmptyWalletWindow.java @@ -103,7 +103,7 @@ protected void setupKeyHandler(Scene scene) { private void addContent() { addMultilineLabel(gridPane, ++rowIndex, Res.get("emptyWalletWindow.info"), 0); - Coin totalBalance = btcWalletService.getAvailableConfirmedBalance(); + Coin totalBalance = btcWalletService.getAvailableBalance(); balanceTextField = addTopLabelTextField(gridPane, ++rowIndex, Res.get("emptyWalletWindow.balance"), btcFormatter.formatCoinWithCode(totalBalance), 10).second; @@ -164,7 +164,7 @@ private void doEmptyWallet2(KeyParameter aesKey) { aesKey, () -> { closeButton.updateText(Res.get("shared.close")); - balanceTextField.setText(btcFormatter.formatCoinWithCode(btcWalletService.getAvailableConfirmedBalance())); + balanceTextField.setText(btcFormatter.formatCoinWithCode(btcWalletService.getAvailableBalance())); emptyWalletButton.setDisable(true); log.debug("wallet empty successful"); onClose(() -> UserThread.runAfter(() -> new Popup() diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/ContractWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/ContractWindow.java index c51d9ed8bac..fca374a9b81 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/ContractWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/ContractWindow.java @@ -37,7 +37,7 @@ import bisq.core.support.dispute.arbitration.ArbitrationManager; import bisq.core.support.dispute.mediation.MediationManager; import bisq.core.support.dispute.refund.RefundManager; -import bisq.core.trade.Contract; +import bisq.core.trade.model.bisq_v1.Contract; import bisq.core.util.FormattingUtils; import bisq.core.util.VolumeUtil; import bisq.core.util.coin.CoinFormatter; diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/DisputeSummaryWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/DisputeSummaryWindow.java index dd632b0e082..ffbba10522e 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/DisputeSummaryWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/DisputeSummaryWindow.java @@ -46,8 +46,8 @@ import bisq.core.support.dispute.DisputeResult; import bisq.core.support.dispute.mediation.MediationManager; import bisq.core.support.dispute.refund.RefundManager; -import bisq.core.trade.Contract; -import bisq.core.trade.TradeDataValidation; +import bisq.core.trade.bisq_v1.TradeDataValidation; +import bisq.core.trade.model.bisq_v1.Contract; import bisq.core.util.FormattingUtils; import bisq.core.util.ParsingUtils; import bisq.core.util.VolumeUtil; diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java index 017ec644d3f..60c56ec6e47 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java @@ -244,8 +244,11 @@ private void addContent() { // working as expected) if (filterManager.canRemoveDevFilter(privKeyString)) { filterManager.removeDevFilter(privKeyString); - UserThread.runAfter(() -> addDevFilter(removeFilterMessageButton, privKeyString, newFilter), - 5); + if (DevEnv.isDevMode()) { + addDevFilter(removeFilterMessageButton, privKeyString, newFilter); + } else { + UserThread.runAfter(() -> addDevFilter(removeFilterMessageButton, privKeyString, newFilter), 5); + } } else { addDevFilter(removeFilterMessageButton, privKeyString, newFilter); } diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/OfferDetailsWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/OfferDetailsWindow.java index 531469bb172..55471788da6 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/OfferDetailsWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/OfferDetailsWindow.java @@ -29,10 +29,11 @@ import bisq.core.btc.wallet.BtcWalletService; import bisq.core.locale.CountryUtil; +import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; import bisq.core.monetary.Price; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; import bisq.core.payment.PaymentAccount; import bisq.core.payment.payload.PaymentMethod; @@ -175,7 +176,7 @@ private void addContent() { if (isF2F) rows++; - boolean showXmrAutoConf = offer.isXmr() && offer.getDirection() == OfferPayload.Direction.SELL; + boolean showXmrAutoConf = offer.isXmr() && offer.getDirection() == OfferDirection.SELL; if (showXmrAutoConf) { rows++; } @@ -184,7 +185,7 @@ private void addContent() { String fiatDirectionInfo = ""; String btcDirectionInfo = ""; - OfferPayload.Direction direction = offer.getDirection(); + OfferDirection direction = offer.getDirection(); String currencyCode = offer.getCurrencyCode(); String offerTypeLabel = Res.get("shared.offerType"); String toReceive = " " + Res.get("shared.toReceive"); @@ -193,13 +194,13 @@ private void addContent() { if (takeOfferHandlerOptional.isPresent()) { addConfirmationLabelLabel(gridPane, rowIndex, offerTypeLabel, DisplayUtils.getDirectionForTakeOffer(direction, currencyCode), firstRowDistance); - fiatDirectionInfo = direction == OfferPayload.Direction.BUY ? toReceive : toSpend; - btcDirectionInfo = direction == OfferPayload.Direction.SELL ? toReceive : toSpend; + fiatDirectionInfo = direction == OfferDirection.BUY ? toReceive : toSpend; + btcDirectionInfo = direction == OfferDirection.SELL ? toReceive : toSpend; } else if (placeOfferHandlerOptional.isPresent()) { addConfirmationLabelLabel(gridPane, rowIndex, offerTypeLabel, DisplayUtils.getOfferDirectionForCreateOffer(direction, currencyCode), firstRowDistance); - fiatDirectionInfo = direction == OfferPayload.Direction.SELL ? toReceive : toSpend; - btcDirectionInfo = direction == OfferPayload.Direction.BUY ? toReceive : toSpend; + fiatDirectionInfo = direction == OfferDirection.SELL ? toReceive : toSpend; + btcDirectionInfo = direction == OfferDirection.BUY ? toReceive : toSpend; } else { addConfirmationLabelLabel(gridPane, rowIndex, offerTypeLabel, DisplayUtils.getDirectionBothSides(direction, currencyCode), firstRowDistance); @@ -423,7 +424,8 @@ private void addConfirmAndCancelButtons(boolean isPlaceOffer) { placeOfferTuple.fourth.getChildren().add(cancelButton); button.setOnAction(e -> { - if (GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation)) { + if (GUIUtil.canCreateOrTakeOfferOrShowPopup(user, navigation, + CurrencyUtil.getTradeCurrency(offer.getCurrencyCode()).get())) { button.setDisable(true); cancelButton.setDisable(true); // temporarily disabled due to high CPU usage (per issue #4649) diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/SignPaymentAccountsWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/SignPaymentAccountsWindow.java index bab6e7e1c2d..36c32ee3220 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/SignPaymentAccountsWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/SignPaymentAccountsWindow.java @@ -171,7 +171,7 @@ public PaymentMethod fromString(String s) { private List getPaymentMethods() { return PaymentMethod.getPaymentMethods().stream() - .filter(paymentMethod -> !paymentMethod.isAsset()) + .filter(PaymentMethod::isFiat) .filter(PaymentMethod::hasChargebackRisk) .collect(Collectors.toList()); } diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/SwiftPaymentDetails.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/SwiftPaymentDetails.java index d652aa067cd..79371c20d93 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/SwiftPaymentDetails.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/SwiftPaymentDetails.java @@ -22,7 +22,7 @@ import bisq.core.locale.CountryUtil; import bisq.core.locale.Res; import bisq.core.payment.payload.SwiftAccountPayload; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.util.VolumeUtil; import javafx.scene.control.Label; diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/TradeDetailsWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/TradeDetailsWindow.java index 332133d61cc..aa9ab9d9060 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/TradeDetailsWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/TradeDetailsWindow.java @@ -33,9 +33,9 @@ import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.support.dispute.agent.DisputeAgentLookupMap; import bisq.core.support.dispute.arbitration.ArbitrationManager; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.txproof.AssetTxProofResult; import bisq.core.util.FormattingUtils; import bisq.core.util.VolumeUtil; @@ -324,7 +324,7 @@ private void addContent() { textArea.scrollTopProperty().addListener(changeListener); textArea.setScrollTop(30); - addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("tradeDetailsWindow.tradeState"), trade.getState().getPhase().name()); + addConfirmationLabelTextField(gridPane, ++rowIndex, Res.get("tradeDetailsWindow.tradeState"), trade.getTradePhase().name()); } Tuple3 tuple = add2ButtonsWithBox(gridPane, ++rowIndex, diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/PortfolioView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/PortfolioView.java index 52809d5b192..c1f9f2de55f 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/PortfolioView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/PortfolioView.java @@ -31,10 +31,10 @@ import bisq.desktop.main.portfolio.pendingtrades.PendingTradesView; import bisq.core.locale.Res; -import bisq.core.offer.OfferPayload; import bisq.core.offer.OpenOffer; -import bisq.core.trade.Trade; -import bisq.core.trade.failed.FailedTradesManager; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.trade.bisq_v1.FailedTradesManager; +import bisq.core.trade.model.bisq_v1.Trade; import javax.inject.Inject; @@ -218,7 +218,7 @@ private void loadView(Class viewClass, @Nullable Object data) { selectOpenOffersView((OpenOffersView) view); } } else if (view instanceof DuplicateOfferView) { - if (duplicateOfferView == null && data instanceof OfferPayload && data != null) { + if (duplicateOfferView == null && data instanceof OfferPayload) { viewLoader.removeFromCache(viewClass); // remove cached dialog view = viewLoader.load(viewClass); // and load a fresh one duplicateOfferView = (DuplicateOfferView) view; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradableListItem.java b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradableListItem.java index 602b4148cfa..6b85a12ca7c 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradableListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradableListItem.java @@ -17,7 +17,7 @@ package bisq.desktop.main.portfolio.closedtrades; -import bisq.core.trade.Tradable; +import bisq.core.trade.model.Tradable; /** * We could remove that wrapper if it is not needed for additional UI only fields. diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesDataModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesDataModel.java index 76026c6da47..e5d15cc0461 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesDataModel.java @@ -20,15 +20,18 @@ import bisq.desktop.common.model.ActivatableDataModel; import bisq.desktop.main.PriceUtil; +import bisq.core.btc.wallet.BsqWalletService; import bisq.core.monetary.Price; import bisq.core.monetary.Volume; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; +import bisq.core.offer.OpenOffer; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; -import bisq.core.trade.Tradable; -import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.closed.ClosedTradeUtil; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.ClosedTradeUtil; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.core.util.VolumeUtil; @@ -50,17 +53,28 @@ class ClosedTradesDataModel extends ActivatableDataModel { final ClosedTradableManager closedTradableManager; private final ClosedTradeUtil closedTradeUtil; + private final BsqWalletService bsqWalletService; private final Preferences preferences; private final PriceFeedService priceFeedService; private final ObservableList list = FXCollections.observableArrayList(); private final ListChangeListener tradesListChangeListener; + /** + * Supplies a List from this JFX ObservableList + * collection, for passing to core's ClosedTradeUtil which has no dependency on JFX. + */ + public final Supplier> tradableList = () -> list.stream() + .map(ClosedTradableListItem::getTradable) + .collect(Collectors.toList()); + @Inject public ClosedTradesDataModel(ClosedTradableManager closedTradableManager, + BsqWalletService bsqWalletService, ClosedTradeUtil closedTradeUtil, Preferences preferences, PriceFeedService priceFeedService) { this.closedTradableManager = closedTradableManager; + this.bsqWalletService = bsqWalletService; this.closedTradeUtil = closedTradeUtil; this.preferences = preferences; this.priceFeedService = priceFeedService; @@ -83,15 +97,7 @@ public ObservableList getList() { return list; } - /** - * Supplies a List from this JFX ObservableList - * collection, for passing to core's ClosedTradeUtil which has no dependency on JFX. - */ - public final Supplier> tradableList = () -> list.stream() - .map(ClosedTradableListItem::getTradable) - .collect(Collectors.toList()); - - public OfferPayload.Direction getDirection(Offer offer) { + public OfferDirection getDirection(Offer offer) { return closedTradableManager.wasMyOffer(offer) ? offer.getDirection() : offer.getMirroredDirection(); } @@ -104,6 +110,10 @@ private void applyList() { list.sort((o1, o2) -> o2.getTradable().getDate().compareTo(o1.getTradable().getDate())); } + boolean wasMyOffer(Tradable tradable) { + return closedTradableManager.wasMyOffer(tradable.getOffer()); + } + Coin getTotalAmount() { return closedTradeUtil.getTotalAmount(tradableList.get()); } @@ -139,4 +149,42 @@ public Coin getTotalTxFee() { public Coin getTotalTradeFee(boolean expectBtcFee) { return closedTradeUtil.getTotalTradeFee(tradableList.get(), expectBtcFee); } + + protected long getTradeFee(Tradable tradable, boolean expectBtcFee) { + Offer offer = tradable.getOffer(); + if (wasMyOffer(tradable) || tradable instanceof OpenOffer) { + String makerFeeTxId = offer.getOfferFeePaymentTxId(); + boolean notInBsqWallet = bsqWalletService.getTransaction(makerFeeTxId) == null; + if (expectBtcFee) { + if (notInBsqWallet) { + return offer.getMakerFee().value; + } else { + return 0; + } + } else { + if (notInBsqWallet) { + return 0; + } else { + return offer.getMakerFee().value; + } + } + } else { + Trade trade = (Trade) tradable; + String takerFeeTxId = trade.getTakerFeeTxId(); + boolean notInBsqWallet = bsqWalletService.getTransaction(takerFeeTxId) == null; + if (expectBtcFee) { + if (notInBsqWallet) { + return trade.getTakerFee().value; + } else { + return 0; + } + } else { + if (notInBsqWallet) { + return 0; + } else { + return trade.getTakerFee().value; + } + } + } + } } diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.java index b4be92daf25..f0ad654c869 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.java @@ -38,11 +38,11 @@ import bisq.core.alert.PrivateNotificationManager; import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; import bisq.core.offer.OpenOffer; -import bisq.core.trade.Contract; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; +import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.network.p2p.NodeAddress; @@ -256,7 +256,7 @@ public void initialize() { MenuItem editItem = new MenuItem(Res.get("portfolio.context.offerLikeThis")); editItem.setOnAction((event) -> { try { - OfferPayload offerPayload = row.getItem().getTradable().getOffer().getOfferPayload(); + OfferPayload offerPayload = row.getItem().getTradable().getOffer().getOfferPayload().orElseThrow(); if (offerPayload.getPubKeyRing().equals(keyRing.getPubKeyRing())) { navigation.navigateToWithData(offerPayload, MainView.class, PortfolioView.class, DuplicateOfferView.class); } else { @@ -424,7 +424,8 @@ private void applyFilteredListPredicate(String filterString) { if (offer.getPaymentMethod().getDisplayString().contains(filterString)) { return true; } - if (offer.getOfferFeePaymentTxId().contains(filterString)) { + if (offer.getOfferFeePaymentTxId() != null && + offer.getOfferFeePaymentTxId().contains(filterString)) { return true; } diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesViewModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesViewModel.java index 9b359cbaad5..2c9c10106d3 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesViewModel.java @@ -23,8 +23,8 @@ import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.monetary.Volume; -import bisq.core.trade.Tradable; -import bisq.core.trade.closed.ClosedTradeUtil; +import bisq.core.trade.bisq_v1.ClosedTradeUtil; +import bisq.core.trade.model.Tradable; import org.bitcoinj.core.Coin; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferDataModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferDataModel.java index b713ed112e7..5818f2cc231 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferDataModel.java @@ -19,16 +19,16 @@ import bisq.desktop.Navigation; -import bisq.desktop.main.offer.MutableOfferDataModel; +import bisq.desktop.main.offer.bisq_v1.MutableOfferDataModel; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.Restrictions; -import bisq.core.offer.CreateOfferService; import bisq.core.offer.Offer; import bisq.core.offer.OfferUtil; import bisq.core.offer.OpenOfferManager; +import bisq.core.offer.bisq_v1.CreateOfferService; import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.statistics.TradeStatisticsManager; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferView.java index ca1b1a4232b..db6eb38ba19 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferView.java @@ -19,11 +19,11 @@ import bisq.desktop.Navigation; import bisq.desktop.common.view.FxmlView; -import bisq.desktop.main.offer.MutableOfferView; +import bisq.desktop.main.offer.bisq_v1.MutableOfferView; import bisq.desktop.main.overlays.windows.OfferDetailsWindow; import bisq.core.locale.CurrencyUtil; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; import bisq.core.util.coin.BsqFormatter; @@ -62,7 +62,9 @@ protected void doActivate() { } public void initWithData(OfferPayload offerPayload) { - initWithData(offerPayload.getDirection(), CurrencyUtil.getTradeCurrency(offerPayload.getCurrencyCode()).get()); + initWithData(offerPayload.getDirection(), + CurrencyUtil.getTradeCurrency(offerPayload.getCurrencyCode()).get(), + null); model.initWithData(offerPayload); } } diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferViewModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferViewModel.java index 76f4f6e711d..756bd7f6de4 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferViewModel.java @@ -18,7 +18,7 @@ package bisq.desktop.main.portfolio.duplicateoffer; import bisq.desktop.Navigation; -import bisq.desktop.main.offer.MutableOfferViewModel; +import bisq.desktop.main.offer.bisq_v1.MutableOfferViewModel; import bisq.desktop.util.validation.AltcoinValidator; import bisq.desktop.util.validation.BsqValidator; import bisq.desktop.util.validation.BtcValidator; @@ -28,8 +28,8 @@ import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; import bisq.core.offer.OfferUtil; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.provider.price.PriceFeedService; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModel.java index abf533c4723..edc153956df 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModel.java @@ -19,7 +19,7 @@ import bisq.desktop.Navigation; -import bisq.desktop.main.offer.MutableOfferDataModel; +import bisq.desktop.main.offer.bisq_v1.MutableOfferDataModel; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.btc.wallet.BsqWalletService; @@ -27,13 +27,14 @@ import bisq.core.btc.wallet.Restrictions; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.TradeCurrency; -import bisq.core.offer.CreateOfferService; -import bisq.core.offer.MutableOfferPayloadFields; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; import bisq.core.offer.OpenOffer; import bisq.core.offer.OpenOfferManager; +import bisq.core.offer.bisq_v1.CreateOfferService; +import bisq.core.offer.bisq_v1.MutableOfferPayloadFields; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.payment.PaymentAccount; import bisq.core.proto.persistable.CorePersistenceProtoResolver; import bisq.core.provider.fee.FeeService; @@ -147,7 +148,7 @@ public void applyOpenOffer(OpenOffer openOffer) { } @Override - public boolean initWithData(OfferPayload.Direction direction, TradeCurrency tradeCurrency) { + public boolean initWithData(OfferDirection direction, TradeCurrency tradeCurrency) { try { return super.initWithData(direction, tradeCurrency); } catch (NullPointerException e) { @@ -183,10 +184,11 @@ public void onStartEditOffer(ErrorMessageHandler errorMessageHandler) { } public void onPublishOffer(ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { - MutableOfferPayloadFields mutableOfferPayloadFields = - new MutableOfferPayloadFields(createAndGetOffer().getOfferPayload()); - final OfferPayload editedPayload = offerUtil.getMergedOfferPayload(openOffer, mutableOfferPayloadFields); - final Offer editedOffer = new Offer(editedPayload); + Offer offer = createAndGetOffer(); + OfferPayload offerPayload = offer.getOfferPayload().orElseThrow(); + var mutableOfferPayloadFields = new MutableOfferPayloadFields(offerPayload); + OfferPayload editedPayload = offerUtil.getMergedOfferPayload(openOffer, mutableOfferPayloadFields); + Offer editedOffer = new Offer(editedPayload); editedOffer.setPriceFeedService(priceFeedService); editedOffer.setState(Offer.State.AVAILABLE); openOfferManager.editOpenOfferPublish(editedOffer, triggerPrice, initialState, () -> { diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java index 2e1f80ca00b..3fe8ae92383 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java @@ -21,7 +21,7 @@ import bisq.desktop.common.view.FxmlView; import bisq.desktop.components.AutoTooltipButton; import bisq.desktop.components.BusyAnimation; -import bisq.desktop.main.offer.MutableOfferView; +import bisq.desktop.main.offer.bisq_v1.MutableOfferView; import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.main.overlays.windows.OfferDetailsWindow; @@ -145,7 +145,8 @@ public void applyOpenOffer(OpenOffer openOffer) { model.applyOpenOffer(openOffer); initWithData(openOffer.getOffer().getDirection(), - CurrencyUtil.getTradeCurrency(openOffer.getOffer().getCurrencyCode()).get()); + CurrencyUtil.getTradeCurrency(openOffer.getOffer().getCurrencyCode()).get(), + null); model.onStartEditOffer(errorMessage -> { log.error(errorMessage); diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferViewModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferViewModel.java index d4aab63268e..7f426770471 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferViewModel.java @@ -19,7 +19,7 @@ import bisq.desktop.Navigation; import bisq.desktop.main.PriceUtil; -import bisq.desktop.main.offer.MutableOfferViewModel; +import bisq.desktop.main.offer.bisq_v1.MutableOfferViewModel; import bisq.desktop.util.validation.AltcoinValidator; import bisq.desktop.util.validation.BsqValidator; import bisq.desktop.util.validation.BtcValidator; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesDataModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesDataModel.java index defd7613622..ea658e1f935 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesDataModel.java @@ -20,10 +20,10 @@ import bisq.desktop.common.model.ActivatableDataModel; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; -import bisq.core.trade.Trade; +import bisq.core.offer.OfferDirection; import bisq.core.trade.TradeManager; -import bisq.core.trade.failed.FailedTradesManager; +import bisq.core.trade.bisq_v1.FailedTradesManager; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.P2PService; @@ -77,7 +77,7 @@ public ObservableList getList() { return list; } - public OfferPayload.Direction getDirection(Offer offer) { + public OfferDirection getDirection(Offer offer) { return failedTradesManager.wasMyOffer(offer) ? offer.getDirection() : offer.getMirroredDirection(); } diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesListItem.java b/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesListItem.java index f16365e1d2e..52973a2316d 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesListItem.java @@ -17,7 +17,7 @@ package bisq.desktop.main.portfolio.failedtrades; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import lombok.Getter; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesView.java index bb51a1af07e..d4e97b02b97 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/failedtrades/FailedTradesView.java @@ -30,8 +30,8 @@ import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.common.config.Config; import bisq.common.util.Utilities; @@ -273,7 +273,8 @@ private void applyFilteredListPredicate(String filterString) { if (model.getDirectionLabel(item).contains(filterString)) { return true; } - if (offer.getOfferFeePaymentTxId().contains(filterString)) { + if (offer.getOfferFeePaymentTxId() != null && + offer.getOfferFeePaymentTxId().contains(filterString)) { return true; } diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersDataModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersDataModel.java index 8d71374f7d4..43dfc34ad06 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersDataModel.java @@ -20,10 +20,10 @@ import bisq.desktop.common.model.ActivatableDataModel; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OpenOffer; import bisq.core.offer.OpenOfferManager; -import bisq.core.offer.TriggerPriceService; +import bisq.core.offer.bisq_v1.TriggerPriceService; import bisq.core.provider.price.PriceFeedService; import bisq.common.handlers.ErrorMessageHandler; @@ -69,11 +69,15 @@ protected void deactivate() { priceFeedService.updateCounterProperty().removeListener(currenciesUpdateFlagPropertyListener); } - void onActivateOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + void onActivateOpenOffer(OpenOffer openOffer, + ResultHandler resultHandler, + ErrorMessageHandler errorMessageHandler) { openOfferManager.activateOpenOffer(openOffer, resultHandler, errorMessageHandler); } - void onDeactivateOpenOffer(OpenOffer openOffer, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { + void onDeactivateOpenOffer(OpenOffer openOffer, + ResultHandler resultHandler, + ErrorMessageHandler errorMessageHandler) { openOfferManager.deactivateOpenOffer(openOffer, resultHandler, errorMessageHandler); } @@ -86,7 +90,7 @@ public ObservableList getList() { return list; } - public OfferPayload.Direction getDirection(Offer offer) { + public OfferDirection getDirection(Offer offer) { return openOfferManager.isMyOffer(offer) ? offer.getDirection() : offer.getMirroredDirection(); } @@ -100,6 +104,7 @@ private void applyList() { } boolean wasTriggered(OpenOffer openOffer) { - return TriggerPriceService.wasTriggered(priceFeedService.getMarketPrice(openOffer.getOffer().getCurrencyCode()), openOffer); + return TriggerPriceService.wasTriggered(priceFeedService.getMarketPrice(openOffer.getOffer().getCurrencyCode()), + openOffer); } } diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersView.java index 4c08adef0b8..1fe99f88a28 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersView.java @@ -37,7 +37,7 @@ import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferPayloadBase; import bisq.core.offer.OpenOffer; import bisq.core.user.DontShowAgainLookup; @@ -122,7 +122,9 @@ public class OpenOffersView extends ActivatableViewAndModel widthListener; @Inject - public OpenOffersView(OpenOffersViewModel model, Navigation navigation, OfferDetailsWindow offerDetailsWindow) { + public OpenOffersView(OpenOffersViewModel model, + Navigation navigation, + OfferDetailsWindow offerDetailsWindow) { super(model); this.navigation = navigation; this.offerDetailsWindow = offerDetailsWindow; @@ -186,8 +188,9 @@ public void initialize() { MenuItem editItem = new MenuItem(Res.get("portfolio.context.offerLikeThis")); editItem.setOnAction((event) -> { try { - OfferPayload offerPayload = row.getItem().getOffer().getOfferPayload(); - navigation.navigateToWithData(offerPayload, MainView.class, PortfolioView.class, DuplicateOfferView.class); + OfferPayloadBase offerPayloadBase = row.getItem().getOffer().getOfferPayloadBase(); + navigation.navigateToWithData(offerPayloadBase, MainView.class, PortfolioView.class, + DuplicateOfferView.class); } catch (NullPointerException e) { log.warn("Unable to get offerPayload - {}", e.toString()); } @@ -347,7 +350,8 @@ private void applyFilteredListPredicate(String filterString) { if (model.getDirectionLabel(item).contains(filterString)) { return true; } - if (offer.getOfferFeePaymentTxId().contains(filterString)) { + if (offer.getOfferFeePaymentTxId() != null && + offer.getOfferFeePaymentTxId().contains(filterString)) { return true; } return false; @@ -442,7 +446,6 @@ public TableCell call(TableColumn offerDetailsWindow.show(item.getOffer())); @@ -472,7 +475,7 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { super.updateItem(item, empty); getStyleClass().removeAll("offer-disabled"); if (item != null) { - if (model.isDeactivated(item)) getStyleClass().add("offer-disabled"); + if (model.isNotPublished(item)) getStyleClass().add("offer-disabled"); setGraphic(new AutoTooltipLabel(model.getDate(item))); } else { setGraphic(null); @@ -497,7 +500,7 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { getStyleClass().removeAll("offer-disabled"); if (item != null) { - if (model.isDeactivated(item)) getStyleClass().add("offer-disabled"); + if (model.isNotPublished(item)) getStyleClass().add("offer-disabled"); setGraphic(new AutoTooltipLabel(model.getAmount(item))); } else { setGraphic(null); @@ -522,7 +525,7 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { getStyleClass().removeAll("offer-disabled"); if (item != null) { - if (model.isDeactivated(item)) getStyleClass().add("offer-disabled"); + if (model.isNotPublished(item)) getStyleClass().add("offer-disabled"); setGraphic(new AutoTooltipLabel(model.getPrice(item))); } else { setGraphic(null); @@ -547,7 +550,7 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { getStyleClass().removeAll("offer-disabled"); if (item != null) { - if (model.isDeactivated(item)) getStyleClass().add("offer-disabled"); + if (model.isNotPublished(item)) getStyleClass().add("offer-disabled"); AutoTooltipLabel autoTooltipLabel = new AutoTooltipLabel(model.getPriceDeviation(item)); autoTooltipLabel.setOpacity(item.getOffer().isUseMarketBasedPrice() ? 1 : 0.4); setGraphic(autoTooltipLabel); @@ -573,7 +576,7 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { super.updateItem(item, empty); getStyleClass().removeAll("offer-disabled"); if (item != null) { - if (model.isDeactivated(item)) getStyleClass().add("offer-disabled"); + if (model.isNotPublished(item)) getStyleClass().add("offer-disabled"); setGraphic(new AutoTooltipLabel(model.getTriggerPrice(item))); } else { setGraphic(null); @@ -598,7 +601,7 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { getStyleClass().removeAll("offer-disabled"); if (item != null) { - if (model.isDeactivated(item)) getStyleClass().add("offer-disabled"); + if (model.isNotPublished(item)) getStyleClass().add("offer-disabled"); setGraphic(new AutoTooltipLabel(model.getVolume(item))); } else { setGraphic(null); @@ -623,7 +626,7 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { getStyleClass().removeAll("offer-disabled"); if (item != null) { - if (model.isDeactivated(item)) getStyleClass().add("offer-disabled"); + if (model.isNotPublished(item)) getStyleClass().add("offer-disabled"); setGraphic(new AutoTooltipLabel(model.getPaymentMethod(item))); } else { setGraphic(null); @@ -648,7 +651,7 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { getStyleClass().removeAll("offer-disabled"); if (item != null) { - if (model.isDeactivated(item)) getStyleClass().add("offer-disabled"); + if (model.isNotPublished(item)) getStyleClass().add("offer-disabled"); setGraphic(new AutoTooltipLabel(model.getDirectionLabel(item))); } else { setGraphic(null); @@ -673,7 +676,7 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { getStyleClass().removeAll("offer-disabled"); if (item != null) { - if (model.isDeactivated(item)) getStyleClass().add("offer-disabled"); + if (model.isNotPublished(item)) getStyleClass().add("offer-disabled"); setGraphic(new AutoTooltipLabel(model.getMarketLabel(item))); } else { setGraphic(null); @@ -827,9 +830,9 @@ public void updateItem(final OpenOfferListItem item, boolean empty) { if (button == null) { button = getRegularIconButton(MaterialDesignIcon.PENCIL); button.setTooltip(new Tooltip(Res.get("shared.editOffer"))); + button.setOnAction(event -> onEditOpenOffer(item.getOpenOffer())); setGraphic(button); } - button.setOnAction(event -> onEditOpenOffer(item.getOpenOffer())); } else { setGraphic(null); if (button != null) { diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersViewModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersViewModel.java index 9a2e12b7d1d..7dbc5be252d 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/openoffer/OpenOffersViewModel.java @@ -160,8 +160,14 @@ String getDate(OpenOfferListItem item) { return DisplayUtils.formatDateTime(item.getOffer().getDate()); } + boolean isNotPublished(OpenOfferListItem item) { + return isDeactivated(item); + } + boolean isDeactivated(OpenOfferListItem item) { - return item != null && item.getOpenOffer() != null && item.getOpenOffer().isDeactivated(); + return item != null && + item.getOpenOffer() != null && + item.getOpenOffer().isDeactivated(); } boolean isBootstrappedOrShowPopup() { diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesDataModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesDataModel.java index b43a4ca52d9..818c8a189db 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesDataModel.java @@ -34,7 +34,7 @@ import bisq.core.dao.DaoFacade; import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.support.SupportType; @@ -47,14 +47,14 @@ import bisq.core.support.dispute.refund.RefundManager; import bisq.core.support.messages.ChatMessage; import bisq.core.support.traderchat.TraderChatManager; -import bisq.core.trade.BuyerTrade; -import bisq.core.trade.SellerTrade; -import bisq.core.trade.Trade; -import bisq.core.trade.TradeDataValidation; import bisq.core.trade.TradeManager; -import bisq.core.trade.protocol.BuyerProtocol; -import bisq.core.trade.protocol.DisputeProtocol; -import bisq.core.trade.protocol.SellerProtocol; +import bisq.core.trade.bisq_v1.TradeDataValidation; +import bisq.core.trade.model.bisq_v1.BuyerTrade; +import bisq.core.trade.model.bisq_v1.SellerTrade; +import bisq.core.trade.model.bisq_v1.Trade; +import bisq.core.trade.protocol.bisq_v1.BuyerProtocol; +import bisq.core.trade.protocol.bisq_v1.DisputeProtocol; +import bisq.core.trade.protocol.bisq_v1.SellerProtocol; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; @@ -380,7 +380,9 @@ public String getReference() { private void onListChanged() { list.clear(); - list.addAll(tradeManager.getObservableList().stream().map(PendingTradesListItem::new).collect(Collectors.toList())); + list.addAll(tradeManager.getObservableList().stream() + .map(PendingTradesListItem::new) + .collect(Collectors.toList())); // we sort by date, earliest first list.sort((o1, o2) -> o2.getTrade().getDate().compareTo(o1.getTrade().getDate())); @@ -534,7 +536,7 @@ private void doOpenDispute(boolean isSupportTicket, Transaction depositTx) { Dispute dispute = new Dispute(new Date().getTime(), trade.getId(), pubKeyRing.hashCode(), // traderId - (offer.getDirection() == OfferPayload.Direction.BUY) == isMaker, + (offer.getDirection() == OfferDirection.BUY) == isMaker, isMaker, pubKeyRing, trade.getDate().getTime(), @@ -595,7 +597,7 @@ private void doOpenDispute(boolean isSupportTicket, Transaction depositTx) { Dispute dispute = new Dispute(new Date().getTime(), trade.getId(), pubKeyRing.hashCode(), // traderId - (offer.getDirection() == OfferPayload.Direction.BUY) == isMaker, + (offer.getDirection() == OfferDirection.BUY) == isMaker, isMaker, pubKeyRing, trade.getDate().getTime(), diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesListItem.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesListItem.java index fbc3035b1b1..7d83e636924 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesListItem.java @@ -19,7 +19,7 @@ import bisq.core.monetary.Price; import bisq.core.monetary.Volume; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import org.bitcoinj.core.Coin; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java index a0ef8130d67..3dba7186c9f 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesView.java @@ -35,13 +35,13 @@ import bisq.core.alert.PrivateNotificationManager; import bisq.core.locale.Res; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.support.dispute.mediation.MediationResultState; import bisq.core.support.messages.ChatMessage; import bisq.core.support.traderchat.TradeChatSession; import bisq.core.support.traderchat.TraderChatManager; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; import bisq.core.util.VolumeUtil; @@ -235,7 +235,7 @@ public void initialize() { MenuItem editItem = new MenuItem(Res.get("portfolio.context.offerLikeThis")); editItem.setOnAction((event) -> { try { - OfferPayload offerPayload = row.getItem().getTrade().getOffer().getOfferPayload(); + OfferPayload offerPayload = row.getItem().getTrade().getOffer().getOfferPayload().orElseThrow(); if (offerPayload.getPubKeyRing().equals(keyRing.getPubKeyRing())) { navigation.navigateToWithData(offerPayload, MainView.class, PortfolioView.class, DuplicateOfferView.class); } else { @@ -368,7 +368,7 @@ private void updateMoveTradeToFailedColumnState() { private boolean isMaybeInvalidTrade(Trade trade) { return trade.hasErrorMessage() || - (Trade.Phase.DEPOSIT_PUBLISHED.ordinal() <= trade.getPhase().ordinal() && trade.isTxChainInvalid()); + (Trade.Phase.DEPOSIT_PUBLISHED.ordinal() <= trade.getTradePhase().ordinal() && trade.isTxChainInvalid()); } private void onMoveInvalidTradeToFailedTrades(Trade trade) { @@ -389,7 +389,7 @@ private void onMoveInvalidTradeToFailedTrades(Trade trade) { private void onShowInfoForInvalidTrade(Trade trade) { new Popup().width(900).attention(Res.get("portfolio.pending.failedTrade.info.popup", - getInvalidTradeDetails(trade))) + getInvalidTradeDetails(trade))) .show(); } diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesViewModel.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesViewModel.java index 21407c5fe42..91d059a916a 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/PendingTradesViewModel.java @@ -32,10 +32,10 @@ import bisq.core.offer.OfferUtil; import bisq.core.provider.fee.FeeService; import bisq.core.provider.mempool.MempoolService; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; -import bisq.core.trade.TradeUtil; -import bisq.core.trade.closed.ClosedTradableManager; +import bisq.core.trade.bisq_v1.ClosedTradableManager; +import bisq.core.trade.bisq_v1.TradeUtil; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.User; import bisq.core.util.FormattingUtils; import bisq.core.util.VolumeUtil; @@ -433,8 +433,8 @@ private void onTradeStateChanged(Trade.State tradeState) { // #################### Phase DEPOSIT_PAID - // DEPOSIT_TX_PUBLISHED_MSG - // seller perspective + // DEPOSIT_TX_PUBLISHED_MSG + // seller perspective case SELLER_PUBLISHED_DEPOSIT_TX: // buyer perspective case BUYER_RECEIVED_DEPOSIT_TX_PUBLISHED_MSG: diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/TradeStepInfo.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/TradeStepInfo.java index 61508824984..c9f53e75cb3 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/TradeStepInfo.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/TradeStepInfo.java @@ -21,7 +21,7 @@ import bisq.desktop.components.TitledGroupBg; import bisq.core.locale.Res; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/TradeSubView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/TradeSubView.java index 8f0f9d76aee..379ae4da8c9 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/TradeSubView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/TradeSubView.java @@ -24,7 +24,7 @@ import bisq.desktop.util.Layout; import bisq.core.locale.Res; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import javafx.scene.control.Label; import javafx.scene.control.Separator; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/TradeStepView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/TradeStepView.java index 1c39db14780..46036e62e74 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/TradeStepView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/TradeStepView.java @@ -31,8 +31,8 @@ import bisq.core.support.dispute.Dispute; import bisq.core.support.dispute.DisputeResult; import bisq.core.support.dispute.mediation.MediationResultState; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.DontShowAgainLookup; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; @@ -570,7 +570,7 @@ protected boolean hasSelfAccepted() { } private boolean peerAccepted() { - return trade.getProcessModel().getTradingPeer().getMediatedPayoutTxSignature() != null; + return trade.getProcessModel().getTradePeer().getMediatedPayoutTxSignature() != null; } private void openMediationResultPopup(String headLine) { @@ -735,7 +735,7 @@ private void checkIfLockTimeIsOver() { } protected void checkForTimeout() { - long unconfirmedHours = Duration.between(trade.getTakeOfferDate().toInstant(), Instant.now()).toHours(); + long unconfirmedHours = Duration.between(trade.getDate().toInstant(), Instant.now()).toHours(); if (unconfirmedHours >= 3 && !trade.hasFailed()) { String key = "tradeUnconfirmedTooLong_" + trade.getShortId(); if (DontShowAgainLookup.showAgain(key)) { diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep1View.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep1View.java index 809b9a5c131..4665dd7e577 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep1View.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep1View.java @@ -22,7 +22,7 @@ import bisq.desktop.main.portfolio.pendingtrades.steps.TradeStepView; import bisq.core.locale.Res; -import bisq.core.trade.TradeDataValidation; +import bisq.core.trade.bisq_v1.TradeDataValidation; public class BuyerStep1View extends TradeStepView { diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java index 4d58c9e0526..137727790d4 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java @@ -97,8 +97,8 @@ import bisq.core.payment.payload.SwiftAccountPayload; import bisq.core.payment.payload.USPostalMoneyOrderAccountPayload; import bisq.core.payment.payload.WesternUnionAccountPayload; -import bisq.core.trade.Trade; -import bisq.core.trade.TradeDataValidation; +import bisq.core.trade.bisq_v1.TradeDataValidation; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.DontShowAgainLookup; import bisq.core.util.VolumeUtil; diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep1View.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep1View.java index eb7129344ed..9696afdf305 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep1View.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep1View.java @@ -22,7 +22,7 @@ import bisq.desktop.main.portfolio.pendingtrades.steps.TradeStepView; import bisq.core.locale.Res; -import bisq.core.trade.TradeDataValidation; +import bisq.core.trade.bisq_v1.TradeDataValidation; public class SellerStep1View extends TradeStepView { diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java index 66fb0a16a0f..9127c74967c 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java @@ -42,8 +42,8 @@ import bisq.core.payment.payload.SepaInstantAccountPayload; import bisq.core.payment.payload.USPostalMoneyOrderAccountPayload; import bisq.core.payment.payload.WesternUnionAccountPayload; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.trade.txproof.AssetTxProofResult; import bisq.core.user.DontShowAgainLookup; import bisq.core.util.VolumeUtil; diff --git a/desktop/src/main/java/bisq/desktop/main/presentation/DaoPresentation.java b/desktop/src/main/java/bisq/desktop/main/presentation/DaoPresentation.java index 27e2be22133..48540bd1752 100644 --- a/desktop/src/main/java/bisq/desktop/main/presentation/DaoPresentation.java +++ b/desktop/src/main/java/bisq/desktop/main/presentation/DaoPresentation.java @@ -31,7 +31,6 @@ @Singleton public class DaoPresentation implements DaoStateListener { - public static final String DAO_NEWS = "daoNewsVersion1.0.0"; private final Preferences preferences; diff --git a/desktop/src/main/java/bisq/desktop/main/support/dispute/DisputeView.java b/desktop/src/main/java/bisq/desktop/main/support/dispute/DisputeView.java index f55ac5a6a5d..0447bc9eafc 100644 --- a/desktop/src/main/java/bisq/desktop/main/support/dispute/DisputeView.java +++ b/desktop/src/main/java/bisq/desktop/main/support/dispute/DisputeView.java @@ -52,9 +52,9 @@ import bisq.core.support.dispute.mediation.mediator.MediatorManager; import bisq.core.support.dispute.refund.refundagent.RefundAgentManager; import bisq.core.support.messages.ChatMessage; -import bisq.core.trade.Contract; -import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; +import bisq.core.trade.model.bisq_v1.Contract; +import bisq.core.trade.model.bisq_v1.Trade; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; import bisq.core.util.coin.CoinFormatter; diff --git a/desktop/src/main/java/bisq/desktop/main/support/dispute/agent/DisputeAgentView.java b/desktop/src/main/java/bisq/desktop/main/support/dispute/agent/DisputeAgentView.java index e7ed03bf36a..dc0f5baedcf 100644 --- a/desktop/src/main/java/bisq/desktop/main/support/dispute/agent/DisputeAgentView.java +++ b/desktop/src/main/java/bisq/desktop/main/support/dispute/agent/DisputeAgentView.java @@ -34,8 +34,8 @@ import bisq.core.support.dispute.agent.MultipleHolderNameDetection; import bisq.core.support.dispute.mediation.mediator.MediatorManager; import bisq.core.support.dispute.refund.refundagent.RefundAgentManager; -import bisq.core.trade.TradeDataValidation; import bisq.core.trade.TradeManager; +import bisq.core.trade.bisq_v1.TradeDataValidation; import bisq.core.user.DontShowAgainLookup; import bisq.core.user.Preferences; import bisq.core.util.coin.CoinFormatter; @@ -64,7 +64,7 @@ import org.jetbrains.annotations.NotNull; -import static bisq.core.trade.TradeDataValidation.ValidationException; +import static bisq.core.trade.bisq_v1.TradeDataValidation.ValidationException; import static bisq.desktop.util.FormBuilder.getIconForLabel; public abstract class DisputeAgentView extends DisputeView implements MultipleHolderNameDetection.Listener { diff --git a/desktop/src/main/java/bisq/desktop/main/support/dispute/client/mediation/MediationClientView.java b/desktop/src/main/java/bisq/desktop/main/support/dispute/client/mediation/MediationClientView.java index 0594e9895e2..f967623e833 100644 --- a/desktop/src/main/java/bisq/desktop/main/support/dispute/client/mediation/MediationClientView.java +++ b/desktop/src/main/java/bisq/desktop/main/support/dispute/client/mediation/MediationClientView.java @@ -35,8 +35,8 @@ import bisq.core.support.dispute.mediation.MediationSession; import bisq.core.support.dispute.mediation.mediator.MediatorManager; import bisq.core.support.dispute.refund.refundagent.RefundAgentManager; -import bisq.core.trade.Contract; import bisq.core.trade.TradeManager; +import bisq.core.trade.model.bisq_v1.Contract; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; import bisq.core.util.coin.CoinFormatter; diff --git a/desktop/src/main/java/bisq/desktop/main/support/dispute/client/refund/RefundClientView.java b/desktop/src/main/java/bisq/desktop/main/support/dispute/client/refund/RefundClientView.java index 0efcfb38ae2..79446c12616 100644 --- a/desktop/src/main/java/bisq/desktop/main/support/dispute/client/refund/RefundClientView.java +++ b/desktop/src/main/java/bisq/desktop/main/support/dispute/client/refund/RefundClientView.java @@ -33,8 +33,8 @@ import bisq.core.support.dispute.refund.RefundManager; import bisq.core.support.dispute.refund.RefundSession; import bisq.core.support.dispute.refund.refundagent.RefundAgentManager; -import bisq.core.trade.Contract; import bisq.core.trade.TradeManager; +import bisq.core.trade.model.bisq_v1.Contract; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; import bisq.core.util.coin.CoinFormatter; diff --git a/desktop/src/main/java/bisq/desktop/util/DisplayUtils.java b/desktop/src/main/java/bisq/desktop/util/DisplayUtils.java index b74bffc8f39..e3ebb02d566 100644 --- a/desktop/src/main/java/bisq/desktop/util/DisplayUtils.java +++ b/desktop/src/main/java/bisq/desktop/util/DisplayUtils.java @@ -6,7 +6,7 @@ import bisq.core.monetary.Price; import bisq.core.monetary.Volume; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.util.FormattingUtils; import bisq.core.util.ParsingUtils; import bisq.core.util.VolumeUtil; @@ -89,21 +89,21 @@ public static String booleanToYesNo(boolean value) { // Offer direction /////////////////////////////////////////////////////////////////////////////////////////// - public static String getDirectionWithCode(OfferPayload.Direction direction, String currencyCode) { + public static String getDirectionWithCode(OfferDirection direction, String currencyCode) { if (CurrencyUtil.isFiatCurrency(currencyCode)) - return (direction == OfferPayload.Direction.BUY) ? Res.get("shared.buyCurrency", Res.getBaseCurrencyCode()) : Res.get("shared.sellCurrency", Res.getBaseCurrencyCode()); + return (direction == OfferDirection.BUY) ? Res.get("shared.buyCurrency", Res.getBaseCurrencyCode()) : Res.get("shared.sellCurrency", Res.getBaseCurrencyCode()); else - return (direction == OfferPayload.Direction.SELL) ? Res.get("shared.buyCurrency", currencyCode) : Res.get("shared.sellCurrency", currencyCode); + return (direction == OfferDirection.SELL) ? Res.get("shared.buyCurrency", currencyCode) : Res.get("shared.sellCurrency", currencyCode); } - public static String getDirectionBothSides(OfferPayload.Direction direction, String currencyCode) { + public static String getDirectionBothSides(OfferDirection direction, String currencyCode) { if (CurrencyUtil.isFiatCurrency(currencyCode)) { currencyCode = Res.getBaseCurrencyCode(); - return direction == OfferPayload.Direction.BUY ? + return direction == OfferDirection.BUY ? Res.get("formatter.makerTaker", currencyCode, Res.get("shared.buyer"), currencyCode, Res.get("shared.seller")) : Res.get("formatter.makerTaker", currencyCode, Res.get("shared.seller"), currencyCode, Res.get("shared.buyer")); } else { - return direction == OfferPayload.Direction.SELL ? + return direction == OfferDirection.SELL ? Res.get("formatter.makerTaker", currencyCode, Res.get("shared.buyer"), currencyCode, Res.get("shared.seller")) : Res.get("formatter.makerTaker", currencyCode, Res.get("shared.seller"), currencyCode, Res.get("shared.buyer")); } @@ -135,28 +135,28 @@ public static String getDirectionForSeller(boolean isMyOffer, String currencyCod } } - public static String getDirectionForTakeOffer(OfferPayload.Direction direction, String currencyCode) { + public static String getDirectionForTakeOffer(OfferDirection direction, String currencyCode) { String baseCurrencyCode = Res.getBaseCurrencyCode(); if (CurrencyUtil.isFiatCurrency(currencyCode)) { - return direction == OfferPayload.Direction.BUY ? + return direction == OfferDirection.BUY ? Res.get("formatter.youAre", Res.get("shared.selling"), baseCurrencyCode, Res.get("shared.buying"), currencyCode) : Res.get("formatter.youAre", Res.get("shared.buying"), baseCurrencyCode, Res.get("shared.selling"), currencyCode); } else { - return direction == OfferPayload.Direction.SELL ? + return direction == OfferDirection.SELL ? Res.get("formatter.youAre", Res.get("shared.selling"), currencyCode, Res.get("shared.buying"), baseCurrencyCode) : Res.get("formatter.youAre", Res.get("shared.buying"), currencyCode, Res.get("shared.selling"), baseCurrencyCode); } } - public static String getOfferDirectionForCreateOffer(OfferPayload.Direction direction, String currencyCode) { + public static String getOfferDirectionForCreateOffer(OfferDirection direction, String currencyCode) { String baseCurrencyCode = Res.getBaseCurrencyCode(); if (CurrencyUtil.isFiatCurrency(currencyCode)) { - return direction == OfferPayload.Direction.BUY ? + return direction == OfferDirection.BUY ? Res.get("formatter.youAreCreatingAnOffer.fiat", Res.get("shared.buy"), baseCurrencyCode) : Res.get("formatter.youAreCreatingAnOffer.fiat", Res.get("shared.sell"), baseCurrencyCode); } else { - return direction == OfferPayload.Direction.SELL ? + return direction == OfferDirection.SELL ? Res.get("formatter.youAreCreatingAnOffer.altcoin", Res.get("shared.buy"), currencyCode, Res.get("shared.selling"), baseCurrencyCode) : Res.get("formatter.youAreCreatingAnOffer.altcoin", Res.get("shared.sell"), currencyCode, Res.get("shared.buying"), baseCurrencyCode); } diff --git a/desktop/src/main/java/bisq/desktop/util/FormBuilder.java b/desktop/src/main/java/bisq/desktop/util/FormBuilder.java index 6961273312f..fe064aedcdc 100644 --- a/desktop/src/main/java/bisq/desktop/util/FormBuilder.java +++ b/desktop/src/main/java/bisq/desktop/util/FormBuilder.java @@ -1293,6 +1293,29 @@ public static Tuple2 getTopLabelWithVBox(String title, Node node) { return new Tuple2<>(label, vBox); } + public static Tuple3 addTopLabelTextFieldWithHbox(GridPane gridPane, + int rowIndex, + String titleTextfield, + double top) { + HBox hBox = new HBox(); + hBox.setSpacing(10); + + TextField textField = new BisqTextField(); + + final VBox topLabelVBox = getTopLabelVBox(5); + final Label topLabel = getTopLabel(titleTextfield); + topLabelVBox.getChildren().addAll(topLabel, textField); + + hBox.getChildren().addAll(topLabelVBox); + + GridPane.setRowIndex(hBox, rowIndex); + GridPane.setMargin(hBox, new Insets(top, 0, 0, 0)); + gridPane.getChildren().add(hBox); + + return new Tuple3<>(topLabel, textField, hBox); + } + + /////////////////////////////////////////////////////////////////////////////////////////// // Label + ComboBox /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/desktop/src/main/java/bisq/desktop/util/GUIUtil.java b/desktop/src/main/java/bisq/desktop/util/GUIUtil.java index 7afd59cb530..506721aaf32 100644 --- a/desktop/src/main/java/bisq/desktop/util/GUIUtil.java +++ b/desktop/src/main/java/bisq/desktop/util/GUIUtil.java @@ -583,7 +583,7 @@ protected void updateItem(PaymentMethod method, boolean empty) { HBox box = new HBox(); box.setSpacing(20); Label paymentType = new AutoTooltipLabel( - method.isAsset() ? Res.get("shared.crypto") : Res.get("shared.fiat")); + method.isAltcoin() ? Res.get("shared.crypto") : Res.get("shared.fiat")); paymentType.getStyleClass().add("currency-label-small"); Label paymentMethod = new AutoTooltipLabel(Res.get(id)); @@ -835,7 +835,7 @@ public static boolean isChainHeightSyncedWithinToleranceOrShowPopup(WalletsSetup return true; } - public static boolean canCreateOrTakeOfferOrShowPopup(User user, Navigation navigation) { + public static boolean canCreateOrTakeOfferOrShowPopup(User user, Navigation navigation, TradeCurrency currency) { if (!user.hasAcceptedRefundAgents()) { new Popup().warning(Res.get("popup.warning.noArbitratorsAvailable")).show(); return false; diff --git a/desktop/src/test/java/bisq/desktop/main/funds/transactions/TransactionAwareTradableFactoryTest.java b/desktop/src/test/java/bisq/desktop/main/funds/transactions/TransactionAwareTradableFactoryTest.java index 86a62b28d24..38a86b5290c 100644 --- a/desktop/src/test/java/bisq/desktop/main/funds/transactions/TransactionAwareTradableFactoryTest.java +++ b/desktop/src/test/java/bisq/desktop/main/funds/transactions/TransactionAwareTradableFactoryTest.java @@ -19,8 +19,8 @@ import bisq.core.offer.OpenOffer; import bisq.core.support.dispute.arbitration.ArbitrationManager; -import bisq.core.trade.Tradable; -import bisq.core.trade.Trade; +import bisq.core.trade.model.Tradable; +import bisq.core.trade.model.bisq_v1.Trade; import org.bitcoinj.core.Transaction; diff --git a/desktop/src/test/java/bisq/desktop/main/funds/transactions/TransactionAwareTradeTest.java b/desktop/src/test/java/bisq/desktop/main/funds/transactions/TransactionAwareTradeTest.java index 4552c9bc1cc..c682ed3b344 100644 --- a/desktop/src/test/java/bisq/desktop/main/funds/transactions/TransactionAwareTradeTest.java +++ b/desktop/src/test/java/bisq/desktop/main/funds/transactions/TransactionAwareTradeTest.java @@ -21,7 +21,7 @@ import bisq.core.support.dispute.Dispute; import bisq.core.support.dispute.arbitration.ArbitrationManager; import bisq.core.support.dispute.refund.RefundManager; -import bisq.core.trade.Trade; +import bisq.core.trade.model.bisq_v1.Trade; import org.bitcoinj.core.Sha256Hash; import org.bitcoinj.core.Transaction; diff --git a/desktop/src/test/java/bisq/desktop/main/market/trades/TradesChartsViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/market/trades/TradesChartsViewModelTest.java index 470c86b853b..3fc291f2739 100644 --- a/desktop/src/test/java/bisq/desktop/main/market/trades/TradesChartsViewModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/market/trades/TradesChartsViewModelTest.java @@ -22,7 +22,7 @@ import bisq.core.locale.FiatCurrency; import bisq.core.monetary.Price; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.payment.payload.PaymentMethod; import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.statistics.TradeStatistics3; diff --git a/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferDataModelTest.java b/desktop/src/test/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferDataModelTest.java similarity index 92% rename from desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferDataModelTest.java rename to desktop/src/test/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferDataModelTest.java index 691da7676bb..17b8ea3c064 100644 --- a/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferDataModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferDataModelTest.java @@ -1,4 +1,4 @@ -package bisq.desktop.main.offer.createoffer; +package bisq.desktop.main.offer.bisq_v1.createoffer; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BtcWalletService; @@ -6,8 +6,9 @@ import bisq.core.locale.FiatCurrency; import bisq.core.locale.GlobalSettings; import bisq.core.locale.Res; -import bisq.core.offer.CreateOfferService; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; +import bisq.core.offer.bisq_v1.CreateOfferService; import bisq.core.payment.ClearXchangeAccount; import bisq.core.payment.PaymentAccount; import bisq.core.payment.RevolutAccount; @@ -22,12 +23,10 @@ import javafx.collections.FXCollections; import java.util.HashSet; -import java.util.UUID; import org.junit.Before; import org.junit.Test; -import static bisq.core.offer.OfferPayload.Direction; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -35,7 +34,6 @@ import static org.mockito.Mockito.when; public class CreateOfferDataModelTest { - private CreateOfferDataModel model; private User user; private Preferences preferences; @@ -60,7 +58,6 @@ public void setUp() { when(btcWalletService.getOrCreateAddressEntry(anyString(), any())).thenReturn(addressEntry); when(preferences.isUsePercentageBasedPrice()).thenReturn(true); when(preferences.getBuyerSecurityDepositAsPercent(null)).thenReturn(0.01); - when(createOfferService.getRandomOfferId()).thenReturn(UUID.randomUUID().toString()); when(tradeStats.getObservableTradeStatisticsSet()).thenReturn(FXCollections.observableSet()); model = new CreateOfferDataModel(createOfferService, @@ -97,7 +94,7 @@ public void testUseTradeCurrencySetInOfferViewWhenInPaymentAccountAvailable() { when(preferences.getSelectedPaymentAccountForCreateOffer()).thenReturn(revolutAccount); when(offerUtil.getMakerFee(any())).thenReturn(Coin.ZERO); - model.initWithData(Direction.BUY, new FiatCurrency("USD")); + model.initWithData(OfferDirection.BUY, new FiatCurrency("USD")); assertEquals("USD", model.getTradeCurrencyCode().get()); } @@ -119,7 +116,7 @@ public void testUseTradeAccountThatMatchesTradeCurrencySetInOffer() { when(preferences.getSelectedPaymentAccountForCreateOffer()).thenReturn(revolutAccount); when(offerUtil.getMakerFee(any())).thenReturn(Coin.ZERO); - model.initWithData(Direction.BUY, new FiatCurrency("USD")); + model.initWithData(OfferDirection.BUY, new FiatCurrency("USD")); assertEquals("USD", model.getTradeCurrencyCode().get()); } } diff --git a/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferViewModelTest.java similarity index 95% rename from desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java rename to desktop/src/test/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferViewModelTest.java index f82c5636e04..958d2a498b2 100644 --- a/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/offer/bisq_v1/createoffer/CreateOfferViewModelTest.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.offer.createoffer; +package bisq.desktop.main.offer.bisq_v1.createoffer; import bisq.desktop.util.validation.AltcoinValidator; import bisq.desktop.util.validation.BtcValidator; @@ -30,8 +30,9 @@ import bisq.core.locale.CryptoCurrency; import bisq.core.locale.GlobalSettings; import bisq.core.locale.Res; -import bisq.core.offer.CreateOfferService; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; +import bisq.core.offer.bisq_v1.CreateOfferService; import bisq.core.payment.PaymentAccount; import bisq.core.payment.payload.PaymentMethod; import bisq.core.provider.fee.FeeService; @@ -55,12 +56,9 @@ import java.time.Instant; -import java.util.UUID; - import org.junit.Before; import org.junit.Test; -import static bisq.core.offer.OfferPayload.Direction; import static bisq.desktop.maker.PreferenceMakers.empty; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -117,8 +115,7 @@ public void setUp() { when(accountAgeWitnessService.getMyTradeLimit(any(), any(), any())).thenReturn(100000000L); when(preferences.getUserCountry()).thenReturn(new Country("ES", "Spain", null)); when(bsqFormatter.formatCoin(any())).thenReturn("0"); - when(bsqWalletService.getAvailableConfirmedBalance()).thenReturn(Coin.ZERO); - when(createOfferService.getRandomOfferId()).thenReturn(UUID.randomUUID().toString()); + when(bsqWalletService.getAvailableBalance()).thenReturn(Coin.ZERO); when(tradeStats.getObservableTradeStatisticsSet()).thenReturn(FXCollections.observableSet()); CreateOfferDataModel dataModel = new CreateOfferDataModel(createOfferService, @@ -135,7 +132,7 @@ public void setUp() { coinFormatter, tradeStats, null); - dataModel.initWithData(Direction.BUY, new CryptoCurrency("BTC", "bitcoin")); + dataModel.initWithData(OfferDirection.BUY, new CryptoCurrency("BTC", "bitcoin")); dataModel.activate(); model = new CreateOfferViewModel(dataModel, diff --git a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookListItemMaker.java b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookListItemMaker.java index 55b243aa82c..58599f20f4c 100644 --- a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookListItemMaker.java +++ b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookListItemMaker.java @@ -19,7 +19,7 @@ import bisq.desktop.maker.OfferMaker; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import com.natpryce.makeiteasy.Instantiator; import com.natpryce.makeiteasy.MakeItEasy; @@ -37,7 +37,7 @@ public class OfferBookListItemMaker { public static final Property price = new Property<>(); public static final Property amount = new Property<>(); public static final Property minAmount = new Property<>(); - public static final Property direction = new Property<>(); + public static final Property direction = new Property<>(); public static final Property useMarketBasedPrice = new Property<>(); public static final Property marketPriceMargin = new Property<>(); public static final Property baseCurrencyCode = new Property<>(); @@ -48,7 +48,7 @@ public class OfferBookListItemMaker { MakeItEasy.with(OfferMaker.price, lookup.valueOf(price, 100000L)), with(OfferMaker.amount, lookup.valueOf(amount, 100000L)), with(OfferMaker.minAmount, lookup.valueOf(amount, 100000L)), - with(OfferMaker.direction, lookup.valueOf(direction, OfferPayload.Direction.BUY)), + with(OfferMaker.direction, lookup.valueOf(direction, OfferDirection.BUY)), with(OfferMaker.useMarketBasedPrice, lookup.valueOf(useMarketBasedPrice, false)), with(OfferMaker.marketPriceMargin, lookup.valueOf(marketPriceMargin, 0.0)), with(OfferMaker.baseCurrencyCode, lookup.valueOf(baseCurrencyCode, "BTC")), @@ -63,7 +63,7 @@ public class OfferBookListItemMaker { with(OfferMaker.amount, lookup.valueOf(amount, 200000L))))); public static final Maker btcBuyItem = a(OfferBookListItem); - public static final Maker btcSellItem = a(OfferBookListItem, with(direction, OfferPayload.Direction.SELL)); + public static final Maker btcSellItem = a(OfferBookListItem, with(direction, OfferDirection.SELL)); public static final Maker btcItemWithRange = a(OfferBookListItemWithRange); } diff --git a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java index 33c55512485..5cc3d4aafeb 100644 --- a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java @@ -25,8 +25,8 @@ import bisq.core.locale.GlobalSettings; import bisq.core.locale.Res; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; import bisq.core.offer.OpenOfferManager; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.payment.AliPayAccount; import bisq.core.payment.CountryBasedPaymentAccount; import bisq.core.payment.CryptoCurrencyAccount; diff --git a/desktop/src/test/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModelTest.java b/desktop/src/test/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModelTest.java index d0b4b01cac6..83bddc34925 100644 --- a/desktop/src/test/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/portfolio/editoffer/EditOfferDataModelTest.java @@ -10,10 +10,10 @@ import bisq.core.locale.CryptoCurrency; import bisq.core.locale.GlobalSettings; import bisq.core.locale.Res; -import bisq.core.offer.CreateOfferService; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; import bisq.core.offer.OpenOffer; +import bisq.core.offer.bisq_v1.CreateOfferService; import bisq.core.payment.CryptoCurrencyAccount; import bisq.core.payment.PaymentAccount; import bisq.core.provider.fee.FeeService; @@ -33,8 +33,6 @@ import java.time.Instant; -import java.util.UUID; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -94,8 +92,7 @@ public void setUp() { when(accountAgeWitnessService.getMyTradeLimit(any(), any(), any())).thenReturn(100000000L); when(preferences.getUserCountry()).thenReturn(new Country("US", "United States", null)); when(bsqFormatter.formatCoin(any())).thenReturn("0"); - when(bsqWalletService.getAvailableConfirmedBalance()).thenReturn(Coin.ZERO); - when(createOfferService.getRandomOfferId()).thenReturn(UUID.randomUUID().toString()); + when(bsqWalletService.getAvailableBalance()).thenReturn(Coin.ZERO); model = new EditOfferDataModel(createOfferService, null, @@ -129,6 +126,6 @@ public void testEditOfferOfRemovedAsset() { @Test public void testInitializeEditOfferWithRemovedAsset() { exception.expect(IllegalArgumentException.class); - model.initWithData(OfferPayload.Direction.BUY, null); + model.initWithData(OfferDirection.BUY, null); } } diff --git a/desktop/src/test/java/bisq/desktop/maker/OfferMaker.java b/desktop/src/test/java/bisq/desktop/maker/OfferMaker.java index 7e956c7bea0..3be4461afa8 100644 --- a/desktop/src/test/java/bisq/desktop/maker/OfferMaker.java +++ b/desktop/src/test/java/bisq/desktop/maker/OfferMaker.java @@ -18,7 +18,8 @@ package bisq.desktop.maker; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferDirection; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.network.p2p.NodeAddress; @@ -56,7 +57,7 @@ public class OfferMaker { public static final Property amount = newProperty(); public static final Property baseCurrencyCode = newProperty(); public static final Property counterCurrencyCode = newProperty(); - public static final Property direction = newProperty(); + public static final Property direction = newProperty(); public static final Property useMarketBasedPrice = newProperty(); public static final Property marketPriceMargin = newProperty(); public static final Property nodeAddress = newProperty(); @@ -78,7 +79,7 @@ public class OfferMaker { lookup.valueOf(date, currentTimeMillis()), lookup.valueOf(nodeAddress, getLocalHostNodeWithPort(10000)), lookup.valueOf(pubKeyRing, genPubKeyRing()), - lookup.valueOf(direction, OfferPayload.Direction.BUY), + lookup.valueOf(direction, OfferDirection.BUY), lookup.valueOf(price, 100000L), lookup.valueOf(marketPriceMargin, 0.0), lookup.valueOf(useMarketBasedPrice, false), diff --git a/desktop/src/test/java/bisq/desktop/util/DisplayUtilsTest.java b/desktop/src/test/java/bisq/desktop/util/DisplayUtilsTest.java index 3a233ce4ee8..1ed85c4e683 100644 --- a/desktop/src/test/java/bisq/desktop/util/DisplayUtilsTest.java +++ b/desktop/src/test/java/bisq/desktop/util/DisplayUtilsTest.java @@ -3,7 +3,7 @@ import bisq.core.locale.Res; import bisq.core.monetary.Volume; import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.core.util.VolumeUtil; import bisq.core.util.coin.CoinFormatter; import bisq.core.util.coin.ImmutableCoinFormatter; diff --git a/gradle/witness/gradle-witness.gradle b/gradle/witness/gradle-witness.gradle index f6f4df9659f..ca5ea906cd4 100644 --- a/gradle/witness/gradle-witness.gradle +++ b/gradle/witness/gradle-witness.gradle @@ -30,7 +30,7 @@ dependencyVerification { 'com.github.bisq-network.tor-binary:tor-binary-linux64:7f58d31dd684b2e361e2980ba23922cadd5d9d8f8dbab9b3a2c6737741b21f7e', 'com.github.bisq-network.tor-binary:tor-binary-macos:a23802ff66d4ac01366ebe712879e2f51df960572dc34db269588da87453a70d', 'com.github.bisq-network.tor-binary:tor-binary-windows:8e0dee7429228aa0c9f7a36f40f303a016ed8dfb40fea77382f7076c13fc27f1', - 'com.github.bisq-network:bitcoinj:59e4d2370fcbfe38f9f3f01f0830f4b5c0448cd27c867ea4eb23457a79d83c0b', + 'com.github.bisq-network:bitcoinj:eccd3b5250d40ac3147d0e087e856ebaa8665720351b802d30ac53cf17b559c5', 'com.github.bisq-network:jsonrpc4j:842b4a660440ef53cd436da2e21c3e1fed939b620a3fc7542307deb3e77fdeb6', 'com.github.ravn:jsocks:3c71600af027b2b6d4244e4ad14d98ff2352a379410daebefff5d8cd48d742a4', 'com.google.android:annotations:ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15', diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java b/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java index 8115c1015d2..368e9cb03c1 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java @@ -19,7 +19,8 @@ import bisq.monitor.Reporter; -import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferUtil; +import bisq.core.offer.bisq_v1.OfferPayload; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.network.Connection; @@ -144,10 +145,8 @@ private class VersionsStatistics extends Statistics { public void log(Object message) { if (message instanceof OfferPayload) { - OfferPayload currentMessage = (OfferPayload) message; - - String version = "v" + currentMessage.getId().substring(currentMessage.getId().lastIndexOf("-") + 1); - + OfferPayload offerPayload = (OfferPayload) message; + String version = "v" + OfferUtil.getVersionFromId(offerPayload.getId()); buckets.putIfAbsent(version, new Aggregator()); buckets.get(version).increment(); } diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java index 48c6089776e..ff4bb78b6f1 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java @@ -197,11 +197,6 @@ public void configure(Properties properties) { private static class Counter { private int value = 1; - /** - * atomic get and reset - * - * @return the current value - */ synchronized int getAndReset() { try { return value; diff --git a/p2p/src/main/java/bisq/network/p2p/network/Connection.java b/p2p/src/main/java/bisq/network/p2p/network/Connection.java index bedef3ed9ea..f4cb3a46298 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/Connection.java +++ b/p2p/src/main/java/bisq/network/p2p/network/Connection.java @@ -27,14 +27,13 @@ import bisq.network.p2p.storage.P2PDataStorage; import bisq.network.p2p.storage.messages.AddDataMessage; import bisq.network.p2p.storage.messages.AddPersistableNetworkPayloadMessage; +import bisq.network.p2p.storage.messages.RemoveDataMessage; import bisq.network.p2p.storage.payload.CapabilityRequiringPayload; import bisq.network.p2p.storage.payload.PersistableNetworkPayload; -import bisq.network.p2p.storage.payload.ProtectedStoragePayload; import bisq.common.Proto; import bisq.common.UserThread; import bisq.common.app.Capabilities; -import bisq.common.app.Capability; import bisq.common.app.HasCapabilities; import bisq.common.app.Version; import bisq.common.config.Config; @@ -70,17 +69,15 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Queue; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; import java.lang.ref.WeakReference; @@ -123,14 +120,12 @@ public static int getPermittedMessageSize() { /////////////////////////////////////////////////////////////////////////////////////////// private final Socket socket; - // private final MessageListener messageListener; private final ConnectionListener connectionListener; @Nullable private final NetworkFilter networkFilter; @Getter private final String uid; private final ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(runnable -> new Thread(runnable, "Connection.java executor-service")); - // holder of state shared between InputHandler and Connection @Getter private final Statistic statistic; @Getter @@ -221,10 +216,6 @@ public Capabilities getCapabilities() { return capabilities; } - private final Object lock = new Object(); - private final Queue queueOfBundles = new ConcurrentLinkedQueue<>(); - private final ScheduledExecutorService bundleSender = Executors.newSingleThreadScheduledExecutor(); - // Called from various threads public void sendMessage(NetworkEnvelope networkEnvelope) { long ts = System.currentTimeMillis(); @@ -242,7 +233,7 @@ public void sendMessage(NetworkEnvelope networkEnvelope) { return; } - if (!noCapabilityRequiredOrCapabilityIsSupported(networkEnvelope)) { + if (!testCapability(networkEnvelope)) { log.debug("Capability for networkEnvelope is required but not supported"); return; } @@ -257,58 +248,6 @@ public void sendMessage(NetworkEnvelope networkEnvelope) { getSendMsgThrottleTrigger(), getSendMsgThrottleSleep(), lastSendTimeStamp, now, elapsed, networkEnvelope.getClass().getSimpleName()); - // check if BundleOfEnvelopes is supported - if (getCapabilities().containsAll(new Capabilities(Capability.BUNDLE_OF_ENVELOPES))) { - synchronized (lock) { - // check if current envelope fits size - // - no? create new envelope - - int size = !queueOfBundles.isEmpty() ? queueOfBundles.element().toProtoNetworkEnvelope().getSerializedSize() + networkEnvelopeSize : 0; - if (queueOfBundles.isEmpty() || size > MAX_PERMITTED_MESSAGE_SIZE * 0.9) { - // - no? create a bucket - queueOfBundles.add(new BundleOfEnvelopes()); - - // - and schedule it for sending - lastSendTimeStamp += getSendMsgThrottleSleep(); - - bundleSender.schedule(() -> { - if (!stopped) { - synchronized (lock) { - BundleOfEnvelopes bundle = queueOfBundles.poll(); - if (bundle != null && !stopped) { - NetworkEnvelope envelope; - int msgSize; - if (bundle.getEnvelopes().size() == 1) { - envelope = bundle.getEnvelopes().get(0); - msgSize = envelope.toProtoNetworkEnvelope().getSerializedSize(); - } else { - envelope = bundle; - msgSize = networkEnvelopeSize; - } - try { - protoOutputStream.writeEnvelope(envelope); - UserThread.execute(() -> messageListeners.forEach(e -> e.onMessageSent(envelope, this))); - UserThread.execute(() -> connectionStatistics.addSendMsgMetrics(System.currentTimeMillis() - ts, msgSize)); - } catch (Throwable t) { - log.error("Sending envelope of class {} to address {} " + - "failed due {}", - envelope.getClass().getSimpleName(), - this.getPeersNodeAddressOptional(), - t.toString()); - log.error("envelope: {}", envelope); - } - } - } - } - }, lastSendTimeStamp - now, TimeUnit.MILLISECONDS); - } - - // - yes? add to bucket - queueOfBundles.element().add(networkEnvelope); - } - return; - } - Thread.sleep(getSendMsgThrottleSleep()); } @@ -324,41 +263,53 @@ public void sendMessage(NetworkEnvelope networkEnvelope) { } } - // TODO: If msg is BundleOfEnvelopes we should check each individual message for capability and filter out those - // which fail. - public boolean noCapabilityRequiredOrCapabilityIsSupported(Proto msg) { - boolean result; - if (msg instanceof AddDataMessage) { - final ProtectedStoragePayload protectedStoragePayload = (((AddDataMessage) msg).getProtectedStorageEntry()).getProtectedStoragePayload(); - result = !(protectedStoragePayload instanceof CapabilityRequiringPayload); - if (!result) - result = capabilities.containsAll(((CapabilityRequiringPayload) protectedStoragePayload).getRequiredCapabilities()); - } else if (msg instanceof AddPersistableNetworkPayloadMessage) { - final PersistableNetworkPayload persistableNetworkPayload = ((AddPersistableNetworkPayloadMessage) msg).getPersistableNetworkPayload(); - result = !(persistableNetworkPayload instanceof CapabilityRequiringPayload); - if (!result) - result = capabilities.containsAll(((CapabilityRequiringPayload) persistableNetworkPayload).getRequiredCapabilities()); - } else if (msg instanceof CapabilityRequiringPayload) { - result = capabilities.containsAll(((CapabilityRequiringPayload) msg).getRequiredCapabilities()); - } else { - result = true; + public boolean testCapability(NetworkEnvelope networkEnvelope) { + if (networkEnvelope instanceof BundleOfEnvelopes) { + // We remove elements in the list which fail the capability test + BundleOfEnvelopes bundleOfEnvelopes = (BundleOfEnvelopes) networkEnvelope; + updateBundleOfEnvelopes(bundleOfEnvelopes); + // If the bundle is empty we dont send the networkEnvelope + return !bundleOfEnvelopes.getEnvelopes().isEmpty(); } + return extractCapabilityRequiringPayload(networkEnvelope) + .map(this::testCapability) + .orElse(true); + } + + private boolean testCapability(CapabilityRequiringPayload capabilityRequiringPayload) { + boolean result = capabilities.containsAll(capabilityRequiringPayload.getRequiredCapabilities()); if (!result) { - if (capabilities.size() > 1) { - Proto data = msg; - if (msg instanceof AddDataMessage) { - data = ((AddDataMessage) msg).getProtectedStorageEntry().getProtectedStoragePayload(); - } - // Monitoring nodes have only one capability set, we don't want to log those - log.debug("We did not send the message because the peer does not support our required capabilities. " + - "messageClass={}, peer={}, peers supportedCapabilities={}", - data.getClass().getSimpleName(), peersNodeAddressOptional, capabilities); - } + log.debug("We did not send {} because capabilities are not supported.", + capabilityRequiringPayload.getClass().getSimpleName()); } return result; } + private void updateBundleOfEnvelopes(BundleOfEnvelopes bundleOfEnvelopes) { + List toRemove = bundleOfEnvelopes.getEnvelopes().stream() + .filter(networkEnvelope -> !testCapability(networkEnvelope)) + .collect(Collectors.toList()); + bundleOfEnvelopes.getEnvelopes().removeAll(toRemove); + } + + private Optional extractCapabilityRequiringPayload(Proto proto) { + Proto candidate = proto; + // Lets check if our networkEnvelope is a wrapped data structure + if (proto instanceof AddDataMessage) { + candidate = (((AddDataMessage) proto).getProtectedStorageEntry()).getProtectedStoragePayload(); + } else if (proto instanceof RemoveDataMessage) { + candidate = (((RemoveDataMessage) proto).getProtectedStorageEntry()).getProtectedStoragePayload(); + } else if (proto instanceof AddPersistableNetworkPayloadMessage) { + candidate = (((AddPersistableNetworkPayloadMessage) proto).getPersistableNetworkPayload()); + } + + if (candidate instanceof CapabilityRequiringPayload) { + return Optional.of((CapabilityRequiringPayload) candidate); + } + return Optional.empty(); + } + public void addMessageListener(MessageListener messageListener) { boolean isNewEntry = messageListeners.add(messageListener); if (!isNewEntry) @@ -531,7 +482,6 @@ public void shutDown(CloseConnectionReason closeConnectionReason, @Nullable Runn stopped = true; - //noinspection UnstableApiUsage Uninterruptibles.sleepUninterruptibly(200, TimeUnit.MILLISECONDS); } catch (Throwable t) { log.error(t.getMessage()); @@ -576,10 +526,8 @@ private void doShutDown(CloseConnectionReason closeConnectionReason, @Nullable R //noinspection UnstableApiUsage MoreExecutors.shutdownAndAwaitTermination(singleThreadExecutor, 500, TimeUnit.MILLISECONDS); - //noinspection UnstableApiUsage - MoreExecutors.shutdownAndAwaitTermination(bundleSender, 500, TimeUnit.MILLISECONDS); - log.debug("Connection shutdown complete {}", this.toString()); + log.debug("Connection shutdown complete {}", this); // Use UserThread.execute as its not clear if that is called from a non-UserThread if (shutDownCompleteHandler != null) UserThread.execute(shutDownCompleteHandler); @@ -655,7 +603,7 @@ public boolean reportInvalidRequest(RuleViolation ruleViolation) { "numRuleViolations={}\n\t" + "corruptRequest={}\n\t" + "corruptRequests={}\n\t" + - "connection={}", numRuleViolations, ruleViolation, ruleViolations.toString(), this); + "connection={}", numRuleViolations, ruleViolation, ruleViolations, this); this.ruleViolation = ruleViolation; if (ruleViolation == RuleViolation.PEER_BANNED) { log.warn("We close connection due RuleViolation.PEER_BANNED. peersNodeAddress={}", getPeersNodeAddressOptional()); @@ -690,13 +638,13 @@ private void handleException(Throwable e) { log.info("SocketException (expected if connection lost). closeConnectionReason={}; connection={}", closeConnectionReason, this); } else if (e instanceof SocketTimeoutException || e instanceof TimeoutException) { closeConnectionReason = CloseConnectionReason.SOCKET_TIMEOUT; - log.info("Shut down caused by exception {} on connection={}", e.toString(), this); + log.info("Shut down caused by exception {} on connection={}", e, this); } else if (e instanceof EOFException) { closeConnectionReason = CloseConnectionReason.TERMINATED; - log.warn("Shut down caused by exception {} on connection={}", e.toString(), this); + log.warn("Shut down caused by exception {} on connection={}", e, this); } else if (e instanceof OptionalDataException || e instanceof StreamCorruptedException) { closeConnectionReason = CloseConnectionReason.CORRUPTED_DATA; - log.warn("Shut down caused by exception {} on connection={}", e.toString(), this); + log.warn("Shut down caused by exception {} on connection={}", e, this); } else { // TODO sometimes we get StreamCorruptedException, OptionalDataException, IllegalStateException closeConnectionReason = CloseConnectionReason.UNKNOWN_EXCEPTION; diff --git a/p2p/src/main/java/bisq/network/p2p/peers/BroadcastHandler.java b/p2p/src/main/java/bisq/network/p2p/peers/BroadcastHandler.java index d0dc97c3c27..b7b89d25795 100644 --- a/p2p/src/main/java/bisq/network/p2p/peers/BroadcastHandler.java +++ b/p2p/src/main/java/bisq/network/p2p/peers/BroadcastHandler.java @@ -231,7 +231,7 @@ private List getBroadcastRequestsForConnection(Con return broadcastRequests.stream() .filter(broadcastRequest -> !connection.getPeersNodeAddressOptional().isPresent() || !connection.getPeersNodeAddressOptional().get().equals(broadcastRequest.getSender())) - .filter(broadcastRequest -> connection.noCapabilityRequiredOrCapabilityIsSupported(broadcastRequest.getMessage())) + .filter(broadcastRequest -> connection.testCapability(broadcastRequest.getMessage())) .collect(Collectors.toList()); } diff --git a/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java b/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java index ada7d8eddc0..615cac138e6 100644 --- a/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java +++ b/p2p/src/main/java/bisq/network/p2p/storage/P2PDataStorage.java @@ -106,10 +106,12 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.Setter; import lombok.ToString; import lombok.extern.slf4j.Slf4j; @@ -155,6 +157,9 @@ public class P2PDataStorage implements MessageListener, ConnectionListener, Pers // Don't convert to local variable as it might get GC'ed. private MonadicBinding readFromResourcesCompleteBinding; + @Setter + private Predicate filterPredicate; //Set from FilterManager + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor @@ -784,6 +789,13 @@ private boolean addProtectedStorageEntry(ProtectedStorageEntry protectedStorageE return false; } + // Test against filterPredicate set from FilterManager + if (filterPredicate != null && + !filterPredicate.test(protectedStorageEntry.getProtectedStoragePayload())) { + log.debug("filterPredicate test failed. hashOfPayload={}", hashOfPayload); + return false; + } + // This is an updated entry. Record it and signal listeners. map.put(hashOfPayload, protectedStorageEntry); hashMapChangedListeners.forEach(e -> e.onAdded(Collections.singletonList(protectedStorageEntry))); diff --git a/proto/src/main/proto/grpc.proto b/proto/src/main/proto/grpc.proto index 84e6ee18ad3..053710db8e8 100644 --- a/proto/src/main/proto/grpc.proto +++ b/proto/src/main/proto/grpc.proto @@ -620,7 +620,7 @@ message BalancesInfo { } message BsqBalanceInfo { - uint64 availableConfirmedBalance = 1; + uint64 availableConfirmedBalance = 1; // todo rename to availableBalance if possible uint64 unverifiedBalance = 2; uint64 unconfirmedChangeBalance = 3; uint64 lockedForVotingBalance = 4; diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 7b48346db45..d781a543bce 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -710,7 +710,7 @@ message Filter { message TradeStatistics2 { string base_currency = 1 [deprecated = true]; string counter_currency = 2 [deprecated = true]; - OfferPayload.Direction direction = 3 [deprecated = true]; + OfferDirection direction = 3 [deprecated = true]; int64 trade_price = 4 [deprecated = true]; int64 trade_amount = 5 [deprecated = true]; int64 trade_date = 6 [deprecated = true]; @@ -746,17 +746,11 @@ message MailboxStoragePayload { } message OfferPayload { - enum Direction { - PB_ERROR = 0; - BUY = 1; - SELL = 2; - } - string id = 1; int64 date = 2; NodeAddress owner_node_address = 3; PubKeyRing pub_key_ring = 4; - Direction direction = 5; + OfferDirection direction = 5; int64 price = 6; double market_price_margin = 7; bool use_market_based_price = 8; @@ -792,6 +786,12 @@ message OfferPayload { int32 protocol_version = 38; } +enum OfferDirection { + OFFER_DIRECTION_ERROR = 0; + BUY = 1; + SELL = 2; +} + message AccountAgeWitness { bytes hash = 1; int64 date = 2; @@ -939,6 +939,7 @@ message RawTransactionInput { int64 index = 1; bytes parent_transaction = 2; int64 value = 3; + int32 script_type_id = 4; } enum AvailabilityResult { @@ -1478,7 +1479,9 @@ message Offer { MAKER_OFFLINE = 6; } - OfferPayload offer_payload = 1; + oneof message { + OfferPayload offer_payload = 1; + } } message OpenOffer {