Fix API/websockets that were still BitcoinACCTv1-only

This commit is contained in:
catbref 2020-12-10 12:48:46 +00:00
parent acc616c204
commit d766cfaa67
3 changed files with 65 additions and 36 deletions

View File

@ -43,6 +43,10 @@ public class CrossChainOfferSummary {
private String partnerQortalReceivingAddress; private String partnerQortalReceivingAddress;
private String foreignBlockchain;
private String acctName;
protected CrossChainOfferSummary() { protected CrossChainOfferSummary() {
/* For JAXB */ /* For JAXB */
} }
@ -57,6 +61,8 @@ public class CrossChainOfferSummary {
this.mode = crossChainTradeData.mode; this.mode = crossChainTradeData.mode;
this.timestamp = timestamp; this.timestamp = timestamp;
this.partnerQortalReceivingAddress = crossChainTradeData.qortalPartnerReceivingAddress; this.partnerQortalReceivingAddress = crossChainTradeData.qortalPartnerReceivingAddress;
this.foreignBlockchain = crossChainTradeData.foreignBlockchain;
this.acctName = crossChainTradeData.acctName;
} }
public String getQortalAtAddress() { public String getQortalAtAddress() {
@ -95,6 +101,14 @@ public class CrossChainOfferSummary {
return this.partnerQortalReceivingAddress; return this.partnerQortalReceivingAddress;
} }
public String getForeignBlockchain() {
return this.foreignBlockchain;
}
public String getAcctName() {
return this.acctName;
}
// For debugging mostly // For debugging mostly
public String toString() { public String toString() {

View File

@ -32,7 +32,6 @@ import org.qortal.api.ApiExceptionFactory;
import org.qortal.api.Security; import org.qortal.api.Security;
import org.qortal.api.model.CrossChainCancelRequest; import org.qortal.api.model.CrossChainCancelRequest;
import org.qortal.api.model.CrossChainTradeSummary; import org.qortal.api.model.CrossChainTradeSummary;
import org.qortal.crosschain.BitcoinACCTv1;
import org.qortal.crosschain.SupportedBlockchain; import org.qortal.crosschain.SupportedBlockchain;
import org.qortal.crosschain.ACCT; import org.qortal.crosschain.ACCT;
import org.qortal.crosschain.AcctMode; import org.qortal.crosschain.AcctMode;
@ -267,10 +266,6 @@ public class CrossChainResource {
if (atData == null) if (atData == null)
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.ADDRESS_UNKNOWN); throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.ADDRESS_UNKNOWN);
// Must be correct AT - check functionality using code hash
if (!Arrays.equals(atData.getCodeHash(), BitcoinACCTv1.CODE_BYTES_HASH))
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
// No point sending message to AT that's finished // No point sending message to AT that's finished
if (atData.getIsFinished()) if (atData.getIsFinished())
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);

View File

@ -7,6 +7,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
@ -20,7 +21,8 @@ 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.api.model.CrossChainOfferSummary; import org.qortal.api.model.CrossChainOfferSummary;
import org.qortal.controller.Controller; import org.qortal.controller.Controller;
import org.qortal.crosschain.BitcoinACCTv1; import org.qortal.crosschain.SupportedBlockchain;
import org.qortal.crosschain.ACCT;
import org.qortal.crosschain.AcctMode; import org.qortal.crosschain.AcctMode;
import org.qortal.data.at.ATStateData; import org.qortal.data.at.ATStateData;
import org.qortal.data.block.BlockData; import org.qortal.data.block.BlockData;
@ -31,6 +33,7 @@ import org.qortal.event.Listener;
import org.qortal.repository.DataException; import org.qortal.repository.DataException;
import org.qortal.repository.Repository; import org.qortal.repository.Repository;
import org.qortal.repository.RepositoryManager; import org.qortal.repository.RepositoryManager;
import org.qortal.utils.ByteArray;
import org.qortal.utils.NTP; import org.qortal.utils.NTP;
@WebSocket @WebSocket
@ -76,7 +79,7 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
BlockData blockData = ((Controller.NewBlockEvent) event).getBlockData(); BlockData blockData = ((Controller.NewBlockEvent) event).getBlockData();
// Process any new info // Process any new info
List<CrossChainOfferSummary> crossChainOfferSummaries; List<CrossChainOfferSummary> crossChainOfferSummaries = new ArrayList<>();
try (final Repository repository = RepositoryManager.getRepository()) { try (final Repository repository = RepositoryManager.getRepository()) {
// Find any new/changed trade ATs since this block // Find any new/changed trade ATs since this block
@ -85,14 +88,18 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
final Long expectedValue = null; final Long expectedValue = null;
final Integer minimumFinalHeight = blockData.getHeight(); final Integer minimumFinalHeight = blockData.getHeight();
List<ATStateData> atStates = repository.getATRepository().getMatchingFinalATStates(BitcoinACCTv1.CODE_BYTES_HASH, // Loop for all different types of trade offer?
Map<ByteArray, Supplier<ACCT>> acctsByCodeHash = SupportedBlockchain.getAcctMap();
for (Map.Entry<ByteArray, Supplier<ACCT>> acctInfo : acctsByCodeHash.entrySet()) {
byte[] codeHash = acctInfo.getKey().value;
ACCT acct = acctInfo.getValue().get();
List<ATStateData> atStates = repository.getATRepository().getMatchingFinalATStates(codeHash,
isFinished, dataByteOffset, expectedValue, minimumFinalHeight, isFinished, dataByteOffset, expectedValue, minimumFinalHeight,
null, null, null); null, null, null);
if (atStates == null) crossChainOfferSummaries.addAll(produceSummaries(repository, acct, atStates, blockData.getTimestamp()));
return; }
crossChainOfferSummaries = produceSummaries(repository, atStates, blockData.getTimestamp());
} catch (DataException e) { } catch (DataException e) {
// No output this time // No output this time
return; return;
@ -198,11 +205,16 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
private static void populateCurrentSummaries(Repository repository) throws DataException { private static void populateCurrentSummaries(Repository repository) throws DataException {
// We want ALL OFFERING trades // We want ALL OFFERING trades
Boolean isFinished = Boolean.FALSE; Boolean isFinished = Boolean.FALSE;
Integer dataByteOffset = BitcoinACCTv1.MODE_BYTE_OFFSET;
Long expectedValue = (long) AcctMode.OFFERING.value; Long expectedValue = (long) AcctMode.OFFERING.value;
Integer minimumFinalHeight = null; Integer minimumFinalHeight = null;
List<ATStateData> initialAtStates = repository.getATRepository().getMatchingFinalATStates(BitcoinACCTv1.CODE_BYTES_HASH, Map<ByteArray, Supplier<ACCT>> acctsByCodeHash = SupportedBlockchain.getAcctMap();
for (Map.Entry<ByteArray, Supplier<ACCT>> acctInfo : acctsByCodeHash.entrySet()) {
byte[] codeHash = acctInfo.getKey().value;
ACCT acct = acctInfo.getValue().get();
Integer dataByteOffset = acct.getModeByteOffset();
List<ATStateData> initialAtStates = repository.getATRepository().getMatchingFinalATStates(codeHash,
isFinished, dataByteOffset, expectedValue, minimumFinalHeight, isFinished, dataByteOffset, expectedValue, minimumFinalHeight,
null, null, null); null, null, null);
@ -213,7 +225,9 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
previousAtModes.putAll(initialAtStates.stream().collect(Collectors.toMap(ATStateData::getATAddress, atState -> AcctMode.OFFERING))); previousAtModes.putAll(initialAtStates.stream().collect(Collectors.toMap(ATStateData::getATAddress, atState -> AcctMode.OFFERING)));
// Convert to offer summaries // Convert to offer summaries
currentSummaries.putAll(produceSummaries(repository, initialAtStates, null).stream().collect(Collectors.toMap(CrossChainOfferSummary::getQortalAtAddress, offerSummary -> offerSummary))); currentSummaries.putAll(produceSummaries(repository, acct, initialAtStates, null).stream()
.collect(Collectors.toMap(CrossChainOfferSummary::getQortalAtAddress, offerSummary -> offerSummary)));
}
} }
private static void populateHistoricSummaries(Repository repository) throws DataException { private static void populateHistoricSummaries(Repository repository) throws DataException {
@ -229,7 +243,12 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
Long expectedValue = null; Long expectedValue = null;
++minimumFinalHeight; // because height is just *before* timestamp ++minimumFinalHeight; // because height is just *before* timestamp
List<ATStateData> historicAtStates = repository.getATRepository().getMatchingFinalATStates(BitcoinACCTv1.CODE_BYTES_HASH, Map<ByteArray, Supplier<ACCT>> acctsByCodeHash = SupportedBlockchain.getAcctMap();
for (Map.Entry<ByteArray, Supplier<ACCT>> acctInfo : acctsByCodeHash.entrySet()) {
byte[] codeHash = acctInfo.getKey().value;
ACCT acct = acctInfo.getValue().get();
List<ATStateData> historicAtStates = repository.getATRepository().getMatchingFinalATStates(codeHash,
isFinished, dataByteOffset, expectedValue, minimumFinalHeight, isFinished, dataByteOffset, expectedValue, minimumFinalHeight,
null, null, null); null, null, null);
@ -237,7 +256,7 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
throw new DataException("Couldn't fetch historic trades from repository"); throw new DataException("Couldn't fetch historic trades from repository");
for (ATStateData historicAtState : historicAtStates) { for (ATStateData historicAtState : historicAtStates) {
CrossChainOfferSummary historicOfferSummary = produceSummary(repository, historicAtState, null); CrossChainOfferSummary historicOfferSummary = produceSummary(repository, acct, historicAtState, null);
if (!isHistoric.test(historicOfferSummary)) if (!isHistoric.test(historicOfferSummary))
continue; continue;
@ -249,9 +268,10 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
previousAtModes.put(historicOfferSummary.getQortalAtAddress(), historicOfferSummary.getMode()); previousAtModes.put(historicOfferSummary.getQortalAtAddress(), historicOfferSummary.getMode());
} }
} }
}
private static CrossChainOfferSummary produceSummary(Repository repository, ATStateData atState, Long timestamp) throws DataException { private static CrossChainOfferSummary produceSummary(Repository repository, ACCT acct, ATStateData atState, Long timestamp) throws DataException {
CrossChainTradeData crossChainTradeData = BitcoinACCTv1.getInstance().populateTradeData(repository, atState); CrossChainTradeData crossChainTradeData = acct.populateTradeData(repository, atState);
long atStateTimestamp; long atStateTimestamp;
@ -264,11 +284,11 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
return new CrossChainOfferSummary(crossChainTradeData, atStateTimestamp); return new CrossChainOfferSummary(crossChainTradeData, atStateTimestamp);
} }
private static List<CrossChainOfferSummary> produceSummaries(Repository repository, List<ATStateData> atStates, Long timestamp) throws DataException { private static List<CrossChainOfferSummary> produceSummaries(Repository repository, ACCT acct, List<ATStateData> atStates, Long timestamp) throws DataException {
List<CrossChainOfferSummary> offerSummaries = new ArrayList<>(); List<CrossChainOfferSummary> offerSummaries = new ArrayList<>();
for (ATStateData atState : atStates) for (ATStateData atState : atStates)
offerSummaries.add(produceSummary(repository, atState, timestamp)); offerSummaries.add(produceSummary(repository, acct, atState, timestamp));
return offerSummaries; return offerSummaries;
} }