Use Transaction instead of hex string for trade process

This commit is contained in:
Manfred Karrer 2015-03-14 20:19:47 +01:00
parent 72ded8ad90
commit 1f041c520a
12 changed files with 105 additions and 114 deletions

View file

@ -602,11 +602,11 @@ public class WalletService {
// 1. step: deposit tx // 1. step: deposit tx
// Offerer creates the 2of3 multiSig deposit tx with his unsigned input and change output // Offerer creates the 2of3 multiSig deposit tx with his unsigned input and change output
public Transaction offererCreatesMSTxAndAddPayment(Coin offererInputAmount, public Transaction prepareDepositTx(Coin offererInputAmount,
byte[] offererPubKey, byte[] offererPubKey,
byte[] takerPubKey, byte[] takerPubKey,
byte[] arbitratorPubKey, byte[] arbitratorPubKey,
String tradeId) throws InsufficientMoneyException { String tradeId) throws InsufficientMoneyException {
log.debug("offererCreatesMSTxAndAddPayment"); log.debug("offererCreatesMSTxAndAddPayment");
log.trace("inputs: "); log.trace("inputs: ");
log.trace("offererInputAmount=" + offererInputAmount.toFriendlyString()); 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 // 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 // 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"); log.trace("verify tx");
tx.verify(); tx.verify();
@ -660,13 +661,12 @@ public class WalletService {
// 2. step: deposit tx // 2. step: deposit tx
// Taker adds his input and change output, changes the multiSig amount to the correct value and sign his input // Taker adds his input and change output, changes the multiSig amount to the correct value and sign his input
public Transaction takerAddPaymentAndSignTx(Coin takerInputAmount, public Transaction takerAddPaymentAndSignTx(Coin takerInputAmount,
Coin msOutputAmount, Coin msOutputAmount,
byte[] offererPubKey, byte[] offererPubKey,
byte[] takerPubKey, byte[] takerPubKey,
byte[] arbitratorPubKey, byte[] arbitratorPubKey,
String offerersPartialDepositTxAsHex, Transaction preparedDepositTransaction,
String tradeId) throws InsufficientMoneyException { String tradeId) throws InsufficientMoneyException {
log.debug("takerAddPaymentAndSignTx"); log.debug("takerAddPaymentAndSignTx");
log.trace("inputs: "); log.trace("inputs: ");
@ -675,7 +675,7 @@ public class WalletService {
log.trace("offererPubKey=" + offererPubKey); log.trace("offererPubKey=" + offererPubKey);
log.trace("takerPubKey=" + takerPubKey); log.trace("takerPubKey=" + takerPubKey);
log.trace("arbitratorPubKey=" + arbitratorPubKey); log.trace("arbitratorPubKey=" + arbitratorPubKey);
log.trace("offerersPartialDepositTxAsHex=" + offerersPartialDepositTxAsHex); log.trace("preparedDepositTransaction=" + preparedDepositTransaction);
log.trace("tradeId=" + tradeId); log.trace("tradeId=" + tradeId);
// We pay the btc tx fee 2 times to the deposit tx: // 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 OUT[1] Optional change = input taker - takerInputAmount - fee btc tx fee
*/ */
// Now we construct the real 2of3 multiSig tx from the serialized offerers tx // Now we construct the real 2of3 multiSig tx from the serialized offerers tx
Transaction tx = new Transaction(params, Utils.parseAsHexOrBase58(offerersPartialDepositTxAsHex)); Transaction tx = new Transaction(params, preparedDepositTransaction.bitcoinSerialize());
log.trace("offerersPartialDepositTx=" + tx);
// The serialized offerers tx looks like: // 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 // 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 for (TransactionInput input : tempTx.getInputs()) {
tx.addInput(tempTx.getInput(0)); tx.addInput(input);
}
// handle optional change output // handle optional change output
if (tempTx.getOutputs().size() == 2) { if (tempTx.getOutputs().size() == 2) {
tx.addOutput(tempTx.getOutput(1)); 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); tx.getOutput(0).setValue(msOutputAmount);
// Now we sign our input (index 1) // Now we sign our input (index 1)
@ -782,8 +779,7 @@ public class WalletService {
// 3. step: deposit tx // 3. step: deposit tx
// Offerer signs tx and publishes it // Offerer signs tx and publishes it
public void offererSignAndPublishTx(Transaction preparedDepositTx,
public void offererSignAndPublishTx(String offerersFirstTxAsHex,
String takersSignedTxAsHex, String takersSignedTxAsHex,
String takersSignedConnOutAsHex, String takersSignedConnOutAsHex,
String takersSignedScriptSigAsHex, String takersSignedScriptSigAsHex,
@ -792,7 +788,7 @@ public class WalletService {
FutureCallback<Transaction> callback) { FutureCallback<Transaction> callback) {
log.debug("offererSignAndPublishTx"); log.debug("offererSignAndPublishTx");
log.trace("inputs: "); log.trace("inputs: ");
log.trace("offerersFirstTxAsHex=" + offerersFirstTxAsHex); log.trace("preparedDepositTx=" + preparedDepositTx);
log.trace("takersSignedTxAsHex=" + takersSignedTxAsHex); log.trace("takersSignedTxAsHex=" + takersSignedTxAsHex);
log.trace("takersSignedConnOutAsHex=" + takersSignedConnOutAsHex); log.trace("takersSignedConnOutAsHex=" + takersSignedConnOutAsHex);
log.trace("takersSignedScriptSigAsHex=" + takersSignedScriptSigAsHex); log.trace("takersSignedScriptSigAsHex=" + takersSignedScriptSigAsHex);
@ -803,7 +799,7 @@ public class WalletService {
Transaction tx = new Transaction(params); Transaction tx = new Transaction(params);
// offerers first tx // offerers first tx
Transaction offerersFirstTx = new Transaction(params, Utils.parseAsHexOrBase58(offerersFirstTxAsHex)); Transaction offerersFirstTx = new Transaction(params, preparedDepositTx.bitcoinSerialize());
printInputs("offerersFirstTx", offerersFirstTx); printInputs("offerersFirstTx", offerersFirstTx);
log.trace("offerersFirstTx = " + offerersFirstTx); log.trace("offerersFirstTx = " + offerersFirstTx);
@ -1040,16 +1036,6 @@ public class WalletService {
return ScriptBuilder.createMultiSigOutputScript(2, keys); 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<ECKey> keys = ImmutableList.of(offererKey, takerKey, arbitratorKey);
return ScriptBuilder.createMultiSigOutputScript(2, keys);
}
private Transaction createPayoutTx(String depositTxAsHex, Coin offererPaybackAmount, Coin takerPaybackAmount, private Transaction createPayoutTx(String depositTxAsHex, Coin offererPaybackAmount, Coin takerPaybackAmount,
String offererAddress, String takerAddress) throws AddressFormatException { String offererAddress, String takerAddress) throws AddressFormatException {
log.trace("createPayoutTx"); log.trace("createPayoutTx");

View file

@ -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.CreateOfferFeeTx;
import io.bitsquare.trade.protocol.placeoffer.tasks.ValidateOffer; import io.bitsquare.trade.protocol.placeoffer.tasks.ValidateOffer;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererProtocol; 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.ProcessPayoutTxPublishedMessage;
import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestOffererPublishDepositTxMessage; 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.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.RespondToTakeOfferRequest;
import io.bitsquare.trade.protocol.trade.offerer.tasks.SendBankTransferInitedMessage; 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.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.SetupListenerForBlockChainConfirmation;
import io.bitsquare.trade.protocol.trade.offerer.tasks.SignAndPublishDepositTx; import io.bitsquare.trade.protocol.trade.offerer.tasks.SignAndPublishDepositTx;
import io.bitsquare.trade.protocol.trade.offerer.tasks.SignPayoutTx; 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.ProcessBankTransferInitedMessage;
import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessDepositTxPublishedMessage; 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.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.RequestTakeOffer;
import io.bitsquare.trade.protocol.trade.taker.tasks.SendPayoutTxToOfferer; import io.bitsquare.trade.protocol.trade.taker.tasks.SendPayoutTxToOfferer;
import io.bitsquare.trade.protocol.trade.taker.tasks.SendSignedTakerDepositTxAsHex; import io.bitsquare.trade.protocol.trade.taker.tasks.SendSignedTakerDepositTxAsHex;
@ -110,8 +110,8 @@ public class DebugView extends InitializableView {
RespondToTakeOfferRequest.class, RespondToTakeOfferRequest.class,
ProcessTakeOfferFeePayedMessage.class, ProcessTakeOfferFeePayedMessage.class,
CreateDepositTx.class, PrepareDepositTx.class,
SendTakerDepositPaymentRequest.class, RequestDepositPayment.class,
ProcessRequestOffererPublishDepositTxMessage.class, ProcessRequestOffererPublishDepositTxMessage.class,
VerifyTakerAccount.class, VerifyTakerAccount.class,
@ -137,7 +137,7 @@ public class DebugView extends InitializableView {
PayTakeOfferFee.class, PayTakeOfferFee.class,
SendTakeOfferFeePayedMessage.class, SendTakeOfferFeePayedMessage.class,
ProcessTakerDepositPaymentRequestMessage.class, ProcessRequestDepositPaymentMessage.class,
VerifyOffererAccount.class, VerifyOffererAccount.class,
CreateAndSignContract.class, CreateAndSignContract.class,
PayDeposit.class, PayDeposit.class,

View file

@ -29,6 +29,7 @@ import io.bitsquare.trade.protocol.trade.OfferSharedModel;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Transaction;
import java.security.PublicKey; import java.security.PublicKey;
@ -50,7 +51,7 @@ public class BuyerAsOffererModel extends OfferSharedModel {
private Trade trade; private Trade trade;
private Peer taker; private Peer taker;
private String preparedOffererDepositTxAsHex; private Transaction preparedDepositTx;
private String depositTxAsHex; private String depositTxAsHex;
private String takerAccountId; private String takerAccountId;
@ -109,12 +110,12 @@ public class BuyerAsOffererModel extends OfferSharedModel {
return offererPaybackAddress; return offererPaybackAddress;
} }
public String getPreparedOffererDepositTxAsHex() { public Transaction getPreparedDepositTx() {
return preparedOffererDepositTxAsHex; return preparedDepositTx;
} }
public void setPreparedOffererDepositTxAsHex(String preparedOffererDepositTxAsHex) { public void setPreparedDepositTx(Transaction preparedDepositTx) {
this.preparedOffererDepositTxAsHex = preparedOffererDepositTxAsHex; this.preparedDepositTx = preparedDepositTx;
} }
public long getOffererTxOutIndex() { public long getOffererTxOutIndex() {

View file

@ -21,15 +21,15 @@ import io.bitsquare.network.Message;
import io.bitsquare.network.Peer; import io.bitsquare.network.Peer;
import io.bitsquare.trade.handlers.MessageHandler; import io.bitsquare.trade.handlers.MessageHandler;
import io.bitsquare.trade.protocol.trade.TradeMessage; 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.ProcessPayoutTxPublishedMessage;
import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessRequestOffererPublishDepositTxMessage; 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.ProcessRequestTakeOfferMessage;
import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessTakeOfferFeePayedMessage; 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.RespondToTakeOfferRequest;
import io.bitsquare.trade.protocol.trade.offerer.tasks.SendBankTransferInitedMessage; 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.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.SetupListenerForBlockChainConfirmation;
import io.bitsquare.trade.protocol.trade.offerer.tasks.SignAndPublishDepositTx; import io.bitsquare.trade.protocol.trade.offerer.tasks.SignAndPublishDepositTx;
import io.bitsquare.trade.protocol.trade.offerer.tasks.SignPayoutTx; import io.bitsquare.trade.protocol.trade.offerer.tasks.SignPayoutTx;
@ -110,8 +110,8 @@ public class BuyerAsOffererProtocol {
); );
taskRunner.addTasks( taskRunner.addTasks(
ProcessTakeOfferFeePayedMessage.class, ProcessTakeOfferFeePayedMessage.class,
CreateDepositTx.class, PrepareDepositTx.class,
SendTakerDepositPaymentRequest.class RequestDepositPayment.class
); );
taskRunner.run(); taskRunner.run();
} }
@ -192,21 +192,23 @@ public class BuyerAsOffererProtocol {
TradeMessage tradeMessage = (TradeMessage) message; TradeMessage tradeMessage = (TradeMessage) message;
nonEmptyStringOf(tradeMessage.getTradeId()); nonEmptyStringOf(tradeMessage.getTradeId());
if (tradeMessage instanceof RequestTakeOfferMessage) { if (tradeMessage.getTradeId().equals(model.getOffer().getId())) {
handleRequestTakeOfferMessage((RequestTakeOfferMessage) tradeMessage, peer); if (tradeMessage instanceof RequestTakeOfferMessage) {
} handleRequestTakeOfferMessage((RequestTakeOfferMessage) tradeMessage, peer);
else if (tradeMessage instanceof TakeOfferFeePayedMessage) { }
handleTakeOfferFeePayedMessage((TakeOfferFeePayedMessage) tradeMessage); else if (tradeMessage instanceof TakeOfferFeePayedMessage) {
} handleTakeOfferFeePayedMessage((TakeOfferFeePayedMessage) tradeMessage);
}
else if (tradeMessage instanceof RequestOffererPublishDepositTxMessage) { else if (tradeMessage instanceof RequestOffererPublishDepositTxMessage) {
handleRequestOffererPublishDepositTxMessage((RequestOffererPublishDepositTxMessage) tradeMessage); handleRequestOffererPublishDepositTxMessage((RequestOffererPublishDepositTxMessage) tradeMessage);
} }
else if (tradeMessage instanceof PayoutTxPublishedMessage) { else if (tradeMessage instanceof PayoutTxPublishedMessage) {
handlePayoutTxPublishedMessage((PayoutTxPublishedMessage) tradeMessage); handlePayoutTxPublishedMessage((PayoutTxPublishedMessage) tradeMessage);
} }
else { else {
log.error("Incoming tradeMessage not supported. " + tradeMessage); log.error("Incoming tradeMessage not supported. " + tradeMessage);
}
} }
} }
} }

View file

@ -20,26 +20,28 @@ package io.bitsquare.trade.protocol.trade.offerer.messages;
import io.bitsquare.bank.BankAccount; import io.bitsquare.bank.BankAccount;
import io.bitsquare.trade.protocol.trade.TradeMessage; import io.bitsquare.trade.protocol.trade.TradeMessage;
import org.bitcoinj.core.Transaction;
import java.io.Serializable; import java.io.Serializable;
public class TakerDepositPaymentRequestMessage implements Serializable, TradeMessage { public class RequestDepositPaymentMessage implements Serializable, TradeMessage {
private static final long serialVersionUID = -3988720410493712913L; private static final long serialVersionUID = -3988720410493712913L;
private final String tradeId; private final String tradeId;
private final BankAccount bankAccount; private final BankAccount bankAccount;
private final String accountID; private final String accountID;
private final byte[] offererPubKey; private final byte[] offererPubKey;
private final String preparedOffererDepositTxAsHex; private final Transaction preparedDepositTx;
private final long offererTxOutIndex; private final long offererTxOutIndex;
public TakerDepositPaymentRequestMessage(String tradeId, BankAccount bankAccount, String accountID, public RequestDepositPaymentMessage(String tradeId, BankAccount bankAccount, String accountID,
byte[] offererPubKey, String preparedOffererDepositTxAsHex, byte[] offererPubKey, Transaction preparedDepositTx,
long offererTxOutIndex) { long offererTxOutIndex) {
this.tradeId = tradeId; this.tradeId = tradeId;
this.bankAccount = bankAccount; this.bankAccount = bankAccount;
this.accountID = accountID; this.accountID = accountID;
this.offererPubKey = offererPubKey; this.offererPubKey = offererPubKey;
this.preparedOffererDepositTxAsHex = preparedOffererDepositTxAsHex; this.preparedDepositTx = preparedDepositTx;
this.offererTxOutIndex = offererTxOutIndex; this.offererTxOutIndex = offererTxOutIndex;
} }
@ -60,8 +62,8 @@ public class TakerDepositPaymentRequestMessage implements Serializable, TradeMes
return offererPubKey; return offererPubKey;
} }
public String getPreparedOffererDepositTxAsHex() { public Transaction getPreparedDepositTx() {
return preparedOffererDepositTxAsHex; return preparedDepositTx;
} }
public long getOffererTxOutIndex() { public long getOffererTxOutIndex() {

View file

@ -25,36 +25,33 @@ import io.bitsquare.util.taskrunner.TaskRunner;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.InsufficientMoneyException; import org.bitcoinj.core.InsufficientMoneyException;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.Utils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class CreateDepositTx extends Task<BuyerAsOffererModel> { public class PrepareDepositTx extends Task<BuyerAsOffererModel> {
private static final Logger log = LoggerFactory.getLogger(CreateDepositTx.class); private static final Logger log = LoggerFactory.getLogger(PrepareDepositTx.class);
public CreateDepositTx(TaskRunner taskHandler, BuyerAsOffererModel model) { public PrepareDepositTx(TaskRunner taskHandler, BuyerAsOffererModel model) {
super(taskHandler, model); super(taskHandler, model);
} }
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
byte[] offererPubKey = model.getWalletService().getAddressInfo(model.getTrade().getId()).getPubKey(); byte[] offererPubKey = model.getWalletService().getAddressInfo(model.getTrade().getId()).getPubKey();
Coin offererInputAmount = model.getTrade().getSecurityDeposit().add(FeePolicy.TX_FEE); Coin offererInputAmount = model.getTrade().getSecurityDeposit().add(FeePolicy.TX_FEE);
Transaction transaction = model.getWalletService().offererCreatesMSTxAndAddPayment( Transaction transaction = model.getWalletService().prepareDepositTx(
offererInputAmount, offererInputAmount,
offererPubKey, offererPubKey,
model.getTakerPubKey(), model.getTakerPubKey(),
model.getArbitratorPubKey(), model.getArbitratorPubKey(),
model.getTrade().getId()); model.getTrade().getId());
String preparedOffererDepositTxAsHex = Utils.HEX.encode(transaction.bitcoinSerialize());
long offererTxOutIndex = transaction.getInput(0).getOutpoint().getIndex(); long offererTxOutIndex = transaction.getInput(0).getOutpoint().getIndex();
model.setOffererPubKey(offererPubKey); model.setOffererPubKey(offererPubKey);
model.setPreparedOffererDepositTxAsHex(preparedOffererDepositTxAsHex); model.setPreparedDepositTx(transaction);
model.setOffererTxOutIndex(offererTxOutIndex); model.setOffererTxOutIndex(offererTxOutIndex);
complete(); complete();

View file

@ -19,28 +19,28 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.listeners.SendMessageListener; import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.offerer.BuyerAsOffererModel; 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.Task;
import io.bitsquare.util.taskrunner.TaskRunner; import io.bitsquare.util.taskrunner.TaskRunner;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class SendTakerDepositPaymentRequest extends Task<BuyerAsOffererModel> { public class RequestDepositPayment extends Task<BuyerAsOffererModel> {
private static final Logger log = LoggerFactory.getLogger(SendTakerDepositPaymentRequest.class); private static final Logger log = LoggerFactory.getLogger(RequestDepositPayment.class);
public SendTakerDepositPaymentRequest(TaskRunner taskHandler, BuyerAsOffererModel model) { public RequestDepositPayment(TaskRunner taskHandler, BuyerAsOffererModel model) {
super(taskHandler, model); super(taskHandler, model);
} }
@Override @Override
protected void doRun() { protected void doRun() {
TakerDepositPaymentRequestMessage tradeMessage = new TakerDepositPaymentRequestMessage( RequestDepositPaymentMessage tradeMessage = new RequestDepositPaymentMessage(
model.getTrade().getId(), model.getTrade().getId(),
model.getBankAccount(), model.getBankAccount(),
model.getAccountId(), model.getAccountId(),
model.getOffererPubKey(), model.getOffererPubKey(),
model.getPreparedOffererDepositTxAsHex(), model.getPreparedDepositTx(),
model.getOffererTxOutIndex()); model.getOffererTxOutIndex());
model.getTradeMessageService().sendMessage(model.getTaker(), tradeMessage, new SendMessageListener() { model.getTradeMessageService().sendMessage(model.getTaker(), tradeMessage, new SendMessageListener() {

View file

@ -41,7 +41,7 @@ public class SignAndPublishDepositTx extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
model.getWalletService().offererSignAndPublishTx(model.getPreparedOffererDepositTxAsHex(), model.getWalletService().offererSignAndPublishTx(model.getPreparedDepositTx(),
model.getSignedTakerDepositTxAsHex(), model.getSignedTakerDepositTxAsHex(),
model.getTxConnOutAsHex(), model.getTxConnOutAsHex(),
model.getTxScriptSigAsHex(), model.getTxScriptSigAsHex(),

View file

@ -40,7 +40,7 @@ public class SellerAsTakerModel extends OfferSharedModel {
// written/read by task // written/read by task
private Peer offerer; private Peer offerer;
private String preparedOffererDepositTxAsHex; private Transaction preparedDepositTx;
private String depositTxAsHex; private String depositTxAsHex;
private Transaction signedTakerDepositTx; private Transaction signedTakerDepositTx;
private Transaction payoutTx; private Transaction payoutTx;
@ -107,12 +107,12 @@ public class SellerAsTakerModel extends OfferSharedModel {
this.offererPubKey = offererPubKey; this.offererPubKey = offererPubKey;
} }
public String getPreparedOffererDepositTxAsHex() { public Transaction getPreparedDepositTx() {
return preparedOffererDepositTxAsHex; return preparedDepositTx;
} }
public void setPreparedOffererDepositTxAsHex(String preparedOffererDepositTxAsHex) { public void setPreparedDepositTx(Transaction preparedDepositTx) {
this.preparedOffererDepositTxAsHex = preparedOffererDepositTxAsHex; this.preparedDepositTx = preparedDepositTx;
} }
public long getOffererTxOutIndex() { public long getOffererTxOutIndex() {

View file

@ -24,16 +24,16 @@ import io.bitsquare.trade.handlers.MessageHandler;
import io.bitsquare.trade.protocol.trade.TradeMessage; import io.bitsquare.trade.protocol.trade.TradeMessage;
import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage; 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.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.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.CreateAndSignContract;
import io.bitsquare.trade.protocol.trade.taker.tasks.GetPeerAddress; 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.PayDeposit;
import io.bitsquare.trade.protocol.trade.taker.tasks.PayTakeOfferFee; 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.ProcessBankTransferInitedMessage;
import io.bitsquare.trade.protocol.trade.taker.tasks.ProcessDepositTxPublishedMessage; 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.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.RequestTakeOffer;
import io.bitsquare.trade.protocol.trade.taker.tasks.SendPayoutTxToOfferer; import io.bitsquare.trade.protocol.trade.taker.tasks.SendPayoutTxToOfferer;
import io.bitsquare.trade.protocol.trade.taker.tasks.SendSignedTakerDepositTxAsHex; import io.bitsquare.trade.protocol.trade.taker.tasks.SendSignedTakerDepositTxAsHex;
@ -114,7 +114,7 @@ public class SellerAsTakerProtocol {
taskRunner.run(); taskRunner.run();
} }
private void handleTakerDepositPaymentRequestMessage(TakerDepositPaymentRequestMessage tradeMessage) { private void handleRequestDepositPaymentMessage(RequestDepositPaymentMessage tradeMessage) {
model.setTradeMessage(tradeMessage); model.setTradeMessage(tradeMessage);
SellerAsTakerTaskRunner<SellerAsTakerModel> taskRunner = new SellerAsTakerTaskRunner<>(model, SellerAsTakerTaskRunner<SellerAsTakerModel> taskRunner = new SellerAsTakerTaskRunner<>(model,
@ -126,7 +126,7 @@ public class SellerAsTakerProtocol {
} }
); );
taskRunner.addTasks( taskRunner.addTasks(
ProcessTakerDepositPaymentRequestMessage.class, ProcessRequestDepositPaymentMessage.class,
VerifyOffererAccount.class, VerifyOffererAccount.class,
CreateAndSignContract.class, CreateAndSignContract.class,
PayDeposit.class, PayDeposit.class,
@ -201,21 +201,23 @@ public class SellerAsTakerProtocol {
if (message instanceof TradeMessage) { if (message instanceof TradeMessage) {
TradeMessage tradeMessage = (TradeMessage) message; TradeMessage tradeMessage = (TradeMessage) message;
nonEmptyStringOf(tradeMessage.getTradeId()); nonEmptyStringOf(tradeMessage.getTradeId());
if (tradeMessage instanceof RespondToTakeOfferRequestMessage) { if (tradeMessage.getTradeId().equals(model.getOffer().getId())) {
handleRespondToTakeOfferRequestMessage((RespondToTakeOfferRequestMessage) tradeMessage); if (tradeMessage instanceof RespondToTakeOfferRequestMessage) {
} handleRespondToTakeOfferRequestMessage((RespondToTakeOfferRequestMessage) tradeMessage);
else if (tradeMessage instanceof TakerDepositPaymentRequestMessage) { }
handleTakerDepositPaymentRequestMessage((TakerDepositPaymentRequestMessage) tradeMessage); else if (tradeMessage instanceof RequestDepositPaymentMessage) {
} handleRequestDepositPaymentMessage((RequestDepositPaymentMessage) tradeMessage);
else if (tradeMessage instanceof DepositTxPublishedMessage) { }
handleDepositTxPublishedMessage((DepositTxPublishedMessage) tradeMessage); else if (tradeMessage instanceof DepositTxPublishedMessage) {
} handleDepositTxPublishedMessage((DepositTxPublishedMessage) tradeMessage);
else if (tradeMessage instanceof BankTransferStartedMessage) { }
handleBankTransferInitedMessage((BankTransferStartedMessage) tradeMessage); else if (tradeMessage instanceof BankTransferStartedMessage) {
} handleBankTransferInitedMessage((BankTransferStartedMessage) tradeMessage);
else { }
log.error("Incoming message not supported. " + tradeMessage); else {
log.error("Incoming message not supported. " + tradeMessage);
}
} }
} }
} }

View file

@ -17,6 +17,7 @@
package io.bitsquare.trade.protocol.trade.taker.tasks; package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.btc.FeePolicy;
import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.taskrunner.Task; import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner; import io.bitsquare.util.taskrunner.TaskRunner;
@ -39,14 +40,14 @@ public class PayDeposit extends Task<SellerAsTakerModel> {
protected void doRun() { protected void doRun() {
try { try {
Coin amountToPay = model.getTrade().getTradeAmount().add(model.getTrade().getSecurityDeposit()); 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( Transaction signedTakerDepositTx = model.getWalletService().takerAddPaymentAndSignTx(
amountToPay, amountToPay,
msOutputAmount, msOutputAmount,
model.getOffererPubKey(), model.getOffererPubKey(),
model.getTakerPubKey(), model.getTakerPubKey(),
model.getArbitratorPubKey(), model.getArbitratorPubKey(),
model.getPreparedOffererDepositTxAsHex(), model.getPreparedDepositTx(),
model.getTrade().getId()); model.getTrade().getId());
model.setSignedTakerDepositTx(signedTakerDepositTx); model.setSignedTakerDepositTx(signedTakerDepositTx);

View file

@ -17,7 +17,7 @@
package io.bitsquare.trade.protocol.trade.taker.tasks; 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.trade.protocol.trade.taker.SellerAsTakerModel;
import io.bitsquare.util.taskrunner.Task; import io.bitsquare.util.taskrunner.Task;
import io.bitsquare.util.taskrunner.TaskRunner; import io.bitsquare.util.taskrunner.TaskRunner;
@ -28,10 +28,10 @@ import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static io.bitsquare.util.Validator.*; import static io.bitsquare.util.Validator.*;
public class ProcessTakerDepositPaymentRequestMessage extends Task<SellerAsTakerModel> { public class ProcessRequestDepositPaymentMessage extends Task<SellerAsTakerModel> {
private static final Logger log = LoggerFactory.getLogger(ProcessTakerDepositPaymentRequestMessage.class); private static final Logger log = LoggerFactory.getLogger(ProcessRequestDepositPaymentMessage.class);
public ProcessTakerDepositPaymentRequestMessage(TaskRunner taskHandler, SellerAsTakerModel model) { public ProcessRequestDepositPaymentMessage(TaskRunner taskHandler, SellerAsTakerModel model) {
super(taskHandler, model); super(taskHandler, model);
} }
@ -39,11 +39,11 @@ public class ProcessTakerDepositPaymentRequestMessage extends Task<SellerAsTaker
protected void doRun() { protected void doRun() {
try { try {
checkTradeId(model.getTrade().getId(), model.getTradeMessage()); checkTradeId(model.getTrade().getId(), model.getTradeMessage());
TakerDepositPaymentRequestMessage message = (TakerDepositPaymentRequestMessage) model.getTradeMessage(); RequestDepositPaymentMessage message = (RequestDepositPaymentMessage) model.getTradeMessage();
model.setTakerAccountId(nonEmptyStringOf(message.getAccountId())); model.setTakerAccountId(nonEmptyStringOf(message.getAccountId()));
model.setTakerBankAccount(checkNotNull(message.getBankAccount())); model.setTakerBankAccount(checkNotNull(message.getBankAccount()));
model.setOffererPubKeyAsHex(checkNotNull(message.getOffererPubKey())); model.setOffererPubKeyAsHex(checkNotNull(message.getOffererPubKey()));
model.setPreparedOffererDepositTxAsHex(nonEmptyStringOf(message.getPreparedOffererDepositTxAsHex())); model.setPreparedDepositTx(checkNotNull(message.getPreparedDepositTx()));
model.setOffererTxOutIndex(nonNegativeLongOf(message.getOffererTxOutIndex())); model.setOffererTxOutIndex(nonNegativeLongOf(message.getOffererTxOutIndex()));
complete(); complete();