diff --git a/core/src/main/java/io/bisq/core/payment/payload/PaymentAccountPayload.java b/core/src/main/java/io/bisq/core/payment/payload/PaymentAccountPayload.java index d5bbed9c1e..00da7b28bb 100644 --- a/core/src/main/java/io/bisq/core/payment/payload/PaymentAccountPayload.java +++ b/core/src/main/java/io/bisq/core/payment/payload/PaymentAccountPayload.java @@ -24,6 +24,9 @@ import lombok.Getter; import lombok.ToString; import lombok.extern.slf4j.Slf4j; +// That class is used in the contract for creating the contract json. Any change will break the contract. +// If a field gets added it need to be be annotated with @JsonExclude (excluded from contract). + @Getter @EqualsAndHashCode @ToString diff --git a/core/src/main/java/io/bisq/core/trade/Contract.java b/core/src/main/java/io/bisq/core/trade/Contract.java index 765294c4af..e4e86b344b 100644 --- a/core/src/main/java/io/bisq/core/trade/Contract.java +++ b/core/src/main/java/io/bisq/core/trade/Contract.java @@ -29,12 +29,15 @@ import io.bisq.core.proto.CoreProtoResolver; import io.bisq.generated.protobuffer.PB; import io.bisq.network.p2p.NodeAddress; import lombok.Value; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.bitcoinj.core.Coin; import javax.annotation.Nullable; import static com.google.common.base.Preconditions.checkArgument; +@Slf4j @Value public final class Contract implements NetworkPayload { private final OfferPayload offerPayload; @@ -210,6 +213,25 @@ public final class Contract implements NetworkPayload { return Price.valueOf(offerPayload.getCurrencyCode(), tradePrice); } + public void printDiff(@Nullable String peersContractAsJson) { + final String json = Utilities.objectToJson(this); + String diff = StringUtils.difference(json, peersContractAsJson); + if (!diff.isEmpty()) { + log.warn("Diff of both contracts: \n" + diff); + log.warn("\n\n------------------------------------------------------------\n" + + "Contract as json\n" + + json + + "\n------------------------------------------------------------\n"); + + log.warn("\n\n------------------------------------------------------------\n" + + "Peers contract as json\n" + + peersContractAsJson + + "\n------------------------------------------------------------\n"); + } else { + log.debug("Both contracts are the same"); + } + } + @Override public String toString() { return "Contract{" + diff --git a/core/src/main/java/io/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignAndPublishDepositTx.java b/core/src/main/java/io/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignAndPublishDepositTx.java index 6374d5ba62..0c063a9995 100644 --- a/core/src/main/java/io/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignAndPublishDepositTx.java +++ b/core/src/main/java/io/bisq/core/trade/protocol/tasks/seller_as_taker/SellerAsTakerSignAndPublishDepositTx.java @@ -124,6 +124,7 @@ public class SellerAsTakerSignAndPublishDepositTx extends TradeTask { }); trade.setDepositTx(depositTx); } catch (Throwable t) { + trade.getContract().printDiff(processModel.getTradingPeer().getContractAsJson()); failed(t); } } diff --git a/core/src/main/java/io/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java b/core/src/main/java/io/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java index 8c79e682fa..d00fd5b47e 100644 --- a/core/src/main/java/io/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java +++ b/core/src/main/java/io/bisq/core/trade/protocol/tasks/taker/TakerVerifyAndSignContract.java @@ -97,11 +97,14 @@ public class TakerVerifyAndSignContract extends TradeTask { ); String contractAsJson = Utilities.objectToJson(contract); log.trace("Contract as json:{}", contractAsJson); + + contract.printDiff(processModel.getTradingPeer().getContractAsJson()); + checkArgument(contractAsJson.equals(processModel.getTradingPeer().getContractAsJson()), "Contracts are not matching"); + String signature = Sig.sign(processModel.getKeyRing().getSignatureKeyPair().getPrivate(), contractAsJson); trade.setContract(contract); trade.setContractAsJson(contractAsJson); trade.setTakerContractSignature(signature); - try { checkNotNull(maker.getPubKeyRing(), "maker.getPubKeyRing() must nto be null"); Sig.verify(maker.getPubKeyRing().getSignaturePubKey(),