diff --git a/core/src/main/java/bisq/core/api/model/OfferInfo.java b/core/src/main/java/bisq/core/api/model/OfferInfo.java
index ad2389e438a..219045b2762 100644
--- a/core/src/main/java/bisq/core/api/model/OfferInfo.java
+++ b/core/src/main/java/bisq/core/api/model/OfferInfo.java
@@ -125,13 +125,9 @@ public bisq.proto.grpc.OfferInfo toProtoMessage() {
.build();
}
+ @SuppressWarnings({"unused", "SameReturnValue"})
public static OfferInfo fromProto(bisq.proto.grpc.OfferInfo proto) {
- /*
- TODO?
- return new OfferInfo(proto.getOfferPayload().getId(),
- proto.getOfferPayload().getDate());
- */
- return null;
+ return null; // TODO
}
/*
diff --git a/core/src/main/java/bisq/core/api/model/TradeInfo.java b/core/src/main/java/bisq/core/api/model/TradeInfo.java
index 33b8059f9b5..6e4adeca4ae 100644
--- a/core/src/main/java/bisq/core/api/model/TradeInfo.java
+++ b/core/src/main/java/bisq/core/api/model/TradeInfo.java
@@ -21,6 +21,8 @@
import bisq.common.Payload;
+import java.util.Objects;
+
import lombok.EqualsAndHashCode;
import lombok.Getter;
@@ -37,6 +39,16 @@ public class TradeInfo implements Payload {
private final OfferInfo offer;
private final String tradeId;
private final String shortId;
+ private final long date;
+ private final boolean isCurrencyForTakerFeeBtc;
+ private final long txFeeAsLong;
+ private final long takerFeeAsLong;
+ private final String takerFeeTxId;
+ private final String depositTxId;
+ private final String payoutTxId;
+ private final long tradeAmountAsLong;
+ private final long tradePrice;
+ private final String tradingPeerNodeAddress;
private final String state;
private final String phase;
private final String tradePeriodState;
@@ -46,11 +58,22 @@ public class TradeInfo implements Payload {
private final boolean isFiatReceived;
private final boolean isPayoutPublished;
private final boolean isWithdrawn;
+ private final String contractAsJson;
public TradeInfo(TradeInfoBuilder builder) {
this.offer = builder.offer;
this.tradeId = builder.tradeId;
this.shortId = builder.shortId;
+ this.date = builder.date;
+ this.isCurrencyForTakerFeeBtc = builder.isCurrencyForTakerFeeBtc;
+ this.txFeeAsLong = builder.txFeeAsLong;
+ this.takerFeeAsLong = builder.takerFeeAsLong;
+ this.takerFeeTxId = builder.takerFeeTxId;
+ this.depositTxId = builder.depositTxId;
+ this.payoutTxId = builder.payoutTxId;
+ this.tradeAmountAsLong = builder.tradeAmountAsLong;
+ this.tradePrice = builder.tradePrice;
+ this.tradingPeerNodeAddress = builder.tradingPeerNodeAddress;
this.state = builder.state;
this.phase = builder.phase;
this.tradePeriodState = builder.tradePeriodState;
@@ -60,6 +83,7 @@ public TradeInfo(TradeInfoBuilder builder) {
this.isFiatReceived = builder.isFiatReceived;
this.isPayoutPublished = builder.isPayoutPublished;
this.isWithdrawn = builder.isWithdrawn;
+ this.contractAsJson = builder.contractAsJson;
}
public static TradeInfo toTradeInfo(Trade trade) {
@@ -67,6 +91,18 @@ public static TradeInfo toTradeInfo(Trade trade) {
.withOffer(toOfferInfo(trade.getOffer()))
.withTradeId(trade.getId())
.withShortId(trade.getShortId())
+ .withDate(trade.getDate().getTime())
+ .withIsCurrencyForTakerFeeBtc(trade.isCurrencyForTakerFeeBtc())
+ .withTxFeeAsLong(trade.getTxFeeAsLong())
+ .withTakerFeeAsLong(trade.getTakerFeeAsLong())
+ .withTakerFeeAsLong(trade.getTakerFeeAsLong())
+ .withTakerFeeTxId(trade.getTakerFeeTxId())
+ .withDepositTxId(trade.getDepositTxId())
+ .withPayoutTxId(trade.getPayoutTxId())
+ .withTradeAmountAsLong(trade.getTradeAmountAsLong())
+ .withTradePrice(trade.getTradePrice().getValue())
+ .withTradingPeerNodeAddress(Objects.requireNonNull(
+ trade.getTradingPeerNodeAddress()).getHostNameWithoutPostFix())
.withState(trade.getState().name())
.withPhase(trade.getPhase().name())
.withTradePeriodState(trade.getTradePeriodState().name())
@@ -76,6 +112,7 @@ public static TradeInfo toTradeInfo(Trade trade) {
.withIsFiatReceived(trade.isFiatReceived())
.withIsPayoutPublished(trade.isPayoutPublished())
.withIsWithdrawn(trade.isWithdrawn())
+ .withContractAsJson(trade.getContractAsJson())
.build();
}
@@ -89,6 +126,16 @@ public bisq.proto.grpc.TradeInfo toProtoMessage() {
.setOffer(offer.toProtoMessage())
.setTradeId(tradeId)
.setShortId(shortId)
+ .setDate(date)
+ .setIsCurrencyForTakerFeeBtc(isCurrencyForTakerFeeBtc)
+ .setTxFeeAsLong(txFeeAsLong)
+ .setTakerFeeAsLong(takerFeeAsLong)
+ .setTakerFeeTxId(takerFeeTxId == null ? "" : takerFeeTxId)
+ .setDepositTxId(depositTxId == null ? "" : depositTxId)
+ .setPayoutTxId(payoutTxId == null ? "" : payoutTxId)
+ .setTradeAmountAsLong(tradeAmountAsLong)
+ .setTradePrice(tradePrice)
+ .setTradingPeerNodeAddress(tradingPeerNodeAddress)
.setState(state)
.setPhase(phase)
.setTradePeriodState(tradePeriodState)
@@ -98,12 +145,13 @@ public bisq.proto.grpc.TradeInfo toProtoMessage() {
.setIsFiatReceived(isFiatReceived)
.setIsPayoutPublished(isPayoutPublished)
.setIsWithdrawn(isWithdrawn)
+ .setContractAsJson(contractAsJson == null ? "" : contractAsJson)
.build();
}
+ @SuppressWarnings({"unused", "SameReturnValue"})
public static TradeInfo fromProto(bisq.proto.grpc.TradeInfo proto) {
- // TODO
- return null;
+ return null; // TODO
}
/*
@@ -116,6 +164,16 @@ public static class TradeInfoBuilder {
private OfferInfo offer;
private String tradeId;
private String shortId;
+ private long date;
+ private boolean isCurrencyForTakerFeeBtc;
+ private long txFeeAsLong;
+ private long takerFeeAsLong;
+ private String takerFeeTxId;
+ private String depositTxId;
+ private String payoutTxId;
+ private long tradeAmountAsLong;
+ private long tradePrice;
+ private String tradingPeerNodeAddress;
private String state;
private String phase;
private String tradePeriodState;
@@ -125,6 +183,7 @@ public static class TradeInfoBuilder {
private boolean isFiatReceived;
private boolean isPayoutPublished;
private boolean isWithdrawn;
+ private String contractAsJson;
public TradeInfoBuilder withOffer(OfferInfo offer) {
this.offer = offer;
@@ -141,6 +200,56 @@ public TradeInfoBuilder withShortId(String shortId) {
return this;
}
+ public TradeInfoBuilder withDate(long date) {
+ this.date = date;
+ return this;
+ }
+
+ public TradeInfoBuilder withIsCurrencyForTakerFeeBtc(boolean isCurrencyForTakerFeeBtc) {
+ this.isCurrencyForTakerFeeBtc = isCurrencyForTakerFeeBtc;
+ return this;
+ }
+
+ public TradeInfoBuilder withTxFeeAsLong(long txFeeAsLong) {
+ this.txFeeAsLong = txFeeAsLong;
+ return this;
+ }
+
+ public TradeInfoBuilder withTakerFeeAsLong(long takerFeeAsLong) {
+ this.takerFeeAsLong = takerFeeAsLong;
+ return this;
+ }
+
+ public TradeInfoBuilder withTakerFeeTxId(String takerFeeTxId) {
+ this.takerFeeTxId = takerFeeTxId;
+ return this;
+ }
+
+ public TradeInfoBuilder withDepositTxId(String depositTxId) {
+ this.depositTxId = depositTxId;
+ return this;
+ }
+
+ public TradeInfoBuilder withPayoutTxId(String payoutTxId) {
+ this.payoutTxId = payoutTxId;
+ return this;
+ }
+
+ public TradeInfoBuilder withTradeAmountAsLong(long tradeAmountAsLong) {
+ this.tradeAmountAsLong = tradeAmountAsLong;
+ return this;
+ }
+
+ public TradeInfoBuilder withTradePrice(long tradePrice) {
+ this.tradePrice = tradePrice;
+ return this;
+ }
+
+ public TradeInfoBuilder withTradePeriodState(String tradePeriodState) {
+ this.tradePeriodState = tradePeriodState;
+ return this;
+ }
+
public TradeInfoBuilder withState(String state) {
this.state = state;
return this;
@@ -151,8 +260,8 @@ public TradeInfoBuilder withPhase(String phase) {
return this;
}
- public TradeInfoBuilder withTradePeriodState(String tradePeriodState) {
- this.tradePeriodState = tradePeriodState;
+ public TradeInfoBuilder withTradingPeerNodeAddress(String tradingPeerNodeAddress) {
+ this.tradingPeerNodeAddress = tradingPeerNodeAddress;
return this;
}
@@ -186,6 +295,11 @@ public TradeInfoBuilder withIsWithdrawn(boolean isWithdrawn) {
return this;
}
+ public TradeInfoBuilder withContractAsJson(String contractAsJson) {
+ this.contractAsJson = contractAsJson;
+ return this;
+ }
+
public TradeInfo build() {
return new TradeInfo(this);
}
@@ -196,6 +310,16 @@ public String toString() {
return "TradeInfo{" +
" tradeId='" + tradeId + '\'' + "\n" +
", shortId='" + shortId + '\'' + "\n" +
+ ", date='" + date + '\'' + "\n" +
+ ", isCurrencyForTakerFeeBtc='" + isCurrencyForTakerFeeBtc + '\'' + "\n" +
+ ", txFeeAsLong='" + txFeeAsLong + '\'' + "\n" +
+ ", takerFeeAsLong='" + takerFeeAsLong + '\'' + "\n" +
+ ", takerFeeTxId='" + takerFeeTxId + '\'' + "\n" +
+ ", depositTxId='" + depositTxId + '\'' + "\n" +
+ ", payoutTxId='" + payoutTxId + '\'' + "\n" +
+ ", tradeAmountAsLong='" + tradeAmountAsLong + '\'' + "\n" +
+ ", tradePrice='" + tradePrice + '\'' + "\n" +
+ ", tradingPeerNodeAddress='" + tradingPeerNodeAddress + '\'' + "\n" +
", state='" + state + '\'' + "\n" +
", phase='" + phase + '\'' + "\n" +
", tradePeriodState='" + tradePeriodState + '\'' + "\n" +
@@ -206,6 +330,7 @@ public String toString() {
", isPayoutPublished=" + isPayoutPublished + "\n" +
", isWithdrawn=" + isWithdrawn + "\n" +
", offer=" + offer + "\n" +
+ ", contractAsJson=" + contractAsJson + "\n" +
'}';
}
}
diff --git a/core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java b/core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java
index efd0523ec19..c48b3c8ad4c 100644
--- a/core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java
+++ b/core/src/main/java/bisq/core/offer/takeoffer/TakeOfferModel.java
@@ -1,3 +1,20 @@
+/*
+ * This file is part of Bisq.
+ *
+ * Bisq 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.
+ *
+ * Bisq 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 Bisq. If not, see .
+ */
+
package bisq.core.offer.takeoffer;
import bisq.core.account.witness.AccountAgeWitnessService;
@@ -20,6 +37,8 @@
import javax.inject.Inject;
import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@@ -141,12 +160,19 @@ private void calculateTxFees() {
// Payout tx: 371 bytes
// Disputed payout tx: 408 bytes
- // Request actual fees:
- log.info("Start requestTxFee: txFeeFromFeeService={}", txFeeFromFeeService);
- feeService.requestFees(() -> {
- txFeePerByteFromFeeService = feeService.getTxFeePerByte();
- txFeeFromFeeService = offerUtil.getTxFeeBySize(txFeePerByteFromFeeService, feeTxSize);
- });
+ txFeePerByteFromFeeService = getTxFeePerByte();
+ txFeeFromFeeService = offerUtil.getTxFeeBySize(txFeePerByteFromFeeService, feeTxSize);
+ log.info("{} txFeePerByte = {}", feeService.getClass().getSimpleName(), txFeePerByteFromFeeService);
+ }
+
+ private Coin getTxFeePerByte() {
+ try {
+ CompletableFuture feeRequestFuture = CompletableFuture.runAsync(feeService::requestFees);
+ feeRequestFuture.get(); // Block until async fee request is complete.
+ return feeService.getTxFeePerByte();
+ } catch (InterruptedException | ExecutionException e) {
+ throw new IllegalStateException("Could not request fees from fee service.", e);
+ }
}
private void calculateTotalToPay() {
diff --git a/core/src/main/java/bisq/core/trade/TradeManager.java b/core/src/main/java/bisq/core/trade/TradeManager.java
index 0d8d02a2414..d8278018d56 100644
--- a/core/src/main/java/bisq/core/trade/TradeManager.java
+++ b/core/src/main/java/bisq/core/trade/TradeManager.java
@@ -120,6 +120,7 @@ public class TradeManager implements PersistedDataHost, DecryptedDirectMessageLi
private final P2PService p2PService;
private final PriceFeedService priceFeedService;
private final TradeStatisticsManager tradeStatisticsManager;
+ private final TradeUtil tradeUtil;
@Getter
private final ArbitratorManager arbitratorManager;
private final MediatorManager mediatorManager;
@@ -157,6 +158,7 @@ public TradeManager(User user,
P2PService p2PService,
PriceFeedService priceFeedService,
TradeStatisticsManager tradeStatisticsManager,
+ TradeUtil tradeUtil,
ArbitratorManager arbitratorManager,
MediatorManager mediatorManager,
ProcessModelServiceProvider processModelServiceProvider,
@@ -175,6 +177,7 @@ public TradeManager(User user,
this.p2PService = p2PService;
this.priceFeedService = priceFeedService;
this.tradeStatisticsManager = tradeStatisticsManager;
+ this.tradeUtil = tradeUtil;
this.arbitratorManager = arbitratorManager;
this.mediatorManager = mediatorManager;
this.processModelServiceProvider = processModelServiceProvider;
@@ -634,7 +637,7 @@ private boolean unFailTrade(Trade trade) {
// the relevant entries are changed, otherwise it's not added and no address entries are changed
private boolean recoverAddresses(Trade trade) {
// Find addresses associated with this trade.
- var entries = TradeUtils.getAvailableAddresses(trade, btcWalletService, keyRing);
+ var entries = tradeUtil.getAvailableAddresses(trade);
if (entries == null)
return false;
diff --git a/core/src/main/java/bisq/core/trade/TradeUtils.java b/core/src/main/java/bisq/core/trade/TradeUtil.java
similarity index 62%
rename from core/src/main/java/bisq/core/trade/TradeUtils.java
rename to core/src/main/java/bisq/core/trade/TradeUtil.java
index 10a5da8fdf8..c93e5e2be3b 100644
--- a/core/src/main/java/bisq/core/trade/TradeUtils.java
+++ b/core/src/main/java/bisq/core/trade/TradeUtil.java
@@ -23,20 +23,44 @@
import bisq.common.util.Tuple2;
import bisq.common.util.Utilities;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
import java.util.Objects;
-public class TradeUtils {
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * This class contains trade utility methods.
+ */
+@Slf4j
+@Singleton
+public class TradeUtil {
+
+ private final BtcWalletService btcWalletService;
+ private final KeyRing keyRing;
- // Returns if both are AVAILABLE, otherwise null
- static Tuple2 getAvailableAddresses(Trade trade, BtcWalletService btcWalletService,
- KeyRing keyRing) {
- var addresses = getTradeAddresses(trade, btcWalletService, keyRing);
+ @Inject
+ public TradeUtil(BtcWalletService btcWalletService, KeyRing keyRing) {
+ this.btcWalletService = btcWalletService;
+ this.keyRing = keyRing;
+ }
+
+ /**
+ * Returns if and only if both are AVAILABLE,
+ * otherwise null.
+ * @param trade the trade being queried for MULTI_SIG, TRADE_PAYOUT addresses
+ * @return Tuple2 tuple containing MULTI_SIG, TRADE_PAYOUT addresses for trade
+ */
+ public Tuple2 getAvailableAddresses(Trade trade) {
+ var addresses = getTradeAddresses(trade);
if (addresses == null)
return null;
if (btcWalletService.getAvailableAddressEntries().stream()
.noneMatch(e -> Objects.equals(e.getAddressString(), addresses.first)))
return null;
+
if (btcWalletService.getAvailableAddressEntries().stream()
.noneMatch(e -> Objects.equals(e.getAddressString(), addresses.second)))
return null;
@@ -44,18 +68,25 @@ static Tuple2 getAvailableAddresses(Trade trade, BtcWalletServic
return new Tuple2<>(addresses.first, addresses.second);
}
- // Returns addresses as strings if they're known by the wallet
- public static Tuple2 getTradeAddresses(Trade trade, BtcWalletService btcWalletService,
- KeyRing keyRing) {
+ /**
+ * Returns addresses as strings if they're known by the
+ * wallet.
+ * @param trade the trade being queried for MULTI_SIG, TRADE_PAYOUT addresses
+ * @return Tuple2 tuple containing MULTI_SIG, TRADE_PAYOUT addresses for trade
+ */
+ public Tuple2 getTradeAddresses(Trade trade) {
var contract = trade.getContract();
if (contract == null)
return null;
// Get multisig address
var isMyRoleBuyer = contract.isMyRoleBuyer(keyRing.getPubKeyRing());
- var multiSigPubKey = isMyRoleBuyer ? contract.getBuyerMultiSigPubKey() : contract.getSellerMultiSigPubKey();
+ var multiSigPubKey = isMyRoleBuyer
+ ? contract.getBuyerMultiSigPubKey()
+ : contract.getSellerMultiSigPubKey();
if (multiSigPubKey == null)
return null;
+
var multiSigPubKeyString = Utilities.bytesAsHexString(multiSigPubKey);
var multiSigAddress = btcWalletService.getAddressEntryListAsImmutableList().stream()
.filter(e -> e.getKeyPair().getPublicKeyAsHex().equals(multiSigPubKeyString))
@@ -65,8 +96,9 @@ public static Tuple2 getTradeAddresses(Trade trade, BtcWalletSer
return null;
// Get payout address
- var payoutAddress = isMyRoleBuyer ?
- contract.getBuyerPayoutAddressString() : contract.getSellerPayoutAddressString();
+ var payoutAddress = isMyRoleBuyer
+ ? contract.getBuyerPayoutAddressString()
+ : contract.getSellerPayoutAddressString();
var payoutAddressEntry = btcWalletService.getAddressEntryListAsImmutableList().stream()
.filter(e -> Objects.equals(e.getAddressString(), payoutAddress))
.findAny()
diff --git a/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java b/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java
index a584f6b783f..4782ef080d2 100644
--- a/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java
+++ b/core/src/main/java/bisq/core/trade/failed/FailedTradesManager.java
@@ -24,7 +24,7 @@
import bisq.core.trade.DumpDelayedPayoutTx;
import bisq.core.trade.TradableList;
import bisq.core.trade.Trade;
-import bisq.core.trade.TradeUtils;
+import bisq.core.trade.TradeUtil;
import bisq.common.crypto.KeyRing;
import bisq.common.persistence.PersistenceManager;
@@ -50,6 +50,7 @@ public class FailedTradesManager implements PersistedDataHost {
private final PriceFeedService priceFeedService;
private final BtcWalletService btcWalletService;
private final PersistenceManager> persistenceManager;
+ private final TradeUtil tradeUtil;
private final DumpDelayedPayoutTx dumpDelayedPayoutTx;
@Setter
private Function unFailTradeCallback;
@@ -59,12 +60,14 @@ public FailedTradesManager(KeyRing keyRing,
PriceFeedService priceFeedService,
BtcWalletService btcWalletService,
PersistenceManager> persistenceManager,
+ TradeUtil tradeUtil,
DumpDelayedPayoutTx dumpDelayedPayoutTx) {
this.keyRing = keyRing;
this.priceFeedService = priceFeedService;
this.btcWalletService = btcWalletService;
this.dumpDelayedPayoutTx = dumpDelayedPayoutTx;
this.persistenceManager = persistenceManager;
+ this.tradeUtil = tradeUtil;
this.persistenceManager.initialize(failedTrades, "FailedTrades", PersistenceManager.Source.PRIVATE);
}
@@ -127,7 +130,7 @@ public void unFailTrade(Trade trade) {
}
public String checkUnFail(Trade trade) {
- var addresses = TradeUtils.getTradeAddresses(trade, btcWalletService, keyRing);
+ var addresses = tradeUtil.getTradeAddresses(trade);
if (addresses == null) {
return "Addresses not found";
}
diff --git a/proto/src/main/proto/grpc.proto b/proto/src/main/proto/grpc.proto
index 38ddd4a9dbb..68121d00596 100644
--- a/proto/src/main/proto/grpc.proto
+++ b/proto/src/main/proto/grpc.proto
@@ -217,15 +217,26 @@ message TradeInfo {
OfferInfo offer = 1;
string tradeId = 2;
string shortId = 3;
- string state = 4;
- string phase = 5;
- string tradePeriodState = 6;
- bool isDepositPublished = 7;
- bool isDepositConfirmed = 8;
- bool isFiatSent = 9;
- bool isFiatReceived = 10;
- bool isPayoutPublished = 11;
- bool isWithdrawn = 12;
+ uint64 date = 4;
+ bool isCurrencyForTakerFeeBtc = 5;
+ uint64 txFeeAsLong = 6;
+ uint64 takerFeeAsLong = 7;
+ string takerFeeTxId = 8;
+ string depositTxId = 9;
+ string payoutTxId = 10;
+ uint64 tradeAmountAsLong = 11;
+ uint64 tradePrice = 12;
+ string tradingPeerNodeAddress = 13;
+ string state = 14;
+ string phase = 15;
+ string tradePeriodState = 16;
+ bool isDepositPublished = 17;
+ bool isDepositConfirmed = 18;
+ bool isFiatSent = 19;
+ bool isFiatReceived = 20;
+ bool isPayoutPublished = 21;
+ bool isWithdrawn = 22;
+ string contractAsJson = 23;
}
///////////////////////////////////////////////////////////////////////////////////////////