mirror of
https://github.com/haveno-dex/haveno.git
synced 2025-08-01 11:16:11 -04:00
Improve locked funds screen, add total balance for locked funds
This commit is contained in:
parent
c70df863d6
commit
6b3df246a1
21 changed files with 361 additions and 366 deletions
|
@ -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() : "") + '\'' +
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue