forked from Qortal/qortal
Fix API/websockets that were still BitcoinACCTv1-only
This commit is contained in:
parent
acc616c204
commit
d766cfaa67
@ -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() {
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user