From 0700a53561e7aa7fcc38ef7d60e1696a138db26e Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Mon, 30 Mar 2015 23:25:24 +0200 Subject: [PATCH] Second trade process (WIP) --- .../io/bitsquare/btc/TradeWalletService.java | 106 ++++---- .../common/taskrunner/TaskRunner.java | 16 +- .../main/java/io/bitsquare/gui/bitsquare.css | 37 +++ .../java/io/bitsquare/gui/main/MainView.java | 4 +- .../gui/main/account/AccountView.java | 2 +- .../arbitrator/ArbitratorSettingsView.java | 5 + .../AltCoinAccountDataModel.java} | 6 +- .../AltCoinAccountView.fxml} | 2 +- .../AltCoinAccountView.java} | 6 +- .../AltCoinAccountViewModel.java} | 6 +- .../account/settings/AccountSettingsView.java | 19 +- .../account/setup/AccountSetupWizard.java | 27 +- .../bitsquare/gui/main/debug/DebugView.java | 88 +++---- .../closed/ClosedTradesViewModel.java | 18 +- .../pending/PendingTradesDataModel.java | 21 +- .../pending/PendingTradesListItem.java | 12 +- .../PendingTradesOffererAsBuyerView.java | 75 ++++++ .../pending/PendingTradesStepsView.java | 91 +++++++ .../pending/PendingTradesViewModel.java | 203 ++++++++++----- .../portfolio/pending/TradeWizardItem.java | 68 +++++ .../portfolio/pending/proto/PendingMain.java | 53 ++++ .../pending/steps/CompletedView.java | 95 +++++++ .../pending/steps/ConfirmFiatView.java | 69 +++++ .../pending/steps/StartFiatView.java | 73 ++++++ .../portfolio/pending/steps/WaitView.java | 64 +++++ .../bitsquare/gui/main/trade/TradeView.java | 10 +- .../createoffer/CreateOfferDataModel.java | 22 +- .../trade/createoffer/CreateOfferView.fxml | 7 +- .../trade/createoffer/CreateOfferView.java | 46 ++-- .../createoffer/CreateOfferViewModel.java | 29 ++- .../main/trade/offerbook/OfferBookView.java | 7 +- .../trade/takeoffer/TakeOfferDataModel.java | 20 +- .../main/trade/takeoffer/TakeOfferView.fxml | 9 +- .../main/trade/takeoffer/TakeOfferView.java | 46 ++-- .../trade/takeoffer/TakeOfferViewModel.java | 129 +++++++--- .../java/io/bitsquare/gui/util/Colors.java | 2 +- .../bitsquare/gui/util/ComponentBuilder.java | 227 +++++++++++++++++ .../java/io/bitsquare/gui/util/Layout.java | 30 +++ .../bitsquare/trade/OffererAsBuyerTrade.java | 151 +++++++++++ .../bitsquare/trade/OffererAsSellerTrade.java | 153 +++++++++++ .../java/io/bitsquare/trade/OffererTrade.java | 165 +++--------- .../io/bitsquare/trade/TakerAsBuyerTrade.java | 161 ++++++++++++ .../bitsquare/trade/TakerAsSellerTrade.java | 164 ++++++++++++ .../java/io/bitsquare/trade/TakerTrade.java | 154 ++--------- .../main/java/io/bitsquare/trade/Trade.java | 113 ++++++--- .../java/io/bitsquare/trade/TradeManager.java | 89 ++++--- .../messages/ConfirmReserveOfferMessage.java | 34 +++ .../messages/FiatTransferStartedMessage.java | 12 +- .../messages/RequestPayDepositMessage.java | 62 +++++ .../RequestTakerDepositPaymentMessage.java | 62 ----- ...tocol.java => OffererAsBuyerProtocol.java} | 82 +++--- .../offerer/OffererAsSellerProtocol.java | 239 ++++++++++++++++++ .../trade/offerer/models/Offerer.java | 33 ++- .../offerer/models/OffererProcessModel.java | 12 + .../protocol/trade/offerer/models/Taker.java | 32 ++- .../offerer/tasks/OffererCommitDepositTx.java | 50 ++++ ...outTx.java => OffererCommitsPayoutTx.java} | 6 +- ...ava => OffererCreatesAndSignPayoutTx.java} | 19 +- .../tasks/OffererCreatesAndSignsContract.java | 64 +++++ .../OffererCreatesAndSignsDepositTx.java | 65 +++++ ...ava => OffererCreatesDepositTxInputs.java} | 21 +- ...fererProcessDepositTxPublishedMessage.java | 60 +++++ ...ererProcessFiatTransferStartedMessage.java | 63 +++++ ...fererProcessPayoutTxPublishedMessage.java} | 15 +- ...ProcessRequestDepositTxInputsMessage.java} | 15 +- ...ffererProcessRequestPayDepositMessage.java | 60 +++++ ...rocessRequestPublishDepositTxMessage.java} | 17 +- ...ffererSendsDepositTxPublishedMessage.java} | 15 +- ...fererSendsFiatTransferStartedMessage.java} | 28 +- .../OffererSendsPayoutTxPublishedMessage.java | 71 ++++++ ...rSendsRequestPublishDepositTxMessage.java} | 41 +-- ...ndsRequestSellerDepositPaymentMessage.java | 89 +++++++ .../OffererSignsAndPublishDepositTx.java | 101 ++++++++ ...va => OffererSignsAndPublishPayoutTx.java} | 37 ++- ...a => OffererVerifiesAndSignsContract.java} | 17 +- .../offerer/tasks/VerifyTakerAccount.java | 15 +- .../trade/taker/TakerAsBuyerProtocol.java | 201 +++++++++++++++ ...otocol.java => TakerAsSellerProtocol.java} | 71 +++--- .../protocol/trade/taker/models/Offerer.java | 40 +++ .../protocol/trade/taker/models/Taker.java | 27 +- .../taker/tasks/BroadcastTakeOfferFeeTx.java | 16 +- .../taker/tasks/CreateTakeOfferFeeTx.java | 8 +- ...positTx.java => TakerCommitDepositTx.java} | 6 +- .../taker/tasks/TakerCommitsPayoutTx.java | 49 ++++ ....java => TakerCreatesAndSignContract.java} | 6 +- ...ava => TakerCreatesAndSignsDepositTx.java} | 8 +- .../tasks/TakerCreatesAndSignsPayoutTx.java | 66 +++++ .../tasks/TakerCreatesDepositTxInputs.java | 55 ++++ ...akerProcessDepositTxPublishedMessage.java} | 14 +- ...kerProcessFiatTransferStartedMessage.java} | 18 +- .../TakerProcessPayoutTxPublishedMessage.java | 60 +++++ ...ProcessRequestPublishDepositTxMessage.java | 63 +++++ ...ssRequestSellerDepositPaymentMessage.java} | 26 +- .../TakerSendsDepositTxPublishedMessage.java | 68 +++++ .../TakerSendsFiatTransferStartedMessage.java | 85 +++++++ ...> TakerSendsPayoutTxPublishedMessage.java} | 15 +- ...erSendsRequestDepositTxInputsMessage.java} | 17 +- .../TakerSendsRequestPayDepositMessage.java | 83 ++++++ ...rSendsRequestPublishDepositTxMessage.java} | 14 +- .../tasks/TakerSignsAndPublishDepositTx.java | 89 +++++++ ...java => TakerSignsAndPublishPayoutTx.java} | 16 +- .../trade/taker/tasks/TakerTradeTask.java | 3 - .../tasks/TakerVerifiesAndSignsContract.java | 65 +++++ .../resources/i18n/displayStrings.properties | 31 ++- doc/new_tag.sh | 17 +- 105 files changed, 4575 insertions(+), 999 deletions(-) rename core/src/main/java/io/bitsquare/gui/main/account/content/{irc/IrcAccountDataModel.java => altcoin/AltCoinAccountDataModel.java} (94%) rename core/src/main/java/io/bitsquare/gui/main/account/content/{irc/IrcAccountView.fxml => altcoin/AltCoinAccountView.fxml} (98%) rename core/src/main/java/io/bitsquare/gui/main/account/content/{irc/IrcAccountView.java => altcoin/AltCoinAccountView.java} (96%) rename core/src/main/java/io/bitsquare/gui/main/account/content/{irc/IrcAccountViewModel.java => altcoin/AltCoinAccountViewModel.java} (94%) create mode 100644 core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesOffererAsBuyerView.java create mode 100644 core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesStepsView.java create mode 100644 core/src/main/java/io/bitsquare/gui/main/portfolio/pending/TradeWizardItem.java create mode 100644 core/src/main/java/io/bitsquare/gui/main/portfolio/pending/proto/PendingMain.java create mode 100644 core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/CompletedView.java create mode 100644 core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/ConfirmFiatView.java create mode 100644 core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/StartFiatView.java create mode 100644 core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitView.java create mode 100644 core/src/main/java/io/bitsquare/gui/util/ComponentBuilder.java create mode 100644 core/src/main/java/io/bitsquare/gui/util/Layout.java create mode 100644 core/src/main/java/io/bitsquare/trade/OffererAsBuyerTrade.java create mode 100644 core/src/main/java/io/bitsquare/trade/OffererAsSellerTrade.java create mode 100644 core/src/main/java/io/bitsquare/trade/TakerAsBuyerTrade.java create mode 100644 core/src/main/java/io/bitsquare/trade/TakerAsSellerTrade.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/messages/ConfirmReserveOfferMessage.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/messages/RequestPayDepositMessage.java delete mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/messages/RequestTakerDepositPaymentMessage.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/{OffererProtocol.java => OffererAsBuyerProtocol.java} (74%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/OffererAsSellerProtocol.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/OffererCommitDepositTx.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{CommitPayoutTx.java => OffererCommitsPayoutTx.java} (84%) rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{CreateAndSignPayoutTx.java => OffererCreatesAndSignPayoutTx.java} (72%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/OffererCreatesAndSignsContract.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/OffererCreatesAndSignsDepositTx.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{CreateOffererDepositTxInputs.java => OffererCreatesDepositTxInputs.java} (65%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/OffererProcessDepositTxPublishedMessage.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/OffererProcessFiatTransferStartedMessage.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{ProcessPayoutTxPublishedMessage.java => OffererProcessPayoutTxPublishedMessage.java} (69%) rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{ProcessRequestDepositTxInputsMessage.java => OffererProcessRequestDepositTxInputsMessage.java} (72%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/OffererProcessRequestPayDepositMessage.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{ProcessRequestPublishDepositTxMessage.java => OffererProcessRequestPublishDepositTxMessage.java} (75%) rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{SendDepositTxPublishedMessage.java => OffererSendsDepositTxPublishedMessage.java} (73%) rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{SendFiatTransferStartedMessage.java => OffererSendsFiatTransferStartedMessage.java} (62%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/OffererSendsPayoutTxPublishedMessage.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{SendRequestTakerDepositPaymentMessage.java => OffererSendsRequestPublishDepositTxMessage.java} (58%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/OffererSendsRequestSellerDepositPaymentMessage.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/OffererSignsAndPublishDepositTx.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{SignAndPublishDepositTx.java => OffererSignsAndPublishPayoutTx.java} (57%) rename core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/{VerifyAndSignContract.java => OffererVerifiesAndSignsContract.java} (75%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/TakerAsBuyerProtocol.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/{TakerProtocol.java => TakerAsSellerProtocol.java} (75%) rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{CommitDepositTx.java => TakerCommitDepositTx.java} (86%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCommitsPayoutTx.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{CreateAndSignContract.java => TakerCreatesAndSignContract.java} (90%) rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{CreateAndSignDepositTx.java => TakerCreatesAndSignsDepositTx.java} (86%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCreatesAndSignsPayoutTx.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCreatesDepositTxInputs.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{ProcessDepositTxPublishedMessage.java => TakerProcessDepositTxPublishedMessage.java} (71%) rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{ProcessFiatTransferStartedMessage.java => TakerProcessFiatTransferStartedMessage.java} (71%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerProcessPayoutTxPublishedMessage.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerProcessRequestPublishDepositTxMessage.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{ProcessRequestTakerDepositPaymentMessage.java => TakerProcessRequestSellerDepositPaymentMessage.java} (66%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerSendsDepositTxPublishedMessage.java create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerSendsFiatTransferStartedMessage.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{SendPayoutTxPublishedMessage.java => TakerSendsPayoutTxPublishedMessage.java} (75%) rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{SendRequestDepositTxInputsMessage.java => TakerSendsRequestDepositTxInputsMessage.java} (78%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerSendsRequestPayDepositMessage.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{SendRequestPublishDepositTxMessage.java => TakerSendsRequestPublishDepositTxMessage.java} (78%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerSignsAndPublishDepositTx.java rename core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/{SignAndPublishPayoutTx.java => TakerSignsAndPublishPayoutTx.java} (75%) create mode 100644 core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerVerifiesAndSignsContract.java diff --git a/core/src/main/java/io/bitsquare/btc/TradeWalletService.java b/core/src/main/java/io/bitsquare/btc/TradeWalletService.java index f70f85194e..918f3ab81f 100644 --- a/core/src/main/java/io/bitsquare/btc/TradeWalletService.java +++ b/core/src/main/java/io/bitsquare/btc/TradeWalletService.java @@ -310,22 +310,22 @@ public class TradeWalletService { return new Result(preparedDepositTx, takerConnectedOutputsForAllInputs, takerOutputs); } - public void offererSignsAndPublishDepositTx(Transaction takersPreparedDepositTx, - List offererConnectedOutputsForAllInputs, - List takerConnectedOutputsForAllInputs, - List offererOutputs, - Coin offererInputAmount, - byte[] offererPubKey, - byte[] takerPubKey, - byte[] arbitratorPubKey, - FutureCallback callback) throws SigningException, TransactionVerificationException, + public void signAndPublishDepositTx(Transaction preparedDepositTx, + List offererConnectedOutputsForAllInputs, + List takerConnectedOutputsForAllInputs, + List buyerOutputs, + Coin buyerInputAmount, + byte[] offererPubKey, + byte[] takerPubKey, + byte[] arbitratorPubKey, + FutureCallback callback) throws SigningException, TransactionVerificationException, WalletException { log.trace("offererSignsAndPublishTx called"); - log.trace("takersPreparedDepositTx " + takersPreparedDepositTx.toString()); + log.trace("preparedDepositTx " + preparedDepositTx.toString()); log.trace("offererConnectedOutputsForAllInputs " + offererConnectedOutputsForAllInputs.toString()); log.trace("takerConnectedOutputsForAllInputs " + takerConnectedOutputsForAllInputs.toString()); - log.trace("offererOutputs " + offererOutputs.toString()); - log.trace("offererInputAmount " + offererInputAmount.toFriendlyString()); + log.trace("buyerOutputs " + buyerOutputs.toString()); + log.trace("buyerInputAmount " + buyerInputAmount.toFriendlyString()); log.trace("offererPubKey " + ECKey.fromPublicOnly(offererPubKey).toString()); log.trace("takerPubKey " + ECKey.fromPublicOnly(takerPubKey).toString()); log.trace("arbitratorPubKey " + ECKey.fromPublicOnly(arbitratorPubKey).toString()); @@ -335,10 +335,10 @@ public class TradeWalletService { // Check if takers Multisig script is identical to mine Script p2SHMultiSigOutputScript = getP2SHMultiSigOutputScript(offererPubKey, takerPubKey, arbitratorPubKey); - if (!takersPreparedDepositTx.getOutput(0).getScriptPubKey().equals(p2SHMultiSigOutputScript)) + if (!preparedDepositTx.getOutput(0).getScriptPubKey().equals(p2SHMultiSigOutputScript)) throw new TransactionVerificationException("Takers p2SHMultiSigOutputScript does not match to my p2SHMultiSigOutputScript"); - // The outpoints are not available from the serialized takersPreparedDepositTx, so we cannot use that tx directly, but we use it to construct a new + // The outpoints are not available from the serialized preparedDepositTx, so we cannot use that tx directly, but we use it to construct a new // depositTx Transaction depositTx = new Transaction(params); @@ -358,8 +358,8 @@ public class TradeWalletService { for (TransactionOutput connectedOutputForInput : takerConnectedOutputsForAllInputs) { TransactionOutPoint outPoint = new TransactionOutPoint(params, connectedOutputForInput.getIndex(), connectedOutputForInput.getParentTransaction()); - // We grab the signature from the takersPreparedDepositTx and apply it to the new tx input - TransactionInput takerInput = takersPreparedDepositTx.getInputs().get(offererConnectedOutputsForAllInputs.size()); + // We grab the signature from the preparedDepositTx and apply it to the new tx input + TransactionInput takerInput = preparedDepositTx.getInputs().get(offererConnectedOutputsForAllInputs.size()); byte[] scriptProgram = takerInput.getScriptSig().getProgram(); if (scriptProgram.length == 0) throw new TransactionVerificationException("Inputs from taker not singed."); @@ -368,8 +368,8 @@ public class TradeWalletService { depositTx.addInput(transactionInput); } - // Add all outputs from takersPreparedDepositTx to depositTx - takersPreparedDepositTx.getOutputs().forEach(depositTx::addOutput); + // Add all outputs from preparedDepositTx to depositTx + preparedDepositTx.getOutputs().forEach(depositTx::addOutput); // Sign inputs for (int i = 0; i < offererConnectedOutputsForAllInputs.size(); i++) { @@ -379,11 +379,11 @@ public class TradeWalletService { } // subtract change amount - for (int i = 1; i < offererOutputs.size() + 1; i++) { + for (int i = 1; i < buyerOutputs.size() + 1; i++) { offererSpendingAmount = offererSpendingAmount.subtract(depositTx.getOutput(i).getValue()); } - if (offererInputAmount.compareTo(offererSpendingAmount) != 0) + if (buyerInputAmount.compareTo(offererSpendingAmount) != 0) throw new TransactionVerificationException("Offerers input amount does not match required value."); verifyTransaction(depositTx); @@ -416,37 +416,37 @@ public class TradeWalletService { return wallet.getTransaction(tx.getHash()); } - public byte[] offererCreatesAndSignsPayoutTx(Transaction depositTx, - Coin offererPayoutAmount, - Coin takerPayoutAmount, - AddressEntry offererAddressEntry, - String takerPayoutAddressString, - byte[] offererPubKey, - byte[] takerPubKey, - byte[] arbitratorPubKey) + public byte[] createAndSignPayoutTx(Transaction depositTx, + Coin offererPayoutAmount, + Coin takerPayoutAmount, + AddressEntry buyerAddressEntry, + String sellerPayoutAddressString, + byte[] offererPubKey, + byte[] takerPubKey, + byte[] arbitratorPubKey) throws AddressFormatException, TransactionVerificationException, SigningException { log.trace("offererCreatesAndSignsPayoutTx called"); log.trace("depositTx " + depositTx.toString()); log.trace("offererPayoutAmount " + offererPayoutAmount.toFriendlyString()); log.trace("takerPayoutAmount " + takerPayoutAmount.toFriendlyString()); - log.trace("offererAddressEntry " + offererAddressEntry.toString()); - log.trace("takerPayoutAddressString " + takerPayoutAddressString); + log.trace("buyerAddressEntry " + buyerAddressEntry.toString()); + log.trace("sellerPayoutAddressString " + sellerPayoutAddressString); log.trace("offererPubKey " + ECKey.fromPublicOnly(offererPubKey).toString()); log.trace("takerPubKey " + ECKey.fromPublicOnly(takerPubKey).toString()); log.trace("arbitratorPubKey " + ECKey.fromPublicOnly(arbitratorPubKey).toString()); - if (!Utils.HEX.encode(offererAddressEntry.getPubKey()).equals(Utils.HEX.encode(offererPubKey))) + if (!Utils.HEX.encode(buyerAddressEntry.getPubKey()).equals(Utils.HEX.encode(offererPubKey))) throw new SigningException("OffererPubKey not matching key pair from addressEntry"); Transaction preparedPayoutTx = createPayoutTx(depositTx, offererPayoutAmount, takerPayoutAmount, - offererAddressEntry.getAddressString(), - takerPayoutAddressString); + buyerAddressEntry.getAddressString(), + sellerPayoutAddressString); // MS redeemScript Script redeemScript = getMultiSigRedeemScript(offererPubKey, takerPubKey, arbitratorPubKey); Sha256Hash sigHash = preparedPayoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); - ECKey.ECDSASignature offererSignature = offererAddressEntry.getKeyPair().sign(sigHash).toCanonicalised(); + ECKey.ECDSASignature offererSignature = buyerAddressEntry.getKeyPair().sign(sigHash).toCanonicalised(); verifyTransaction(preparedPayoutTx); @@ -459,40 +459,40 @@ public class TradeWalletService { return offererSignature.encodeToDER(); } - public void takerSignsAndPublishPayoutTx(Transaction depositTx, - byte[] offererSignature, - Coin offererPayoutAmount, - Coin takerPayoutAmount, - String offererAddressString, - AddressEntry takerAddressEntry, - byte[] offererPubKey, - byte[] takerPubKey, - byte[] arbitratorPubKey, - FutureCallback callback) + public void signAndPublishPayoutTx(Transaction depositTx, + byte[] buyerSignature, + Coin offererPayoutAmount, + Coin takerPayoutAmount, + String buyerAddressString, + AddressEntry sellerAddressEntry, + byte[] offererPubKey, + byte[] takerPubKey, + byte[] arbitratorPubKey, + FutureCallback callback) throws AddressFormatException, TransactionVerificationException, WalletException, SigningException { log.trace("takerSignsAndPublishPayoutTx called"); log.trace("depositTx " + depositTx.toString()); - log.trace("offererSignature r " + ECKey.ECDSASignature.decodeFromDER(offererSignature).r.toString()); - log.trace("offererSignature s " + ECKey.ECDSASignature.decodeFromDER(offererSignature).s.toString()); + log.trace("buyerSignature r " + ECKey.ECDSASignature.decodeFromDER(buyerSignature).r.toString()); + log.trace("buyerSignature s " + ECKey.ECDSASignature.decodeFromDER(buyerSignature).s.toString()); log.trace("offererPayoutAmount " + offererPayoutAmount.toFriendlyString()); log.trace("takerPayoutAmount " + takerPayoutAmount.toFriendlyString()); - log.trace("offererAddressString " + offererAddressString); - log.trace("takerAddressEntry " + takerAddressEntry); + log.trace("buyerAddressString " + buyerAddressString); + log.trace("sellerAddressEntry " + sellerAddressEntry); log.trace("offererPubKey " + ECKey.fromPublicOnly(offererPubKey).toString()); log.trace("takerPubKey " + ECKey.fromPublicOnly(takerPubKey).toString()); log.trace("arbitratorPubKey " + ECKey.fromPublicOnly(arbitratorPubKey).toString()); - if (!Utils.HEX.encode(takerAddressEntry.getPubKey()).equals(Utils.HEX.encode(takerPubKey))) + if (!Utils.HEX.encode(sellerAddressEntry.getPubKey()).equals(Utils.HEX.encode(takerPubKey))) throw new SigningException("TakerPubKey not matching key pair from addressEntry"); Transaction payoutTx = createPayoutTx(depositTx, offererPayoutAmount, takerPayoutAmount, - offererAddressString, - takerAddressEntry.getAddressString()); + buyerAddressString, + sellerAddressEntry.getAddressString()); Script redeemScript = getMultiSigRedeemScript(offererPubKey, takerPubKey, arbitratorPubKey); Sha256Hash sigHash = payoutTx.hashForSignature(0, redeemScript, Transaction.SigHash.ALL, false); - ECKey.ECDSASignature takerSignature = takerAddressEntry.getKeyPair().sign(sigHash).toCanonicalised(); + ECKey.ECDSASignature takerSignature = sellerAddressEntry.getKeyPair().sign(sigHash).toCanonicalised(); log.trace("takerSignature r " + takerSignature.r.toString()); log.trace("takerSignature s " + takerSignature.s.toString()); @@ -500,7 +500,7 @@ public class TradeWalletService { Sha256Hash hashForSignature = payoutTx.hashForSignature(0, redeemScript.getProgram(), (byte) 1); log.trace("hashForSignature " + Utils.HEX.encode(hashForSignature.getBytes())); - TransactionSignature offererTxSig = new TransactionSignature(ECKey.ECDSASignature.decodeFromDER(offererSignature), + TransactionSignature offererTxSig = new TransactionSignature(ECKey.ECDSASignature.decodeFromDER(buyerSignature), Transaction.SigHash.ALL, false); TransactionSignature takerTxSig = new TransactionSignature(takerSignature, Transaction.SigHash.ALL, false); // Take care of order of signatures. See comment below at getMultiSigRedeemScript diff --git a/core/src/main/java/io/bitsquare/common/taskrunner/TaskRunner.java b/core/src/main/java/io/bitsquare/common/taskrunner/TaskRunner.java index 8f1f75212a..94023b8e1a 100644 --- a/core/src/main/java/io/bitsquare/common/taskrunner/TaskRunner.java +++ b/core/src/main/java/io/bitsquare/common/taskrunner/TaskRunner.java @@ -45,7 +45,7 @@ public class TaskRunner { this.resultHandler = resultHandler; this.errorMessageHandler = errorMessageHandler; } - + public final void addTasks(Class>... items) { List>> list = Arrays.asList(items); tasks.addAll(list); @@ -61,7 +61,19 @@ public class TaskRunner { try { currentTask = tasks.poll(); log.trace("Run task: " + currentTask.getSimpleName()); - currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass()).newInstance(this, sharedModel).run(); + log.debug("sharedModel.getClass() " + sharedModel.getClass()); + log.debug("sharedModel.getClass().getSuperclass() " + sharedModel.getClass().getSuperclass()); + /* Object c = currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass()); + log.debug("c " + c); + Object c2 = currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass().getSuperclass()); + log.debug("c getSuperclass " + c2); + Object o = currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass()).newInstance(this, sharedModel);*/ + //TODO solve in tasks problem with superclasses + try { + currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass()).newInstance(this, sharedModel).run(); + } catch (Throwable throwable) { + currentTask.getDeclaredConstructor(TaskRunner.class, sharedModel.getClass().getSuperclass()).newInstance(this, sharedModel).run(); + } } catch (Throwable throwable) { throwable.printStackTrace(); handleErrorMessage("Error at taskRunner: " + throwable.getMessage()); diff --git a/core/src/main/java/io/bitsquare/gui/bitsquare.css b/core/src/main/java/io/bitsquare/gui/bitsquare.css index 52dc06027b..5b56193a9a 100644 --- a/core/src/main/java/io/bitsquare/gui/bitsquare.css +++ b/core/src/main/java/io/bitsquare/gui/bitsquare.css @@ -22,6 +22,7 @@ lower gradient color on tab: dddddd .root { -bs-grey: #666666; -bs-bg-grey: #dddddd; + -bs-bg-green: #00aa33; -bs-error-red: #dd0000; -fx-accent: #0f87c3; @@ -466,6 +467,42 @@ textfield */ -fx-background-radius: 3px, 3px, 2px, 1px; } + +/* Pending trades */ +#trade-wizard-item-background-disabled { + -fx-body-color: linear-gradient(to bottom, #f4f4f4, #F0F0F0); + -fx-outer-border: linear-gradient(to bottom, #dddddd, #ccc); + -fx-background-color: -fx-shadow-highlight-color, + -fx-outer-border, + -fx-inner-border, + -fx-body-color; + -fx-background-insets: 0 0 -1 0, 0, 1, 2; + -fx-background-radius: 3px, 3px, 2px, 1px; +} + +#trade-wizard-item-background-active { + -fx-body-color: linear-gradient(to bottom, #f1f6f7, #e7f5f9); + -fx-outer-border: linear-gradient(to bottom, #b5e1ef, #6aa4b6); + -fx-background-color: -fx-shadow-highlight-color, + -fx-outer-border, + -fx-inner-border, + -fx-body-color; + -fx-background-insets: 0 0 -1 0, 0, 1, 2; + -fx-background-radius: 3px, 3px, 2px, 1px; +} + +#trade-wizard-item-background-completed{ + -fx-body-color: linear-gradient(to bottom, #f4f4f4, #E1E9E1); + -fx-outer-border: linear-gradient(to bottom, #99ba9c, #619865); + -fx-background-color: -fx-shadow-highlight-color, + -fx-outer-border, + -fx-inner-border, + -fx-body-color; + -fx-background-insets: 0 0 -1 0, 0, 1, 2; + -fx-background-radius: 3px, 3px, 2px, 1px; +} + + /* TitledGroupBg */ #titled-group-bg-label { -fx-font-weight: bold; diff --git a/core/src/main/java/io/bitsquare/gui/main/MainView.java b/core/src/main/java/io/bitsquare/gui/main/MainView.java index 3236d164da..314ea313be 100644 --- a/core/src/main/java/io/bitsquare/gui/main/MainView.java +++ b/core/src/main/java/io/bitsquare/gui/main/MainView.java @@ -91,9 +91,9 @@ public class MainView extends InitializableView { setDisable(true); // alpha }}; ToggleButton settingsButton = new NavButton(SettingsView.class, "Settings"); - ToggleButton accountButton = new NavButton(AccountView.class, "Account") {{ + ToggleButton accountButton = new NavButton(AccountView.class, "Account"); /*{{ setDisable(true); // alpha - }}; + }};*/ Pane portfolioButtonHolder = new Pane(portfolioButton); Pane bankAccountComboBoxHolder = new Pane(); diff --git a/core/src/main/java/io/bitsquare/gui/main/account/AccountView.java b/core/src/main/java/io/bitsquare/gui/main/account/AccountView.java index 91f03e6a91..066714ef41 100644 --- a/core/src/main/java/io/bitsquare/gui/main/account/AccountView.java +++ b/core/src/main/java/io/bitsquare/gui/main/account/AccountView.java @@ -118,7 +118,7 @@ public class AccountView extends ActivatableView { } // for IRC demo we deactivate the arbitratorSettingsTab - arbitratorSettingsTab.setDisable(true); + // arbitratorSettingsTab.setDisable(true); tab.setContent(view.getRoot()); root.getSelectionModel().select(tab); diff --git a/core/src/main/java/io/bitsquare/gui/main/account/arbitrator/ArbitratorSettingsView.java b/core/src/main/java/io/bitsquare/gui/main/account/arbitrator/ArbitratorSettingsView.java index fa9d1b0f49..1be302f66f 100644 --- a/core/src/main/java/io/bitsquare/gui/main/account/arbitrator/ArbitratorSettingsView.java +++ b/core/src/main/java/io/bitsquare/gui/main/account/arbitrator/ArbitratorSettingsView.java @@ -28,6 +28,7 @@ import javax.inject.Inject; import javafx.fxml.FXML; import javafx.scene.*; +import javafx.scene.layout.*; import javafx.stage.Modality; import javafx.stage.Stage; @@ -69,6 +70,10 @@ public class ArbitratorSettingsView extends AbstractView { stage.initOwner(primaryStage); Scene scene = new Scene((Parent) view.getRoot(), 800, 600); stage.setScene(scene); + stage.setOnCloseRequest(e -> { + // need to unset root to be re-uasabel to other popups screens + scene.setRoot(new Pane()); + }); stage.show(); } } diff --git a/core/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountDataModel.java b/core/src/main/java/io/bitsquare/gui/main/account/content/altcoin/AltCoinAccountDataModel.java similarity index 94% rename from core/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountDataModel.java rename to core/src/main/java/io/bitsquare/gui/main/account/content/altcoin/AltCoinAccountDataModel.java index 1b4007c680..2ed4c46d57 100644 --- a/core/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountDataModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/account/content/altcoin/AltCoinAccountDataModel.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.gui.main.account.content.irc; +package io.bitsquare.gui.main.account.content.altcoin; import io.bitsquare.common.viewfx.model.Activatable; import io.bitsquare.common.viewfx.model.DataModel; @@ -33,7 +33,7 @@ import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; -class IrcAccountDataModel implements Activatable, DataModel { +class AltCoinAccountDataModel implements Activatable, DataModel { private final User user; @@ -48,7 +48,7 @@ class IrcAccountDataModel implements Activatable, DataModel { @Inject - public IrcAccountDataModel(User user) { + public AltCoinAccountDataModel(User user) { this.user = user; } diff --git a/core/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountView.fxml b/core/src/main/java/io/bitsquare/gui/main/account/content/altcoin/AltCoinAccountView.fxml similarity index 98% rename from core/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountView.fxml rename to core/src/main/java/io/bitsquare/gui/main/account/content/altcoin/AltCoinAccountView.fxml index a0286b0183..4a30b595d9 100644 --- a/core/src/main/java/io/bitsquare/gui/main/account/content/irc/IrcAccountView.fxml +++ b/core/src/main/java/io/bitsquare/gui/main/account/content/altcoin/AltCoinAccountView.fxml @@ -24,7 +24,7 @@ -. */ -package io.bitsquare.gui.main.account.content.irc; +package io.bitsquare.gui.main.account.content.altcoin; import io.bitsquare.common.viewfx.view.ActivatableViewAndModel; import io.bitsquare.common.viewfx.view.FxmlView; @@ -40,7 +40,7 @@ import javafx.util.Callback; * Just temporary for giving the user a possibility to test the app via simulating the bank transfer in a IRC chat. */ @FxmlView -public class IrcAccountView extends ActivatableViewAndModel implements Wizard.Step { +public class AltCoinAccountView extends ActivatableViewAndModel implements Wizard.Step { @FXML HBox buttonsHBox; @FXML InputTextField ircNickNameTextField; @@ -51,7 +51,7 @@ public class IrcAccountView extends ActivatableViewAndModel. */ -package io.bitsquare.gui.main.account.content.irc; +package io.bitsquare.gui.main.account.content.altcoin; import io.bitsquare.common.viewfx.model.ActivatableWithDataModel; import io.bitsquare.common.viewfx.model.ViewModel; @@ -36,7 +36,7 @@ import javafx.beans.property.StringProperty; import javafx.collections.ObservableList; import javafx.util.StringConverter; -class IrcAccountViewModel extends ActivatableWithDataModel implements ViewModel { +class AltCoinAccountViewModel extends ActivatableWithDataModel implements ViewModel { private final InputValidator nickNameValidator; @@ -46,7 +46,7 @@ class IrcAccountViewModel extends ActivatableWithDataModel final ObjectProperty type = new SimpleObjectProperty<>(); @Inject - public IrcAccountViewModel(IrcAccountDataModel dataModel, BankAccountNumberValidator nickNameValidator) { + public AltCoinAccountViewModel(AltCoinAccountDataModel dataModel, BankAccountNumberValidator nickNameValidator) { super(dataModel); this.nickNameValidator = nickNameValidator; diff --git a/core/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java b/core/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java index 5d5452a8a4..1f2cb9271f 100644 --- a/core/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java +++ b/core/src/main/java/io/bitsquare/gui/main/account/settings/AccountSettingsView.java @@ -17,7 +17,6 @@ package io.bitsquare.gui.main.account.settings; -import io.bitsquare.BitsquareException; import io.bitsquare.common.viewfx.view.ActivatableViewAndModel; import io.bitsquare.common.viewfx.view.CachingViewLoader; import io.bitsquare.common.viewfx.view.FxmlView; @@ -29,7 +28,7 @@ import io.bitsquare.gui.Navigation; import io.bitsquare.gui.main.MainView; import io.bitsquare.gui.main.account.AccountView; import io.bitsquare.gui.main.account.content.changepassword.ChangePasswordView; -import io.bitsquare.gui.main.account.content.irc.IrcAccountView; +import io.bitsquare.gui.main.account.content.fiat.FiatAccountView; import io.bitsquare.gui.main.account.content.registration.RegistrationView; import io.bitsquare.gui.main.account.content.restrictions.RestrictionsView; import io.bitsquare.gui.main.account.content.seedwords.SeedWordsView; @@ -52,7 +51,7 @@ public class AccountSettingsView extends ActivatableViewAndModel { private final ViewLoader viewLoader; private final Navigation navigation; - private MenuItem seedWords, password, restrictions, ircAccount, registration; + private MenuItem seedWords, password, restrictions, fiatAccount, registration; private Navigation.Listener listener; @FXML private VBox leftVBox; @@ -77,15 +76,10 @@ public class AccountSettingsView extends ActivatableViewAndModel { seedWords = new MenuItem(navigation, toggleGroup, "Wallet seed", SeedWordsView.class); password = new MenuItem(navigation, toggleGroup, "Wallet password", ChangePasswordView.class); restrictions = new MenuItem(navigation, toggleGroup, "Arbitrator selection", RestrictionsView.class); - ircAccount = new MenuItem(navigation, toggleGroup, "Payments account(s)", IrcAccountView.class); + fiatAccount = new MenuItem(navigation, toggleGroup, "Payments account(s)", FiatAccountView.class); registration = new MenuItem(navigation, toggleGroup, "Renew your account", RegistrationView.class); - seedWords.setDisable(true); - password.setDisable(true); - restrictions.setDisable(true); - registration.setDisable(true); - - leftVBox.getChildren().addAll(seedWords, password, restrictions, ircAccount, registration); + leftVBox.getChildren().addAll(seedWords, password, restrictions, fiatAccount, registration); } @Override @@ -93,7 +87,7 @@ public class AccountSettingsView extends ActivatableViewAndModel { navigation.addListener(listener); ViewPath viewPath = navigation.getCurrentPath(); if (viewPath.size() == 3 && viewPath.indexOf(AccountSettingsView.class) == 2) { - navigation.navigateTo(MainView.class, AccountView.class, AccountSettingsView.class, IrcAccountView.class); + navigation.navigateTo(MainView.class, AccountView.class, AccountSettingsView.class, SeedWordsView.class); } else if (viewPath.size() == 4 && viewPath.indexOf(AccountSettingsView.class) == 2) { loadView(viewPath.get(3)); @@ -114,9 +108,8 @@ public class AccountSettingsView extends ActivatableViewAndModel { if (view instanceof SeedWordsView) seedWords.setSelected(true); else if (view instanceof ChangePasswordView) password.setSelected(true); else if (view instanceof RestrictionsView) restrictions.setSelected(true); - else if (view instanceof IrcAccountView) ircAccount.setSelected(true); + else if (view instanceof FiatAccountView) fiatAccount.setSelected(true); else if (view instanceof RegistrationView) registration.setSelected(true); - else throw new BitsquareException("Selecting main menu button for view " + view + " is not supported"); } } diff --git a/core/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java b/core/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java index 39350c5a46..48c873b864 100644 --- a/core/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java +++ b/core/src/main/java/io/bitsquare/gui/main/account/setup/AccountSetupWizard.java @@ -25,7 +25,7 @@ import io.bitsquare.common.viewfx.view.ViewLoader; import io.bitsquare.common.viewfx.view.Wizard; import io.bitsquare.gui.Navigation; import io.bitsquare.gui.main.MainView; -import io.bitsquare.gui.main.account.content.irc.IrcAccountView; +import io.bitsquare.gui.main.account.content.fiat.FiatAccountView; import io.bitsquare.gui.main.account.content.password.PasswordView; import io.bitsquare.gui.main.account.content.registration.RegistrationView; import io.bitsquare.gui.main.account.content.restrictions.RestrictionsView; @@ -46,7 +46,7 @@ public class AccountSetupWizard extends ActivatableView implements Wizard { @FXML VBox leftVBox; @FXML AnchorPane content; - private WizardItem seedWords, password, ircAccount, restrictions, registration; + private WizardItem seedWords, password, fiatAccount, restrictions, registration; private Navigation.Listener listener; private final ViewLoader viewLoader; @@ -78,17 +78,17 @@ public class AccountSetupWizard extends ActivatableView implements Wizard { password.onCompleted(); restrictions.show(); } - else if (viewClass == IrcAccountView.class) { + else if (viewClass == FiatAccountView.class) { seedWords.onCompleted(); password.onCompleted(); restrictions.onCompleted(); - ircAccount.show(); + fiatAccount.show(); } else if (viewClass == RegistrationView.class) { seedWords.onCompleted(); password.onCompleted(); restrictions.onCompleted(); - ircAccount.onCompleted(); + fiatAccount.onCompleted(); registration.show(); } }; @@ -99,23 +99,18 @@ public class AccountSetupWizard extends ActivatableView implements Wizard { "Setup password", "Protect your wallet with a password"); restrictions = new WizardItem(RestrictionsView.class, "Select arbitrators", "Select which arbitrators you want to use for trading"); - ircAccount = new WizardItem(IrcAccountView.class, + fiatAccount = new WizardItem(FiatAccountView.class, " Setup Payments account(s)", "You need to setup at least one payment account"); registration = new WizardItem(RegistrationView.class, "Register your account", "The registration in the Blockchain requires a payment of 0.0002 BTC"); - leftVBox.getChildren().addAll(seedWords, password, restrictions, ircAccount, registration); - - seedWords.setDisable(true); - password.setDisable(true); - restrictions.setDisable(true); - registration.setDisable(true); + leftVBox.getChildren().addAll(seedWords, password, restrictions, fiatAccount, registration); } @Override public void activate() { navigation.addListener(listener); - ircAccount.show(); + seedWords.show(); } @Override @@ -135,10 +130,10 @@ public class AccountSetupWizard extends ActivatableView implements Wizard { } else if (currentStep instanceof RestrictionsView) { restrictions.onCompleted(); - ircAccount.show(); + fiatAccount.show(); } - else if (currentStep instanceof IrcAccountView) { - ircAccount.onCompleted(); + else if (currentStep instanceof FiatAccountView) { + fiatAccount.onCompleted(); registration.show(); } else if (currentStep instanceof RegistrationView) { diff --git a/core/src/main/java/io/bitsquare/gui/main/debug/DebugView.java b/core/src/main/java/io/bitsquare/gui/main/debug/DebugView.java index 35ba0ebe32..0fb99f52e5 100644 --- a/core/src/main/java/io/bitsquare/gui/main/debug/DebugView.java +++ b/core/src/main/java/io/bitsquare/gui/main/debug/DebugView.java @@ -28,31 +28,31 @@ import io.bitsquare.trade.protocol.placeoffer.tasks.AddOfferToRemoteOfferBook; import io.bitsquare.trade.protocol.placeoffer.tasks.BroadcastCreateOfferFeeTx; import io.bitsquare.trade.protocol.placeoffer.tasks.CreateOfferFeeTx; import io.bitsquare.trade.protocol.placeoffer.tasks.ValidateOffer; -import io.bitsquare.trade.protocol.trade.offerer.OffererProtocol; -import io.bitsquare.trade.protocol.trade.offerer.tasks.CreateAndSignPayoutTx; -import io.bitsquare.trade.protocol.trade.offerer.tasks.CreateOffererDepositTxInputs; -import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessPayoutTxPublishedMessage; -import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestDepositTxInputsMessage; -import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestPublishDepositTxMessage; -import io.bitsquare.trade.protocol.trade.offerer.tasks.SendRequestTakerDepositPaymentMessage; -import io.bitsquare.trade.protocol.trade.offerer.tasks.SendFiatTransferStartedMessage; -import io.bitsquare.trade.protocol.trade.offerer.tasks.SendDepositTxPublishedMessage; -import io.bitsquare.trade.protocol.trade.offerer.tasks.SignAndPublishDepositTx; -import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyAndSignContract; +import io.bitsquare.trade.protocol.trade.offerer.OffererAsBuyerProtocol; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererCreatesAndSignPayoutTx; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererCreatesDepositTxInputs; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererProcessPayoutTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererProcessRequestDepositTxInputsMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererProcessRequestPublishDepositTxMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererSendsRequestSellerDepositPaymentMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererSendsFiatTransferStartedMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererSendsDepositTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererSignsAndPublishDepositTx; +import io.bitsquare.trade.protocol.trade.offerer.tasks.OffererVerifiesAndSignsContract; import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakeOfferFeePayment; import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakerAccount; -import io.bitsquare.trade.protocol.trade.taker.TakerProtocol; -import io.bitsquare.trade.protocol.trade.taker.tasks.CreateAndSignContract; +import io.bitsquare.trade.protocol.trade.taker.TakerAsSellerProtocol; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerCreatesAndSignContract; import io.bitsquare.trade.protocol.trade.taker.tasks.CreateTakeOfferFeeTx; -import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessDepositTxPublishedMessage; -import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessFiatTransferStartedMessage; -import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessRequestTakerDepositPaymentMessage; -import io.bitsquare.trade.protocol.trade.taker.tasks.SendPayoutTxPublishedMessage; -import io.bitsquare.trade.protocol.trade.taker.tasks.SendRequestDepositTxInputsMessage; -import io.bitsquare.trade.protocol.trade.taker.tasks.SendRequestPublishDepositTxMessage; -import io.bitsquare.trade.protocol.trade.taker.tasks.SignAndPublishPayoutTx; -import io.bitsquare.trade.protocol.trade.taker.tasks.CommitDepositTx; -import io.bitsquare.trade.protocol.trade.taker.tasks.CreateAndSignDepositTx; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerProcessDepositTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerProcessFiatTransferStartedMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerProcessRequestSellerDepositPaymentMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerSendsPayoutTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerSendsRequestDepositTxInputsMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerSendsRequestPublishDepositTxMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerSignsAndPublishPayoutTx; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerCommitDepositTx; +import io.bitsquare.trade.protocol.trade.taker.tasks.TakerCreatesAndSignsDepositTx; import io.bitsquare.trade.protocol.trade.taker.tasks.VerifyOfferFeePayment; import io.bitsquare.trade.protocol.trade.taker.tasks.VerifyOffererAccount; @@ -100,44 +100,44 @@ public class DebugView extends InitializableView { /*---- Protocol ----*/ - OffererProtocol.class, - ProcessRequestDepositTxInputsMessage.class, - CreateOffererDepositTxInputs.class, - SendRequestTakerDepositPaymentMessage.class, + OffererAsBuyerProtocol.class, + OffererProcessRequestDepositTxInputsMessage.class, + OffererCreatesDepositTxInputs.class, + OffererSendsRequestSellerDepositPaymentMessage.class, - ProcessRequestPublishDepositTxMessage.class, + OffererProcessRequestPublishDepositTxMessage.class, VerifyTakerAccount.class, - VerifyAndSignContract.class, - SignAndPublishDepositTx.class, - SendDepositTxPublishedMessage.class, + OffererVerifiesAndSignsContract.class, + OffererSignsAndPublishDepositTx.class, + OffererSendsDepositTxPublishedMessage.class, - CreateAndSignPayoutTx.class, + OffererCreatesAndSignPayoutTx.class, VerifyTakeOfferFeePayment.class, - SendFiatTransferStartedMessage.class, + OffererSendsFiatTransferStartedMessage.class, - ProcessPayoutTxPublishedMessage.class, + OffererProcessPayoutTxPublishedMessage.class, Boolean.class, /* used as seperator*/ /*---- Protocol ----*/ - TakerProtocol.class, + TakerAsSellerProtocol.class, CreateTakeOfferFeeTx.class, - SendRequestDepositTxInputsMessage.class, + TakerSendsRequestDepositTxInputsMessage.class, - ProcessRequestTakerDepositPaymentMessage.class, + TakerProcessRequestSellerDepositPaymentMessage.class, VerifyOffererAccount.class, - CreateAndSignContract.class, - CreateAndSignDepositTx.class, - SendRequestPublishDepositTxMessage.class, + TakerCreatesAndSignContract.class, + TakerCreatesAndSignsDepositTx.class, + TakerSendsRequestPublishDepositTxMessage.class, - ProcessDepositTxPublishedMessage.class, - CommitDepositTx.class, + TakerProcessDepositTxPublishedMessage.class, + TakerCommitDepositTx.class, - ProcessFiatTransferStartedMessage.class, + TakerProcessFiatTransferStartedMessage.class, - SignAndPublishPayoutTx.class, + TakerSignsAndPublishPayoutTx.class, VerifyOfferFeePayment.class, - SendPayoutTxPublishedMessage.class + TakerSendsPayoutTxPublishedMessage.class ) ); diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java index ba0fc5e7d9..51b3f1531e 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/closed/ClosedTradesViewModel.java @@ -20,8 +20,8 @@ package io.bitsquare.gui.main.portfolio.closed; import io.bitsquare.common.viewfx.model.ActivatableWithDataModel; import io.bitsquare.common.viewfx.model.ViewModel; import io.bitsquare.gui.util.BSFormatter; -import io.bitsquare.trade.OffererTrade; -import io.bitsquare.trade.TakerTrade; +import io.bitsquare.trade.OffererAsSellerTrade; +import io.bitsquare.trade.TakerAsBuyerTrade; import io.bitsquare.trade.Trade; import com.google.inject.Inject; @@ -71,8 +71,8 @@ class ClosedTradesViewModel extends ActivatableWithDataModel takerProcessState = new SimpleObjectProperty<>(); - final ObjectProperty offererProcessState = new SimpleObjectProperty<>(); + final ObjectProperty takerProcessState = new SimpleObjectProperty<>(); + final ObjectProperty offererProcessState = new SimpleObjectProperty<>(); @Inject public PendingTradesDataModel(TradeManager tradeManager, WalletService walletService, User user) { @@ -115,10 +119,10 @@ class PendingTradesDataModel implements Activatable, DataModel { isOfferer = getTrade().getOffer().getP2PSigPubKey().equals(user.getP2PSigPubKey()); Trade trade = getTrade(); - if (trade instanceof TakerTrade) - takerProcessState.bind(((TakerTrade) trade).processStateProperty()); + if (trade instanceof TakerAsSellerTrade) + takerProcessState.bind(trade.processStateProperty()); else - offererProcessState.bind(((OffererTrade) trade).processStateProperty()); + offererProcessState.bind(trade.processStateProperty()); log.trace("selectTrade trade.stateProperty().get() " + trade.processStateProperty().get()); @@ -127,11 +131,11 @@ class PendingTradesDataModel implements Activatable, DataModel { } void fiatPaymentStarted() { - ((OffererTrade) getTrade()).onFiatPaymentStarted(); + ((OffererAsBuyerTrade) getTrade()).onFiatPaymentStarted(); } void fiatPaymentReceived() { - ((TakerTrade) getTrade()).onFiatPaymentReceived(); + ((TakerAsSellerTrade) getTrade()).onFiatPaymentReceived(); } void withdraw(String toAddress) { @@ -180,8 +184,9 @@ class PendingTradesDataModel implements Activatable, DataModel { return isOfferer; } + @Nullable Trade getTrade() { - return selectedItem.getTrade(); + return selectedItem != null ? selectedItem.getTrade() : null; } Coin getTotalFees() { diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java index 2b9a9ea1c9..4b01e2d501 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesListItem.java @@ -17,6 +17,8 @@ package io.bitsquare.gui.main.portfolio.pending; +import io.bitsquare.trade.OffererTrade; +import io.bitsquare.trade.TakerTrade; import io.bitsquare.trade.Trade; import org.bitcoinj.core.Coin; @@ -51,11 +53,17 @@ public class PendingTradesListItem { } public ReadOnlyObjectProperty tradeAmountProperty() { - return trade.tradeAmountProperty(); + if (trade instanceof TakerTrade) + return ((TakerTrade) trade).tradeAmountProperty(); + else + return ((OffererTrade) trade).tradeAmountProperty(); } public ReadOnlyObjectProperty tradeVolumeProperty() { - return trade.tradeVolumeProperty(); + if (trade instanceof TakerTrade) + return ((TakerTrade) trade).tradeVolumeProperty(); + else + return ((OffererTrade) trade).tradeVolumeProperty(); } public Date getDate() { diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesOffererAsBuyerView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesOffererAsBuyerView.java new file mode 100644 index 0000000000..2669d2a84b --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesOffererAsBuyerView.java @@ -0,0 +1,75 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare 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. + * + * Bitsquare 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 Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.portfolio.pending; + +import io.bitsquare.gui.main.portfolio.pending.steps.CompletedView; +import io.bitsquare.gui.main.portfolio.pending.steps.StartFiatView; +import io.bitsquare.gui.main.portfolio.pending.steps.WaitView; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PendingTradesOffererAsBuyerView extends PendingTradesStepsView { + private static final Logger log = LoggerFactory.getLogger(PendingTradesOffererAsBuyerView.class); + + private TradeWizardItem waitTxConfirm; + private TradeWizardItem startFiat; + private TradeWizardItem waitFiatReceived; + private TradeWizardItem completed; + + + public PendingTradesOffererAsBuyerView() { + super(); + } + + public void activate() { + showWaitTxConfirm(); + } + + public void deactivate() { + } + + public void showWaitTxConfirm() { + showItem(waitTxConfirm); + } + + public void showStartFiat() { + showItem(startFiat); + } + + public void showWaitFiatReceived() { + showItem(waitFiatReceived); + } + + public void showCompleted() { + showItem(completed); + } + + + @Override + protected void addWizards() { + waitTxConfirm = new TradeWizardItem(WaitView.class, "Wait for blockchain confirmation"); + startFiat = new TradeWizardItem(StartFiatView.class, "Start payment"); + waitFiatReceived = new TradeWizardItem(WaitView.class, "Wait until payment has arrived"); + completed = new TradeWizardItem(CompletedView.class, "Completed"); + leftVBox.getChildren().addAll(waitTxConfirm, startFiat, waitFiatReceived, completed); + } +} + + + diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesStepsView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesStepsView.java new file mode 100644 index 0000000000..7ee12db028 --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesStepsView.java @@ -0,0 +1,91 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare 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. + * + * Bitsquare 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 Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.portfolio.pending; + +import io.bitsquare.gui.util.Layout; + +import javafx.scene.*; +import javafx.scene.layout.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class PendingTradesStepsView extends HBox { + private static final Logger log = LoggerFactory.getLogger(PendingTradesStepsView.class); + + protected VBox leftVBox; + protected AnchorPane contentPane; + protected TradeWizardItem current; + + public PendingTradesStepsView() { + setSpacing(Layout.PADDING_WINDOW); + buildViews(); + } + + public void activate() { + + } + + public void deactivate() { + } + + protected void buildViews() { + addLeftBox(); + addContentPane(); + addWizards(); + activate(); + } + + abstract protected void addWizards(); + + protected void showItem(TradeWizardItem item) { + if (current != null) + current.onCompleted(); + current = item; + current.show(); + loadView(item.getViewClass()); + } + + protected void loadView(Class viewClass) { + Node view = null; + try { + view = viewClass.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + + contentPane.getChildren().setAll(view); + } + + private void addLeftBox() { + leftVBox = new VBox(); + leftVBox.setSpacing(Layout.SPACING_VBOX); + getChildren().add(leftVBox); + } + + private void addContentPane() { + contentPane = new AnchorPane(); + HBox.setHgrow(contentPane, Priority.SOMETIMES); + getChildren().add(contentPane); + } + + +} + + + diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewModel.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewModel.java index d5bf153d0e..5ef1da70fa 100644 --- a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/PendingTradesViewModel.java @@ -23,8 +23,10 @@ import io.bitsquare.common.viewfx.model.ViewModel; import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.validation.BtcAddressValidator; import io.bitsquare.locale.BSResources; -import io.bitsquare.trade.OffererTrade; -import io.bitsquare.trade.TakerTrade; +import io.bitsquare.trade.OffererAsBuyerTrade; +import io.bitsquare.trade.OffererAsSellerTrade; +import io.bitsquare.trade.TakerAsBuyerTrade; +import io.bitsquare.trade.TakerAsSellerTrade; import org.bitcoinj.core.Coin; import org.bitcoinj.utils.Fiat; @@ -240,79 +242,160 @@ class PendingTradesViewModel extends ActivatableWithDataModel. + */ + +package io.bitsquare.gui.main.portfolio.pending; + +import io.bitsquare.gui.util.Colors; + +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.*; +import javafx.scene.control.*; + +import de.jensd.fx.fontawesome.AwesomeDude; +import de.jensd.fx.fontawesome.AwesomeIcon; + +public class TradeWizardItem extends Button { + public Class getViewClass() { + return viewClass; + } + + private final Class viewClass; + + public TradeWizardItem(Class viewClass, String title) { + this.viewClass = viewClass; + + setText(title); + setId("trade-wizard-item-background-disabled"); + setPrefHeight(40); + setPrefWidth(270); + setPadding(new Insets(0, 20, 0, 10)); + setAlignment(Pos.CENTER_LEFT); + + Label icon = new Label(); + icon.setTextFill(Colors.MID_GREY); + AwesomeDude.setIcon(icon, AwesomeIcon.ANGLE_DOWN); + setGraphic(icon); + } + + void show() { + setId("trade-wizard-item-background-active"); + Label icon = new Label(); + icon.setTextFill(Colors.BLUE); + AwesomeDude.setIcon(icon, AwesomeIcon.ARROW_RIGHT); + setGraphic(icon); + } + + void onCompleted() { + setId("trade-wizard-item-background-completed"); + Label icon = new Label(); + icon.setTextFill(Colors.GREEN); + AwesomeDude.setIcon(icon, AwesomeIcon.OK); + setGraphic(icon); + } +} diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/proto/PendingMain.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/proto/PendingMain.java new file mode 100644 index 0000000000..b63ade789a --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/proto/PendingMain.java @@ -0,0 +1,53 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare 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. + * + * Bitsquare 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 Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.portfolio.pending.proto; + +import io.bitsquare.gui.main.portfolio.pending.PendingTradesOffererAsBuyerView; +import io.bitsquare.gui.util.Layout; + +import javafx.application.Application; +import javafx.scene.*; +import javafx.scene.layout.*; +import javafx.stage.Stage; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PendingMain extends Application { + private static final Logger log = LoggerFactory.getLogger(PendingMain.class); + + @Override + public void start(Stage primaryStage) { + AnchorPane root = new AnchorPane(); + PendingTradesOffererAsBuyerView pendingTradesOffererAsBuyerView = new PendingTradesOffererAsBuyerView(); + AnchorPane.setLeftAnchor(pendingTradesOffererAsBuyerView, Layout.PADDING_WINDOW); + AnchorPane.setRightAnchor(pendingTradesOffererAsBuyerView, Layout.PADDING_WINDOW); + AnchorPane.setTopAnchor(pendingTradesOffererAsBuyerView, Layout.PADDING_WINDOW); + AnchorPane.setBottomAnchor(pendingTradesOffererAsBuyerView, Layout.PADDING_WINDOW); + + root.getChildren().add(pendingTradesOffererAsBuyerView); + + Scene scene = new Scene(root, 1000, 600); + scene.getStylesheets().setAll( + "/io/bitsquare/gui/bitsquare.css", + "/io/bitsquare/gui/images.css"); + primaryStage.setScene(scene); + primaryStage.show(); + + } +} diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/CompletedView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/CompletedView.java new file mode 100644 index 0000000000..ea86eb3c1f --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/CompletedView.java @@ -0,0 +1,95 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare 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. + * + * Bitsquare 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 Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.portfolio.pending.steps; + +import io.bitsquare.gui.components.InfoDisplay; +import io.bitsquare.gui.components.InputTextField; +import io.bitsquare.gui.util.Layout; + +import javafx.event.ActionEvent; +import javafx.scene.control.*; +import javafx.scene.layout.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static io.bitsquare.gui.util.ComponentBuilder.*; + +public class CompletedView extends AnchorPane{ + private static final Logger log = LoggerFactory.getLogger(WaitView.class); + + private Label btcTradeAmountLabel; + private TextField btcTradeAmountTextField; + private Label fiatTradeAmountLabel; + private TextField fiatTradeAmountTextField; + private Label feesLabel; + private TextField feesTextField; + private Label securityDepositLabel; + private TextField securityDepositTextField; + private InfoDisplay infoDisplay; + + private InputTextField withdrawAddressTextField; + private TextField withdrawAmountTextField; + + public CompletedView() { + buildViews(); + } + + private void buildViews() { + AnchorPane.setLeftAnchor(this, 0d); + AnchorPane.setRightAnchor(this, 0d); + AnchorPane.setTopAnchor(this, 0d); + AnchorPane.setBottomAnchor(this, 0d); + + int i = 0; + GridPane gridPane = getAndAddGridPane(this); + + getAndAddTitledGroupBg(gridPane, i, 5, "Summary"); + LabelTextFieldPair btcTradeAmountPair = getAndAddLabelTextFieldPair(gridPane, i++, "You have bought:", Layout.FIRST_ROW_DISTANCE); + btcTradeAmountLabel = btcTradeAmountPair.label; + btcTradeAmountTextField = btcTradeAmountPair.textField; + + LabelTextFieldPair fiatTradeAmountPair = getAndAddLabelTextFieldPair(gridPane, i++, "You have paid:"); + fiatTradeAmountLabel = fiatTradeAmountPair.label; + fiatTradeAmountTextField = fiatTradeAmountPair.textField; + + LabelTextFieldPair feesPair = getAndAddLabelTextFieldPair(gridPane, i++, "Total fees paid:"); + feesLabel = feesPair.label; + feesTextField = feesPair.textField; + + LabelTextFieldPair securityDepositPair = getAndAddLabelTextFieldPair(gridPane, i++, "Refunded security deposit:"); + securityDepositLabel = securityDepositPair.label; + securityDepositTextField = securityDepositPair.textField; + + infoDisplay = getAndAddInfoDisplay(gridPane, i++, "infoDisplay", this::onOpenHelp); + + getAndAddTitledGroupBg(gridPane, i, 2, "Withdraw your bitcoins", Layout.GROUP_DISTANCE); + withdrawAmountTextField = getAndAddLabelTextFieldPair(gridPane, i++, "Amount to withdraw:", Layout.FIRST_ROW_AND_GROUP_DISTANCE).textField; + withdrawAddressTextField = getAndAddLabelInputTextFieldPair(gridPane, i++, "Withdraw to address:").inputTextField; + getAndAddButton(gridPane, i++, "Withdraw to external wallet", this::onWithdraw); + } + + private void onWithdraw(ActionEvent actionEvent) { + log.debug("onWithdraw"); + } + + private void onOpenHelp(ActionEvent actionEvent) { + log.debug("onOpenHelp"); + } + +} diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/ConfirmFiatView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/ConfirmFiatView.java new file mode 100644 index 0000000000..3d4574da60 --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/ConfirmFiatView.java @@ -0,0 +1,69 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare 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. + * + * Bitsquare 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 Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.portfolio.pending.steps; + +import io.bitsquare.gui.components.InfoDisplay; +import io.bitsquare.gui.components.TxIdTextField; +import io.bitsquare.gui.util.Layout; + +import javafx.event.ActionEvent; +import javafx.scene.control.*; +import javafx.scene.layout.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static io.bitsquare.gui.util.ComponentBuilder.*; + +public class ConfirmFiatView extends AnchorPane { + private static final Logger log = LoggerFactory.getLogger(ConfirmFiatView.class); + + private TextField statusTextField; + private TxIdTextField txIdTextField; + private InfoDisplay infoDisplay; + + public ConfirmFiatView() { + buildViews(); + } + + private void buildViews() { + AnchorPane.setLeftAnchor(this, 0d); + AnchorPane.setRightAnchor(this, 0d); + AnchorPane.setTopAnchor(this, 0d); + AnchorPane.setBottomAnchor(this, 0d); + + int i = 0; + GridPane gridPane = getAndAddGridPane(this); + getAndAddTitledGroupBg(gridPane, i, 3, "Trade status"); + statusTextField = getAndAddLabelTextFieldPair(gridPane, i++, "Status:", Layout.FIRST_ROW_DISTANCE).textField; + txIdTextField = getAndAddLabelTxIdTextFieldPair(gridPane, i++, "Deposit transaction ID:").txIdTextField; + infoDisplay = getAndAddInfoDisplay(gridPane, i++, "infoDisplay", this::onOpenHelp); + getAndAddButton(gridPane, i++, "Confirm payment receipt", this::onPaymentReceived); + } + + private void onPaymentReceived(ActionEvent actionEvent) { + log.debug("onPaymentReceived"); + } + + private void onOpenHelp(ActionEvent actionEvent) { + log.debug("onOpenHelp"); + } + +} + + diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/StartFiatView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/StartFiatView.java new file mode 100644 index 0000000000..d8e833f07d --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/StartFiatView.java @@ -0,0 +1,73 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare 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. + * + * Bitsquare 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 Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.portfolio.pending.steps; + +import io.bitsquare.gui.components.InfoDisplay; +import io.bitsquare.gui.components.TextFieldWithCopyIcon; +import io.bitsquare.gui.util.Layout; + +import javafx.event.ActionEvent; +import javafx.scene.control.*; +import javafx.scene.layout.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static io.bitsquare.gui.util.ComponentBuilder.*; + +public class StartFiatView extends AnchorPane { + private static final Logger log = LoggerFactory.getLogger(WaitView.class); + + private TextFieldWithCopyIcon fiatAmountTextField; + private TextField paymentMethodTextField; + private TextFieldWithCopyIcon holderNameTextField; + private TextFieldWithCopyIcon primarTextField; + private TextFieldWithCopyIcon secondaryIdTextField; + private InfoDisplay infoDisplay; + + public StartFiatView() { + buildViews(); + } + + private void buildViews() { + AnchorPane.setLeftAnchor(this, 0d); + AnchorPane.setRightAnchor(this, 0d); + AnchorPane.setTopAnchor(this, 0d); + AnchorPane.setBottomAnchor(this, 0d); + + int i = 0; + GridPane gridPane = getAndAddGridPane(this); + getAndAddTitledGroupBg(gridPane, i, 6, "Payments details"); + fiatAmountTextField = getAndAddLabelTextFieldWithCopyIconPair(gridPane, i++, "Amount to transfer:", Layout.FIRST_ROW_DISTANCE).textFieldWithCopyIcon; + paymentMethodTextField = getAndAddLabelTextFieldPair(gridPane, i++, "Payment method:").textField; + holderNameTextField = getAndAddLabelTextFieldWithCopyIconPair(gridPane, i++, "Receiver:").textFieldWithCopyIcon; + primarTextField = getAndAddLabelTextFieldWithCopyIconPair(gridPane, i++, "IBAN:").textFieldWithCopyIcon; + secondaryIdTextField = getAndAddLabelTextFieldWithCopyIconPair(gridPane, i++, "BIC:").textFieldWithCopyIcon; + infoDisplay = getAndAddInfoDisplay(gridPane, i++, "infoDisplay", this::onOpenHelp); + getAndAddButton(gridPane, i++, "Payment started", this::onPaymentStarted); + } + + private void onPaymentStarted(ActionEvent actionEvent) { + log.debug("onPaymentStarted"); + } + + private void onOpenHelp(ActionEvent actionEvent) { + log.debug("onOpenHelp"); + } + +} diff --git a/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitView.java b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitView.java new file mode 100644 index 0000000000..cb6b2fb4f7 --- /dev/null +++ b/core/src/main/java/io/bitsquare/gui/main/portfolio/pending/steps/WaitView.java @@ -0,0 +1,64 @@ +/* + * This file is part of Bitsquare. + * + * Bitsquare 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. + * + * Bitsquare 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 Bitsquare. If not, see . + */ + +package io.bitsquare.gui.main.portfolio.pending.steps; + +import io.bitsquare.gui.components.InfoDisplay; +import io.bitsquare.gui.components.TxIdTextField; +import io.bitsquare.gui.util.Layout; + +import javafx.event.ActionEvent; +import javafx.scene.control.*; +import javafx.scene.layout.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static io.bitsquare.gui.util.ComponentBuilder.*; + +public class WaitView extends AnchorPane { + private static final Logger log = LoggerFactory.getLogger(WaitView.class); + + + private TextField statusTextField; + private TxIdTextField txIdTextField; + private InfoDisplay infoDisplay; + + public WaitView() { + buildViews(); + } + + private void buildViews() { + AnchorPane.setLeftAnchor(this, 0d); + AnchorPane.setRightAnchor(this, 0d); + AnchorPane.setTopAnchor(this, 0d); + AnchorPane.setBottomAnchor(this, 0d); + + int i = 0; + GridPane gridPane = getAndAddGridPane(this); + getAndAddTitledGroupBg(gridPane, i, 3, "Trade status"); + statusTextField = getAndAddLabelTextFieldPair(gridPane, i++, "Status:", Layout.FIRST_ROW_DISTANCE).textField; + txIdTextField = getAndAddLabelTxIdTextFieldPair(gridPane, i++, "Deposit transaction ID:").txIdTextField; + infoDisplay = getAndAddInfoDisplay(gridPane, i++, "infoDisplay", this::onOpenHelp); + } + + private void onOpenHelp(ActionEvent actionEvent) { + log.debug("onOpenHelp"); + } +} + + diff --git a/core/src/main/java/io/bitsquare/gui/main/trade/TradeView.java b/core/src/main/java/io/bitsquare/gui/main/trade/TradeView.java index 395990c535..f2831d5f05 100644 --- a/core/src/main/java/io/bitsquare/gui/main/trade/TradeView.java +++ b/core/src/main/java/io/bitsquare/gui/main/trade/TradeView.java @@ -22,7 +22,6 @@ import io.bitsquare.common.viewfx.view.View; import io.bitsquare.common.viewfx.view.ViewLoader; import io.bitsquare.gui.Navigation; import io.bitsquare.gui.components.InputTextField; -import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.main.MainView; import io.bitsquare.gui.main.trade.createoffer.CreateOfferView; import io.bitsquare.gui.main.trade.offerbook.OfferBookView; @@ -128,13 +127,6 @@ public abstract class TradeView extends ActivatableView { OfferActionHandler offerActionHandler = new OfferActionHandler() { @Override public void createOffer(Coin amount, Fiat price) { - if (TradeView.this instanceof SellView) { - Popups.openWarningPopup("Warning", - "Please note that a sell offer is not supported yet for trading", - "You can create the offer and it appears in the offerbook, " + - "but nobody can take the offer.\n" + - "That will be implemented in an upcoming development milestone."); - } TradeView.this.amount = amount; TradeView.this.price = price; TradeView.this.navigation.navigateTo(MainView.class, TradeView.this.getClass(), @@ -175,7 +167,7 @@ public abstract class TradeView extends ActivatableView { // CreateOffer and TakeOffer must not be cached by ViewLoader as we cannot use a view multiple times // in different graphs takeOfferView = (TakeOfferView) view; - takeOfferView.initWithData(direction, amount, offer); + takeOfferView.initWithData(amount, offer); takeOfferPane = ((TakeOfferView) view).getRoot(); final Tab tab = new Tab("Take offer"); takeOfferView.setCloseHandler(() -> { diff --git a/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferDataModel.java b/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferDataModel.java index 75a382cc91..aed55f32a8 100644 --- a/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferDataModel.java +++ b/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferDataModel.java @@ -75,7 +75,7 @@ class CreateOfferDataModel implements Activatable, DataModel { private final String offerId; - @Nullable private Offer.Direction direction = null; + private Offer.Direction direction; private AddressEntry addressEntry; final StringProperty requestPlaceOfferErrorMessage = new SimpleStringProperty(); @@ -211,8 +211,12 @@ class CreateOfferDataModel implements Activatable, DataModel { } void calculateTotalToPay() { - if (securityDepositAsCoin.get() != null) - totalToPayAsCoin.set(offerFeeAsCoin.get().add(networkFeeAsCoin.get()).add(securityDepositAsCoin.get())); + if (securityDepositAsCoin.get() != null) { + if (direction == Offer.Direction.BUY) + totalToPayAsCoin.set(offerFeeAsCoin.get().add(networkFeeAsCoin.get()).add(securityDepositAsCoin.get())); + else + totalToPayAsCoin.set(offerFeeAsCoin.get().add(networkFeeAsCoin.get()).add(securityDepositAsCoin.get()).add(amountAsCoin.get())); + } } @@ -234,13 +238,6 @@ class CreateOfferDataModel implements Activatable, DataModel { return direction; } - @SuppressWarnings("NullableProblems") - void setDirection(Offer.Direction direction) { - // direction can not be changed once it is initially set - checkNotNull(direction); - this.direction = direction; - } - WalletService getWalletService() { return walletService; } @@ -270,4 +267,9 @@ class CreateOfferDataModel implements Activatable, DataModel { public Boolean getDisplaySecurityDepositInfo() { return preferences.getDisplaySecurityDepositInfo(); } + + public void initWithData(Offer.Direction direction, Coin amount, Fiat price) { + checkNotNull(direction); + this.direction = direction; + } } diff --git a/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.fxml b/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.fxml index 4e7edc018a..bbd5917d67 100644 --- a/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.fxml +++ b/core/src/main/java/io/bitsquare/gui/main/trade/createoffer/CreateOfferView.fxml @@ -51,7 +51,7 @@ -