diff --git a/core/src/main/java/io/bitsquare/btc/WalletService.java b/core/src/main/java/io/bitsquare/btc/WalletService.java index 0ab89a1a7d..93b8556977 100644 --- a/core/src/main/java/io/bitsquare/btc/WalletService.java +++ b/core/src/main/java/io/bitsquare/btc/WalletService.java @@ -602,11 +602,11 @@ public class WalletService { // 1. step: deposit tx // Offerer creates the 2of3 multiSig deposit tx with his unsigned input and change output - public Transaction offererCreatesMSTxAndAddPayment(Coin offererInputAmount, - byte[] offererPubKey, - byte[] takerPubKey, - byte[] arbitratorPubKey, - String tradeId) throws InsufficientMoneyException { + public Transaction prepareDepositTx(Coin offererInputAmount, + byte[] offererPubKey, + byte[] takerPubKey, + byte[] arbitratorPubKey, + String tradeId) throws InsufficientMoneyException { log.debug("offererCreatesMSTxAndAddPayment"); log.trace("inputs: "); log.trace("offererInputAmount=" + offererInputAmount.toFriendlyString()); @@ -640,7 +640,8 @@ public class WalletService { // The completeTx() call signs the input, but we don't want to pass over a signed tx so we remove the // signature to make sure the tx is invalid for publishing - tx.getInput(0).setScriptSig(new Script(new byte[]{})); + // We have exactly 1 input as our spending transaction output is from the create offer fee payment and has only 1 output + tx.getInputs().get(0).setScriptSig(new Script(new byte[]{})); log.trace("verify tx"); tx.verify(); @@ -660,13 +661,12 @@ public class WalletService { // 2. step: deposit tx // Taker adds his input and change output, changes the multiSig amount to the correct value and sign his input - public Transaction takerAddPaymentAndSignTx(Coin takerInputAmount, Coin msOutputAmount, byte[] offererPubKey, byte[] takerPubKey, byte[] arbitratorPubKey, - String offerersPartialDepositTxAsHex, + Transaction preparedDepositTransaction, String tradeId) throws InsufficientMoneyException { log.debug("takerAddPaymentAndSignTx"); log.trace("inputs: "); @@ -675,7 +675,7 @@ public class WalletService { log.trace("offererPubKey=" + offererPubKey); log.trace("takerPubKey=" + takerPubKey); log.trace("arbitratorPubKey=" + arbitratorPubKey); - log.trace("offerersPartialDepositTxAsHex=" + offerersPartialDepositTxAsHex); + log.trace("preparedDepositTransaction=" + preparedDepositTransaction); log.trace("tradeId=" + tradeId); // We pay the btc tx fee 2 times to the deposit tx: @@ -710,10 +710,8 @@ public class WalletService { OUT[1] Optional change = input taker - takerInputAmount - fee btc tx fee */ - // Now we construct the real 2of3 multiSig tx from the serialized offerers tx - Transaction tx = new Transaction(params, Utils.parseAsHexOrBase58(offerersPartialDepositTxAsHex)); - log.trace("offerersPartialDepositTx=" + tx); + Transaction tx = new Transaction(params, preparedDepositTransaction.bitcoinSerialize()); // The serialized offerers tx looks like: /* @@ -724,15 +722,14 @@ public class WalletService { */ // Now we add the inputs and outputs from our temp tx and change the multiSig amount to the correct value - // TODO multiple inputs not supported yet - tx.addInput(tempTx.getInput(0)); + for (TransactionInput input : tempTx.getInputs()) { + tx.addInput(input); + } // handle optional change output if (tempTx.getOutputs().size() == 2) { tx.addOutput(tempTx.getOutput(1)); } - // We add the btc tx fee to the msOutputAmount and apply the change to the multiSig output - msOutputAmount = msOutputAmount.add(FeePolicy.TX_FEE); tx.getOutput(0).setValue(msOutputAmount); // Now we sign our input (index 1) @@ -782,8 +779,7 @@ public class WalletService { // 3. step: deposit tx // Offerer signs tx and publishes it - - public void offererSignAndPublishTx(String offerersFirstTxAsHex, + public void offererSignAndPublishTx(Transaction preparedDepositTx, String takersSignedTxAsHex, String takersSignedConnOutAsHex, String takersSignedScriptSigAsHex, @@ -792,7 +788,7 @@ public class WalletService { FutureCallback callback) { log.debug("offererSignAndPublishTx"); log.trace("inputs: "); - log.trace("offerersFirstTxAsHex=" + offerersFirstTxAsHex); + log.trace("preparedDepositTx=" + preparedDepositTx); log.trace("takersSignedTxAsHex=" + takersSignedTxAsHex); log.trace("takersSignedConnOutAsHex=" + takersSignedConnOutAsHex); log.trace("takersSignedScriptSigAsHex=" + takersSignedScriptSigAsHex); @@ -803,7 +799,7 @@ public class WalletService { Transaction tx = new Transaction(params); // offerers first tx - Transaction offerersFirstTx = new Transaction(params, Utils.parseAsHexOrBase58(offerersFirstTxAsHex)); + Transaction offerersFirstTx = new Transaction(params, preparedDepositTx.bitcoinSerialize()); printInputs("offerersFirstTx", offerersFirstTx); log.trace("offerersFirstTx = " + offerersFirstTx); @@ -1040,16 +1036,6 @@ public class WalletService { return ScriptBuilder.createMultiSigOutputScript(2, keys); } - private Script getMultiSigScript(String offererPubKey, String takerPubKey, String arbitratorPubKey) { - ECKey offererKey = ECKey.fromPublicOnly(Utils.parseAsHexOrBase58(offererPubKey)); - ECKey takerKey = ECKey.fromPublicOnly(Utils.parseAsHexOrBase58(takerPubKey)); - ECKey arbitratorKey = ECKey.fromPublicOnly(Utils.parseAsHexOrBase58(arbitratorPubKey)); - - List keys = ImmutableList.of(offererKey, takerKey, arbitratorKey); - return ScriptBuilder.createMultiSigOutputScript(2, keys); - } - - private Transaction createPayoutTx(String depositTxAsHex, Coin offererPaybackAmount, Coin takerPaybackAmount, String offererAddress, String takerAddress) throws AddressFormatException { log.trace("createPayoutTx"); 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 3aa7affda3..0225a604ee 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 @@ -26,7 +26,7 @@ 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.BuyerAsOffererProtocol; -import io.bitsquare.trade.protocol.trade.offerer.tasks.CreateDepositTx; +import io.bitsquare.trade.protocol.trade.offerer.tasks.PrepareDepositTx; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessPayoutTxPublishedMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestOffererPublishDepositTxMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestTakeOfferMessage; @@ -34,7 +34,7 @@ import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessTakeOfferFeePayedM import io.bitsquare.trade.protocol.trade.offerer.tasks.RespondToTakeOfferRequest; import io.bitsquare.trade.protocol.trade.offerer.tasks.SendBankTransferInitedMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.SendDepositTxIdToTaker; -import io.bitsquare.trade.protocol.trade.offerer.tasks.SendTakerDepositPaymentRequest; +import io.bitsquare.trade.protocol.trade.offerer.tasks.RequestDepositPayment; import io.bitsquare.trade.protocol.trade.offerer.tasks.SetupListenerForBlockChainConfirmation; import io.bitsquare.trade.protocol.trade.offerer.tasks.SignAndPublishDepositTx; import io.bitsquare.trade.protocol.trade.offerer.tasks.SignPayoutTx; @@ -48,7 +48,7 @@ import io.bitsquare.trade.protocol.trade.taker.tasks.PayTakeOfferFee; import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessBankTransferInitedMessage; import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessDepositTxPublishedMessage; import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessRespondToTakeOfferRequestMessage; -import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessTakerDepositPaymentRequestMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessRequestDepositPaymentMessage; import io.bitsquare.trade.protocol.trade.taker.tasks.RequestTakeOffer; import io.bitsquare.trade.protocol.trade.taker.tasks.SendPayoutTxToOfferer; import io.bitsquare.trade.protocol.trade.taker.tasks.SendSignedTakerDepositTxAsHex; @@ -110,8 +110,8 @@ public class DebugView extends InitializableView { RespondToTakeOfferRequest.class, ProcessTakeOfferFeePayedMessage.class, - CreateDepositTx.class, - SendTakerDepositPaymentRequest.class, + PrepareDepositTx.class, + RequestDepositPayment.class, ProcessRequestOffererPublishDepositTxMessage.class, VerifyTakerAccount.class, @@ -137,7 +137,7 @@ public class DebugView extends InitializableView { PayTakeOfferFee.class, SendTakeOfferFeePayedMessage.class, - ProcessTakerDepositPaymentRequestMessage.class, + ProcessRequestDepositPaymentMessage.class, VerifyOffererAccount.class, CreateAndSignContract.class, PayDeposit.class, diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererModel.java index e783f96a19..f1ed313bbf 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererModel.java @@ -29,6 +29,7 @@ import io.bitsquare.trade.protocol.trade.OfferSharedModel; import io.bitsquare.user.User; import org.bitcoinj.core.Coin; +import org.bitcoinj.core.Transaction; import java.security.PublicKey; @@ -50,7 +51,7 @@ public class BuyerAsOffererModel extends OfferSharedModel { private Trade trade; private Peer taker; - private String preparedOffererDepositTxAsHex; + private Transaction preparedDepositTx; private String depositTxAsHex; private String takerAccountId; @@ -109,12 +110,12 @@ public class BuyerAsOffererModel extends OfferSharedModel { return offererPaybackAddress; } - public String getPreparedOffererDepositTxAsHex() { - return preparedOffererDepositTxAsHex; + public Transaction getPreparedDepositTx() { + return preparedDepositTx; } - public void setPreparedOffererDepositTxAsHex(String preparedOffererDepositTxAsHex) { - this.preparedOffererDepositTxAsHex = preparedOffererDepositTxAsHex; + public void setPreparedDepositTx(Transaction preparedDepositTx) { + this.preparedDepositTx = preparedDepositTx; } public long getOffererTxOutIndex() { diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java index d13ccd1e85..1d86fa15ec 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java @@ -21,15 +21,15 @@ import io.bitsquare.network.Message; import io.bitsquare.network.Peer; import io.bitsquare.trade.handlers.MessageHandler; import io.bitsquare.trade.protocol.trade.TradeMessage; -import io.bitsquare.trade.protocol.trade.offerer.tasks.CreateDepositTx; +import io.bitsquare.trade.protocol.trade.offerer.tasks.PrepareDepositTx; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessPayoutTxPublishedMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestOffererPublishDepositTxMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestTakeOfferMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessTakeOfferFeePayedMessage; +import io.bitsquare.trade.protocol.trade.offerer.tasks.RequestDepositPayment; import io.bitsquare.trade.protocol.trade.offerer.tasks.RespondToTakeOfferRequest; import io.bitsquare.trade.protocol.trade.offerer.tasks.SendBankTransferInitedMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.SendDepositTxIdToTaker; -import io.bitsquare.trade.protocol.trade.offerer.tasks.SendTakerDepositPaymentRequest; import io.bitsquare.trade.protocol.trade.offerer.tasks.SetupListenerForBlockChainConfirmation; import io.bitsquare.trade.protocol.trade.offerer.tasks.SignAndPublishDepositTx; import io.bitsquare.trade.protocol.trade.offerer.tasks.SignPayoutTx; @@ -110,8 +110,8 @@ public class BuyerAsOffererProtocol { ); taskRunner.addTasks( ProcessTakeOfferFeePayedMessage.class, - CreateDepositTx.class, - SendTakerDepositPaymentRequest.class + PrepareDepositTx.class, + RequestDepositPayment.class ); taskRunner.run(); } @@ -192,21 +192,23 @@ public class BuyerAsOffererProtocol { TradeMessage tradeMessage = (TradeMessage) message; nonEmptyStringOf(tradeMessage.getTradeId()); - if (tradeMessage instanceof RequestTakeOfferMessage) { - handleRequestTakeOfferMessage((RequestTakeOfferMessage) tradeMessage, peer); - } - else if (tradeMessage instanceof TakeOfferFeePayedMessage) { - handleTakeOfferFeePayedMessage((TakeOfferFeePayedMessage) tradeMessage); - } + if (tradeMessage.getTradeId().equals(model.getOffer().getId())) { + if (tradeMessage instanceof RequestTakeOfferMessage) { + handleRequestTakeOfferMessage((RequestTakeOfferMessage) tradeMessage, peer); + } + else if (tradeMessage instanceof TakeOfferFeePayedMessage) { + handleTakeOfferFeePayedMessage((TakeOfferFeePayedMessage) tradeMessage); + } - else if (tradeMessage instanceof RequestOffererPublishDepositTxMessage) { - handleRequestOffererPublishDepositTxMessage((RequestOffererPublishDepositTxMessage) tradeMessage); - } - else if (tradeMessage instanceof PayoutTxPublishedMessage) { - handlePayoutTxPublishedMessage((PayoutTxPublishedMessage) tradeMessage); - } - else { - log.error("Incoming tradeMessage not supported. " + tradeMessage); + else if (tradeMessage instanceof RequestOffererPublishDepositTxMessage) { + handleRequestOffererPublishDepositTxMessage((RequestOffererPublishDepositTxMessage) tradeMessage); + } + else if (tradeMessage instanceof PayoutTxPublishedMessage) { + handlePayoutTxPublishedMessage((PayoutTxPublishedMessage) tradeMessage); + } + else { + log.error("Incoming tradeMessage not supported. " + tradeMessage); + } } } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/TakerDepositPaymentRequestMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/RequestDepositPaymentMessage.java similarity index 74% rename from core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/TakerDepositPaymentRequestMessage.java rename to core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/RequestDepositPaymentMessage.java index 194fe03a71..b3dac96891 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/TakerDepositPaymentRequestMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/RequestDepositPaymentMessage.java @@ -20,26 +20,28 @@ package io.bitsquare.trade.protocol.trade.offerer.messages; import io.bitsquare.bank.BankAccount; import io.bitsquare.trade.protocol.trade.TradeMessage; +import org.bitcoinj.core.Transaction; + import java.io.Serializable; -public class TakerDepositPaymentRequestMessage implements Serializable, TradeMessage { +public class RequestDepositPaymentMessage implements Serializable, TradeMessage { private static final long serialVersionUID = -3988720410493712913L; private final String tradeId; private final BankAccount bankAccount; private final String accountID; private final byte[] offererPubKey; - private final String preparedOffererDepositTxAsHex; + private final Transaction preparedDepositTx; private final long offererTxOutIndex; - public TakerDepositPaymentRequestMessage(String tradeId, BankAccount bankAccount, String accountID, - byte[] offererPubKey, String preparedOffererDepositTxAsHex, - long offererTxOutIndex) { + public RequestDepositPaymentMessage(String tradeId, BankAccount bankAccount, String accountID, + byte[] offererPubKey, Transaction preparedDepositTx, + long offererTxOutIndex) { this.tradeId = tradeId; this.bankAccount = bankAccount; this.accountID = accountID; this.offererPubKey = offererPubKey; - this.preparedOffererDepositTxAsHex = preparedOffererDepositTxAsHex; + this.preparedDepositTx = preparedDepositTx; this.offererTxOutIndex = offererTxOutIndex; } @@ -60,8 +62,8 @@ public class TakerDepositPaymentRequestMessage implements Serializable, TradeMes return offererPubKey; } - public String getPreparedOffererDepositTxAsHex() { - return preparedOffererDepositTxAsHex; + public Transaction getPreparedDepositTx() { + return preparedDepositTx; } public long getOffererTxOutIndex() { diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/PrepareDepositTx.java similarity index 78% rename from core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateDepositTx.java rename to core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/PrepareDepositTx.java index 83f8ce0f16..f20fc0eb5d 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateDepositTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/PrepareDepositTx.java @@ -25,36 +25,33 @@ import io.bitsquare.util.taskrunner.TaskRunner; import org.bitcoinj.core.Coin; import org.bitcoinj.core.InsufficientMoneyException; import org.bitcoinj.core.Transaction; -import org.bitcoinj.core.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class CreateDepositTx extends Task { - private static final Logger log = LoggerFactory.getLogger(CreateDepositTx.class); +public class PrepareDepositTx extends Task { + private static final Logger log = LoggerFactory.getLogger(PrepareDepositTx.class); - public CreateDepositTx(TaskRunner taskHandler, BuyerAsOffererModel model) { + public PrepareDepositTx(TaskRunner taskHandler, BuyerAsOffererModel model) { super(taskHandler, model); } @Override protected void doRun() { try { - byte[] offererPubKey = model.getWalletService().getAddressInfo(model.getTrade().getId()).getPubKey(); Coin offererInputAmount = model.getTrade().getSecurityDeposit().add(FeePolicy.TX_FEE); - Transaction transaction = model.getWalletService().offererCreatesMSTxAndAddPayment( + Transaction transaction = model.getWalletService().prepareDepositTx( offererInputAmount, offererPubKey, model.getTakerPubKey(), model.getArbitratorPubKey(), model.getTrade().getId()); - String preparedOffererDepositTxAsHex = Utils.HEX.encode(transaction.bitcoinSerialize()); long offererTxOutIndex = transaction.getInput(0).getOutpoint().getIndex(); model.setOffererPubKey(offererPubKey); - model.setPreparedOffererDepositTxAsHex(preparedOffererDepositTxAsHex); + model.setPreparedDepositTx(transaction); model.setOffererTxOutIndex(offererTxOutIndex); complete(); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendTakerDepositPaymentRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RequestDepositPayment.java similarity index 78% rename from core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendTakerDepositPaymentRequest.java rename to core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RequestDepositPayment.java index 7a20e48a0d..5fed79e497 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendTakerDepositPaymentRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RequestDepositPayment.java @@ -19,28 +19,28 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks; import io.bitsquare.trade.listeners.SendMessageListener; import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel; -import io.bitsquare.trade.protocol.trade.offerer.messages.TakerDepositPaymentRequestMessage; +import io.bitsquare.trade.protocol.trade.offerer.messages.RequestDepositPaymentMessage; import io.bitsquare.util.taskrunner.Task; import io.bitsquare.util.taskrunner.TaskRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SendTakerDepositPaymentRequest extends Task { - private static final Logger log = LoggerFactory.getLogger(SendTakerDepositPaymentRequest.class); +public class RequestDepositPayment extends Task { + private static final Logger log = LoggerFactory.getLogger(RequestDepositPayment.class); - public SendTakerDepositPaymentRequest(TaskRunner taskHandler, BuyerAsOffererModel model) { + public RequestDepositPayment(TaskRunner taskHandler, BuyerAsOffererModel model) { super(taskHandler, model); } @Override protected void doRun() { - TakerDepositPaymentRequestMessage tradeMessage = new TakerDepositPaymentRequestMessage( + RequestDepositPaymentMessage tradeMessage = new RequestDepositPaymentMessage( model.getTrade().getId(), model.getBankAccount(), model.getAccountId(), model.getOffererPubKey(), - model.getPreparedOffererDepositTxAsHex(), + model.getPreparedDepositTx(), model.getOffererTxOutIndex()); model.getTradeMessageService().sendMessage(model.getTaker(), tradeMessage, new SendMessageListener() { diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java index 02523ae81f..2cb88b743c 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java @@ -41,7 +41,7 @@ public class SignAndPublishDepositTx extends Task { @Override protected void doRun() { try { - model.getWalletService().offererSignAndPublishTx(model.getPreparedOffererDepositTxAsHex(), + model.getWalletService().offererSignAndPublishTx(model.getPreparedDepositTx(), model.getSignedTakerDepositTxAsHex(), model.getTxConnOutAsHex(), model.getTxScriptSigAsHex(), diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerModel.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerModel.java index 121a21bb86..e0631937bd 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerModel.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerModel.java @@ -40,7 +40,7 @@ public class SellerAsTakerModel extends OfferSharedModel { // written/read by task private Peer offerer; - private String preparedOffererDepositTxAsHex; + private Transaction preparedDepositTx; private String depositTxAsHex; private Transaction signedTakerDepositTx; private Transaction payoutTx; @@ -107,12 +107,12 @@ public class SellerAsTakerModel extends OfferSharedModel { this.offererPubKey = offererPubKey; } - public String getPreparedOffererDepositTxAsHex() { - return preparedOffererDepositTxAsHex; + public Transaction getPreparedDepositTx() { + return preparedDepositTx; } - public void setPreparedOffererDepositTxAsHex(String preparedOffererDepositTxAsHex) { - this.preparedOffererDepositTxAsHex = preparedOffererDepositTxAsHex; + public void setPreparedDepositTx(Transaction preparedDepositTx) { + this.preparedDepositTx = preparedDepositTx; } public long getOffererTxOutIndex() { diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java index 1831b96032..eb5f776ce4 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java @@ -24,16 +24,16 @@ import io.bitsquare.trade.handlers.MessageHandler; import io.bitsquare.trade.protocol.trade.TradeMessage; import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage; import io.bitsquare.trade.protocol.trade.offerer.messages.DepositTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.offerer.messages.RequestDepositPaymentMessage; import io.bitsquare.trade.protocol.trade.offerer.messages.RespondToTakeOfferRequestMessage; -import io.bitsquare.trade.protocol.trade.offerer.messages.TakerDepositPaymentRequestMessage; import io.bitsquare.trade.protocol.trade.taker.tasks.CreateAndSignContract; import io.bitsquare.trade.protocol.trade.taker.tasks.GetPeerAddress; import io.bitsquare.trade.protocol.trade.taker.tasks.PayDeposit; import io.bitsquare.trade.protocol.trade.taker.tasks.PayTakeOfferFee; import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessBankTransferInitedMessage; import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessDepositTxPublishedMessage; +import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessRequestDepositPaymentMessage; import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessRespondToTakeOfferRequestMessage; -import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessTakerDepositPaymentRequestMessage; import io.bitsquare.trade.protocol.trade.taker.tasks.RequestTakeOffer; import io.bitsquare.trade.protocol.trade.taker.tasks.SendPayoutTxToOfferer; import io.bitsquare.trade.protocol.trade.taker.tasks.SendSignedTakerDepositTxAsHex; @@ -114,7 +114,7 @@ public class SellerAsTakerProtocol { taskRunner.run(); } - private void handleTakerDepositPaymentRequestMessage(TakerDepositPaymentRequestMessage tradeMessage) { + private void handleRequestDepositPaymentMessage(RequestDepositPaymentMessage tradeMessage) { model.setTradeMessage(tradeMessage); SellerAsTakerTaskRunner taskRunner = new SellerAsTakerTaskRunner<>(model, @@ -126,7 +126,7 @@ public class SellerAsTakerProtocol { } ); taskRunner.addTasks( - ProcessTakerDepositPaymentRequestMessage.class, + ProcessRequestDepositPaymentMessage.class, VerifyOffererAccount.class, CreateAndSignContract.class, PayDeposit.class, @@ -201,21 +201,23 @@ public class SellerAsTakerProtocol { if (message instanceof TradeMessage) { TradeMessage tradeMessage = (TradeMessage) message; nonEmptyStringOf(tradeMessage.getTradeId()); - - if (tradeMessage instanceof RespondToTakeOfferRequestMessage) { - handleRespondToTakeOfferRequestMessage((RespondToTakeOfferRequestMessage) tradeMessage); - } - else if (tradeMessage instanceof TakerDepositPaymentRequestMessage) { - handleTakerDepositPaymentRequestMessage((TakerDepositPaymentRequestMessage) tradeMessage); - } - else if (tradeMessage instanceof DepositTxPublishedMessage) { - handleDepositTxPublishedMessage((DepositTxPublishedMessage) tradeMessage); - } - else if (tradeMessage instanceof BankTransferStartedMessage) { - handleBankTransferInitedMessage((BankTransferStartedMessage) tradeMessage); - } - else { - log.error("Incoming message not supported. " + tradeMessage); + + if (tradeMessage.getTradeId().equals(model.getOffer().getId())) { + if (tradeMessage instanceof RespondToTakeOfferRequestMessage) { + handleRespondToTakeOfferRequestMessage((RespondToTakeOfferRequestMessage) tradeMessage); + } + else if (tradeMessage instanceof RequestDepositPaymentMessage) { + handleRequestDepositPaymentMessage((RequestDepositPaymentMessage) tradeMessage); + } + else if (tradeMessage instanceof DepositTxPublishedMessage) { + handleDepositTxPublishedMessage((DepositTxPublishedMessage) tradeMessage); + } + else if (tradeMessage instanceof BankTransferStartedMessage) { + handleBankTransferInitedMessage((BankTransferStartedMessage) tradeMessage); + } + else { + log.error("Incoming message not supported. " + tradeMessage); + } } } } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayDeposit.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayDeposit.java index 72755dad62..ffea77b8fa 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayDeposit.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayDeposit.java @@ -17,6 +17,7 @@ package io.bitsquare.trade.protocol.trade.taker.tasks; +import io.bitsquare.btc.FeePolicy; import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel; import io.bitsquare.util.taskrunner.Task; import io.bitsquare.util.taskrunner.TaskRunner; @@ -39,14 +40,14 @@ public class PayDeposit extends Task { protected void doRun() { try { Coin amountToPay = model.getTrade().getTradeAmount().add(model.getTrade().getSecurityDeposit()); - Coin msOutputAmount = amountToPay.add(model.getTrade().getSecurityDeposit()); + Coin msOutputAmount = amountToPay.add(model.getTrade().getSecurityDeposit()).add(FeePolicy.TX_FEE); Transaction signedTakerDepositTx = model.getWalletService().takerAddPaymentAndSignTx( amountToPay, msOutputAmount, model.getOffererPubKey(), model.getTakerPubKey(), model.getArbitratorPubKey(), - model.getPreparedOffererDepositTxAsHex(), + model.getPreparedDepositTx(), model.getTrade().getId()); model.setSignedTakerDepositTx(signedTakerDepositTx); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessTakerDepositPaymentRequestMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRequestDepositPaymentMessage.java similarity index 76% rename from core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessTakerDepositPaymentRequestMessage.java rename to core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRequestDepositPaymentMessage.java index da9f333dba..c9a32a57b6 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessTakerDepositPaymentRequestMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRequestDepositPaymentMessage.java @@ -17,7 +17,7 @@ package io.bitsquare.trade.protocol.trade.taker.tasks; -import io.bitsquare.trade.protocol.trade.offerer.messages.TakerDepositPaymentRequestMessage; +import io.bitsquare.trade.protocol.trade.offerer.messages.RequestDepositPaymentMessage; import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel; import io.bitsquare.util.taskrunner.Task; import io.bitsquare.util.taskrunner.TaskRunner; @@ -28,10 +28,10 @@ import org.slf4j.LoggerFactory; import static com.google.common.base.Preconditions.checkNotNull; import static io.bitsquare.util.Validator.*; -public class ProcessTakerDepositPaymentRequestMessage extends Task { - private static final Logger log = LoggerFactory.getLogger(ProcessTakerDepositPaymentRequestMessage.class); +public class ProcessRequestDepositPaymentMessage extends Task { + private static final Logger log = LoggerFactory.getLogger(ProcessRequestDepositPaymentMessage.class); - public ProcessTakerDepositPaymentRequestMessage(TaskRunner taskHandler, SellerAsTakerModel model) { + public ProcessRequestDepositPaymentMessage(TaskRunner taskHandler, SellerAsTakerModel model) { super(taskHandler, model); } @@ -39,11 +39,11 @@ public class ProcessTakerDepositPaymentRequestMessage extends Task