Improve locked funds screen, add total balance for locked funds

This commit is contained in:
Manfred Karrer 2016-02-03 18:06:34 +01:00
parent c70df863d6
commit 6b3df246a1
21 changed files with 361 additions and 366 deletions

View file

@ -171,7 +171,7 @@ abstract public class Trade implements Tradable, Model, Serializable {
transient private ObjectProperty<Coin> tradeAmountProperty;
transient private ObjectProperty<Fiat> tradeVolumeProperty;
@Nullable
private Transaction takeOfferFeeTx;
private String takeOfferFeeTxId;
///////////////////////////////////////////////////////////////////////////////////////////
@ -562,12 +562,12 @@ abstract public class Trade implements Tradable, Model, Serializable {
return contractHash;
}
public void setTakeOfferFeeTx(Transaction takeOfferFeeTx) {
this.takeOfferFeeTx = takeOfferFeeTx;
public void setTakeOfferFeeTxId(String takeOfferFeeTxId) {
this.takeOfferFeeTxId = takeOfferFeeTxId;
}
public Transaction getTakeOfferFeeTx() {
return takeOfferFeeTx;
public String getTakeOfferFeeTxId() {
return takeOfferFeeTxId;
}
///////////////////////////////////////////////////////////////////////////////////////////
@ -628,7 +628,7 @@ abstract public class Trade implements Tradable, Model, Serializable {
"\n\tdisputeState=" + disputeState +
"\n\ttradePeriodState=" + tradePeriodState +
"\n\tdepositTx=" + depositTx +
"\n\ttakeOfferFeeTx.getHashAsString()=" + (takeOfferFeeTx != null ? takeOfferFeeTx.getHashAsString() : "") +
"\n\ttakeOfferFeeTxId=" + takeOfferFeeTxId +
"\n\tcontract=" + contract +
"\n\ttakerContractSignature.hashCode()='" + (takerContractSignature != null ? takerContractSignature.hashCode() : "") + '\'' +
"\n\toffererContractSignature.hashCode()='" + (offererContractSignature != null ? offererContractSignature.hashCode() : "") + '\'' +

View file

@ -36,6 +36,7 @@ import io.bitsquare.trade.offer.Offer;
import io.bitsquare.trade.offer.OpenOfferManager;
import io.bitsquare.trade.protocol.trade.messages.TradeMessage;
import io.bitsquare.user.User;
import org.bitcoinj.core.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -65,7 +66,6 @@ public class ProcessModel implements Model, Serializable {
// Mutable
public final TradingPeer tradingPeer;
transient private TradeMessage tradeMessage;
private String takeOfferFeeTxId;
private byte[] payoutTxSignature;
private List<NodeAddress> takerAcceptedArbitratorNodeAddresses;
@ -78,6 +78,7 @@ public class ProcessModel implements Model, Serializable {
private long changeOutputValue;
@Nullable
private String changeOutputAddress;
private Transaction takeOfferFeeTx;
public ProcessModel() {
tradingPeer = new TradingPeer();
@ -194,14 +195,6 @@ public class ProcessModel implements Model, Serializable {
this.payoutTxSignature = payoutTxSignature;
}
public String getTakeOfferFeeTxId() {
return takeOfferFeeTxId;
}
public void setTakeOfferFeeTxId(String takeOfferFeeTxId) {
this.takeOfferFeeTxId = takeOfferFeeTxId;
}
@Override
public void persist() {
}
@ -274,4 +267,12 @@ public class ProcessModel implements Model, Serializable {
public String getChangeOutputAddress() {
return changeOutputAddress;
}
public void setTakeOfferFeeTx(Transaction takeOfferFeeTx) {
this.takeOfferFeeTx = takeOfferFeeTx;
}
public Transaction getTakeOfferFeeTx() {
return takeOfferFeeTx;
}
}

View file

@ -43,7 +43,7 @@ public class CreateAndSignContract extends TradeTask {
protected void run() {
try {
runInterceptHook();
checkNotNull(processModel.getTakeOfferFeeTxId(), "processModel.getTakeOfferFeeTxId() must not be null");
checkNotNull(trade.getTakeOfferFeeTxId(), "trade.getTakeOfferFeeTxId() must not be null");
TradingPeer taker = processModel.tradingPeer;
PaymentAccountContractData offererPaymentAccountContractData = processModel.getPaymentAccountContractData(trade);
@ -58,7 +58,7 @@ public class CreateAndSignContract extends TradeTask {
Contract contract = new Contract(
processModel.getOffer(),
trade.getTradeAmount(),
processModel.getTakeOfferFeeTxId(),
trade.getTakeOfferFeeTxId(),
buyerNodeAddress,
sellerNodeAddress,
trade.getArbitratorNodeAddress(),

View file

@ -71,7 +71,7 @@ public class ProcessPayDepositRequest extends TradeTask {
}
processModel.tradingPeer.setAccountId(nonEmptyStringOf(payDepositRequest.takerAccountId));
processModel.setTakeOfferFeeTxId(nonEmptyStringOf(payDepositRequest.takeOfferFeeTxId));
trade.setTakeOfferFeeTxId(nonEmptyStringOf(payDepositRequest.takeOfferFeeTxId));
processModel.setTakerAcceptedArbitratorNodeAddresses(checkNotNull(payDepositRequest.acceptedArbitratorNodeAddresses));
if (payDepositRequest.acceptedArbitratorNodeAddresses.size() < 1)
failed("acceptedArbitratorNames size must be at least 1");

View file

@ -37,7 +37,7 @@ public class BroadcastTakeOfferFeeTx extends TradeTask {
protected void run() {
try {
runInterceptHook();
processModel.getTradeWalletService().broadcastTx(trade.getTakeOfferFeeTx(),
processModel.getTradeWalletService().broadcastTx(processModel.getTakeOfferFeeTx(),
new FutureCallback<Transaction>() {
@Override
public void onSuccess(Transaction transaction) {

View file

@ -50,10 +50,8 @@ public class CreateTakeOfferFeeTx extends TradeTask {
FeePolicy.getTakeOfferFee(),
selectedArbitrator.getBtcAddress());
trade.setTakeOfferFeeTx(createTakeOfferFeeTx);
// TODO check if needed as we have stored tx already at setTakeOfferFeeTx
processModel.setTakeOfferFeeTxId(createTakeOfferFeeTx.getHashAsString());
processModel.setTakeOfferFeeTx(createTakeOfferFeeTx);
trade.setTakeOfferFeeTxId(createTakeOfferFeeTx.getHashAsString());
complete();
} catch (Throwable t) {

View file

@ -38,53 +38,52 @@ public class SendPayDepositRequest extends TradeTask {
protected void run() {
try {
runInterceptHook();
if (trade.getTakeOfferFeeTx() != null) {
checkNotNull(trade.getTradeAmount());
PayDepositRequest payDepositRequest = new PayDepositRequest(
processModel.getMyAddress(),
processModel.getId(),
trade.getTradeAmount().value,
processModel.getRawInputs(),
processModel.getChangeOutputValue(),
processModel.getChangeOutputAddress(),
processModel.getTradeWalletPubKey(),
processModel.getAddressEntry().getAddressString(),
processModel.getPubKeyRing(),
processModel.getPaymentAccountContractData(trade),
processModel.getAccountId(),
trade.getTakeOfferFeeTx().getHashAsString(),
processModel.getUser().getAcceptedArbitratorAddresses(),
trade.getArbitratorNodeAddress()
);
processModel.getP2PService().sendEncryptedMailboxMessage(
trade.getTradingPeerNodeAddress(),
processModel.tradingPeer.getPubKeyRing(),
payDepositRequest,
new SendMailboxMessageListener() {
@Override
public void onArrived() {
log.trace("Message arrived at peer.");
complete();
}
checkNotNull(trade.getTradeAmount(), "TradeAmount must not be null");
checkNotNull(trade.getTakeOfferFeeTxId(), "TakeOfferFeeTxId must not be null");
checkNotNull(processModel.getAddressEntry(), "AddressEntry must not be null");
@Override
public void onStoredInMailbox() {
log.trace("Message stored in mailbox.");
complete();
}
PayDepositRequest payDepositRequest = new PayDepositRequest(
processModel.getMyAddress(),
processModel.getId(),
trade.getTradeAmount().value,
processModel.getRawInputs(),
processModel.getChangeOutputValue(),
processModel.getChangeOutputAddress(),
processModel.getTradeWalletPubKey(),
processModel.getAddressEntry().getAddressString(),
processModel.getPubKeyRing(),
processModel.getPaymentAccountContractData(trade),
processModel.getAccountId(),
trade.getTakeOfferFeeTxId(),
processModel.getUser().getAcceptedArbitratorAddresses(),
trade.getArbitratorNodeAddress()
);
@Override
public void onFault(String errorMessage) {
appendToErrorMessage("PayDepositRequest sending failed");
failed();
}
processModel.getP2PService().sendEncryptedMailboxMessage(
trade.getTradingPeerNodeAddress(),
processModel.tradingPeer.getPubKeyRing(),
payDepositRequest,
new SendMailboxMessageListener() {
@Override
public void onArrived() {
log.trace("Message arrived at peer.");
complete();
}
);
} else {
log.error("trade.getTakeOfferFeeTx() = " + trade.getTakeOfferFeeTx());
failed("TakeOfferFeeTx is null");
}
@Override
public void onStoredInMailbox() {
log.trace("Message stored in mailbox.");
complete();
}
@Override
public void onFault(String errorMessage) {
appendToErrorMessage("PayDepositRequest sending failed");
failed();
}
}
);
} catch (Throwable t) {
failed(t);
}

View file

@ -30,6 +30,8 @@ import io.bitsquare.trade.protocol.trade.tasks.TradeTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkNotNull;
public class VerifyAndSignContract extends TradeTask {
private static final Logger log = LoggerFactory.getLogger(VerifyAndSignContract.class);
@ -42,55 +44,53 @@ public class VerifyAndSignContract extends TradeTask {
try {
runInterceptHook();
if (trade.getTakeOfferFeeTx() != null) {
TradingPeer offerer = processModel.tradingPeer;
PaymentAccountContractData offererPaymentAccountContractData = offerer.getPaymentAccountContractData();
PaymentAccountContractData takerPaymentAccountContractData = processModel.getPaymentAccountContractData(trade);
checkNotNull(trade.getTakeOfferFeeTxId(), "TakeOfferFeeTxId must not be null");
boolean isBuyerOffererAndSellerTaker = trade instanceof SellerAsTakerTrade;
NodeAddress buyerNodeAddress = isBuyerOffererAndSellerTaker ? processModel.getTempTradingPeerNodeAddress() : processModel.getMyAddress();
NodeAddress sellerNodeAddress = isBuyerOffererAndSellerTaker ? processModel.getMyAddress() : processModel.getTempTradingPeerNodeAddress();
log.debug("isBuyerOffererAndSellerTaker " + isBuyerOffererAndSellerTaker);
log.debug("buyerAddress " + buyerNodeAddress);
log.debug("sellerAddress " + sellerNodeAddress);
TradingPeer offerer = processModel.tradingPeer;
PaymentAccountContractData offererPaymentAccountContractData = offerer.getPaymentAccountContractData();
PaymentAccountContractData takerPaymentAccountContractData = processModel.getPaymentAccountContractData(trade);
Contract contract = new Contract(
processModel.getOffer(),
trade.getTradeAmount(),
trade.getTakeOfferFeeTx().getHashAsString(),
buyerNodeAddress,
sellerNodeAddress,
trade.getArbitratorNodeAddress(),
isBuyerOffererAndSellerTaker,
offerer.getAccountId(),
processModel.getAccountId(),
offererPaymentAccountContractData,
takerPaymentAccountContractData,
offerer.getPubKeyRing(),
processModel.getPubKeyRing(),
offerer.getPayoutAddressString(),
processModel.getAddressEntry().getAddressString(),
offerer.getTradeWalletPubKey(),
processModel.getTradeWalletPubKey()
);
String contractAsJson = Utilities.objectToJson(contract);
String signature = Sig.sign(processModel.getKeyRing().getSignatureKeyPair().getPrivate(), contractAsJson);
trade.setContract(contract);
trade.setContractAsJson(contractAsJson);
trade.setTakerContractSignature(signature);
boolean isBuyerOffererAndSellerTaker = trade instanceof SellerAsTakerTrade;
NodeAddress buyerNodeAddress = isBuyerOffererAndSellerTaker ? processModel.getTempTradingPeerNodeAddress() : processModel.getMyAddress();
NodeAddress sellerNodeAddress = isBuyerOffererAndSellerTaker ? processModel.getMyAddress() : processModel.getTempTradingPeerNodeAddress();
log.debug("isBuyerOffererAndSellerTaker " + isBuyerOffererAndSellerTaker);
log.debug("buyerAddress " + buyerNodeAddress);
log.debug("sellerAddress " + sellerNodeAddress);
try {
Sig.verify(offerer.getPubKeyRing().getSignaturePubKey(),
contractAsJson,
offerer.getContractSignature());
} catch (Throwable t) {
failed("Signature verification failed. " + t.getMessage());
}
Contract contract = new Contract(
processModel.getOffer(),
trade.getTradeAmount(),
trade.getTakeOfferFeeTxId(),
buyerNodeAddress,
sellerNodeAddress,
trade.getArbitratorNodeAddress(),
isBuyerOffererAndSellerTaker,
offerer.getAccountId(),
processModel.getAccountId(),
offererPaymentAccountContractData,
takerPaymentAccountContractData,
offerer.getPubKeyRing(),
processModel.getPubKeyRing(),
offerer.getPayoutAddressString(),
processModel.getAddressEntry().getAddressString(),
offerer.getTradeWalletPubKey(),
processModel.getTradeWalletPubKey()
);
String contractAsJson = Utilities.objectToJson(contract);
String signature = Sig.sign(processModel.getKeyRing().getSignatureKeyPair().getPrivate(), contractAsJson);
trade.setContract(contract);
trade.setContractAsJson(contractAsJson);
trade.setTakerContractSignature(signature);
complete();
} else {
failed("processModel.getTakeOfferFeeTx() = null");
try {
Sig.verify(offerer.getPubKeyRing().getSignaturePubKey(),
contractAsJson,
offerer.getContractSignature());
} catch (Throwable t) {
failed("Signature verification failed. " + t.getMessage());
}
complete();
} catch (Throwable t) {
failed(t);
}