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"
This commit is contained in:
catbref 2020-12-18 11:42:53 +00:00
parent 0f0266609f
commit 70ec8cb11f
4 changed files with 33 additions and 14 deletions

View File

@ -16,10 +16,13 @@ public class CrossChainOfferSummary {
// Properties // Properties
@Schema(description = "AT's Qortal address") @Schema(description = "AT's Qortal address")
public String qortalAtAddress; private String qortalAtAddress;
@Schema(description = "AT creator's Qortal address") @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) @XmlJavaTypeAdapter(value = org.qortal.api.AmountTypeAdapter.class)
private long qortAmount; private long qortAmount;
@ -41,6 +44,7 @@ public class CrossChainOfferSummary {
private long timestamp; private long timestamp;
@Schema(description = "Trade partner's Qortal receiving address")
private String partnerQortalReceivingAddress; private String partnerQortalReceivingAddress;
private String foreignBlockchain; private String foreignBlockchain;
@ -54,6 +58,7 @@ public class CrossChainOfferSummary {
public CrossChainOfferSummary(CrossChainTradeData crossChainTradeData, long timestamp) { public CrossChainOfferSummary(CrossChainTradeData crossChainTradeData, long timestamp) {
this.qortalAtAddress = crossChainTradeData.qortalAtAddress; this.qortalAtAddress = crossChainTradeData.qortalAtAddress;
this.qortalCreator = crossChainTradeData.qortalCreator; this.qortalCreator = crossChainTradeData.qortalCreator;
this.qortalCreatorTradeAddress = crossChainTradeData.qortalCreatorTradeAddress;
this.qortAmount = crossChainTradeData.qortAmount; this.qortAmount = crossChainTradeData.qortAmount;
this.foreignAmount = crossChainTradeData.expectedForeignAmount; this.foreignAmount = crossChainTradeData.expectedForeignAmount;
this.btcAmount = this.foreignAmount; // Duplicate for deprecated field this.btcAmount = this.foreignAmount; // Duplicate for deprecated field
@ -73,6 +78,10 @@ public class CrossChainOfferSummary {
return this.qortalCreator; return this.qortalCreator;
} }
public String getQortalCreatorTradeAddress() {
return this.qortalCreatorTradeAddress;
}
public long getQortAmount() { public long getQortAmount() {
return this.qortAmount; return this.qortAmount;
} }

View File

@ -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.api.annotations.WebSocket;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
import org.qortal.controller.Controller; import org.qortal.controller.Controller;
import org.qortal.crypto.Crypto;
import org.qortal.data.transaction.PresenceTransactionData; import org.qortal.data.transaction.PresenceTransactionData;
import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.TransactionData;
import org.qortal.event.Event; import org.qortal.event.Event;
@ -39,20 +40,23 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener {
@XmlAccessorType(XmlAccessType.FIELD) @XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static class PresenceInfo { private static class PresenceInfo {
public final PresenceType presenceType; private final PresenceType presenceType;
public final String publicKey; private final String publicKey;
public final long timestamp; private final long timestamp;
private final String address;
protected PresenceInfo() { protected PresenceInfo() {
this.presenceType = null; this.presenceType = null;
this.publicKey = null; this.publicKey = null;
this.timestamp = 0L; this.timestamp = 0L;
this.address = null;
} }
public PresenceInfo(PresenceType presenceType, String pubKey58, long timestamp) { public PresenceInfo(PresenceType presenceType, String pubKey58, long timestamp) {
this.presenceType = presenceType; this.presenceType = presenceType;
this.publicKey = pubKey58; this.publicKey = pubKey58;
this.timestamp = timestamp; this.timestamp = timestamp;
this.address = Crypto.toAddress(Base58.decode(this.publicKey));
} }
public PresenceType getPresenceType() { public PresenceType getPresenceType() {
@ -66,6 +70,10 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener {
public long getTimestamp() { public long getTimestamp() {
return this.timestamp; 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 */ /** Outer map key is PresenceType (enum), inner map key is public key in base58, inner map value is timestamp */

View File

@ -122,25 +122,27 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
// Update // Update
for (CrossChainOfferSummary offerSummary : crossChainOfferSummaries) { for (CrossChainOfferSummary offerSummary : crossChainOfferSummaries) {
cachedInfo.previousAtModes.put(offerSummary.qortalAtAddress, offerSummary.getMode()); String offerAtAddress = offerSummary.getQortalAtAddress();
LOGGER.trace(() -> String.format("Block height: %d, AT: %s, mode: %s", blockData.getHeight(), offerSummary.qortalAtAddress, offerSummary.getMode().name()));
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()) { switch (offerSummary.getMode()) {
case OFFERING: case OFFERING:
cachedInfo.currentSummaries.put(offerSummary.qortalAtAddress, offerSummary); cachedInfo.currentSummaries.put(offerAtAddress, offerSummary);
cachedInfo.historicSummaries.remove(offerSummary.qortalAtAddress); cachedInfo.historicSummaries.remove(offerAtAddress);
break; break;
case REDEEMED: case REDEEMED:
case REFUNDED: case REFUNDED:
case CANCELLED: case CANCELLED:
cachedInfo.currentSummaries.remove(offerSummary.qortalAtAddress); cachedInfo.currentSummaries.remove(offerAtAddress);
cachedInfo.historicSummaries.put(offerSummary.qortalAtAddress, offerSummary); cachedInfo.historicSummaries.put(offerAtAddress, offerSummary);
break; break;
case TRADING: case TRADING:
cachedInfo.currentSummaries.remove(offerSummary.qortalAtAddress); cachedInfo.currentSummaries.remove(offerAtAddress);
cachedInfo.historicSummaries.remove(offerSummary.qortalAtAddress); cachedInfo.historicSummaries.remove(offerAtAddress);
break; break;
} }
} }

View File

@ -20,7 +20,7 @@ public class CrossChainTradeData {
@Schema(description = "AT creator's Qortal address") @Schema(description = "AT creator's Qortal address")
public String qortalCreator; 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; public String qortalCreatorTradeAddress;
@Deprecated @Deprecated