mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-06-18 03:49:20 -04:00
Use Transaction instead of hex string for trade process
This commit is contained in:
parent
72ded8ad90
commit
1f041c520a
12 changed files with 105 additions and 114 deletions
|
@ -602,7 +602,7 @@ 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,
|
||||||
|
@ -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");
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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,6 +192,7 @@ public class BuyerAsOffererProtocol {
|
||||||
TradeMessage tradeMessage = (TradeMessage) message;
|
TradeMessage tradeMessage = (TradeMessage) message;
|
||||||
nonEmptyStringOf(tradeMessage.getTradeId());
|
nonEmptyStringOf(tradeMessage.getTradeId());
|
||||||
|
|
||||||
|
if (tradeMessage.getTradeId().equals(model.getOffer().getId())) {
|
||||||
if (tradeMessage instanceof RequestTakeOfferMessage) {
|
if (tradeMessage instanceof RequestTakeOfferMessage) {
|
||||||
handleRequestTakeOfferMessage((RequestTakeOfferMessage) tradeMessage, peer);
|
handleRequestTakeOfferMessage((RequestTakeOfferMessage) tradeMessage, peer);
|
||||||
}
|
}
|
||||||
|
@ -210,4 +211,5 @@ public class BuyerAsOffererProtocol {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
|
@ -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();
|
|
@ -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() {
|
|
@ -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(),
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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,
|
||||||
|
@ -202,11 +202,12 @@ public class SellerAsTakerProtocol {
|
||||||
TradeMessage tradeMessage = (TradeMessage) message;
|
TradeMessage tradeMessage = (TradeMessage) message;
|
||||||
nonEmptyStringOf(tradeMessage.getTradeId());
|
nonEmptyStringOf(tradeMessage.getTradeId());
|
||||||
|
|
||||||
|
if (tradeMessage.getTradeId().equals(model.getOffer().getId())) {
|
||||||
if (tradeMessage instanceof RespondToTakeOfferRequestMessage) {
|
if (tradeMessage instanceof RespondToTakeOfferRequestMessage) {
|
||||||
handleRespondToTakeOfferRequestMessage((RespondToTakeOfferRequestMessage) tradeMessage);
|
handleRespondToTakeOfferRequestMessage((RespondToTakeOfferRequestMessage) tradeMessage);
|
||||||
}
|
}
|
||||||
else if (tradeMessage instanceof TakerDepositPaymentRequestMessage) {
|
else if (tradeMessage instanceof RequestDepositPaymentMessage) {
|
||||||
handleTakerDepositPaymentRequestMessage((TakerDepositPaymentRequestMessage) tradeMessage);
|
handleRequestDepositPaymentMessage((RequestDepositPaymentMessage) tradeMessage);
|
||||||
}
|
}
|
||||||
else if (tradeMessage instanceof DepositTxPublishedMessage) {
|
else if (tradeMessage instanceof DepositTxPublishedMessage) {
|
||||||
handleDepositTxPublishedMessage((DepositTxPublishedMessage) tradeMessage);
|
handleDepositTxPublishedMessage((DepositTxPublishedMessage) tradeMessage);
|
||||||
|
@ -219,4 +220,5 @@ public class SellerAsTakerProtocol {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
Loading…
Add table
Add a link
Reference in a new issue