diff --git a/src/main/java/org/qortal/api/resource/CrossChainResource.java b/src/main/java/org/qortal/api/resource/CrossChainResource.java index 47c0ed62..c4e0b0fc 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainResource.java @@ -93,19 +93,17 @@ public class CrossChainResource { List crossChainTradesData = new ArrayList<>(); try (final Repository repository = RepositoryManager.getRepository()) { - for (SupportedBlockchain blockchain : SupportedBlockchain.values()) { - Map> acctsByCodeHash = blockchain.getAcctMap(); + Map> acctsByCodeHash = SupportedBlockchain.getAcctMap(); - for (Map.Entry> acctInfo : acctsByCodeHash.entrySet()) { - byte[] codeHash = acctInfo.getKey().value; - ACCT acct = acctInfo.getValue().get(); + for (Map.Entry> acctInfo : acctsByCodeHash.entrySet()) { + byte[] codeHash = acctInfo.getKey().value; + ACCT acct = acctInfo.getValue().get(); - List atsData = repository.getATRepository().getATsByFunctionality(codeHash, isExecutable, limit, offset, reverse); + List atsData = repository.getATRepository().getATsByFunctionality(codeHash, isExecutable, limit, offset, reverse); - for (ATData atData : atsData) { - CrossChainTradeData crossChainTradeData = acct.populateTradeData(repository, atData); - crossChainTradesData.add(crossChainTradeData); - } + for (ATData atData : atsData) { + CrossChainTradeData crossChainTradeData = acct.populateTradeData(repository, atData); + crossChainTradesData.add(crossChainTradeData); } } @@ -168,26 +166,24 @@ public class CrossChainResource { List crossChainTrades = new ArrayList<>(); - for (SupportedBlockchain blockchain : SupportedBlockchain.values()) { - Map> acctsByCodeHash = blockchain.getAcctMap(); + Map> acctsByCodeHash = SupportedBlockchain.getAcctMap(); - for (Map.Entry> acctInfo : acctsByCodeHash.entrySet()) { - byte[] codeHash = acctInfo.getKey().value; - ACCT acct = acctInfo.getValue().get(); + for (Map.Entry> acctInfo : acctsByCodeHash.entrySet()) { + byte[] codeHash = acctInfo.getKey().value; + ACCT acct = acctInfo.getValue().get(); - List atStates = repository.getATRepository().getMatchingFinalATStates(codeHash, - isFinished, acct.getModeByteOffset(), (long) AcctMode.REDEEMED.value, minimumFinalHeight, - limit, offset, reverse); + List atStates = repository.getATRepository().getMatchingFinalATStates(codeHash, + isFinished, acct.getModeByteOffset(), (long) AcctMode.REDEEMED.value, minimumFinalHeight, + limit, offset, reverse); - for (ATStateData atState : atStates) { - CrossChainTradeData crossChainTradeData = acct.populateTradeData(repository, atState); + for (ATStateData atState : atStates) { + CrossChainTradeData crossChainTradeData = acct.populateTradeData(repository, atState); - // We also need block timestamp for use as trade timestamp - long timestamp = repository.getBlockRepository().getTimestampFromHeight(atState.getHeight()); + // We also need block timestamp for use as trade timestamp + long timestamp = repository.getBlockRepository().getTimestampFromHeight(atState.getHeight()); - CrossChainTradeSummary crossChainTradeSummary = new CrossChainTradeSummary(crossChainTradeData, timestamp); - crossChainTrades.add(crossChainTradeSummary); - } + CrossChainTradeSummary crossChainTradeSummary = new CrossChainTradeSummary(crossChainTradeData, timestamp); + crossChainTrades.add(crossChainTradeSummary); } } diff --git a/src/main/java/org/qortal/crosschain/SupportedBlockchain.java b/src/main/java/org/qortal/crosschain/SupportedBlockchain.java index 6a13a368..f835aaad 100644 --- a/src/main/java/org/qortal/crosschain/SupportedBlockchain.java +++ b/src/main/java/org/qortal/crosschain/SupportedBlockchain.java @@ -1,11 +1,10 @@ package org.qortal.crosschain; import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Supplier; +import java.util.stream.Collectors; import org.qortal.utils.ByteArray; import org.qortal.utils.Triple; @@ -14,6 +13,7 @@ public enum SupportedBlockchain { BITCOIN(Arrays.asList( Triple.valueOf(BitcoinACCTv1.NAME, BitcoinACCTv1.CODE_BYTES_HASH, BitcoinACCTv1::getInstance) + // Could add improved BitcoinACCTv2 here in the future )) { @Override public ForeignBlockchain getInstance() { @@ -40,45 +40,47 @@ public enum SupportedBlockchain { } }; - private final Map> supportedAcctsByCodeHash = new HashMap<>(); - private final Map> supportedAcctsByName = new HashMap<>(); + private static final Map> supportedAcctsByCodeHash = Arrays.stream(SupportedBlockchain.values()) + .map(supportedBlockchain -> supportedBlockchain.supportedAccts) + .flatMap(List::stream) + .collect(Collectors.toUnmodifiableMap(triple -> new ByteArray(triple.getB()), Triple::getC)); + + private static final Map> supportedAcctsByName = Arrays.stream(SupportedBlockchain.values()) + .map(supportedBlockchain -> supportedBlockchain.supportedAccts) + .flatMap(List::stream) + .collect(Collectors.toUnmodifiableMap(Triple::getA, Triple::getC)); + + private final List>> supportedAccts; SupportedBlockchain(List>> supportedAccts) { - supportedAccts.forEach(triple -> triple.consume((acctName, hashBytes, supplier) -> { - supportedAcctsByCodeHash.put(new ByteArray(hashBytes), supplier); - supportedAcctsByName.put(acctName, supplier); - })); + this.supportedAccts = supportedAccts; } public abstract ForeignBlockchain getInstance(); public abstract ACCT getLatestAcct(); - public Map> getAcctMap() { - return Collections.unmodifiableMap(this.supportedAcctsByCodeHash); + public static Map> getAcctMap() { + return supportedAcctsByCodeHash; } public static ACCT getAcctByCodeHash(byte[] codeHash) { ByteArray wrappedCodeHash = new ByteArray(codeHash); - for (SupportedBlockchain supportedBlockchain : SupportedBlockchain.values()) { - Supplier acctInstanceSupplier = supportedBlockchain.supportedAcctsByCodeHash.get(wrappedCodeHash); + Supplier acctInstanceSupplier = supportedAcctsByCodeHash.get(wrappedCodeHash); - if (acctInstanceSupplier != null) - return acctInstanceSupplier.get(); - } + if (acctInstanceSupplier == null) + return null; - return null; + return acctInstanceSupplier.get(); } public static ACCT getAcctByName(String acctName) { - for (SupportedBlockchain supportedBlockchain : SupportedBlockchain.values()) { - Supplier acctInstanceSupplier = supportedBlockchain.supportedAcctsByName.get(acctName); + Supplier acctInstanceSupplier = supportedAcctsByName.get(acctName); - if (acctInstanceSupplier != null) - return acctInstanceSupplier.get(); - } + if (acctInstanceSupplier == null) + return null; - return null; + return acctInstanceSupplier.get(); } } \ No newline at end of file