From 70ec8cb11fa72e6203ffe1f6f17b2b3b22360d94 Mon Sep 17 00:00:00 2001 From: catbref Date: Fri, 18 Dec 2020 11:42:53 +0000 Subject: [PATCH] Add public key in Qortal address form to tradeoffers and presence websockets This aids matching PRESENCE to corresponding trade offers for use in UI. Also tighten up visibility of some fields in ChainChainOfferSummary and PresenceInfo to private. PresenceInfo.address should map to CrossChainOfferSummary.qortalCreatorTradeAddress which is "AT creator's ephemeral trading key-pair represented as Qortal address" --- .../api/model/CrossChainOfferSummary.java | 13 +++++++++++-- .../api/websocket/PresenceWebSocket.java | 14 +++++++++++--- .../api/websocket/TradeOffersWebSocket.java | 18 ++++++++++-------- .../data/crosschain/CrossChainTradeData.java | 2 +- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/qortal/api/model/CrossChainOfferSummary.java b/src/main/java/org/qortal/api/model/CrossChainOfferSummary.java index 97ab7eb8..bf71c2d2 100644 --- a/src/main/java/org/qortal/api/model/CrossChainOfferSummary.java +++ b/src/main/java/org/qortal/api/model/CrossChainOfferSummary.java @@ -16,10 +16,13 @@ public class CrossChainOfferSummary { // Properties @Schema(description = "AT's Qortal address") - public String qortalAtAddress; + private String qortalAtAddress; @Schema(description = "AT creator's Qortal address") - public String qortalCreator; + private String qortalCreator; + + @Schema(description = "AT creator's ephemeral trading key-pair represented as Qortal address") + private String qortalCreatorTradeAddress; @XmlJavaTypeAdapter(value = org.qortal.api.AmountTypeAdapter.class) private long qortAmount; @@ -41,6 +44,7 @@ public class CrossChainOfferSummary { private long timestamp; + @Schema(description = "Trade partner's Qortal receiving address") private String partnerQortalReceivingAddress; private String foreignBlockchain; @@ -54,6 +58,7 @@ public class CrossChainOfferSummary { public CrossChainOfferSummary(CrossChainTradeData crossChainTradeData, long timestamp) { this.qortalAtAddress = crossChainTradeData.qortalAtAddress; this.qortalCreator = crossChainTradeData.qortalCreator; + this.qortalCreatorTradeAddress = crossChainTradeData.qortalCreatorTradeAddress; this.qortAmount = crossChainTradeData.qortAmount; this.foreignAmount = crossChainTradeData.expectedForeignAmount; this.btcAmount = this.foreignAmount; // Duplicate for deprecated field @@ -73,6 +78,10 @@ public class CrossChainOfferSummary { return this.qortalCreator; } + public String getQortalCreatorTradeAddress() { + return this.qortalCreatorTradeAddress; + } + public long getQortAmount() { return this.qortAmount; } diff --git a/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java b/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java index e4eef0ae..27bc603f 100644 --- a/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java @@ -20,6 +20,7 @@ import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.api.annotations.WebSocket; import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; import org.qortal.controller.Controller; +import org.qortal.crypto.Crypto; import org.qortal.data.transaction.PresenceTransactionData; import org.qortal.data.transaction.TransactionData; import org.qortal.event.Event; @@ -39,20 +40,23 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener { @XmlAccessorType(XmlAccessType.FIELD) @SuppressWarnings("unused") private static class PresenceInfo { - public final PresenceType presenceType; - public final String publicKey; - public final long timestamp; + private final PresenceType presenceType; + private final String publicKey; + private final long timestamp; + private final String address; protected PresenceInfo() { this.presenceType = null; this.publicKey = null; this.timestamp = 0L; + this.address = null; } public PresenceInfo(PresenceType presenceType, String pubKey58, long timestamp) { this.presenceType = presenceType; this.publicKey = pubKey58; this.timestamp = timestamp; + this.address = Crypto.toAddress(Base58.decode(this.publicKey)); } public PresenceType getPresenceType() { @@ -66,6 +70,10 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener { public long getTimestamp() { return this.timestamp; } + + public String getAddress() { + return this.address; + } } /** Outer map key is PresenceType (enum), inner map key is public key in base58, inner map value is timestamp */ diff --git a/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java b/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java index 59a16344..f03b05ae 100644 --- a/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java @@ -122,25 +122,27 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener { // Update for (CrossChainOfferSummary offerSummary : crossChainOfferSummaries) { - cachedInfo.previousAtModes.put(offerSummary.qortalAtAddress, offerSummary.getMode()); - LOGGER.trace(() -> String.format("Block height: %d, AT: %s, mode: %s", blockData.getHeight(), offerSummary.qortalAtAddress, offerSummary.getMode().name())); + String offerAtAddress = offerSummary.getQortalAtAddress(); + + cachedInfo.previousAtModes.put(offerAtAddress, offerSummary.getMode()); + LOGGER.trace(() -> String.format("Block height: %d, AT: %s, mode: %s", blockData.getHeight(), offerAtAddress, offerSummary.getMode().name())); switch (offerSummary.getMode()) { case OFFERING: - cachedInfo.currentSummaries.put(offerSummary.qortalAtAddress, offerSummary); - cachedInfo.historicSummaries.remove(offerSummary.qortalAtAddress); + cachedInfo.currentSummaries.put(offerAtAddress, offerSummary); + cachedInfo.historicSummaries.remove(offerAtAddress); break; case REDEEMED: case REFUNDED: case CANCELLED: - cachedInfo.currentSummaries.remove(offerSummary.qortalAtAddress); - cachedInfo.historicSummaries.put(offerSummary.qortalAtAddress, offerSummary); + cachedInfo.currentSummaries.remove(offerAtAddress); + cachedInfo.historicSummaries.put(offerAtAddress, offerSummary); break; case TRADING: - cachedInfo.currentSummaries.remove(offerSummary.qortalAtAddress); - cachedInfo.historicSummaries.remove(offerSummary.qortalAtAddress); + cachedInfo.currentSummaries.remove(offerAtAddress); + cachedInfo.historicSummaries.remove(offerAtAddress); break; } } diff --git a/src/main/java/org/qortal/data/crosschain/CrossChainTradeData.java b/src/main/java/org/qortal/data/crosschain/CrossChainTradeData.java index 76b6a930..69250e54 100644 --- a/src/main/java/org/qortal/data/crosschain/CrossChainTradeData.java +++ b/src/main/java/org/qortal/data/crosschain/CrossChainTradeData.java @@ -20,7 +20,7 @@ public class CrossChainTradeData { @Schema(description = "AT creator's Qortal address") public String qortalCreator; - @Schema(description = "AT creator's Qortal trade address") + @Schema(description = "AT creator's ephemeral trading key-pair represented as Qortal address") public String qortalCreatorTradeAddress; @Deprecated