Change accessors

This commit is contained in:
Manfred Karrer 2015-03-18 11:52:12 +01:00
parent ac886c1c94
commit 769037e137
76 changed files with 521 additions and 680 deletions

View file

@ -94,7 +94,7 @@ public class TradeWalletService {
// Trade fee // Trade fee
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public Transaction createOfferFeeTx(AddressEntry addressEntry) throws InsufficientMoneyException { public Transaction createOfferFeeTx(AddressEntry offererAddressEntry) throws InsufficientMoneyException {
Transaction createOfferFeeTx = new Transaction(params); Transaction createOfferFeeTx = new Transaction(params);
Coin fee = FeePolicy.CREATE_OFFER_FEE.subtract(FeePolicy.TX_FEE); Coin fee = FeePolicy.CREATE_OFFER_FEE.subtract(FeePolicy.TX_FEE);
createOfferFeeTx.addOutput(fee, feePolicy.getAddressForCreateOfferFee()); createOfferFeeTx.addOutput(fee, feePolicy.getAddressForCreateOfferFee());
@ -102,8 +102,8 @@ public class TradeWalletService {
sendRequest.shuffleOutputs = false; sendRequest.shuffleOutputs = false;
// we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to // we allow spending of unconfirmed tx (double spend risk is low and usability would suffer if we need to
// wait for 1 confirmation) // wait for 1 confirmation)
sendRequest.coinSelector = new AddressBasedCoinSelector(params, addressEntry, true); sendRequest.coinSelector = new AddressBasedCoinSelector(params, offererAddressEntry, true);
sendRequest.changeAddress = addressEntry.getAddress(); sendRequest.changeAddress = offererAddressEntry.getAddress();
wallet.completeTx(sendRequest); wallet.completeTx(sendRequest);
printTxWithInputs("createOfferFeeTx", createOfferFeeTx); printTxWithInputs("createOfferFeeTx", createOfferFeeTx);
return createOfferFeeTx; return createOfferFeeTx;
@ -114,7 +114,7 @@ public class TradeWalletService {
Futures.addCallback(future, callback); Futures.addCallback(future, callback);
} }
public Transaction createTakeOfferFeeTx(AddressEntry addressEntry) throws InsufficientMoneyException { public Transaction createTakeOfferFeeTx(AddressEntry takerAddressEntry) throws InsufficientMoneyException {
Transaction takeOfferFeeTx = new Transaction(params); Transaction takeOfferFeeTx = new Transaction(params);
Coin fee = FeePolicy.TAKE_OFFER_FEE.subtract(FeePolicy.TX_FEE); Coin fee = FeePolicy.TAKE_OFFER_FEE.subtract(FeePolicy.TX_FEE);
takeOfferFeeTx.addOutput(fee, feePolicy.getAddressForTakeOfferFee()); takeOfferFeeTx.addOutput(fee, feePolicy.getAddressForTakeOfferFee());
@ -123,8 +123,8 @@ public class TradeWalletService {
sendRequest.shuffleOutputs = false; sendRequest.shuffleOutputs = false;
// we allow spending of unconfirmed takeOfferFeeTx (double spend risk is low and usability would suffer if we need to // we allow spending of unconfirmed takeOfferFeeTx (double spend risk is low and usability would suffer if we need to
// wait for 1 confirmation) // wait for 1 confirmation)
sendRequest.coinSelector = new AddressBasedCoinSelector(params, addressEntry, true); sendRequest.coinSelector = new AddressBasedCoinSelector(params, takerAddressEntry, true);
sendRequest.changeAddress = addressEntry.getAddress(); sendRequest.changeAddress = takerAddressEntry.getAddress();
wallet.completeTx(sendRequest); wallet.completeTx(sendRequest);
printTxWithInputs("takeOfferFeeTx", takeOfferFeeTx); printTxWithInputs("takeOfferFeeTx", takeOfferFeeTx);
return takeOfferFeeTx; return takeOfferFeeTx;
@ -140,7 +140,7 @@ public class TradeWalletService {
// Trade // Trade
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public TransactionDataResult offererCreatesDepositTxInputs(Coin inputAmount, AddressEntry addressInfo) throws public TransactionDataResult offererCreatesDepositTxInputs(Coin inputAmount, AddressEntry offererAddressEntry) throws
TransactionVerificationException, WalletException { TransactionVerificationException, WalletException {
// We pay the tx fee 2 times to the deposit tx: // We pay the tx fee 2 times to the deposit tx:
@ -160,7 +160,7 @@ public class TradeWalletService {
// Fin the needed inputs to pay the output, optional add change output. // Fin the needed inputs to pay the output, optional add change output.
// Normally only 1 input and no change output is used, but we support multiple inputs and outputs. Our spending transaction output is from the create // Normally only 1 input and no change output is used, but we support multiple inputs and outputs. Our spending transaction output is from the create
// offer fee payment. In future changes (in case of no offer fee) multiple inputs might become used. // offer fee payment. In future changes (in case of no offer fee) multiple inputs might become used.
addAvailableInputsAndChangeOutputs(dummyTX, addressInfo); addAvailableInputsAndChangeOutputs(dummyTX, offererAddressEntry);
// The completeTx() call signs the input, but we don't want to pass over signed tx inputs // The completeTx() call signs the input, but we don't want to pass over signed tx inputs
// But to be safe and to support future changes (in case of no offer fee) we handle potential multiple inputs // But to be safe and to support future changes (in case of no offer fee) we handle potential multiple inputs
@ -200,7 +200,7 @@ public class TradeWalletService {
Coin msOutputAmount, Coin msOutputAmount,
List<TransactionOutput> offererConnectedOutputsForAllInputs, List<TransactionOutput> offererConnectedOutputsForAllInputs,
List<TransactionOutput> offererOutputs, List<TransactionOutput> offererOutputs,
AddressEntry addressInfo, AddressEntry takerAddressInfo,
byte[] offererPubKey, byte[] offererPubKey,
byte[] takerPubKey, byte[] takerPubKey,
byte[] arbitratorPubKey) throws SigningException, byte[] arbitratorPubKey) throws SigningException,
@ -213,7 +213,7 @@ public class TradeWalletService {
Coin dummyOutputAmount = takerInputAmount.subtract(FeePolicy.TX_FEE); Coin dummyOutputAmount = takerInputAmount.subtract(FeePolicy.TX_FEE);
TransactionOutput dummyOutput = new TransactionOutput(params, dummyTx, dummyOutputAmount, new ECKey().toAddress(params)); TransactionOutput dummyOutput = new TransactionOutput(params, dummyTx, dummyOutputAmount, new ECKey().toAddress(params));
dummyTx.addOutput(dummyOutput); dummyTx.addOutput(dummyOutput);
addAvailableInputsAndChangeOutputs(dummyTx, addressInfo); addAvailableInputsAndChangeOutputs(dummyTx, takerAddressInfo);
List<TransactionInput> takerInputs = dummyTx.getInputs(); List<TransactionInput> takerInputs = dummyTx.getInputs();
List<TransactionOutput> takerOutputs = new ArrayList<>(); List<TransactionOutput> takerOutputs = new ArrayList<>();
// we store optional change outputs (ignoring dummyOutput) // we store optional change outputs (ignoring dummyOutput)
@ -387,36 +387,39 @@ public class TradeWalletService {
verifyTransaction(payoutTx); verifyTransaction(payoutTx);
return new TransactionDataResult(payoutTx, offererSignature); return new TransactionDataResult(payoutTx, offererSignature.encodeToDER());
} }
public void takerSignsAndPublishPayoutTx(Transaction depositTx, public void takerSignsAndPublishPayoutTx(Transaction depositTx,
ECKey.ECDSASignature offererSignature, byte[] offererSignature,
Coin offererPayoutAmount, Coin offererPayoutAmount,
Coin takerPayoutAmount, Coin takerPayoutAmount,
String offererAddressString, String offererAddressString,
AddressEntry addressEntry, AddressEntry takerAddressEntry,
byte[] offererPubKey, byte[] offererPubKey,
byte[] takerPubKey, byte[] takerPubKey,
byte[] arbitratorPubKey, byte[] arbitratorPubKey,
FutureCallback<Transaction> callback) FutureCallback<Transaction> callback)
throws AddressFormatException, TransactionVerificationException, WalletException { throws AddressFormatException, TransactionVerificationException, WalletException {
Transaction payoutTx = createPayoutTx(depositTx, offererPayoutAmount, takerPayoutAmount, offererAddressString, addressEntry.getAddressString()); Transaction payoutTx = createPayoutTx(depositTx, offererPayoutAmount, takerPayoutAmount, offererAddressString, takerAddressEntry.getAddressString());
// We need MS script not the P2SH // We need MS script not the P2SH
Script multiSigScript = getMultiSigRedeemScript(offererPubKey, takerPubKey, arbitratorPubKey); Script multiSigScript = getMultiSigRedeemScript(offererPubKey, takerPubKey, arbitratorPubKey);
Sha256Hash sigHash = payoutTx.hashForSignature(0, multiSigScript, Transaction.SigHash.ALL, false); Sha256Hash sigHash = payoutTx.hashForSignature(0, multiSigScript, Transaction.SigHash.ALL, false);
ECKey.ECDSASignature takerSignature = addressEntry.getKeyPair().sign(sigHash); ECKey.ECDSASignature takerSignature = takerAddressEntry.getKeyPair().sign(sigHash);
TransactionSignature takerTxSig = new TransactionSignature(takerSignature, Transaction.SigHash.ALL, false); TransactionSignature takerTxSig = new TransactionSignature(takerSignature, Transaction.SigHash.ALL, false);
TransactionSignature offererTxSig = new TransactionSignature(offererSignature, Transaction.SigHash.ALL, false); TransactionSignature offererTxSig = new TransactionSignature(ECKey.ECDSASignature.decodeFromDER(offererSignature), Transaction.SigHash.ALL, false);
Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(offererTxSig, takerTxSig), multiSigScript); Script inputScript = ScriptBuilder.createP2SHMultiSigInputScript(ImmutableList.of(offererTxSig, takerTxSig), multiSigScript);
TransactionInput input = payoutTx.getInput(0); TransactionInput input = payoutTx.getInput(0);
input.setScriptSig(inputScript); input.setScriptSig(inputScript);
verifyTransaction(payoutTx); verifyTransaction(payoutTx);
checkWalletConsistency(); checkWalletConsistency();
checkScriptSig(payoutTx, input, 0);
input.verify(input.getConnectedOutput());
printTxWithInputs("payoutTx", payoutTx); printTxWithInputs("payoutTx", payoutTx);
ListenableFuture<Transaction> broadcastComplete = walletAppKit.peerGroup().broadcastTransaction(payoutTx); ListenableFuture<Transaction> broadcastComplete = walletAppKit.peerGroup().broadcastTransaction(payoutTx);
Futures.addCallback(broadcastComplete, callback); Futures.addCallback(broadcastComplete, callback);
} }
@ -544,9 +547,9 @@ public class TradeWalletService {
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Inner classes // Inner classes
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public class TransactionDataResult { public class TransactionDataResult {
private List<TransactionOutput> connectedOutputsForAllInputs; private List<TransactionOutput> connectedOutputsForAllInputs;
@ -555,7 +558,7 @@ public class TradeWalletService {
private Transaction payoutTx; private Transaction payoutTx;
private ECKey.ECDSASignature offererSignature; private byte[] offererSignature;
public TransactionDataResult(List<TransactionOutput> connectedOutputsForAllInputs, List<TransactionOutput> outputs) { public TransactionDataResult(List<TransactionOutput> connectedOutputsForAllInputs, List<TransactionOutput> outputs) {
this.connectedOutputsForAllInputs = connectedOutputsForAllInputs; this.connectedOutputsForAllInputs = connectedOutputsForAllInputs;
@ -568,7 +571,7 @@ public class TradeWalletService {
this.outputs = outputs; this.outputs = outputs;
} }
public TransactionDataResult(Transaction payoutTx, ECKey.ECDSASignature offererSignature) { public TransactionDataResult(Transaction payoutTx, byte[] offererSignature) {
this.payoutTx = payoutTx; this.payoutTx = payoutTx;
this.offererSignature = offererSignature; this.offererSignature = offererSignature;
@ -590,7 +593,7 @@ public class TradeWalletService {
return payoutTx; return payoutTx;
} }
public ECKey.ECDSASignature getOffererSignature() { public byte[] getOffererSignature() {
return offererSignature; return offererSignature;
} }
} }

View file

@ -20,6 +20,9 @@ package io.bitsquare.common.taskrunner;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class SharedModel { public class SharedTaskModel {
private static final Logger log = LoggerFactory.getLogger(SharedModel.class); private static final Logger log = LoggerFactory.getLogger(SharedTaskModel.class);
public void persist() {
}
} }

View file

@ -24,7 +24,7 @@ import io.bitsquare.btc.exceptions.WalletException;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public abstract class Task<T extends SharedModel> { public abstract class Task<T extends SharedTaskModel> {
private static final Logger log = LoggerFactory.getLogger(Task.class); private static final Logger log = LoggerFactory.getLogger(Task.class);
public static Class<? extends Task> taskToInterceptBeforeRun; public static Class<? extends Task> taskToInterceptBeforeRun;

View file

@ -27,7 +27,7 @@ import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class TaskRunner<T extends SharedModel> { public class TaskRunner<T extends SharedTaskModel> {
private static final Logger log = LoggerFactory.getLogger(TaskRunner.class); private static final Logger log = LoggerFactory.getLogger(TaskRunner.class);
private final Queue<Class> tasks = new LinkedBlockingQueue<>(); private final Queue<Class> tasks = new LinkedBlockingQueue<>();
@ -77,9 +77,14 @@ public class TaskRunner<T extends SharedModel> {
void handleComplete() { void handleComplete() {
log.trace("Task completed: " + currentTask.getSimpleName()); log.trace("Task completed: " + currentTask.getSimpleName());
persistModel();
next(); next();
} }
protected void persistModel() {
// sharedModel.persist();
}
void handleErrorMessage(String errorMessage) { void handleErrorMessage(String errorMessage) {
log.error("Task failed: " + currentTask.getSimpleName()); log.error("Task failed: " + currentTask.getSimpleName());
log.error("errorMessage: " + errorMessage); log.error("errorMessage: " + errorMessage);

View file

@ -157,7 +157,7 @@ class MainViewModel implements ViewModel {
error -> log.error(error.toString()), error -> log.error(error.toString()),
() -> Platform.runLater(() -> setBitcoinNetworkSyncProgress(1.0))); () -> Platform.runLater(() -> setBitcoinNetworkSyncProgress(1.0)));
Observable<BootstrapState> messageObservable = clientNode.bootstrap(user.getNetworkKeyPair(), tradeMessageService); Observable<BootstrapState> messageObservable = clientNode.bootstrap(user.getMessageKeyPair(), tradeMessageService);
messageObservable.publish(); messageObservable.publish();
messageObservable.subscribe( messageObservable.subscribe(
state -> Platform.runLater(() -> setBootstrapState(state)), state -> Platform.runLater(() -> setBootstrapState(state)),
@ -350,9 +350,9 @@ class MainViewModel implements ViewModel {
} }
private void addMockArbitrator() { private void addMockArbitrator() {
if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getNetworkKeyPair() != null) { if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getMessageKeyPair() != null) {
byte[] pubKey = new ECKey().getPubKey(); byte[] pubKey = new ECKey().getPubKey();
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getNetworkPubKey()); String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePubKey());
List<Locale> languages = new ArrayList<>(); List<Locale> languages = new ArrayList<>();
languages.add(LanguageUtil.getDefaultLanguageLocale()); languages.add(LanguageUtil.getDefaultLanguageLocale());
List<Arbitrator.METHOD> arbitrationMethods = new ArrayList<>(); List<Arbitrator.METHOD> arbitrationMethods = new ArrayList<>();

View file

@ -370,7 +370,7 @@ public class ArbitratorRegistrationView extends ActivatableView<AnchorPane, Void
private Arbitrator getEditedArbitrator() { private Arbitrator getEditedArbitrator() {
byte[] pubKey = walletService.getArbitratorDepositAddressEntry().getPubKey(); byte[] pubKey = walletService.getArbitratorDepositAddressEntry().getPubKey();
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getNetworkPubKey()); String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePubKey());
String name = nameTextField.getText(); String name = nameTextField.getText();
Coin fee = formatter.parseToCoin(arbitrationFeeTextField.getText()); Coin fee = formatter.parseToCoin(arbitrationFeeTextField.getText());
String webUrl = webPageTextField.getText(); String webUrl = webPageTextField.getText();

View file

@ -122,9 +122,9 @@ class IrcAccountDataModel implements Activatable, DataModel {
} }
private void addMockArbitrator() { private void addMockArbitrator() {
if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getNetworkKeyPair() != null) { if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getMessageKeyPair() != null) {
byte[] pubKey = new ECKey().getPubKey(); byte[] pubKey = new ECKey().getPubKey();
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getNetworkPubKey()); String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePubKey());
List<Locale> languages = new ArrayList<>(); List<Locale> languages = new ArrayList<>();
languages.add(LanguageUtil.getDefaultLanguageLocale()); languages.add(LanguageUtil.getDefaultLanguageLocale());
List<Arbitrator.METHOD> arbitrationMethods = new ArrayList<>(); List<Arbitrator.METHOD> arbitrationMethods = new ArrayList<>();

View file

@ -152,9 +152,9 @@ class RestrictionsDataModel implements Activatable, DataModel {
// TODO Remove mock later // TODO Remove mock later
private void addMockArbitrator() { private void addMockArbitrator() {
if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getNetworkKeyPair() != null) { if (accountSettings.getAcceptedArbitrators().isEmpty() && user.getMessageKeyPair() != null) {
byte[] pubKey = new ECKey().getPubKey(); byte[] pubKey = new ECKey().getPubKey();
String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getNetworkPubKey()); String messagePubKeyAsHex = DSAKeyUtil.getHexStringFromPublicKey(user.getMessagePubKey());
List<Locale> languages = new ArrayList<>(); List<Locale> languages = new ArrayList<>();
languages.add(LanguageUtil.getDefaultLanguageLocale()); languages.add(LanguageUtil.getDefaultLanguageLocale());
List<Arbitrator.METHOD> arbitrationMethods = new ArrayList<>(); List<Arbitrator.METHOD> arbitrationMethods = new ArrayList<>();

View file

@ -74,7 +74,7 @@ class ClosedTradesDataModel implements Activatable, DataModel {
} }
public Direction getDirection(Offer offer) { public Direction getDirection(Offer offer) {
return offer.getMessagePublicKey().equals(user.getNetworkPubKey()) ? return offer.getMessagePublicKey().equals(user.getMessagePubKey()) ?
offer.getDirection() : offer.getMirroredDirection(); offer.getDirection() : offer.getMirroredDirection();
} }

View file

@ -86,7 +86,7 @@ class OffersDataModel implements Activatable, DataModel {
} }
public Direction getDirection(Offer offer) { public Direction getDirection(Offer offer) {
return offer.getMessagePublicKey().equals(user.getNetworkPubKey()) ? return offer.getMessagePublicKey().equals(user.getMessagePubKey()) ?
offer.getDirection() : offer.getMirroredDirection(); offer.getDirection() : offer.getMirroredDirection();
} }
} }

View file

@ -130,7 +130,7 @@ class PendingTradesDataModel implements Activatable, DataModel {
selectedItem = item; selectedItem = item;
if (selectedItem != null) { if (selectedItem != null) {
isOfferer = getTrade().getOffer().getMessagePublicKey().equals(user.getNetworkPubKey()); isOfferer = getTrade().getOffer().getMessagePublicKey().equals(user.getMessagePubKey());
Trade trade = getTrade(); Trade trade = getTrade();
trade.stateProperty().addListener(stateChangeListener); trade.stateProperty().addListener(stateChangeListener);
@ -253,7 +253,7 @@ class PendingTradesDataModel implements Activatable, DataModel {
} }
public Direction getDirection(Offer offer) { public Direction getDirection(Offer offer) {
return offer.getMessagePublicKey().equals(user.getNetworkPubKey()) ? return offer.getMessagePublicKey().equals(user.getMessagePubKey()) ?
offer.getDirection() : offer.getMirroredDirection(); offer.getDirection() : offer.getMirroredDirection();
} }

View file

@ -213,7 +213,7 @@ class OfferBookDataModel implements Activatable, DataModel {
} }
boolean isMyOffer(Offer offer) { boolean isMyOffer(Offer offer) {
return offer.getMessagePublicKey() != null && offer.getMessagePublicKey().equals(user.getNetworkPubKey()); return offer.getMessagePublicKey() != null && offer.getMessagePublicKey().equals(user.getMessagePubKey());
} }
Coin getAmountAsCoin() { Coin getAmountAsCoin() {

View file

@ -17,5 +17,7 @@
package io.bitsquare.network; package io.bitsquare.network;
public interface Message { import java.io.Serializable;
public interface Message extends Serializable {
} }

View file

@ -168,7 +168,7 @@ public class TradeManager {
FiatAccount currentFiatAccount = user.getCurrentBankAccount().get(); FiatAccount currentFiatAccount = user.getCurrentBankAccount().get();
Offer offer = new Offer(id, Offer offer = new Offer(id,
user.getNetworkPubKey(), user.getMessagePubKey(),
direction, direction,
price.getValue(), price.getValue(),
amount, amount,
@ -295,7 +295,7 @@ public class TradeManager {
// Offerer handles those requests // Offerer handles those requests
private void handleMessage(Message message, Peer sender) { private void handleMessage(Message message, Peer sender) {
if (message instanceof RequestIsOfferAvailableMessage) { if (message instanceof RequestIsOfferAvailableMessage) {
String offerId = ((RequestIsOfferAvailableMessage) message).getOfferId(); String offerId = ((RequestIsOfferAvailableMessage) message).offerId;
checkNotNull(offerId); checkNotNull(offerId);
ReportOfferAvailabilityMessage reportOfferAvailabilityMessage = new ReportOfferAvailabilityMessage(offerId, isOfferOpen(offerId)); ReportOfferAvailabilityMessage reportOfferAvailabilityMessage = new ReportOfferAvailabilityMessage(offerId, isOfferOpen(offerId));

View file

@ -17,20 +17,20 @@
package io.bitsquare.trade.protocol.availability; package io.bitsquare.trade.protocol.availability;
import io.bitsquare.common.taskrunner.SharedModel; import io.bitsquare.common.taskrunner.SharedTaskModel;
import io.bitsquare.network.Peer; import io.bitsquare.network.Peer;
import io.bitsquare.offer.Offer; import io.bitsquare.offer.Offer;
import io.bitsquare.trade.TradeMessageService; import io.bitsquare.trade.TradeMessageService;
import io.bitsquare.trade.protocol.trade.OfferMessage; import io.bitsquare.trade.protocol.trade.messages.OfferMessage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class CheckOfferAvailabilityModel extends SharedModel { public class CheckOfferAvailabilityModel extends SharedTaskModel {
private static final Logger log = LoggerFactory.getLogger(CheckOfferAvailabilityModel.class); private static final Logger log = LoggerFactory.getLogger(CheckOfferAvailabilityModel.class);
private final Offer offer; public final Offer offer;
private final TradeMessageService tradeMessageService; public final TradeMessageService tradeMessageService;
private Peer peer; private Peer peer;
private OfferMessage message; private OfferMessage message;
@ -40,15 +40,6 @@ public class CheckOfferAvailabilityModel extends SharedModel {
this.tradeMessageService = tradeMessageService; this.tradeMessageService = tradeMessageService;
} }
// getter/setter
public Offer getOffer() {
return offer;
}
public TradeMessageService getTradeMessageService() {
return tradeMessageService;
}
public Peer getPeer() { public Peer getPeer() {
return peer; return peer;
} }

View file

@ -55,7 +55,7 @@ public class CheckOfferAvailabilityProtocol {
} }
public void cleanup() { public void cleanup() {
model.getTradeMessageService().removeMessageHandler(messageHandler); model.tradeMessageService.removeMessageHandler(messageHandler);
} }
@ -64,7 +64,7 @@ public class CheckOfferAvailabilityProtocol {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public void checkOfferAvailability() { public void checkOfferAvailability() {
model.getTradeMessageService().addMessageHandler(messageHandler); model.tradeMessageService.addMessageHandler(messageHandler);
taskRunner = new TaskRunner<>(model, taskRunner = new TaskRunner<>(model,
() -> { () -> {

View file

@ -17,27 +17,17 @@
package io.bitsquare.trade.protocol.availability.messages; package io.bitsquare.trade.protocol.availability.messages;
import io.bitsquare.trade.protocol.trade.OfferMessage; import io.bitsquare.trade.protocol.trade.messages.OfferMessage;
import java.io.Serializable; import java.io.Serializable;
public class ReportOfferAvailabilityMessage implements Serializable, OfferMessage { public class ReportOfferAvailabilityMessage extends OfferMessage implements Serializable {
private static final long serialVersionUID = 6177387534187739018L; private static final long serialVersionUID = 6177387534187739018L;
private final String offerId; public final boolean isOfferOpen;
private final boolean isOfferOpen;
public ReportOfferAvailabilityMessage(String offerId, boolean isOfferOpen) { public ReportOfferAvailabilityMessage(String offerId, boolean isOfferOpen) {
this.offerId = offerId; super.offerId = offerId;
this.isOfferOpen = isOfferOpen; this.isOfferOpen = isOfferOpen;
} }
@Override
public String getOfferId() {
return offerId;
}
public boolean isOfferOpen() {
return isOfferOpen;
}
} }

View file

@ -17,23 +17,16 @@
package io.bitsquare.trade.protocol.availability.messages; package io.bitsquare.trade.protocol.availability.messages;
import io.bitsquare.trade.protocol.trade.OfferMessage; import io.bitsquare.trade.protocol.trade.messages.OfferMessage;
import java.io.Serializable; import java.io.Serializable;
// That msg is used to ping the offerer if he is online and if the offer is still available // That msg is used to ping the offerer if he is online and if the offer is still available
public class RequestIsOfferAvailableMessage implements Serializable, OfferMessage { public class RequestIsOfferAvailableMessage extends OfferMessage implements Serializable {
private static final long serialVersionUID = 4630151440192191798L; private static final long serialVersionUID = 4630151440192191798L;
private final String offerId;
public RequestIsOfferAvailableMessage(String offerId) { public RequestIsOfferAvailableMessage(String offerId) {
this.offerId = offerId; super.offerId = offerId;
}
@Override
public String getOfferId() {
return offerId;
} }

View file

@ -39,7 +39,7 @@ public class GetPeerAddress extends Task<CheckOfferAvailabilityModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
model.getTradeMessageService().getPeerAddress(model.getOffer().getMessagePublicKey(), new GetPeerAddressListener() { model.tradeMessageService.getPeerAddress(model.offer.getMessagePublicKey(), new GetPeerAddressListener() {
@Override @Override
public void onResult(Peer peer) { public void onResult(Peer peer) {
model.setPeer(peer); model.setPeer(peer);
@ -49,13 +49,13 @@ public class GetPeerAddress extends Task<CheckOfferAvailabilityModel> {
@Override @Override
public void onFailed() { public void onFailed() {
model.getOffer().setState(Offer.State.OFFERER_OFFLINE); model.offer.setState(Offer.State.OFFERER_OFFLINE);
failed(); failed();
} }
}); });
} catch (Throwable t) { } catch (Throwable t) {
model.getOffer().setState(Offer.State.FAULT); model.offer.setState(Offer.State.FAULT);
failed(t); failed(t);
} }

View file

@ -39,18 +39,18 @@ public class ProcessReportOfferAvailabilityMessage extends Task<CheckOfferAvaila
protected void doRun() { protected void doRun() {
try { try {
ReportOfferAvailabilityMessage reportOfferAvailabilityMessage = (ReportOfferAvailabilityMessage) model.getMessage(); ReportOfferAvailabilityMessage reportOfferAvailabilityMessage = (ReportOfferAvailabilityMessage) model.getMessage();
checkState(model.getOffer().getId().equals(reportOfferAvailabilityMessage.getOfferId())); checkState(model.offer.getId().equals(reportOfferAvailabilityMessage.offerId));
if (model.getOffer().getState() != Offer.State.REMOVED) { if (model.offer.getState() != Offer.State.REMOVED) {
if (reportOfferAvailabilityMessage.isOfferOpen()) if (reportOfferAvailabilityMessage.isOfferOpen)
model.getOffer().setState(Offer.State.AVAILABLE); model.offer.setState(Offer.State.AVAILABLE);
else else
model.getOffer().setState(Offer.State.RESERVED); model.offer.setState(Offer.State.RESERVED);
} }
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {
model.getOffer().setState(Offer.State.FAULT); model.offer.setState(Offer.State.FAULT);
failed(t); failed(t);
} }

View file

@ -37,7 +37,7 @@ public class RequestIsOfferAvailable extends Task<CheckOfferAvailabilityModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
model.getTradeMessageService().sendMessage(model.getPeer(), new RequestIsOfferAvailableMessage(model.getOffer().getId()), model.tradeMessageService.sendMessage(model.getPeer(), new RequestIsOfferAvailableMessage(model.offer.getId()),
new SendMessageListener() { new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
@ -46,13 +46,13 @@ public class RequestIsOfferAvailable extends Task<CheckOfferAvailabilityModel> {
@Override @Override
public void handleFault() { public void handleFault() {
model.getOffer().setState(Offer.State.OFFERER_OFFLINE); model.offer.setState(Offer.State.OFFERER_OFFLINE);
failed(); failed();
} }
}); });
} catch (Throwable t) { } catch (Throwable t) {
model.getOffer().setState(Offer.State.FAULT); model.offer.setState(Offer.State.FAULT);
failed(t); failed(t);
} }

View file

@ -20,19 +20,20 @@ package io.bitsquare.trade.protocol.placeoffer;
import io.bitsquare.btc.WalletService; import io.bitsquare.btc.WalletService;
import io.bitsquare.offer.Offer; import io.bitsquare.offer.Offer;
import io.bitsquare.offer.OfferBookService; import io.bitsquare.offer.OfferBookService;
import io.bitsquare.common.taskrunner.SharedModel; import io.bitsquare.common.taskrunner.SharedTaskModel;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class PlaceOfferModel extends SharedModel { public class PlaceOfferModel extends SharedTaskModel {
private static final Logger log = LoggerFactory.getLogger(PlaceOfferModel.class); private static final Logger log = LoggerFactory.getLogger(PlaceOfferModel.class);
private final Offer offer; public final Offer offer;
private final WalletService walletService; public final WalletService walletService;
private final OfferBookService offerBookService; public final OfferBookService offerBookService;
private Transaction transaction; private Transaction transaction;
public PlaceOfferModel(Offer offer, public PlaceOfferModel(Offer offer,
@ -43,19 +44,6 @@ public class PlaceOfferModel extends SharedModel {
this.offerBookService = offerBookService; this.offerBookService = offerBookService;
} }
// getter/setter
public Offer getOffer() {
return offer;
}
public WalletService getWalletService() {
return walletService;
}
public OfferBookService getOfferBookService() {
return offerBookService;
}
public void setTransaction(Transaction transaction) { public void setTransaction(Transaction transaction) {
this.transaction = transaction; this.transaction = transaction;
} }
@ -63,5 +51,4 @@ public class PlaceOfferModel extends SharedModel {
public Transaction getTransaction() { public Transaction getTransaction() {
return transaction; return transaction;
} }
} }

View file

@ -34,7 +34,7 @@ public class AddOfferToRemoteOfferBook extends Task<PlaceOfferModel> {
@Override @Override
protected void doRun() { protected void doRun() {
model.getOfferBookService().addOffer(model.getOffer(), model.offerBookService.addOffer(model.offer,
() -> { () -> {
complete(); complete();
}, },

View file

@ -19,9 +19,9 @@ package io.bitsquare.trade.protocol.placeoffer.tasks;
import io.bitsquare.btc.AddressEntry; import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.FeePolicy; import io.bitsquare.btc.FeePolicy;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
@ -49,12 +49,12 @@ public class BroadcastCreateOfferFeeTx extends Task<PlaceOfferModel> {
@Override @Override
protected void doRun() { protected void doRun() {
Coin totalsNeeded = model.getOffer().getSecurityDeposit().add(FeePolicy.CREATE_OFFER_FEE).add(FeePolicy.TX_FEE); Coin totalsNeeded = model.offer.getSecurityDeposit().add(FeePolicy.CREATE_OFFER_FEE).add(FeePolicy.TX_FEE);
AddressEntry addressEntry = model.getWalletService().getAddressEntry(model.getOffer().getId()); AddressEntry addressEntry = model.walletService.getAddressEntry(model.offer.getId());
Coin balance = model.getWalletService().getBalanceForAddress(addressEntry.getAddress()); Coin balance = model.walletService.getBalanceForAddress(addressEntry.getAddress());
if (balance.compareTo(totalsNeeded) >= 0) { if (balance.compareTo(totalsNeeded) >= 0) {
model.getWalletService().getTradeWalletService().broadcastCreateOfferFeeTx(model.getTransaction(), new FutureCallback<Transaction>() { model.walletService.getTradeWalletService().broadcastCreateOfferFeeTx(model.getTransaction(), new FutureCallback<Transaction>() {
@Override @Override
public void onSuccess(Transaction transaction) { public void onSuccess(Transaction transaction) {
log.info("Broadcast of offer fee payment succeeded: transaction = " + transaction.toString()); log.info("Broadcast of offer fee payment succeeded: transaction = " + transaction.toString());
@ -66,12 +66,12 @@ public class BroadcastCreateOfferFeeTx extends Task<PlaceOfferModel> {
else { else {
log.warn("Tx malleability happened after broadcast. We publish the changed offer to the DHT again."); log.warn("Tx malleability happened after broadcast. We publish the changed offer to the DHT again.");
// Tx malleability happened after broadcast. We publish the changed offer to the DHT again. // Tx malleability happened after broadcast. We publish the changed offer to the DHT again.
model.getOfferBookService().removeOffer(model.getOffer(), model.offerBookService.removeOffer(model.offer,
() -> { () -> {
log.info("We store now the changed txID to the offer and add that again."); log.info("We store now the changed txID to the offer and add that again.");
// We store now the changed txID to the offer and add that again. // We store now the changed txID to the offer and add that again.
model.getOffer().setOfferFeePaymentTxID(transaction.getHashAsString()); model.offer.setOfferFeePaymentTxID(transaction.getHashAsString());
model.getOfferBookService().addOffer(model.getOffer(), model.offerBookService.addOffer(model.offer,
() -> { () -> {
complete(); complete();
}, },
@ -103,7 +103,7 @@ public class BroadcastCreateOfferFeeTx extends Task<PlaceOfferModel> {
protected void updateStateOnFault() { protected void updateStateOnFault() {
if (!removeOfferFailed && !addOfferFailed) { if (!removeOfferFailed && !addOfferFailed) {
// If broadcast fails we need to remove offer from offerbook // If broadcast fails we need to remove offer from offerbook
model.getOfferBookService().removeOffer(model.getOffer(), model.offerBookService.removeOffer(model.offer,
() -> { () -> {
log.info("Offer removed from offerbook because broadcast failed."); log.info("Offer removed from offerbook because broadcast failed.");
}, },

View file

@ -17,9 +17,9 @@
package io.bitsquare.trade.protocol.placeoffer.tasks; package io.bitsquare.trade.protocol.placeoffer.tasks;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
@ -36,11 +36,11 @@ public class CreateOfferFeeTx extends Task<PlaceOfferModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
Transaction transaction = model.getWalletService().getTradeWalletService().createOfferFeeTx( Transaction transaction = model.walletService.getTradeWalletService().createOfferFeeTx(
model.getWalletService().getAddressEntry(model.getOffer().getId())); model.walletService.getAddressEntry(model.offer.getId()));
// We assume there will be no tx malleability. We add a check later in case the published offer has a different hash. // We assume there will be no tx malleability. We add a check later in case the published offer has a different hash.
model.getOffer().setOfferFeePaymentTxID(transaction.getHashAsString()); model.offer.setOfferFeePaymentTxID(transaction.getHashAsString());
model.setTransaction(transaction); model.setTransaction(transaction);
complete(); complete();

View file

@ -17,9 +17,9 @@
package io.bitsquare.trade.protocol.placeoffer.tasks; package io.bitsquare.trade.protocol.placeoffer.tasks;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
import io.bitsquare.trade.protocol.placeoffer.PlaceOfferModel;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -34,7 +34,7 @@ public class ValidateOffer extends Task<PlaceOfferModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
model.getOffer().validate(); model.offer.validate();
complete(); complete();
} catch (Exception e) { } catch (Exception e) {

View file

@ -17,58 +17,57 @@
package io.bitsquare.trade.protocol.trade; package io.bitsquare.trade.protocol.trade;
import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.BlockChainService; import io.bitsquare.btc.BlockChainService;
import io.bitsquare.btc.TradeWalletService; import io.bitsquare.btc.TradeWalletService;
import io.bitsquare.btc.WalletService; import io.bitsquare.btc.WalletService;
import io.bitsquare.common.taskrunner.SharedModel; import io.bitsquare.common.taskrunner.SharedTaskModel;
import io.bitsquare.crypto.SignatureService; import io.bitsquare.crypto.SignatureService;
import io.bitsquare.fiat.FiatAccount;
import io.bitsquare.offer.Offer; import io.bitsquare.offer.Offer;
import io.bitsquare.persistence.Persistence; import io.bitsquare.persistence.Persistence;
import io.bitsquare.trade.TradeMessageService; import io.bitsquare.trade.TradeMessageService;
import io.bitsquare.user.User; import io.bitsquare.trade.protocol.trade.messages.TradeMessage;
import org.bitcoinj.crypto.DeterministicKey; import java.io.Serializable;
import java.security.PublicKey;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class OfferSharedModel extends SharedModel { public class SharedTradeModel extends SharedTaskModel implements Serializable {
protected static final Logger log = LoggerFactory.getLogger(OfferSharedModel.class); private static final long serialVersionUID = -2523252022571497157L;
protected static final Logger log = LoggerFactory.getLogger(SharedTradeModel.class);
// provided // provided
private final Offer offer; transient public final Offer offer;
private final TradeMessageService tradeMessageService;
private final WalletService walletService; transient public final TradeMessageService tradeMessageService;
private final BlockChainService blockChainService; transient public final WalletService walletService;
private final SignatureService signatureService; transient public final BlockChainService blockChainService;
private final Persistence persistence; transient public final SignatureService signatureService;
transient protected final Persistence persistence;
// derived // derived
private final String id; transient public final String id;
private final FiatAccount fiatAccount; transient public final TradeWalletService tradeWalletService;
private final String accountId; transient public final byte[] arbitratorPubKey;
private final PublicKey networkPubKey;
private final byte[] registrationPubKey; /* transient public final FiatAccount fiatAccount;
private final DeterministicKey registrationKeyPair; transient public final String accountId;
private final byte[] arbitratorPubKey; transient public final PublicKey messagePubKey;
private final AddressEntry addressEntry; transient public final byte[] registrationPubKey;
private final TradeWalletService tradeWalletService; transient public final DeterministicKey registrationKeyPair;
transient public final AddressEntry addressEntry;*/
// data written/read by tasks // data written/read by tasks
private TradeMessage tradeMessage; transient private TradeMessage tradeMessage;
protected OfferSharedModel(Offer offer, protected SharedTradeModel(Offer offer,
TradeMessageService tradeMessageService, TradeMessageService tradeMessageService,
WalletService walletService, WalletService walletService,
BlockChainService blockChainService, BlockChainService blockChainService,
SignatureService signatureService, SignatureService signatureService,
User user,
Persistence persistence) { Persistence persistence) {
this.offer = offer; this.offer = offer;
this.tradeMessageService = tradeMessageService; this.tradeMessageService = tradeMessageService;
@ -81,78 +80,22 @@ public class OfferSharedModel extends SharedModel {
tradeWalletService = walletService.getTradeWalletService(); tradeWalletService = walletService.getTradeWalletService();
//TODO use default arbitrator for now //TODO use default arbitrator for now
arbitratorPubKey = offer.getArbitrators().get(0).getPubKey(); arbitratorPubKey = offer.getArbitrators().get(0).getPubKey();
registrationPubKey = walletService.getRegistrationAddressEntry().getPubKey();
/* registrationPubKey = walletService.getRegistrationAddressEntry().getPubKey();
registrationKeyPair = walletService.getRegistrationAddressEntry().getKeyPair(); registrationKeyPair = walletService.getRegistrationAddressEntry().getKeyPair();
addressEntry = walletService.getAddressEntry(id); addressEntry = walletService.getAddressEntry(id);
fiatAccount = user.getBankAccount(offer.getBankAccountId()); fiatAccount = user.getBankAccount(offer.getBankAccountId());
accountId = user.getAccountId(); accountId = user.getAccountId();
networkPubKey = user.getNetworkPubKey(); messagePubKey = user.getNetworkPubKey();*/
} }
//setter
public void setTradeMessage(TradeMessage tradeMessage) { public void setTradeMessage(TradeMessage tradeMessage) {
this.tradeMessage = tradeMessage; this.tradeMessage = tradeMessage;
} }
// getter
public String getId() {
return id;
}
public TradeWalletService getTradeWalletService() {
return tradeWalletService;
}
public TradeMessage getTradeMessage() { public TradeMessage getTradeMessage() {
return tradeMessage; return tradeMessage;
} }
public Offer getOffer() {
return offer;
}
public TradeMessageService getTradeMessageService() {
return tradeMessageService;
}
public WalletService getWalletService() {
return walletService;
}
public BlockChainService getBlockChainService() {
return blockChainService;
}
public SignatureService getSignatureService() {
return signatureService;
}
public FiatAccount getFiatAccount() {
return fiatAccount;
}
public String getAccountId() {
return accountId;
}
public PublicKey getNetworkPubKey() {
return networkPubKey;
}
public byte[] getRegistrationPubKey() {
return registrationPubKey;
}
public DeterministicKey getRegistrationKeyPair() {
return registrationKeyPair;
}
public byte[] getArbitratorPubKey() {
return arbitratorPubKey;
}
public AddressEntry getAddressEntry() {
return addressEntry;
}
} }

View file

@ -15,24 +15,21 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.bitsquare.trade.protocol.trade.offerer.messages; package io.bitsquare.trade.protocol.trade.messages;
import io.bitsquare.trade.protocol.trade.TradeMessage;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import java.io.Serializable; import java.io.Serializable;
public class BankTransferStartedMessage implements Serializable, TradeMessage { public class BankTransferStartedMessage extends TradeMessage implements Serializable {
private static final long serialVersionUID = -3479634129543632523L; private static final long serialVersionUID = -3479634129543632523L;
private final String tradeId; public final Transaction depositTx;
private final Transaction depositTx; public final byte[] offererSignature;
private final byte[] offererSignature; public final Coin offererPayoutAmount;
private final Coin offererPayoutAmount; public final Coin takerPayoutAmount;
private final Coin takerPayoutAmount; public final String offererPayoutAddress;
private final String offererPayoutAddress;
public BankTransferStartedMessage(String tradeId, public BankTransferStartedMessage(String tradeId,
Transaction depositTx, Transaction depositTx,
@ -47,29 +44,4 @@ public class BankTransferStartedMessage implements Serializable, TradeMessage {
this.takerPayoutAmount = takerPayoutAmount; this.takerPayoutAmount = takerPayoutAmount;
this.offererPayoutAddress = offererPayoutAddress; this.offererPayoutAddress = offererPayoutAddress;
} }
@Override
public String getTradeId() {
return tradeId;
}
public Transaction getDepositTx() {
return depositTx;
}
public String getOffererPayoutAddress() {
return offererPayoutAddress;
}
public Coin getOffererPayoutAmount() {
return offererPayoutAmount;
}
public Coin getTakerPayoutAmount() {
return takerPayoutAmount;
}
public byte[] getOffererSignature() {
return offererSignature;
}
} }

View file

@ -15,31 +15,19 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.bitsquare.trade.protocol.trade.offerer.messages; package io.bitsquare.trade.protocol.trade.messages;
import io.bitsquare.trade.protocol.trade.TradeMessage;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import java.io.Serializable; import java.io.Serializable;
public class DepositTxPublishedMessage implements Serializable, TradeMessage { public class DepositTxPublishedMessage extends TradeMessage implements Serializable {
private static final long serialVersionUID = -1532231540167406581L; private static final long serialVersionUID = -1532231540167406581L;
private final String tradeId; public final Transaction depositTx;
private final Transaction depositTx;
public DepositTxPublishedMessage(String tradeId, Transaction depositTx) { public DepositTxPublishedMessage(String tradeId, Transaction depositTx) {
this.tradeId = tradeId; this.tradeId = tradeId;
this.depositTx = depositTx; this.depositTx = depositTx;
} }
@Override
public String getTradeId() {
return tradeId;
}
public Transaction getDepositTx() {
return depositTx;
}
} }

View file

@ -15,10 +15,14 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.bitsquare.trade.protocol.trade; package io.bitsquare.trade.protocol.trade.messages;
import io.bitsquare.network.Message; import io.bitsquare.network.Message;
public interface OfferMessage extends Message { import java.io.Serializable;
public String getOfferId();
public class OfferMessage implements Message, Serializable {
private static final long serialVersionUID = -89035992124170905L;
public String offerId;
} }

View file

@ -15,31 +15,20 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.bitsquare.trade.protocol.trade.taker.messages; package io.bitsquare.trade.protocol.trade.messages;
import io.bitsquare.trade.protocol.trade.TradeMessage;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import java.io.Serializable; import java.io.Serializable;
public class PayoutTxPublishedMessage implements Serializable, TradeMessage { public class PayoutTxPublishedMessage extends TradeMessage implements Serializable {
private static final long serialVersionUID = 1288653559218403873L; private static final long serialVersionUID = 1288653559218403873L;
private final String tradeId; public final Transaction payoutTx;
private final Transaction payoutTx;
public PayoutTxPublishedMessage(String tradeId, Transaction payoutTx) { public PayoutTxPublishedMessage(String tradeId, Transaction payoutTx) {
this.tradeId = tradeId; this.tradeId = tradeId;
this.payoutTx = payoutTx; this.payoutTx = payoutTx;
} }
@Override
public String getTradeId() {
return tradeId;
}
public Transaction getPayoutTx() {
return payoutTx;
}
} }

View file

@ -15,10 +15,9 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.bitsquare.trade.protocol.trade.offerer.messages; package io.bitsquare.trade.protocol.trade.messages;
import io.bitsquare.fiat.FiatAccount; import io.bitsquare.fiat.FiatAccount;
import io.bitsquare.trade.protocol.trade.TradeMessage;
import org.bitcoinj.core.TransactionOutput; import org.bitcoinj.core.TransactionOutput;
@ -26,52 +25,26 @@ import java.io.Serializable;
import java.util.List; import java.util.List;
public class RequestDepositPaymentMessage implements Serializable, TradeMessage { public class RequestDepositPaymentMessage extends TradeMessage implements Serializable {
private static final long serialVersionUID = -3988720410493712913L; private static final long serialVersionUID = -3988720410493712913L;
private final String tradeId; public final List<TransactionOutput> offererConnectedOutputsForAllInputs;
private final List<TransactionOutput> offererConnectedOutputsForAllInputs; public final List<TransactionOutput> offererOutputs;
private final List<TransactionOutput> offererOutputs; public final byte[] offererPubKey;
private final byte[] offererPubKey; public final FiatAccount offererFiatAccount;
private final FiatAccount fiatAccount; public final String offererAccountId;
private final String accountID;
public RequestDepositPaymentMessage(String tradeId, public RequestDepositPaymentMessage(String tradeId,
List<TransactionOutput> offererConnectedOutputsForAllInputs, List<TransactionOutput> offererConnectedOutputsForAllInputs,
List<TransactionOutput> offererOutputs, List<TransactionOutput> offererOutputs,
byte[] offererPubKey, byte[] offererPubKey,
FiatAccount fiatAccount, FiatAccount offererFiatAccount,
String accountID) { String offererAccountId) {
this.tradeId = tradeId; this.tradeId = tradeId;
this.offererConnectedOutputsForAllInputs = offererConnectedOutputsForAllInputs; this.offererConnectedOutputsForAllInputs = offererConnectedOutputsForAllInputs;
this.offererOutputs = offererOutputs; this.offererOutputs = offererOutputs;
this.offererPubKey = offererPubKey; this.offererPubKey = offererPubKey;
this.fiatAccount = fiatAccount; this.offererFiatAccount = offererFiatAccount;
this.accountID = accountID; this.offererAccountId = offererAccountId;
}
@Override
public String getTradeId() {
return tradeId;
}
public List<TransactionOutput> getOffererConnectedOutputsForAllInputs() {
return offererConnectedOutputsForAllInputs;
}
public List<TransactionOutput> getOffererOutputs() {
return offererOutputs;
}
public byte[] getOffererPubKey() {
return offererPubKey;
}
public FiatAccount getFiatAccount() {
return fiatAccount;
}
public String getAccountId() {
return accountID;
} }
} }

View file

@ -15,21 +15,18 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.bitsquare.trade.protocol.trade.taker.messages; package io.bitsquare.trade.protocol.trade.messages;
import io.bitsquare.trade.protocol.trade.TradeMessage;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import java.io.Serializable; import java.io.Serializable;
public class RequestDepositTxInputsMessage implements Serializable, TradeMessage { public class RequestDepositTxInputsMessage extends TradeMessage implements Serializable {
private static final long serialVersionUID = -5057935061275354312L; private static final long serialVersionUID = -5057935061275354312L;
private final String tradeId; public final Coin tradeAmount;
private final Coin tradeAmount; public final String takeOfferFeeTxId;
private final String takeOfferFeeTxId; public final byte[] takerPubKey;
private final byte[] takerPubKey;
public RequestDepositTxInputsMessage(String tradeId, String takeOfferFeeTxId, Coin tradeAmount, byte[] takerPubKey) { public RequestDepositTxInputsMessage(String tradeId, String takeOfferFeeTxId, Coin tradeAmount, byte[] takerPubKey) {
this.tradeId = tradeId; this.tradeId = tradeId;
@ -37,22 +34,4 @@ public class RequestDepositTxInputsMessage implements Serializable, TradeMessage
this.tradeAmount = tradeAmount; this.tradeAmount = tradeAmount;
this.takerPubKey = takerPubKey; this.takerPubKey = takerPubKey;
} }
@Override
public String getTradeId() {
return tradeId;
}
public Coin getTradeAmount() {
return tradeAmount;
}
public String getTakeOfferFeeTxId() {
return takeOfferFeeTxId;
}
public byte[] getTakerPubKey() {
return takerPubKey;
}
} }

View file

@ -0,0 +1,65 @@
/*
* This file is part of Bitsquare.
*
* Bitsquare is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bitsquare is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bitsquare.trade.protocol.trade.messages;
import io.bitsquare.fiat.FiatAccount;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionOutput;
import java.io.Serializable;
import java.security.PublicKey;
import java.util.List;
public class RequestOffererPublishDepositTxMessage extends TradeMessage implements Serializable {
private static final long serialVersionUID = 2179683654379803071L;
public final FiatAccount takerFiatAccount;
public final String takerAccountId;
public final PublicKey takerMessagePublicKey;
public final String takerContractAsJson;
public final String takerContractSignature;
public final String takerPayoutAddress;
public final Transaction takersDepositTx;
public final List<TransactionOutput> takerConnectedOutputsForAllInputs;
public final List<TransactionOutput> takerOutputs;
public RequestOffererPublishDepositTxMessage(String tradeId,
FiatAccount takerFiatAccount,
String takerAccountId,
PublicKey takerMessagePublicKey,
String takerContractAsJson,
String takerContractSignature,
String takerPayoutAddress,
Transaction takersDepositTx,
List<TransactionOutput> takerConnectedOutputsForAllInputs,
List<TransactionOutput> takerOutputs) {
this.tradeId = tradeId;
this.takerFiatAccount = takerFiatAccount;
this.takerAccountId = takerAccountId;
this.takerMessagePublicKey = takerMessagePublicKey;
this.takerContractAsJson = takerContractAsJson;
this.takerContractSignature = takerContractSignature;
this.takerPayoutAddress = takerPayoutAddress;
this.takersDepositTx = takersDepositTx;
this.takerConnectedOutputsForAllInputs = takerConnectedOutputsForAllInputs;
this.takerOutputs = takerOutputs;
}
}

View file

@ -15,10 +15,14 @@
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>. * along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/ */
package io.bitsquare.trade.protocol.trade; package io.bitsquare.trade.protocol.trade.messages;
import io.bitsquare.network.Message; import io.bitsquare.network.Message;
public interface TradeMessage extends Message { import java.io.Serializable;
public String getTradeId();
public class TradeMessage implements Message, Serializable {
private static final long serialVersionUID = 7572470983485004081L;
public String tradeId;
} }

View file

@ -21,7 +21,7 @@ import io.bitsquare.network.Message;
import io.bitsquare.network.Peer; import io.bitsquare.network.Peer;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
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.messages.TradeMessage;
import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.offerer.tasks.GetOffererDepositTxInputs; import io.bitsquare.trade.protocol.trade.offerer.tasks.GetOffererDepositTxInputs;
import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessPayoutTxPublishedMessage; import io.bitsquare.trade.protocol.trade.offerer.tasks.ProcessPayoutTxPublishedMessage;
@ -36,19 +36,17 @@ import io.bitsquare.trade.protocol.trade.offerer.tasks.SignPayoutTx;
import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyAndSignContract; import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyAndSignContract;
import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakeOfferFeePayment; import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakeOfferFeePayment;
import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakerAccount; import io.bitsquare.trade.protocol.trade.offerer.tasks.VerifyTakerAccount;
import io.bitsquare.trade.protocol.trade.taker.messages.PayoutTxPublishedMessage; import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage;
import io.bitsquare.trade.protocol.trade.taker.messages.RequestDepositTxInputsMessage; import io.bitsquare.trade.protocol.trade.messages.RequestDepositTxInputsMessage;
import io.bitsquare.trade.protocol.trade.taker.messages.RequestOffererPublishDepositTxMessage; import io.bitsquare.trade.protocol.trade.messages.RequestOffererPublishDepositTxMessage;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionConfidence; import org.bitcoinj.core.TransactionConfidence;
import javafx.application.Platform;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import static io.bitsquare.util.Validator.nonEmptyStringOf; import static io.bitsquare.util.Validator.*;
public class BuyerAsOffererProtocol { public class BuyerAsOffererProtocol {
private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererProtocol.class); private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererProtocol.class);
@ -56,15 +54,19 @@ public class BuyerAsOffererProtocol {
private final BuyerAsOffererModel model; private final BuyerAsOffererModel model;
private final MessageHandler messageHandler; private final MessageHandler messageHandler;
private TransactionConfidence.Listener transactionConfidenceListener;
private TransactionConfidence transactionConfidence;
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Constructor // Constructor
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public BuyerAsOffererProtocol(BuyerAsOffererModel model) { public BuyerAsOffererProtocol(BuyerAsOffererModel model) {
log.debug("New BuyerAsOffererProtocol " + this);
this.model = model; this.model = model;
messageHandler = this::handleMessage; messageHandler = this::handleMessage;
model.getTradeMessageService().addMessageHandler(messageHandler); model.tradeMessageService.addMessageHandler(messageHandler);
} }
@ -73,15 +75,20 @@ public class BuyerAsOffererProtocol {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public void cleanup() { public void cleanup() {
model.getTradeMessageService().removeMessageHandler(messageHandler); log.debug("cleanup " + this);
model.tradeMessageService.removeMessageHandler(messageHandler);
if (transactionConfidence != null) {
if (!transactionConfidence.removeEventListener(transactionConfidenceListener))
throw new RuntimeException("Remove transactionConfidenceListener failed.");
}
} }
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// Incoming message handling // Incoming message handling
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
private void handleRequestDepositTxInputsMessage(RequestDepositTxInputsMessage tradeMessage, Peer taker) { private void handleRequestDepositTxInputsMessage(RequestDepositTxInputsMessage tradeMessage, Peer taker) {
checkTradeId(model.id, tradeMessage);
model.setTradeMessage(tradeMessage); model.setTradeMessage(tradeMessage);
model.taker.peer = taker; model.taker.peer = taker;
@ -107,20 +114,18 @@ public class BuyerAsOffererProtocol {
BuyerAsOffererTaskRunner<BuyerAsOffererModel> taskRunner = new BuyerAsOffererTaskRunner<>(model, BuyerAsOffererTaskRunner<BuyerAsOffererModel> taskRunner = new BuyerAsOffererTaskRunner<>(model,
() -> { () -> {
log.debug("taskRunner at handleRequestOffererPublishDepositTxMessage completed"); log.debug("taskRunner at handleRequestOffererPublishDepositTxMessage completed");
TransactionConfidence confidence = model.getTrade().getDepositTx().getConfidence(); transactionConfidenceListener = new TransactionConfidence.Listener() {
confidence.addEventListener(new TransactionConfidence.Listener() {
@Override @Override
public void onConfidenceChanged(Transaction tx, ChangeReason reason) { public void onConfidenceChanged(Transaction tx, ChangeReason reason) {
log.trace("onConfidenceChanged " + tx.getConfidence()); log.trace("onConfidenceChanged " + tx.getConfidence());
if (reason == ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING) { if (reason == ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING) {
model.getTrade().setState(Trade.State.DEPOSIT_CONFIRMED); model.trade.setState(Trade.State.DEPOSIT_CONFIRMED);
//TODO not sure if that works
Platform.runLater(() -> confidence.removeEventListener(this));
} }
} }
}); };
transactionConfidence = model.trade.getDepositTx().getConfidence();
transactionConfidence.addEventListener(transactionConfidenceListener);
}, },
(errorMessage) -> { (errorMessage) -> {
log.error(errorMessage); log.error(errorMessage);
@ -189,9 +194,9 @@ public class BuyerAsOffererProtocol {
log.trace("handleNewMessage: message = " + message.getClass().getSimpleName()); log.trace("handleNewMessage: message = " + message.getClass().getSimpleName());
if (message instanceof TradeMessage) { if (message instanceof TradeMessage) {
TradeMessage tradeMessage = (TradeMessage) message; TradeMessage tradeMessage = (TradeMessage) message;
nonEmptyStringOf(tradeMessage.getTradeId()); nonEmptyStringOf(tradeMessage.tradeId);
if (tradeMessage.getTradeId().equals(model.getOffer().getId())) { if (tradeMessage.tradeId.equals(model.id)) {
if (tradeMessage instanceof RequestDepositTxInputsMessage) { if (tradeMessage instanceof RequestDepositTxInputsMessage) {
handleRequestDepositTxInputsMessage((RequestDepositTxInputsMessage) tradeMessage, peer); handleRequestDepositTxInputsMessage((RequestDepositTxInputsMessage) tradeMessage, peer);
} }

View file

@ -34,7 +34,7 @@ class BuyerAsOffererTaskRunner<T extends BuyerAsOffererModel> extends TaskRunner
/* @Override /* @Override
public void handleFault(String message, @NotNull Throwable throwable) { public void handleFault(String message, @NotNull Throwable throwable) {
sharedModel.getTrade().setState(Trade.State.FAILED); sharedModel.trade.setState(Trade.State.FAILED);
super.handleFault(message, throwable); super.handleFault(message, throwable);
}*/ }*/
} }

View file

@ -23,7 +23,7 @@ import io.bitsquare.crypto.SignatureService;
import io.bitsquare.persistence.Persistence; import io.bitsquare.persistence.Persistence;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
import io.bitsquare.trade.TradeMessageService; import io.bitsquare.trade.TradeMessageService;
import io.bitsquare.trade.protocol.trade.OfferSharedModel; import io.bitsquare.trade.protocol.trade.SharedTradeModel;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
@ -33,11 +33,11 @@ import java.io.Serializable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class BuyerAsOffererModel extends OfferSharedModel implements Serializable { public class BuyerAsOffererModel extends SharedTradeModel implements Serializable {
private static final long serialVersionUID = 5000457153390911569L; private static final long serialVersionUID = 5000457153390911569L;
private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererModel.class); private static final Logger log = LoggerFactory.getLogger(BuyerAsOffererModel.class);
private final Trade trade; transient public final Trade trade;
public final TakerModel taker; public final TakerModel taker;
public final OffererModel offerer; public final OffererModel offerer;
@ -56,19 +56,39 @@ public class BuyerAsOffererModel extends OfferSharedModel implements Serializabl
walletService, walletService,
blockChainService, blockChainService,
signatureService, signatureService,
user,
persistence); persistence);
this.trade = trade; this.trade = trade;
Object modelObject = persistence.read(this, "BuyerAsOffererModel_" + id);
if (modelObject instanceof BuyerAsOffererModel) {
BuyerAsOffererModel persistedModel = (BuyerAsOffererModel) modelObject;
log.debug("Model reconstructed form persisted model.");
setPublishedDepositTx(persistedModel.getPublishedDepositTx());
setTakeOfferFeeTxId(persistedModel.takeOfferFeeTxId);
taker = persistedModel.taker;
offerer = persistedModel.offerer;
}
else {
taker = new TakerModel(); taker = new TakerModel();
offerer = new OffererModel(); offerer = new OffererModel();
offerer.pubKey = getAddressEntry().getPubKey();
} }
public Trade getTrade() { offerer.registrationPubKey = walletService.getRegistrationAddressEntry().getPubKey();
return trade; offerer.registrationKeyPair = walletService.getRegistrationAddressEntry().getKeyPair();
offerer.addressEntry = walletService.getAddressEntry(id);
offerer.fiatAccount = user.getBankAccount(offer.getBankAccountId());
offerer.accountId = user.getAccountId();
offerer.messagePubKey = user.getMessagePubKey();
offerer.pubKey = offerer.addressEntry.getPubKey();
}
// Get called form taskRunner after each completed task
@Override
public void persist() {
persistence.write(this, "BuyerAsOffererModel_" + id, this);
} }
public Transaction getPublishedDepositTx() { public Transaction getPublishedDepositTx() {

View file

@ -17,25 +17,39 @@
package io.bitsquare.trade.protocol.trade.offerer.models; package io.bitsquare.trade.protocol.trade.offerer.models;
import io.bitsquare.btc.AddressEntry;
import io.bitsquare.fiat.FiatAccount;
import io.bitsquare.network.Peer; import io.bitsquare.network.Peer;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionOutput; import org.bitcoinj.core.TransactionOutput;
import org.bitcoinj.crypto.DeterministicKey;
import java.io.Serializable; import java.io.Serializable;
import java.security.PublicKey;
import java.util.List; import java.util.List;
public class OffererModel implements Serializable { public class OffererModel implements Serializable {
private static final long serialVersionUID = -1845177552607819927L; private static final long serialVersionUID = -1845177552607819927L;
public byte[] pubKey; // Those fields are set at constructor but not declared as final because constructor is not called in case model gets created from a persisted model
public ECKey.ECDSASignature payoutSignature; // Declared transient as they will be provided in any case at construction time
transient public FiatAccount fiatAccount;
transient public String accountId;
transient public PublicKey messagePubKey;
transient public byte[] registrationPubKey;
transient public DeterministicKey registrationKeyPair;
transient public AddressEntry addressEntry;
transient public byte[] pubKey;
// written by tasks
public byte[] payoutSignature;
public Coin payoutAmount; public Coin payoutAmount;
public List<TransactionOutput> connectedOutputsForAllInputs; public List<TransactionOutput> connectedOutputsForAllInputs;
public List<TransactionOutput> outputs; public List<TransactionOutput> outputs;
public Transaction payoutTx;
public Peer peer; public Peer peer;
public Transaction preparedPayoutTx;
} }

View file

@ -17,7 +17,6 @@
package io.bitsquare.trade.protocol.trade.offerer.tasks; package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.btc.AddressEntry;
import io.bitsquare.btc.FeePolicy; import io.bitsquare.btc.FeePolicy;
import io.bitsquare.btc.TradeWalletService; import io.bitsquare.btc.TradeWalletService;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
@ -39,9 +38,9 @@ public class GetOffererDepositTxInputs extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
Coin offererInputAmount = model.getTrade().getSecurityDeposit().add(FeePolicy.TX_FEE); Coin offererInputAmount = model.trade.getSecurityDeposit().add(FeePolicy.TX_FEE);
AddressEntry addressInfo = model.getAddressEntry(); TradeWalletService.TransactionDataResult result = model.tradeWalletService.offererCreatesDepositTxInputs(offererInputAmount,
TradeWalletService.TransactionDataResult result = model.getTradeWalletService().offererCreatesDepositTxInputs(offererInputAmount, addressInfo); model.offerer.addressEntry);
model.offerer.connectedOutputsForAllInputs = result.getConnectedOutputsForAllInputs(); model.offerer.connectedOutputsForAllInputs = result.getConnectedOutputsForAllInputs();
model.offerer.outputs = result.getOutputs(); model.offerer.outputs = result.getOutputs();

View file

@ -19,7 +19,7 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.taker.messages.PayoutTxPublishedMessage; import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
@ -39,11 +39,11 @@ public class ProcessPayoutTxPublishedMessage extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
checkTradeId(model.getId(), model.getTradeMessage()); checkTradeId(model.id, model.getTradeMessage());
model.getTrade().setPayoutTx(checkNotNull(((PayoutTxPublishedMessage) model.getTradeMessage()).getPayoutTx())); model.trade.setPayoutTx(checkNotNull(((PayoutTxPublishedMessage) model.getTradeMessage()).payoutTx));
model.getTrade().setState(Trade.State.PAYOUT_PUBLISHED); model.trade.setState(Trade.State.PAYOUT_PUBLISHED);
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {

View file

@ -21,7 +21,7 @@ import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.taker.messages.RequestDepositTxInputsMessage; import io.bitsquare.trade.protocol.trade.messages.RequestDepositTxInputsMessage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -39,12 +39,13 @@ public class ProcessRequestDepositTxInputsMessage extends Task<BuyerAsOffererMod
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
checkTradeId(model.getId(), model.getTradeMessage()); checkTradeId(model.id, model.getTradeMessage());
Trade trade = model.getTrade(); Trade trade = model.trade;
RequestDepositTxInputsMessage requestDepositTxInputsMessage = (RequestDepositTxInputsMessage) model.getTradeMessage(); RequestDepositTxInputsMessage requestDepositTxInputsMessage = (RequestDepositTxInputsMessage) model.getTradeMessage();
trade.setTradeAmount(positiveCoinOf(nonZeroCoinOf(requestDepositTxInputsMessage.getTradeAmount())));
model.setTakeOfferFeeTxId(nonEmptyStringOf(requestDepositTxInputsMessage.getTakeOfferFeeTxId())); trade.setTradeAmount(positiveCoinOf(nonZeroCoinOf(requestDepositTxInputsMessage.tradeAmount)));
model.taker.pubKey = checkNotNull(requestDepositTxInputsMessage.getTakerPubKey()); model.setTakeOfferFeeTxId(nonEmptyStringOf(requestDepositTxInputsMessage.takeOfferFeeTxId));
model.taker.pubKey = checkNotNull(requestDepositTxInputsMessage.takerPubKey);
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {

View file

@ -20,7 +20,7 @@ package io.bitsquare.trade.protocol.trade.offerer.tasks;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel; import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.taker.messages.RequestOffererPublishDepositTxMessage; import io.bitsquare.trade.protocol.trade.messages.RequestOffererPublishDepositTxMessage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -38,18 +38,18 @@ public class ProcessRequestOffererPublishDepositTxMessage extends Task<BuyerAsOf
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
checkTradeId(model.getId(), model.getTradeMessage()); checkTradeId(model.id, model.getTradeMessage());
RequestOffererPublishDepositTxMessage message = (RequestOffererPublishDepositTxMessage) model.getTradeMessage(); RequestOffererPublishDepositTxMessage message = (RequestOffererPublishDepositTxMessage) model.getTradeMessage();
model.taker.fiatAccount = checkNotNull(message.getTakerBankAccount()); model.taker.fiatAccount = checkNotNull(message.takerFiatAccount);
model.taker.accountId = nonEmptyStringOf(message.getTakerAccountId()); model.taker.accountId = nonEmptyStringOf(message.takerAccountId);
model.taker.messagePublicKey = checkNotNull(message.getTakerMessagePublicKey()); model.taker.messagePublicKey = checkNotNull(message.takerMessagePublicKey);
model.taker.contractAsJson = nonEmptyStringOf(message.getTakerContractAsJson()); model.taker.contractAsJson = nonEmptyStringOf(message.takerContractAsJson);
model.taker.payoutAddress = nonEmptyStringOf(message.getTakerPayoutAddress()); model.taker.payoutAddress = nonEmptyStringOf(message.takerPayoutAddress);
model.taker.depositTx = checkNotNull(message.getTakersDepositTx()); model.taker.depositTx = checkNotNull(message.takersDepositTx);
model.taker.connectedOutputsForAllInputs = checkNotNull(message.getTakerConnectedOutputsForAllInputs()); model.taker.connectedOutputsForAllInputs = checkNotNull(message.takerConnectedOutputsForAllInputs);
checkArgument(message.getTakerConnectedOutputsForAllInputs().size() > 0); checkArgument(message.takerConnectedOutputsForAllInputs.size() > 0);
model.taker.outputs = checkNotNull(message.getTakerOutputs()); model.taker.outputs = checkNotNull(message.takerOutputs);
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {

View file

@ -19,7 +19,7 @@ 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.models.BuyerAsOffererModel; import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.offerer.messages.RequestDepositPaymentMessage; import io.bitsquare.trade.protocol.trade.messages.RequestDepositPaymentMessage;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
@ -36,14 +36,14 @@ public class RequestDepositPayment extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
RequestDepositPaymentMessage tradeMessage = new RequestDepositPaymentMessage( RequestDepositPaymentMessage tradeMessage = new RequestDepositPaymentMessage(
model.getId(), model.id,
model.offerer.connectedOutputsForAllInputs, model.offerer.connectedOutputsForAllInputs,
model.offerer.outputs, model.offerer.outputs,
model.offerer.pubKey, model.offerer.pubKey,
model.getFiatAccount(), model.offerer.fiatAccount,
model.getAccountId()); model.offerer.accountId);
model.getTradeMessageService().sendMessage(model.taker.peer, tradeMessage, new SendMessageListener() { model.tradeMessageService.sendMessage(model.taker.peer, tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("RequestTakerDepositPaymentMessage successfully arrived at peer"); log.trace("RequestTakerDepositPaymentMessage successfully arrived at peer");

View file

@ -19,7 +19,7 @@ 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.models.BuyerAsOffererModel; import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage; import io.bitsquare.trade.protocol.trade.messages.BankTransferStartedMessage;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
@ -36,13 +36,13 @@ public class SendBankTransferStartedMessage extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
BankTransferStartedMessage tradeMessage = new BankTransferStartedMessage( BankTransferStartedMessage tradeMessage = new BankTransferStartedMessage(
model.getId(), model.id,
model.getPublishedDepositTx(), model.getPublishedDepositTx(),
model.offerer.payoutSignature.encodeToDER(), model.offerer.payoutSignature,
model.offerer.payoutAmount, model.offerer.payoutAmount,
model.taker.payoutAmount, model.taker.payoutAmount,
model.getAddressEntry().getAddressString()); model.offerer.addressEntry.getAddressString());
model.getTradeMessageService().sendMessage(model.taker.peer, tradeMessage, new SendMessageListener() { model.tradeMessageService.sendMessage(model.taker.peer, tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("Sending BankTransferInitedMessage succeeded."); log.trace("Sending BankTransferInitedMessage succeeded.");

View file

@ -19,7 +19,7 @@ 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.models.BuyerAsOffererModel; import io.bitsquare.trade.protocol.trade.offerer.models.BuyerAsOffererModel;
import io.bitsquare.trade.protocol.trade.offerer.messages.DepositTxPublishedMessage; import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
@ -35,9 +35,9 @@ public class SendDepositTxIdToTaker extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
DepositTxPublishedMessage tradeMessage = new DepositTxPublishedMessage(model.getId(), model.getTrade().getDepositTx()); DepositTxPublishedMessage tradeMessage = new DepositTxPublishedMessage(model.id, model.trade.getDepositTx());
model.getTradeMessageService().sendMessage(model.taker.peer, tradeMessage, new SendMessageListener() { model.tradeMessageService.sendMessage(model.taker.peer, tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("DepositTxPublishedMessage successfully arrived at peer"); log.trace("DepositTxPublishedMessage successfully arrived at peer");

View file

@ -37,14 +37,14 @@ public class SetupListenerForBlockChainConfirmation extends Task<BuyerAsOffererM
@Override @Override
protected void doRun() { protected void doRun() {
TransactionConfidence confidence = model.getTrade().getDepositTx().getConfidence(); TransactionConfidence confidence = model.trade.getDepositTx().getConfidence();
confidence.addEventListener(new TransactionConfidence.Listener() { confidence.addEventListener(new TransactionConfidence.Listener() {
@Override @Override
public void onConfidenceChanged(Transaction tx, ChangeReason reason) { public void onConfidenceChanged(Transaction tx, ChangeReason reason) {
log.trace("onConfidenceChanged " + tx.getConfidence()); log.trace("onConfidenceChanged " + tx.getConfidence());
if (reason == ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING) { if (reason == ChangeReason.TYPE && tx.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING) {
model.getTrade().setState(Trade.State.DEPOSIT_CONFIRMED); model.trade.setState(Trade.State.DEPOSIT_CONFIRMED);
boolean removed = confidence.removeEventListener(this); boolean removed = confidence.removeEventListener(this);
log.debug("listener removed? " + removed); log.debug("listener removed? " + removed);

View file

@ -43,8 +43,8 @@ public class SignAndPublishDepositTx extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
Coin offererInputAmount = model.getTrade().getSecurityDeposit().add(FeePolicy.TX_FEE); Coin offererInputAmount = model.trade.getSecurityDeposit().add(FeePolicy.TX_FEE);
model.getTradeWalletService().offererSignsAndPublishTx( model.tradeWalletService.offererSignsAndPublishTx(
model.taker.depositTx, model.taker.depositTx,
model.offerer.connectedOutputsForAllInputs, model.offerer.connectedOutputsForAllInputs,
model.taker.connectedOutputsForAllInputs, model.taker.connectedOutputsForAllInputs,
@ -52,15 +52,15 @@ public class SignAndPublishDepositTx extends Task<BuyerAsOffererModel> {
offererInputAmount, offererInputAmount,
model.offerer.pubKey, model.offerer.pubKey,
model.taker.pubKey, model.taker.pubKey,
model.getArbitratorPubKey(), model.arbitratorPubKey,
new FutureCallback<Transaction>() { new FutureCallback<Transaction>() {
@Override @Override
public void onSuccess(Transaction transaction) { public void onSuccess(Transaction transaction) {
log.trace("offererSignAndPublishTx succeeded " + transaction); log.trace("offererSignAndPublishTx succeeded " + transaction);
model.setPublishedDepositTx(transaction); model.setPublishedDepositTx(transaction);
model.getTrade().setDepositTx(transaction); model.trade.setDepositTx(transaction);
model.getTrade().setState(Trade.State.DEPOSIT_PUBLISHED); model.trade.setState(Trade.State.DEPOSIT_PUBLISHED);
complete(); complete();
} }

View file

@ -38,22 +38,22 @@ public class SignPayoutTx extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
Trade trade = model.getTrade(); Trade trade = model.trade;
Coin securityDeposit = trade.getSecurityDeposit(); Coin securityDeposit = trade.getSecurityDeposit();
Coin offererPayoutAmount = trade.getTradeAmount().add(securityDeposit); Coin offererPayoutAmount = trade.getTradeAmount().add(securityDeposit);
@SuppressWarnings("UnnecessaryLocalVariable") Coin takerPayoutAmount = securityDeposit; @SuppressWarnings("UnnecessaryLocalVariable") Coin takerPayoutAmount = securityDeposit;
TradeWalletService.TransactionDataResult result = model.getTradeWalletService().offererCreatesAndSignsPayoutTx( TradeWalletService.TransactionDataResult result = model.tradeWalletService.offererCreatesAndSignsPayoutTx(
trade.getDepositTx(), trade.getDepositTx(),
offererPayoutAmount, offererPayoutAmount,
takerPayoutAmount, takerPayoutAmount,
model.taker.payoutAddress, model.taker.payoutAddress,
model.getWalletService().getAddressEntry(trade.getId()), model.walletService.getAddressEntry(trade.getId()),
model.offerer.pubKey, model.offerer.pubKey,
model.taker.pubKey, model.taker.pubKey,
model.getArbitratorPubKey()); model.arbitratorPubKey);
model.offerer.payoutTx = result.getPayoutTx(); model.offerer.preparedPayoutTx = result.getPayoutTx();
model.offerer.payoutSignature = result.getOffererSignature(); model.offerer.payoutSignature = result.getOffererSignature();
model.offerer.payoutAmount = offererPayoutAmount; model.offerer.payoutAmount = offererPayoutAmount;
model.taker.payoutAmount = takerPayoutAmount; model.taker.payoutAmount = takerPayoutAmount;

View file

@ -36,20 +36,20 @@ public class VerifyAndSignContract extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
Trade trade = model.getTrade(); Trade trade = model.trade;
Contract contract = new Contract( Contract contract = new Contract(
model.getOffer(), model.offer,
trade.getTradeAmount(), trade.getTradeAmount(),
model.getTakeOfferFeeTxId(), model.getTakeOfferFeeTxId(),
model.getAccountId(), model.offerer.accountId,
model.taker.accountId, model.taker.accountId,
model.getFiatAccount(), model.offerer.fiatAccount,
model.taker.fiatAccount, model.taker.fiatAccount,
model.getNetworkPubKey(), model.offerer.messagePubKey,
model.taker.messagePublicKey); model.taker.messagePublicKey);
String contractAsJson = Utilities.objectToJson(contract); String contractAsJson = Utilities.objectToJson(contract);
String signature = model.getSignatureService().signMessage(model.getRegistrationKeyPair(), contractAsJson); String signature = model.signatureService.signMessage(model.offerer.registrationKeyPair, contractAsJson);
trade.setContract(contract); trade.setContract(contract);
trade.setContractAsJson(contractAsJson); trade.setContractAsJson(contractAsJson);

View file

@ -34,7 +34,7 @@ public class VerifyTakeOfferFeePayment extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
//TODO mocked yet, need a confidence listeners //TODO mocked yet, need a confidence listeners
int numOfPeersSeenTx = model.getWalletService().getNumOfPeersSeenTx(model.getTakeOfferFeeTxId()); int numOfPeersSeenTx = model.walletService.getNumOfPeersSeenTx(model.getTakeOfferFeeTxId());
/* if (numOfPeersSeenTx > 2) { /* if (numOfPeersSeenTx > 2) {
resultHandler.handleResult(); resultHandler.handleResult();
}*/ }*/

View file

@ -34,8 +34,8 @@ public class VerifyTakerAccount extends Task<BuyerAsOffererModel> {
@Override @Override
protected void doRun() { protected void doRun() {
//TODO mocked yet //TODO mocked yet
if (model.getBlockChainService().verifyAccountRegistration()) { if (model.blockChainService.verifyAccountRegistration()) {
if (model.getBlockChainService().isAccountBlackListed(model.taker.accountId, model.taker.fiatAccount)) { if (model.blockChainService.isAccountBlackListed(model.taker.accountId, model.taker.fiatAccount)) {
log.error("Taker is blacklisted"); log.error("Taker is blacklisted");
failed("Taker is blacklisted"); failed("Taker is blacklisted");
} }

View file

@ -21,10 +21,10 @@ import io.bitsquare.network.Message;
import io.bitsquare.network.Peer; import io.bitsquare.network.Peer;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
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.messages.TradeMessage;
import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage; import io.bitsquare.trade.protocol.trade.messages.BankTransferStartedMessage;
import io.bitsquare.trade.protocol.trade.offerer.messages.DepositTxPublishedMessage; import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage;
import io.bitsquare.trade.protocol.trade.offerer.messages.RequestDepositPaymentMessage; import io.bitsquare.trade.protocol.trade.messages.RequestDepositPaymentMessage;
import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel;
import io.bitsquare.trade.protocol.trade.taker.tasks.BroadcastTakeOfferFeeTx; import io.bitsquare.trade.protocol.trade.taker.tasks.BroadcastTakeOfferFeeTx;
import io.bitsquare.trade.protocol.trade.taker.tasks.CreateAndSignContract; import io.bitsquare.trade.protocol.trade.taker.tasks.CreateAndSignContract;
@ -65,9 +65,10 @@ public class SellerAsTakerProtocol {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public SellerAsTakerProtocol(SellerAsTakerModel model) { public SellerAsTakerProtocol(SellerAsTakerModel model) {
log.debug("New SellerAsTakerProtocol " + this);
this.model = model; this.model = model;
messageHandler = this::handleMessage; messageHandler = this::handleMessage;
model.getTradeMessageService().addMessageHandler(messageHandler); model.tradeMessageService.addMessageHandler(messageHandler);
} }
@ -76,7 +77,8 @@ public class SellerAsTakerProtocol {
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
public void cleanup() { public void cleanup() {
model.getTradeMessageService().removeMessageHandler(messageHandler); log.debug("cleanup " + this);
model.tradeMessageService.removeMessageHandler(messageHandler);
} }
public void takeAvailableOffer() { public void takeAvailableOffer() {
@ -145,7 +147,7 @@ public class SellerAsTakerProtocol {
SellerAsTakerTaskRunner<SellerAsTakerModel> taskRunner = new SellerAsTakerTaskRunner<>(model, SellerAsTakerTaskRunner<SellerAsTakerModel> taskRunner = new SellerAsTakerTaskRunner<>(model,
() -> { () -> {
log.debug("taskRunner at handleBankTransferInitedMessage completed"); log.debug("taskRunner at handleBankTransferInitedMessage completed");
model.getTrade().setState(Trade.State.FIAT_PAYMENT_STARTED); model.trade.setState(Trade.State.FIAT_PAYMENT_STARTED);
}, },
(errorMessage) -> { (errorMessage) -> {
log.error(errorMessage); log.error(errorMessage);
@ -186,9 +188,9 @@ public class SellerAsTakerProtocol {
log.trace("handleNewMessage: message = " + message.getClass().getSimpleName()); log.trace("handleNewMessage: message = " + message.getClass().getSimpleName());
if (message instanceof TradeMessage) { if (message instanceof TradeMessage) {
TradeMessage tradeMessage = (TradeMessage) message; TradeMessage tradeMessage = (TradeMessage) message;
nonEmptyStringOf(tradeMessage.getTradeId()); nonEmptyStringOf(tradeMessage.tradeId);
if (tradeMessage.getTradeId().equals(model.getId())) { if (tradeMessage.tradeId.equals(model.id)) {
if (tradeMessage instanceof RequestDepositPaymentMessage) { if (tradeMessage instanceof RequestDepositPaymentMessage) {
handleRequestDepositPaymentMessage((RequestDepositPaymentMessage) tradeMessage); handleRequestDepositPaymentMessage((RequestDepositPaymentMessage) tradeMessage);
} }

View file

@ -34,7 +34,7 @@ class SellerAsTakerTaskRunner<T extends SellerAsTakerModel> extends TaskRunner<S
/* @Override /* @Override
public void handleErrorMessage(String errorMessage) { public void handleErrorMessage(String errorMessage) {
sharedModel.getTrade().setState(Trade.State.FAILED); sharedModel.trade.setState(Trade.State.FAILED);
super.handleErrorMessage(errorMessage); super.handleErrorMessage(errorMessage);
}*/ }*/
} }

View file

@ -1,121 +0,0 @@
/*
* This file is part of Bitsquare.
*
* Bitsquare is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bitsquare is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bitsquare.trade.protocol.trade.taker.messages;
import io.bitsquare.fiat.FiatAccount;
import io.bitsquare.trade.protocol.trade.TradeMessage;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionOutput;
import java.io.Serializable;
import java.security.PublicKey;
import java.util.List;
public class RequestOffererPublishDepositTxMessage implements Serializable, TradeMessage {
private static final long serialVersionUID = 2179683654379803071L;
private final String tradeId;
private final FiatAccount fiatAccount;
private final String accountID;
private final PublicKey takerMessagePublicKey;
private final String contractAsJson;
private final String takerContractSignature;
private final String takerPayoutAddress;
private final Transaction takersDepositTx;
private final List<TransactionOutput> takerConnectedOutputsForAllInputs;
private final List<TransactionOutput> takerOutputs;
public RequestOffererPublishDepositTxMessage(String tradeId,
FiatAccount fiatAccount,
String accountID,
PublicKey takerMessagePublicKey,
String contractAsJson,
String takerContractSignature,
String takerPayoutAddress,
Transaction takersDepositTx,
List<TransactionOutput> takerConnectedOutputsForAllInputs,
List<TransactionOutput> takerOutputs) {
this.tradeId = tradeId;
this.fiatAccount = fiatAccount;
this.accountID = accountID;
this.takerMessagePublicKey = takerMessagePublicKey;
this.contractAsJson = contractAsJson;
this.takerContractSignature = takerContractSignature;
this.takerPayoutAddress = takerPayoutAddress;
this.takersDepositTx = takersDepositTx;
this.takerConnectedOutputsForAllInputs = takerConnectedOutputsForAllInputs;
this.takerOutputs = takerOutputs;
}
@Override
public String getTradeId() {
return tradeId;
}
public FiatAccount getTakerBankAccount() {
return fiatAccount;
}
public String getTakerAccountId() {
return accountID;
}
public PublicKey getTakerMessagePublicKey() {
return takerMessagePublicKey;
}
public String getTakerContractAsJson() {
return contractAsJson;
}
public String getTakerContractSignature() {
return takerContractSignature;
}
public List<TransactionOutput> getTakerOutputs() {
return takerOutputs;
}
public FiatAccount getFiatAccount() {
return fiatAccount;
}
public String getAccountID() {
return accountID;
}
public String getContractAsJson() {
return contractAsJson;
}
public String getTakerPayoutAddress() {
return takerPayoutAddress;
}
public Transaction getTakersDepositTx() {
return takersDepositTx;
}
public List<TransactionOutput> getTakerConnectedOutputsForAllInputs() {
return takerConnectedOutputsForAllInputs;
}
}

View file

@ -17,10 +17,10 @@
package io.bitsquare.trade.protocol.trade.taker.models; package io.bitsquare.trade.protocol.trade.taker.models;
import io.bitsquare.fiat.FiatAccount;
import io.bitsquare.network.Peer; import io.bitsquare.network.Peer;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.TransactionOutput; import org.bitcoinj.core.TransactionOutput;
import java.io.Serializable; import java.io.Serializable;
@ -30,16 +30,14 @@ import java.util.List;
public class OffererModel implements Serializable { public class OffererModel implements Serializable {
private static final long serialVersionUID = 1582902150121576205L; private static final long serialVersionUID = 1582902150121576205L;
public OffererModel(Peer peer) { public Peer peer;
this.peer = peer;
}
public final Peer peer;
public byte[] pubKey; public byte[] pubKey;
public Coin payoutAmount; public Coin payoutAmount;
public String payoutAddress; public String payoutAddress;
public List<TransactionOutput> connectedOutputsForAllInputs; public List<TransactionOutput> connectedOutputsForAllInputs;
public List<TransactionOutput> outputs; public List<TransactionOutput> outputs;
public ECKey.ECDSASignature signature; public byte[] signature;
public FiatAccount fiatAccount;
public String accountId;
} }

View file

@ -24,7 +24,7 @@ import io.bitsquare.network.Peer;
import io.bitsquare.persistence.Persistence; import io.bitsquare.persistence.Persistence;
import io.bitsquare.trade.Trade; import io.bitsquare.trade.Trade;
import io.bitsquare.trade.TradeMessageService; import io.bitsquare.trade.TradeMessageService;
import io.bitsquare.trade.protocol.trade.OfferSharedModel; import io.bitsquare.trade.protocol.trade.SharedTradeModel;
import io.bitsquare.user.User; import io.bitsquare.user.User;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
@ -34,11 +34,11 @@ import java.io.Serializable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class SellerAsTakerModel extends OfferSharedModel implements Serializable { public class SellerAsTakerModel extends SharedTradeModel implements Serializable {
private static final long serialVersionUID = -963501132927618376L; private static final long serialVersionUID = -963501132927618376L;
private static final Logger log = LoggerFactory.getLogger(SellerAsTakerModel.class); private static final Logger log = LoggerFactory.getLogger(SellerAsTakerModel.class);
private final Trade trade; public final Trade trade;
public final TakerModel taker; public final TakerModel taker;
public final OffererModel offerer; public final OffererModel offerer;
@ -59,20 +59,42 @@ public class SellerAsTakerModel extends OfferSharedModel implements Serializable
walletService, walletService,
blockChainService, blockChainService,
signatureService, signatureService,
user,
persistence); persistence);
this.trade = trade; this.trade = trade;
taker = new TakerModel(); Object modelObject = persistence.read(this, "SellerAsTakerModel_" + id);
offerer = new OffererModel(offererPeer); if (modelObject instanceof SellerAsTakerModel) {
SellerAsTakerModel persistedModel = (SellerAsTakerModel) modelObject;
log.debug("Model reconstructed form persisted model.");
taker.pubKey = getAddressEntry().getPubKey(); setPublishedDepositTx(persistedModel.getPublishedDepositTx());
setTakeOfferFeeTx(persistedModel.getTakeOfferFeeTx());
setPayoutTx(persistedModel.payoutTx);
taker = persistedModel.taker;
offerer = persistedModel.offerer;
}
else {
taker = new TakerModel();
offerer = new OffererModel();
} }
offerer.peer = offererPeer;
public Trade getTrade() { taker.registrationPubKey = walletService.getRegistrationAddressEntry().getPubKey();
return trade; taker.registrationKeyPair = walletService.getRegistrationAddressEntry().getKeyPair();
taker.addressEntry = walletService.getAddressEntry(id);
taker.fiatAccount = user.getBankAccount(offer.getBankAccountId());
taker.accountId = user.getAccountId();
taker.messagePubKey = user.getMessagePubKey();
taker.pubKey = taker.addressEntry.getPubKey();
}
// Get called form taskRunner after each completed task
@Override
public void persist() {
persistence.write(this, "SellerAsTakerModel_" + id, this);
} }
public Transaction getPublishedDepositTx() { public Transaction getPublishedDepositTx() {

View file

@ -17,25 +17,37 @@
package io.bitsquare.trade.protocol.trade.taker.models; package io.bitsquare.trade.protocol.trade.taker.models;
import io.bitsquare.btc.AddressEntry;
import io.bitsquare.fiat.FiatAccount; import io.bitsquare.fiat.FiatAccount;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Transaction; import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionOutput; import org.bitcoinj.core.TransactionOutput;
import org.bitcoinj.crypto.DeterministicKey;
import java.io.Serializable; import java.io.Serializable;
import java.security.PublicKey;
import java.util.List; import java.util.List;
public class TakerModel implements Serializable { public class TakerModel implements Serializable {
private static final long serialVersionUID = -4041809885931756860L; private static long serialVersionUID = -4041809885931756860L;
// Those fields are set at constructor but not declared as final because constructor is not called in case model gets created from a persisted model
// Declared transient as they will be provided in any case at construction time
transient public FiatAccount fiatAccount;
transient public String accountId;
transient public PublicKey messagePubKey;
transient public byte[] registrationPubKey;
transient public DeterministicKey registrationKeyPair;
transient public AddressEntry addressEntry;
transient public byte[] pubKey;
// written by tasks
public List<TransactionOutput> connectedOutputsForAllInputs; public List<TransactionOutput> connectedOutputsForAllInputs;
public List<TransactionOutput> outputs; public List<TransactionOutput> outputs;
public Transaction depositTx;
public FiatAccount fiatAccount;
public String accountId;
public Coin payoutAmount; public Coin payoutAmount;
public byte[] pubKey; public Transaction preparedDepositTx;
} }

View file

@ -41,20 +41,20 @@ public class BroadcastTakeOfferFeeTx extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
model.getTradeWalletService().broadcastTakeOfferFeeTx(model.getTakeOfferFeeTx(), model.tradeWalletService.broadcastTakeOfferFeeTx(model.getTakeOfferFeeTx(),
new FutureCallback<Transaction>() { new FutureCallback<Transaction>() {
@Override @Override
public void onSuccess(Transaction transaction) { public void onSuccess(Transaction transaction) {
log.debug("Take offer fee published successfully. Transaction ID = " + transaction.getHashAsString()); log.debug("Take offer fee published successfully. Transaction ID = " + transaction.getHashAsString());
model.getTrade().setState(Trade.State.TAKE_OFFER_FEE_PUBLISHED); model.trade.setState(Trade.State.TAKE_OFFER_FEE_PUBLISHED);
complete(); complete();
} }
@Override @Override
public void onFailure(@NotNull Throwable t) { public void onFailure(@NotNull Throwable t) {
model.getTrade().setState(Trade.State.TAKE_OFFER_FEE_PUBLISH_FAILED); model.trade.setState(Trade.State.TAKE_OFFER_FEE_PUBLISH_FAILED);
failed(t); failed(t);
} }
}); });
@ -62,7 +62,7 @@ public class BroadcastTakeOfferFeeTx extends Task<SellerAsTakerModel> {
appendToErrorMessage("Take offer fee payment failed. Maybe your network connection was lost. Please try again."); appendToErrorMessage("Take offer fee payment failed. Maybe your network connection was lost. Please try again.");
appendToErrorMessage(e.getMessage()); appendToErrorMessage(e.getMessage());
model.getTrade().setState(Trade.State.FAULT); model.trade.setState(Trade.State.FAULT);
failed(e); failed(e);
} }

View file

@ -36,19 +36,19 @@ public class CreateAndSignContract extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
Trade trade = model.getTrade(); Trade trade = model.trade;
Contract contract = new Contract( Contract contract = new Contract(
model.getOffer(), model.offer,
trade.getTradeAmount(), trade.getTradeAmount(),
model.getTakeOfferFeeTx().getHashAsString(), model.getTakeOfferFeeTx().getHashAsString(),
model.offerer.accountId,
model.taker.accountId, model.taker.accountId,
model.getAccountId(), model.offerer.fiatAccount,
model.taker.fiatAccount, model.taker.fiatAccount,
model.getFiatAccount(), model.offer.getMessagePublicKey(),
model.getOffer().getMessagePublicKey(), model.taker.messagePubKey);
model.getNetworkPubKey());
String contractAsJson = Utilities.objectToJson(contract); String contractAsJson = Utilities.objectToJson(contract);
String signature = model.getSignatureService().signMessage(model.getRegistrationKeyPair(), contractAsJson); String signature = model.signatureService.signMessage(model.taker.registrationKeyPair, contractAsJson);
trade.setContract(contract); trade.setContract(contract);
trade.setContractAsJson(contractAsJson); trade.setContractAsJson(contractAsJson);

View file

@ -37,16 +37,16 @@ public class CreateTakeOfferFeeTx extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
Transaction createTakeOfferFeeTx = model.getTradeWalletService().createTakeOfferFeeTx(model.getAddressEntry()); Transaction createTakeOfferFeeTx = model.tradeWalletService.createTakeOfferFeeTx(model.taker.addressEntry);
model.setTakeOfferFeeTx(createTakeOfferFeeTx); model.setTakeOfferFeeTx(createTakeOfferFeeTx);
model.getTrade().setState(Trade.State.TAKE_OFFER_FEE_TX_CREATED); model.trade.setState(Trade.State.TAKE_OFFER_FEE_TX_CREATED);
complete(); complete();
} catch (Exception e) { } catch (Exception e) {
appendToErrorMessage(e.getMessage()); appendToErrorMessage(e.getMessage());
model.getTrade().setState(Trade.State.FAULT); model.trade.setState(Trade.State.FAULT);
failed(e); failed(e);
} }

View file

@ -19,11 +19,9 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
import io.bitsquare.trade.protocol.trade.offerer.messages.BankTransferStartedMessage; import io.bitsquare.trade.protocol.trade.messages.BankTransferStartedMessage;
import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel;
import org.bitcoinj.core.ECKey;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -40,14 +38,14 @@ public class ProcessBankTransferStartedMessage extends Task<SellerAsTakerModel>
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
checkTradeId(model.getId(), model.getTradeMessage()); checkTradeId(model.id, model.getTradeMessage());
BankTransferStartedMessage message = (BankTransferStartedMessage) model.getTradeMessage(); BankTransferStartedMessage message = (BankTransferStartedMessage) model.getTradeMessage();
model.setPublishedDepositTx(checkNotNull(message.getDepositTx())); model.setPublishedDepositTx(checkNotNull(message.depositTx));
model.offerer.signature = checkNotNull(ECKey.ECDSASignature.decodeFromDER(message.getOffererSignature())); model.offerer.signature = checkNotNull(message.offererSignature);
model.offerer.payoutAmount = positiveCoinOf(nonZeroCoinOf(message.getOffererPayoutAmount())); model.offerer.payoutAmount = positiveCoinOf(nonZeroCoinOf(message.offererPayoutAmount));
model.taker.payoutAmount = positiveCoinOf(nonZeroCoinOf(message.getTakerPayoutAmount())); model.taker.payoutAmount = positiveCoinOf(nonZeroCoinOf(message.takerPayoutAmount));
model.offerer.payoutAddress = nonEmptyStringOf(message.getOffererPayoutAddress()); model.offerer.payoutAddress = nonEmptyStringOf(message.offererPayoutAddress);
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {

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.DepositTxPublishedMessage; import io.bitsquare.trade.protocol.trade.messages.DepositTxPublishedMessage;
import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
@ -38,10 +38,10 @@ public class ProcessDepositTxPublishedMessage extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
checkTradeId(model.getId(), model.getTradeMessage()); checkTradeId(model.id, model.getTradeMessage());
DepositTxPublishedMessage message = (DepositTxPublishedMessage) model.getTradeMessage(); DepositTxPublishedMessage message = (DepositTxPublishedMessage) model.getTradeMessage();
model.setPublishedDepositTx(checkNotNull(message.getDepositTx())); model.setPublishedDepositTx(checkNotNull(message.depositTx));
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {

View file

@ -19,7 +19,7 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
import io.bitsquare.trade.protocol.trade.offerer.messages.RequestDepositPaymentMessage; import io.bitsquare.trade.protocol.trade.messages.RequestDepositPaymentMessage;
import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -38,15 +38,15 @@ public class ProcessRequestDepositPaymentMessage extends Task<SellerAsTakerModel
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
checkTradeId(model.getId(), model.getTradeMessage()); checkTradeId(model.id, model.getTradeMessage());
RequestDepositPaymentMessage message = (RequestDepositPaymentMessage) model.getTradeMessage(); RequestDepositPaymentMessage message = (RequestDepositPaymentMessage) model.getTradeMessage();
model.offerer.connectedOutputsForAllInputs = checkNotNull(message.getOffererConnectedOutputsForAllInputs()); model.offerer.connectedOutputsForAllInputs = checkNotNull(message.offererConnectedOutputsForAllInputs);
checkArgument(message.getOffererConnectedOutputsForAllInputs().size() > 0); checkArgument(message.offererConnectedOutputsForAllInputs.size() > 0);
model.offerer.outputs = checkNotNull(message.getOffererOutputs()); model.offerer.outputs = checkNotNull(message.offererOutputs);
model.offerer.pubKey = checkNotNull(message.getOffererPubKey()); model.offerer.pubKey = checkNotNull(message.offererPubKey);
model.taker.fiatAccount = checkNotNull(message.getFiatAccount()); model.offerer.fiatAccount = checkNotNull(message.offererFiatAccount);
model.taker.accountId = nonEmptyStringOf(message.getAccountId()); model.offerer.accountId = nonEmptyStringOf(message.offererAccountId);
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {

View file

@ -19,7 +19,7 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.trade.listeners.SendMessageListener; import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel;
import io.bitsquare.trade.protocol.trade.taker.messages.PayoutTxPublishedMessage; import io.bitsquare.trade.protocol.trade.messages.PayoutTxPublishedMessage;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
@ -35,8 +35,8 @@ public class SendPayoutTxToOfferer extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(model.getId(), model.getPayoutTx()); PayoutTxPublishedMessage tradeMessage = new PayoutTxPublishedMessage(model.id, model.getPayoutTx());
model.getTradeMessageService().sendMessage(model.offerer.peer, tradeMessage, new SendMessageListener() { model.tradeMessageService.sendMessage(model.offerer.peer, tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("PayoutTxPublishedMessage successfully arrived at peer"); log.trace("PayoutTxPublishedMessage successfully arrived at peer");

View file

@ -22,7 +22,7 @@ import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
import io.bitsquare.trade.protocol.trade.taker.messages.RequestDepositTxInputsMessage; import io.bitsquare.trade.protocol.trade.messages.RequestDepositTxInputsMessage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -39,13 +39,13 @@ public class SendRequestDepositTxInputsMessage extends Task<SellerAsTakerModel>
@Override @Override
protected void doRun() { protected void doRun() {
RequestDepositTxInputsMessage msg = new RequestDepositTxInputsMessage( RequestDepositTxInputsMessage msg = new RequestDepositTxInputsMessage(
model.getId(), model.id,
model.getTakeOfferFeeTx().getHashAsString(), model.getTakeOfferFeeTx().getHashAsString(),
model.getTrade().getTradeAmount(), model.trade.getTradeAmount(),
model.taker.pubKey model.taker.pubKey
); );
model.getTradeMessageService().sendMessage(model.offerer.peer, msg, new SendMessageListener() { model.tradeMessageService.sendMessage(model.offerer.peer, msg, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
log.trace("Sending TakeOfferFeePayedMessage succeeded."); log.trace("Sending TakeOfferFeePayedMessage succeeded.");
@ -71,6 +71,6 @@ public class SendRequestDepositTxInputsMessage extends Task<SellerAsTakerModel>
protected void updateStateOnFault() { protected void updateStateOnFault() {
appendToErrorMessage("Sending TakeOfferFeePayedMessage to offerer failed. Maybe the network connection was lost or the offerer lost his connection. " + appendToErrorMessage("Sending TakeOfferFeePayedMessage to offerer failed. Maybe the network connection was lost or the offerer lost his connection. " +
"We persisted the state of the trade, please try again later or cancel that trade."); "We persisted the state of the trade, please try again later or cancel that trade.");
model.getTrade().setState(Trade.State.MESSAGE_SENDING_FAILED); model.trade.setState(Trade.State.MESSAGE_SENDING_FAILED);
} }
} }

View file

@ -20,7 +20,7 @@ package io.bitsquare.trade.protocol.trade.taker.tasks;
import io.bitsquare.common.taskrunner.Task; import io.bitsquare.common.taskrunner.Task;
import io.bitsquare.common.taskrunner.TaskRunner; import io.bitsquare.common.taskrunner.TaskRunner;
import io.bitsquare.trade.listeners.SendMessageListener; import io.bitsquare.trade.listeners.SendMessageListener;
import io.bitsquare.trade.protocol.trade.taker.messages.RequestOffererPublishDepositTxMessage; import io.bitsquare.trade.protocol.trade.messages.RequestOffererPublishDepositTxMessage;
import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel; import io.bitsquare.trade.protocol.trade.taker.models.SellerAsTakerModel;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -36,19 +36,19 @@ public class SendSignedTakerDepositTx extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
RequestOffererPublishDepositTxMessage tradeMessage = new RequestOffererPublishDepositTxMessage( RequestOffererPublishDepositTxMessage tradeMessage = new RequestOffererPublishDepositTxMessage(
model.getId(), model.id,
model.getFiatAccount(), model.taker.fiatAccount,
model.getAccountId(), model.taker.accountId,
model.getNetworkPubKey(), model.taker.messagePubKey,
model.getTrade().getContractAsJson(), model.trade.getContractAsJson(),
model.getTrade().getTakerContractSignature(), model.trade.getTakerContractSignature(),
model.getAddressEntry().getAddressString(), model.taker.addressEntry.getAddressString(),
model.taker.depositTx, model.taker.preparedDepositTx,
model.taker.connectedOutputsForAllInputs, model.taker.connectedOutputsForAllInputs,
model.taker.outputs model.taker.outputs
); );
model.getTradeMessageService().sendMessage(model.offerer.peer, tradeMessage, new SendMessageListener() { model.tradeMessageService.sendMessage(model.offerer.peer, tradeMessage, new SendMessageListener() {
@Override @Override
public void handleResult() { public void handleResult() {
complete(); complete();

View file

@ -41,21 +41,21 @@ public class SignAndPublishPayoutTx extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
model.getTradeWalletService().takerSignsAndPublishPayoutTx( model.tradeWalletService.takerSignsAndPublishPayoutTx(
model.getPublishedDepositTx(), model.getPublishedDepositTx(),
model.offerer.signature, model.offerer.signature,
model.offerer.payoutAmount, model.offerer.payoutAmount,
model.taker.payoutAmount, model.taker.payoutAmount,
model.offerer.payoutAddress, model.offerer.payoutAddress,
model.getAddressEntry(), model.taker.addressEntry,
model.offerer.pubKey, model.offerer.pubKey,
model.taker.pubKey, model.taker.pubKey,
model.getArbitratorPubKey(), model.arbitratorPubKey,
new FutureCallback<Transaction>() { new FutureCallback<Transaction>() {
@Override @Override
public void onSuccess(Transaction transaction) { public void onSuccess(Transaction transaction) {
model.setPayoutTx(transaction); model.setPayoutTx(transaction);
model.getTrade().setState(Trade.State.PAYOUT_PUBLISHED); model.trade.setState(Trade.State.PAYOUT_PUBLISHED);
complete(); complete();
} }

View file

@ -37,9 +37,9 @@ public class TakerCommitDepositTx extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
Transaction transaction = model.getTradeWalletService().takerCommitsDepositTx(model.getPublishedDepositTx()); Transaction transaction = model.tradeWalletService.takerCommitsDepositTx(model.getPublishedDepositTx());
model.getTrade().setDepositTx(transaction); model.trade.setDepositTx(transaction);
model.getTrade().setState(Trade.State.DEPOSIT_PUBLISHED); model.trade.setState(Trade.State.DEPOSIT_PUBLISHED);
complete(); complete();
} catch (Throwable t) { } catch (Throwable t) {

View file

@ -39,23 +39,23 @@ public class TakerCreatesAndSignsDepositTx extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
try { try {
Coin takerInputAmount = model.getTrade().getTradeAmount().add(model.getTrade().getSecurityDeposit()).add(FeePolicy.TX_FEE); Coin takerInputAmount = model.trade.getTradeAmount().add(model.trade.getSecurityDeposit()).add(FeePolicy.TX_FEE);
Coin msOutputAmount = takerInputAmount.add(model.getTrade().getSecurityDeposit()); Coin msOutputAmount = takerInputAmount.add(model.trade.getSecurityDeposit());
TradeWalletService.TransactionDataResult result = model.getTradeWalletService().takerCreatesAndSignsDepositTx( TradeWalletService.TransactionDataResult result = model.tradeWalletService.takerCreatesAndSignsDepositTx(
takerInputAmount, takerInputAmount,
msOutputAmount, msOutputAmount,
model.offerer.connectedOutputsForAllInputs, model.offerer.connectedOutputsForAllInputs,
model.offerer.outputs, model.offerer.outputs,
model.getAddressEntry(), model.taker.addressEntry,
model.offerer.pubKey, model.offerer.pubKey,
model.taker.pubKey, model.taker.pubKey,
model.getArbitratorPubKey()); model.arbitratorPubKey);
model.taker.connectedOutputsForAllInputs = result.getConnectedOutputsForAllInputs(); model.taker.connectedOutputsForAllInputs = result.getConnectedOutputsForAllInputs();
model.taker.outputs = result.getOutputs(); model.taker.outputs = result.getOutputs();
model.taker.depositTx = result.getDepositTx(); model.taker.preparedDepositTx = result.getDepositTx();
complete(); complete();
} catch (Exception e) { } catch (Exception e) {
@ -67,6 +67,6 @@ public class TakerCreatesAndSignsDepositTx extends Task<SellerAsTakerModel> {
protected void updateStateOnFault() { protected void updateStateOnFault() {
Trade.State state = Trade.State.FAULT; Trade.State state = Trade.State.FAULT;
state.setErrorMessage(errorMessage); state.setErrorMessage(errorMessage);
model.getTrade().setState(state); model.trade.setState(state);
} }
} }

View file

@ -34,7 +34,7 @@ public class VerifyOfferFeePayment extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
//TODO impl. missing //TODO impl. missing
int numOfPeersSeenTx = model.getWalletService().getNumOfPeersSeenTx(model.getTakeOfferFeeTx().getHashAsString()); int numOfPeersSeenTx = model.walletService.getNumOfPeersSeenTx(model.getTakeOfferFeeTx().getHashAsString());
/* if (numOfPeersSeenTx > 2) { /* if (numOfPeersSeenTx > 2) {
resultHandler.handleResult(); resultHandler.handleResult();
}*/ }*/

View file

@ -33,8 +33,8 @@ public class VerifyOffererAccount extends Task<SellerAsTakerModel> {
@Override @Override
protected void doRun() { protected void doRun() {
if (model.getBlockChainService().verifyAccountRegistration()) { if (model.blockChainService.verifyAccountRegistration()) {
if (model.getBlockChainService().isAccountBlackListed(model.taker.accountId, model.taker.fiatAccount)) { if (model.blockChainService.isAccountBlackListed(model.offerer.accountId, model.offerer.fiatAccount)) {
failed("Taker is blacklisted."); failed("Taker is blacklisted.");
} }
else { else {

View file

@ -43,7 +43,7 @@ import javafx.collections.ObservableList;
public class User implements Serializable { public class User implements Serializable {
private static final long serialVersionUID = 7409078808248518638L; private static final long serialVersionUID = 7409078808248518638L;
private KeyPair networkKeyPair; private KeyPair messageKeyPair;
private String accountID; private String accountID;
// Used for serialisation (ObservableList cannot be serialized) -> serialisation will change anyway so that is // Used for serialisation (ObservableList cannot be serialized) -> serialisation will change anyway so that is
@ -71,13 +71,13 @@ public class User implements Serializable {
if (persistedUser != null) { if (persistedUser != null) {
fiatAccounts.setAll(persistedUser.getSerializedBankAccounts()); fiatAccounts.setAll(persistedUser.getSerializedBankAccounts());
setCurrentBankAccount(persistedUser.getSerializedCurrentBankAccount()); setCurrentBankAccount(persistedUser.getSerializedCurrentBankAccount());
networkKeyPair = persistedUser.getNetworkKeyPair(); messageKeyPair = persistedUser.getMessageKeyPair();
accountID = persistedUser.getAccountId(); accountID = persistedUser.getAccountId();
} }
else { else {
// First time // First time
// TODO use separate thread. DSAKeyUtil.getKeyPair() runs in same thread now // TODO use separate thread. DSAKeyUtil.getKeyPair() runs in same thread now
networkKeyPair = DSAKeyUtil.generateKeyPair(); messageKeyPair = DSAKeyUtil.generateKeyPair();
} }
} }
@ -160,12 +160,12 @@ public class User implements Serializable {
return null; return null;
} }
public KeyPair getNetworkKeyPair() { public KeyPair getMessageKeyPair() {
return networkKeyPair; return messageKeyPair;
} }
public PublicKey getNetworkPubKey() { public PublicKey getMessagePubKey() {
return networkKeyPair.getPublic(); return messageKeyPair.getPublic();
} }
public ObjectProperty<FiatAccount> currentBankAccountProperty() { public ObjectProperty<FiatAccount> currentBankAccountProperty() {

View file

@ -17,7 +17,7 @@
package io.bitsquare.util; package io.bitsquare.util;
import io.bitsquare.trade.protocol.trade.TradeMessage; import io.bitsquare.trade.protocol.trade.messages.TradeMessage;
import org.bitcoinj.core.Coin; import org.bitcoinj.core.Coin;
@ -52,7 +52,7 @@ public class Validator {
} }
public static void checkTradeId(String tradeId, TradeMessage tradeMessage) { public static void checkTradeId(String tradeId, TradeMessage tradeMessage) {
checkArgument(tradeId.equals(tradeMessage.getTradeId())); checkArgument(tradeId.equals(tradeMessage.tradeId));
} }

View file

@ -30,7 +30,7 @@
<logger name="io.bitsquare" level="TRACE"/> <logger name="io.bitsquare" level="TRACE"/>
<logger name="io.bitsquare.gui.util.Profiler" level="ERROR"/> <logger name="io.bitsquare.gui.util.Profiler" level="ERROR"/>
<logger name="io.bitsquare.persistence.Persistence" level="ERROR"/> <!-- <logger name="io.bitsquare.persistence.Persistence" level="ERROR"/>-->
<logger name="io.bitsquare.locale.BSResources" level="ERROR"/> <logger name="io.bitsquare.locale.BSResources" level="ERROR"/>
<logger name="org.bitcoinj" level="DEBUG"/> <logger name="org.bitcoinj" level="DEBUG"/>

View file

@ -98,7 +98,7 @@ public class PlaceOfferProtocolTest {
tomP2PNode = new TomP2PNode(bootstrappedPeerBuilder); tomP2PNode = new TomP2PNode(bootstrappedPeerBuilder);
tradeMessageService = new TomP2PTradeMessageService(tomP2PNode); tradeMessageService = new TomP2PTradeMessageService(tomP2PNode);
Observable<BootstrapState> messageObservable = tomP2PNode.bootstrap(user.getNetworkKeyPair(), tradeMessageService); Observable<BootstrapState> messageObservable = tomP2PNode.bootstrap(user.getMessageKeyPair(), tradeMessageService);
messageObservable.publish(); messageObservable.publish();
messageObservable.subscribe( messageObservable.subscribe(
state -> log.trace("state changed: " + state), state -> log.trace("state changed: " + state),